Прерывания по приходу байта с COM-порта на Arduino Leonardo (ATMega32u4)
- Войдите на сайт для отправки комментариев
Вс, 14/07/2019 - 08:33
Добрый день, пытаюсь разобраться с прерываниями, пока получается не очень, может поделитесь идеями?
Код основан на паримерах из даташита по ATMega32u4 и различных источников из интернета, так например sei() ничего не делает, а вот interrupts() - делает, но ни о том, ни о другом методах ничего не было в примерах :)
При загрузке этого скетча в arduino micro pro сразу загорается красный и синий светодиоды и всё, больше ничего не происходит, на команды из терминала не реагирует, я так понимаю она просто виснет.
#include <Arduino.h>
#include <avr/interrupt.h> //библиотека прерываний
#define RED 9 // Присваиваем имя RED для пина 9
#define GREEN 6 // Присваиваем имя GREEN для пина 6
#define BLUE 3 // Присваиваем имя BLUE для пина 3
volatile byte i = 0;
volatile boolean flag = false;
void USART_Init( unsigned int baud ) {
/* Set baud rate */
UBRR1H = (unsigned char)(baud>>8);
UBRR1L = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSR1B = (1<<RXCIE1)|(1<<TXCIE1)|(1<<RXEN1)|(1<<TXEN1);
/* Set frame format: 8data, 2stop bit */
UCSR1C = (1<<UCSZ11)|(1<<UCSZ10);
//sei();
}
void setup() {
noInterrupts();
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
interrupts();
USART_Init(103);
}
void USART_Transmit( unsigned char data ) {
/* Wait for empty transmit buffer */
while ( !( UCSR1A & (1<<UDRE1)) );
/* Put data into buffer, sends the data */
UDR1 = data;
}
unsigned char USART_Receive( void ) {
analogWrite(GREEN, 255);
while ( !(UCSR1A & (1<<RXC1)) );
return UDR1;
}
// void USART_Flush( void ) {
// unsigned char dummy;
// while ( UCSR1A & (1<<RXC1) ) dummy = UDR1;
// }
ISR(USART1_RX_vect) {
flag = !flag;
if (flag == true) {
analogWrite(RED, 255);
}
else {
analogWrite(GREEN, 255);
}
analogWrite(BLUE, 255);
//USART_Flush();
}
void loop() {
}
Merkalov, а что вы шлёте в порт, куда и как включена "терминалка", к каким пинам?
Плата подключена по USB, пытаюсь что-то послать через монитор порта из Arduino IDE - он просто зависает, через плагин PlatformiO для Атома - подключается к плате, отпрапвляю рендомные символы - ничего не происходит, но и не зависает. По задумке после каждого посланного символа должно срабатывать прерывание и flag должен инвертироваться, соотвественно зеленый должен зажечься.
Merkalov, я может ещё не проснулся, но расскажите поподробнее какая взаимосвязь между USBCDC и USART1 ?? Это как опускать три копейки в один автомат, а газировку ждать из соседнего.
Думалось мне, что USART и есть COM-порт, ну раз это не так, тогда буду копать дальше.