為啥不能進入接受中斷函數呢?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);
}
}
|