UART RX Interrurpt сработал слишком рано

Я делаю небольшой проект, в котором я хочу передать текст через кабель на мой 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
}

Изменить: изображение моей установки:

Моя настройка

Я использую Arduiono только для питания своей макетной платы. 5V и GND подключены. Интернет-провайдер AVR MKII подключен через несколько контактов для прошивки микроконтроллера. Два кабеля используются для UART RX.
Кнопка предназначена только для СБРОСА

Изменить 2: я просто попытался включить его через внешний источник и raspberrypi. Эффект везде одинаковый


person 0xAffe    schedule 11.06.2015    source источник
comment
ничего не было передано - Вы проверяли регистр состояния прерывания, чтобы подтвердить источник прерывания? Вы проверяли регистр статуса RX на наличие ошибок?   -  person sawdust    schedule 11.06.2015


Ответы (3)


Конечно. Флаг RXC устанавливается, когда в приемном буфере есть непрочитанные данные. Этот флаг используется для генерации прерывания RX. Поскольку вы никогда не читаете UDR внутри своего прерывания, этот флаг остается установленным, и, следовательно, сразу после завершения процедуры обработки прерывания он запускается снова. И снова. И снова....

person AterLux    schedule 11.06.2015
comment
На самом деле я читал URD, я просто его не упомянул. Но проблема немного в другом. Дело не в том, что из ISR не выйдет. Проблема в том, что прерывание сработает даже тогда, когда ничего не было передано. - person 0xAffe; 11.06.2015
comment
Ok. Затем проверьте соединение на выводе RX. Если соединение плохое, он может ошибочно определить низкий уровень (в качестве стартового бита) (на вашей фотографии этот пин в воздухе, без подтягивания) - person AterLux; 11.06.2015

Линия Rx не должна быть плавающей. Это вход с высоким импедансом, и его следует установить на определенный уровень. Ваши кабели действуют как антенна, и если вы прикоснетесь к кабелю, ситуация ухудшится из-за емкостной связи между кабелем и вашим телом. Это может привести к высокочастотному шуму на вашем входе, который может вызвать прерывание Rx.

Кроме того, убедитесь, что местный источник питания 328p должным образом отключен. Я не вижу конденсаторов возле контроллера на вашей макетной плате. Проверьте соединение GND между Arduino и 328p (обязательно).

person Rev    schedule 12.06.2015
comment
Проблема со случайным прерыванием, кажется, решена подключением кабеля .. Но мой микроконтроллер все еще не получает правильный текст. Может быть, часы неправильные, но я думаю, что для этого мне нужно прочитать документацию. Правда, конденсаторов нет. Для чего они мне нужны? - person 0xAffe; 14.06.2015

Не глядя на вашу настройку, трудно сказать, что идет не так, но если вы касаетесь изолированного кабеля и получаете ответ от процессора, тогда я бы проверил общие основания между устройствами, если вы питаете ATMega от батареи, Убедитесь, что заземление батареи касается устройства, которое принимает и передает, так как любая разница в уровнях мощности может привести к усилению испускаемого вами небольшого магнитного поля до того, что ядро ​​регистрирует как высокий бит. изображение вашей установки!

Также при программировании с помощью чипов ATMel запись загрузчика Arduino и использование простого (r) кода C никогда не повредит.

person Mike Armstrong    schedule 11.06.2015
comment
Я добавил картинку и описание. - person 0xAffe; 11.06.2015
comment
Разность потенциалов на самом деле вызовет электрическое поле, а не магнитное. А отсутствие соединения GND в первую очередь приведет к смещению логического уровня из-за отсутствия общей ссылки, а не из-за связи. - person Rev; 12.06.2015