【问题标题】:arduino Usart1 Interruptarduino Usart1 中断
【发布时间】:2016-11-12 12:43:13
【问题描述】:

我正在 atmel studio 7 的 aurdino mega2560 使用 arduino 引导加载程序工作 起初我使用带有中断的 uart 0 (tx0 和 rx0),它运行良好 但是,当我使用带有 u1_rx 中断的 uart1 时不起作用

#include <avr/io.h>
#include <util/delay.h>
#include<avr/interrupt.h>
#ifndef F_CPU
#define F_CPU 16000000UL // 16 MHz clock speed
#endif

#define USART_BAUDRATE0 115200
#define USART_BAUDRATE1 57600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE0 * 16UL))) - 1)
volatile char ReceivedByte1;
void initUART(int BRR)
{//|(1 << TXCIE0)
    UCSR0A=(0<<RXC0)|(0<<FE0)|(0<<DOR0)|(0<<UPE0)|(1<<U2X0)|(0<<MPCM0);
    UCSR0B = (1 << RXCIE0)  |(1 << UDRIE0)|(1 << RXEN0) | (1 << TXEN0)|(0<<UCSZ02)|(0<<RXB80)|(0<<TXB80);   
    UCSR0C =(0<<UMSEL01)|(0<<UMSEL00)|(0<<UPM00)|(0<<UPM01)|(0<<USBS0)|(1 << UCSZ00) | (1 << UCSZ01)  ;
    UBRR0H=(BRR >> 8);
    UBRR0L=BRR;
    sei ()  ;
}
void initUART1(int BRR)
{//|(1 << TXCIE0)
    UCSR1A=(0<<RXC1)|(0<<FE1)|(0<<DOR1)|(0<<UPE1)|(1<<U2X1)|(0<<MPCM1);
    UCSR1B = (1 << RXCIE1)  |(1 << UDRIE1)|(1 << RXEN1) | (1 << TXEN1)|(0<<UCSZ12)|(0<<RXB81)|(0<<TXB81);
    UCSR1C =(0<<UMSEL11)|(0<<UMSEL10)|(0<<UPM10)|(0<<UPM11)|(0<<USBS1)|(1 << UCSZ10) | (1 << UCSZ11)  ;
    UBRR1H=(BRR >> 8);
    UBRR1L=BRR;
    sei ()  ;
}
ISR(USART0_RX_vect)
{
    char ReceivedByte;
    //ReceivedByte = UDR0; // Fetch the received byte value into the variable "ByteReceived"
    //UDR0 = ReceivedByte; // Echo back the received byte back to the computer
    while ((UCSR0A & (1 << RXC0)) == 1) {}; // Do nothing until data have been received and is ready to be read from UDR
    ReceivedByte = UDR0; // Fetch the received byte value into the variable "ByteReceived"
    while ((UCSR0A & (1 << UDRE0)) == 1) {}; // Do nothing until UDR is ready for more data to be written to it
    UDR0 = ReceivedByte; // Echo back the received byte back to the computer
}
ISR(USART1_RX_vect)
{
    //while ((UCSR1A & (1 << RXC1)) == 1) {}; // Do nothing until data have been received and is ready to be read from UDR
    ReceivedByte1 = UDR1; // Fetch the received byte value into the variable "ByteReceived"
    PORTB=0xff;

//  while ((UCSR0A & (1 << UDRE0)) == 1) {}; // Do nothing until UDR is ready for more data to be written to it
    UDR0 = ReceivedByte1; // Echo back the received byte back to the computer
}
ISR(USART1_UDRE_vect)
{

}
ISR(USART0_UDRE_vect)
{

}
ISR(USART0_TX_vect)
{
}
int main(void)
{
    initUART1(34);
    initUART(16);//Boudratecalc);
    DDRB = 0xFF;
    PORTB=0x00;

    while (1) 
    {

    }
}

【问题讨论】:

  • 只有当 uart 0 被禁用时,uart 1 才有效
  • 你的代码不对称。

标签: arduino atmel atmelstudio


【解决方案1】:

当 UDRIE0 启用并且仍在触发时控制器冻结 所以不会去UART1 我使用 TX 中断,它可以工作

【讨论】:

    猜你喜欢
    • 2016-12-02
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2021-12-27
    相关资源
    最近更新 更多