UART RX Interrurpt过早发射

时间:2015-06-11 14:48:14

标签: avr uart atmega atmel

我正在做一个小项目,我希望通过电缆将文本传输到我的Atmega328p。
我首先用Arduino Uno(纯C)创建了这个项目,传输工作正常 现在我切换到一个独立的328p并在那里试了一下。

但现在的问题是,我的RX-Complete中断过早发生了。事实上,当没有传播任何东西时,它甚至被解雇了。当我刚接触电缆(隔离部分)时它会被触发。

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/setbaud.h>

void setup(void){

    CLKPR = 0;

    //Set Output
    DDRC |= (1 << PC0) | (1 << PC1) |(1 << PC2) |(1 << PC3) |(1 << PC4) | (1 << PC5);
    DDRD |= (1 << PD6) | (1 << PD7);

    // Interrupts
    sei();

    // Init UART
    // Set baud
     UBRR0H = UBRRH_VALUE;
    UBRR0L = UBRRL_VALUE;
    #if USE_2X
        UCSR0A |= (1 << U2X0);
    #else
        UCSR0A &= ~(1 << U2X0);
    #endif

    // Enable UART Receive and Receivecomplete Interrupt
    UCSR0B = (1<<RXEN0) | (1 << RXCIE0);

    // Set frameformat to 8 Data and 1 Stopbit
    UCSR0C = ((1<<UCSZ00)|(1<<UCSZ01));
}


int main(void){
    setup();
    while(1){

    }
    return 0;
}

ISR(USART_RX_vect){
    // Enable some LEDs
}

编辑:我的设置图片:

My Setup

我使用Arduiono只是为我的面包板供电。 5V和GND连接。 AVR MKII ISP通过一些引脚连接以闪烁μC。这两根电缆用于UART RX 按钮仅适用于RESET

编辑2:我只是尝试通过外部源和raspberrypi来驱动它。到处都有同样的效果

3 个答案:

答案 0 :(得分:1)

当然。当接收缓冲区中有未读数据时,RXC标志置位。 该标志用于产生RX中断。 由于您从未在中断中读取UDR,因此该标志保持置位状态,因此在中断例程完成后,它将再次启动。然后再次。再次......

答案 1 :(得分:1)

Rx线不应该浮动。它是一个高阻抗输入,应该被驱动到一个特定的水平。您的电缆就像天线一样,如果您触摸电缆,它会变得更糟,因为电缆和您的身体之间存在电容耦合。这可能会导致输入端产生高频噪声,从而触发Rx中断。

进一步确保328p本地电源正确去耦。我在面包板上的控制器附近没有看到任何电容器。检查Arduino和328p之间的GND连接(强制)。

答案 2 :(得分:0)

如果没有查看您的设置,很难分辨出哪些是错的,但是如果您正在接触隔离的电缆并从处理器获得响应,那么我会查看两者之间的常见理由。设备如果您通过电池为ATMega供电,请确保电池接地正在接触正在接收和发送的设备,因为任何潜在的功率差异都可能导致您发出的微小磁场被放大为核心注册为高位的东西。如果可能,发布你的设置图片!

当使用ATMel芯片进行编程时,烧毁arduino引导程序并使用简单的(r)C代码方式也不会受到伤害。