2016-09-05 3 views
0

У меня возникли проблемы с чтением данных, отправленных с моего ноутбука на микроконтроллер через UART. Передающая часть работает нормально - я могу отправлять данные на свой ноутбук без проблем, но эхо-данные или чтение входных данных с клавиатуры не работают. Я попытался реализовать чтение как с опросом, так и с помощью процедур прерывания Rx, но без успеха. Микроконтроллер, который я использую, - ATMEGA2560, и я подключен к своему ноутбуку через FTD1232 Конвертер USB в TTL.UART Прием ввода клавиатуры не работает

Я использую Шпатлевка как послед терминала, а Arduino IDE для программирования.

Я предполагаю, что проблема не в аппаратном обеспечении, основанном на следующем: я попытался инициализировать разные USART и попытался использовать разные COM-порты, а также другой USB-адаптер TTL, различные провода, но результат тоже самое. Я также подключил другой источник питания для подачи достаточного напряжения на все устройства.

Я пытаюсь получить хотя бы ответ, включив светодиод, когда происходит прерывание Rx (когда я ввожу что-то в терминал).

~

#define F_CPU 16000000UL //16MHz 
#define BAUD 115200UL //bps 
#define BAUD_PRESCALER (((F_CPU/(BAUD*8UL)))-1) //Table 101, page 212 

volatile uint8_t temp; 

void UART_init(){ 
    //Set baud rate 
    UBRR0H = (uint8_t)(BAUD_PRESCALER >> 8); //Higher portion of the baud rate 
    UBRR0L = (uint8_t)BAUD_PRESCALER; //Lower portion of the baud rate 

    //Enable Receiver and Transmitter 
    UCSR0B = (1 << RXEN0) | (1 << TXEN0); 
    //Set frame format: 8-bit format, 1 stop bit, no parity 
    UCSR0C |= (3 << UCSZ00); 
    UCSR0C &= ~(1 << USBS0); //clear for 1 stop bit 

    //Set Double Speed Asynchronous mode 
    UCSR0A |= (1 << U2X0); 

    UCSR0B |= (1 << RXCIE0); //Enables interrupt rxc 
} 

uint8_t UART_getchar(){ 
    //Wait for RXC flag 
    while(!(UCSR0A & (1 << RXC0))){}; 
    return UDR0; 
} 

//Arduino setup() 
void setup(){ 
    pinMode(8, OUTPUT); 
    UART_init(); 
    sei(); 
} 

//Arduino loop() 
void loop(){ 
    delay(500); 
    UART_putchar('a'); 
} 

ISR(USART0_RX_vect){ 
    temp = UDR0; 
    digitalWrite(8, HIGH); 
} 

Это lenghty пост, но я старался быть конкретными, а также размещать весь код. Таблицу, которую я использую для ATMEGA2560, можно найти here.

настройка

Моей Шпатлевки:

COM Port Settings

+0

Я предполагаю, что вы подтвердили свой L Код ED уже (т.е. может включать/выключать по желанию). Пробовали ли вы recv в режиме опроса (т. Е. Не использовать/полагаться на прерывание), чтобы проверить возможность подключения всех, включая вывод/провод recv? Когда опрос работает, отлаживайте прерывание. Я проверил ваши init и _seems_ в порядке, но я был бы более счастлив, если бы вы использовали явное назначение вместо OR/AND. Убедитесь, что вы не указали ** режим 9 бит ** по ошибке [см. Стр. 219] Обратите внимание, что третий бит USCZ находится в UCSRB [и _not_ UCSRC, как и два нижних]. И, см. Определения бит бит, начиная со страницы 227. Crosscheck '.h' против doc. –

+0

Arduino не C! См. [Ask] и укажите [mcve], а не только фрагменты. – Olaf

+0

Выберите один: опрос или RX ISR. И не забывайте, что Arduino Serial также использует ISR. – KIIV

ответ

0

Я только что проверил это на моем Mega борту, и это работает отлично без прерывания включено (простой петлевого):

#define BAUD 115200UL 
#define BAUD_PRESCALER (((F_CPU/(BAUD*8UL)))-1) 

volatile uint8_t temp; 

void UART_init(){ 
    //Set baud rate 
    UBRR0H = (uint8_t)(BAUD_PRESCALER >> 8); //Higher portion of the baud rate 
    UBRR0L = (uint8_t)BAUD_PRESCALER; //Lower portion of the baud rate 

    //Enable Receiver and Transmitter 
    UCSR0B = (1 << RXEN0) | (1 << TXEN0); 
    //Set frame format: 8-bit format, 1 stop bit, no parity 
    UCSR0C |= (3 << UCSZ00); 
    UCSR0C &= ~(1 << USBS0); //clear for 1 stop bit 

    //Set Double Speed Asynchronous mode 
    UCSR0A |= (1 << U2X0); 
// UCSR0B |= (1 << RXCIE0); //Enables interrupt rxc 
} 

uint8_t UART_getchar(){ 
    //Wait for RXC flag 
    while(!(UCSR0A & (1 << RXC0))){}; 
    return UDR0; 
} 

void UART_putchar(uint8_t data){ 
    //Do nothing until UDR is ready 
    while(!(UCSR0A &(1 << UDRE0))){}; 
    UDR0 = data; 
} 

void UART_putstring(uint8_t *data){ 
    while(*data != 0x00){ 
    UART_putchar(*data); 
    data++; 
    } 
} 

//Arduino setup() 
void setup(){ 
    pinMode(8, OUTPUT); 
    UART_init(); 
    sei(); 
} 

//Arduino loop() 
void loop(){ 
    UART_putchar(UART_getchar()); 
} 

/*ISR(USART0_RX_vect){ 
    temp = UDR0; 
    digitalWrite(8, HIGH); 
}*/ 

прерывания RX должно быть отключен, в противном случае выполняется вектор последовательного прерывания, а опрошенный get char не может работать, поскольку символы считываются ISR

+0

Проблема была, по-видимому, в FTDI (оба), которые я использовал. Когда я запускаю свой код только при подключении USB-кабеля, который я использую для программирования платы, все работает нормально, но если я попытаюсь связаться с FTDI, только передача будет работать. Я буду смотреть дальше. Спасибо :) – soundonly01

+0

Если вы использовали USART0, где тоже подключен USB-Serial, я не настолько удивлен. Если это не работает на других USART, это было бы странно. В любом случае, вы можете протестировать свой чип FTDI, подключив его TX и RX, чтобы выполнить простой тест петли. – KIIV

Смежные вопросы