標(biāo)題: AVR單片機(jī)USART接受中斷不能夠進(jìn)入 [打印本頁(yè)]

作者: 云上月    時(shí)間: 2018-4-10 19:07
標(biāo)題: AVR單片機(jī)USART接受中斷不能夠進(jìn)入
       為啥不能進(jìn)入接受中斷函數(shù)呢?reset多次后可能有一兩次能夠進(jìn)入。沒(méi)有使用MPCM,多設(shè)備交流模式。
       我想用兩個(gè)AVR ATmega8A進(jìn)行通訊,一個(gè)單片機(jī)發(fā)送數(shù)據(jù)重復(fù)發(fā)送0x00和0x01,接受數(shù)據(jù)的一個(gè)單片機(jī)將這個(gè)0x00和0x01用二極管顯示出來(lái)。用示波器看發(fā)送數(shù)據(jù)的單片機(jī)發(fā)出的波形沒(méi)有問(wèn)題。但是接受數(shù)據(jù)的單片機(jī),不能夠進(jìn)入接受中斷。
連接方式:兩個(gè)單片機(jī)供電相同,發(fā)送數(shù)據(jù)的單片機(jī)TXD和接受數(shù)據(jù)單片機(jī)的RXD連接,發(fā)送數(shù)據(jù)的單片機(jī)RXD和接受數(shù)據(jù)單片機(jī)的TXD連接,以及指示                 二極管io口的連接。
接受單片機(jī)的程序如下
#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進(jìn)行操作
UCSRC &=~BIT(6);//異步模式
UCSRC &=~BIT(5);//奇偶校驗(yàn)禁止
UCSRC &=~BIT(4);
UCSRC &=~BIT(3);//一個(gè)stop bit
UCSRC |=BIT(2);//選擇8位數(shù)據(jù)位
UCSRC |=BIT(1);
UCSRC &=~BIT(0);//異步模式直接設(shè)置0

UBRRL =49;//波特率設(shè)置為1250
UBRRH=0X00;

UCSRB |=BIT(7);//接受完成中斷
UCSRB &=~BIT(6);//發(fā)送完成中斷
UCSRB &=~BIT(5);//數(shù)據(jù)寄存器空中斷
UCSRB |=BIT(4);//接受使能
UCSRB |=BIT(3);//發(fā)送使能
UCSRB |=BIT(2);//選擇8位數(shù)據(jù)位
UCSRB &=~BIT(1);//RXB8用不著就置為初始值
UCSRB &=~BIT(0);//TXB用不著也設(shè)置為初始值

UCSRA |=~BIT(1);//正常不倍速的模式

SREG |=BIT(7);
}


#pragma interrupt_handler inter_rxc:12
void inter_rxc(void)
{
//進(jìn)入中斷會(huì)清除標(biāo)志位,ATmega8A中,只有該位置位
//才能進(jìn)入中斷,所以下面的可以不要,
//while(!(UCSRA&BIT(7)))  
//{}
rdata=UDR;
//rdata &=0X01;
//rdata ^=0X01;
PORTC |=BIT(0);//令PC0為高來(lái)檢驗(yàn)是否收到數(shù)據(jù)
}

void main(void)
{
io_init();
usart_init();
while(1)
  {
  PORTC |=BIT(1);
  }
}










歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1