为啥不能进入接受中断函数呢?reset多次后可能有一两次能够进入。没有使用MPCM,多设备交流模式。
我想用两个AVR ATmega8A进行通讯,一个单片机发送数据重复发送0x00和0x01,接受数据的一个单片机将这个0x00和0x01用二极管显示出来。用示波器看发送数据的单片机发出的波形没有问题。但是接受数据的单片机,不能够进入接受中断。
连接方式:两个单片机供电相同,发送数据的单片机TXD和接受数据单片机的RXD连接,发送数据的单片机RXD和接受数据单片机的TXD连接,以及指示 二极管io口的连接。
接受单片机的程序如下
#include<iom8v.h>
#include<macros.h>
unsigned char rdata;
unsigned char flag;
void io_init(void)
{
DDRD &=~BIT(0);//RXD
DDRD |=BIT(1);//TXD
PORTD |=BIT(0);
SFIOR &=~BIT(2);
DDRC=0XFF;
}
void usart_init(void)
{
UCSRC |=BIT(7);//选择UCSRC进行操作
UCSRC &=~BIT(6);//异步模式
UCSRC &=~BIT(5);//奇偶校验禁止
UCSRC &=~BIT(4);
UCSRC &=~BIT(3);//一个stop bit
UCSRC |=BIT(2);//选择8位数据位
UCSRC |=BIT(1);
UCSRC &=~BIT(0);//异步模式直接设置0
UBRRL =49;//波特率设置为1250
UBRRH=0X00;
UCSRB |=BIT(7);//接受完成中断
UCSRB &=~BIT(6);//发送完成中断
UCSRB &=~BIT(5);//数据寄存器空中断
UCSRB |=BIT(4);//接受使能
UCSRB |=BIT(3);//发送使能
UCSRB |=BIT(2);//选择8位数据位
UCSRB &=~BIT(1);//RXB8用不着就置为初始值
UCSRB &=~BIT(0);//TXB用不着也设置为初始值
UCSRA |=~BIT(1);//正常不倍速的模式
SREG |=BIT(7);
}
#pragma interrupt_handler inter_rxc:12
void inter_rxc(void)
{
//进入中断会清除标志位,ATmega8A中,只有该位置位
//才能进入中断,所以下面的可以不要,
//while(!(UCSRA&BIT(7)))
//{}
rdata=UDR;
//rdata &=0X01;
//rdata ^=0X01;
PORTC |=BIT(0);//令PC0为高来检验是否收到数据
}
void main(void)
{
io_init();
usart_init();
while(1)
{
PORTC |=BIT(1);
}
}
|