首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >avr USART中断不工作

avr USART中断不工作
EN

Stack Overflow用户
提问于 2015-03-24 20:22:29
回答 2查看 1.4K关注 0票数 0

我使用以下代码测试在ATtiny2131微控制器中工作的usart中断:

代码语言:javascript
运行
复制
#include<avr/io.h>        // for reading data to I/O ports
#include<util/delay.h>    // for setting delays
#include<avr/interrupt.h> // for setting interrupt service routines


void USART_initialize() {

    //int baud_rate = (unsigned int)(((16000000)/(16*baud_value))-1);
    UCSRC &= ~(1<<UMSEL);                       // MODE OF COMMUNICATION (SYNCHRONOUS --> (USMEL = 1), ASYNCHRONOUS --> (USMEL = 0))
    UBRRH = (unsigned char)(103 >> 8);         // SETTING BAUD
    UBRRL = (unsigned char)(103);              // RATE
    UCSRA &= ~(1<<U2X);                        // NORMAL ASYNCHRONOUS MODE OF COMMUNICATION

    UCSRB = (1<<RXEN)|(1<<TXEN);               // ENABLE RECEIVER & TRANSMITTER
    UCSRC |= (3<<UCSZ0);                       //
    UCSRB &= ~(UCSZ2);                         // 8-BIT DATA
    //UCSRC |= (1<<UPM1);                      // EVEN PARITY
    //UCSRC &= ~(1<<UPM0);
    UCSRC &= ~(1<<UPM1);
    UCSRC &= ~(1<<UPM0);
    UCSRC |= (1<<USBS);                        // 1 STOP BIT

    sei();                                     // ENABLE GLOBAL INTERRUPT
    UCSRC |= (1<<7);                           // ENABLE RECEIVE COMPLETE INTERRUPT
}


int main(void) {
    USART_initialize();
    while(1) {
        UCSRA |= (1<<RXC);
        _delay_ms(1000);
    }
    return(0);   
}

ISR(USART0_RX_vect) {
    PORTD |= (1<<5);
    _delay_ms(1000);
    PORTD &= ~(1<<5);
    _delay_ms(1000);
    int data = UDR;
}

代码应该每秒钟在PD5上闪烁一次,但是它没有做任何事情,我不明白为什么。

请帮帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-25 06:27:46

RXCIEUCSRB,而不是UCSRC

票数 1
EN

Stack Overflow用户

发布于 2015-03-25 06:29:13

RXC位的UCSRA是只读的.它由接收缓冲区的状态设置和清除。您不能手动写入它来创建您自己的中断。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29242154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档