Официальный сайт компании Arduino по адресу arduino.cc
Прерывания по приходу байта с 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-порт, ну раз это не так, тогда буду копать дальше.