標(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