У меня возникли проблемы с чтением данных, отправленных с моего ноутбука на микроконтроллер через 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.
настройкаМоей Шпатлевки:
Я предполагаю, что вы подтвердили свой L Код ED уже (т.е. может включать/выключать по желанию). Пробовали ли вы recv в режиме опроса (т. Е. Не использовать/полагаться на прерывание), чтобы проверить возможность подключения всех, включая вывод/провод recv? Когда опрос работает, отлаживайте прерывание. Я проверил ваши init и _seems_ в порядке, но я был бы более счастлив, если бы вы использовали явное назначение вместо OR/AND. Убедитесь, что вы не указали ** режим 9 бит ** по ошибке [см. Стр. 219] Обратите внимание, что третий бит USCZ находится в UCSRB [и _not_ UCSRC, как и два нижних]. И, см. Определения бит бит, начиная со страницы 227. Crosscheck '.h' против doc. –
Arduino не C! См. [Ask] и укажите [mcve], а не только фрагменты. – Olaf
Выберите один: опрос или RX ISR. И не забывайте, что Arduino Serial также использует ISR. – KIIV