Прерывания по приходу байта с COM-порта на Arduino Leonardo (ATMega32u4)

Merkalov
Offline
Зарегистрирован: 14.07.2019

Добрый день, пытаюсь разобраться с прерываниями, пока получается не очень, может поделитесь идеями?

Код основан на паримерах из даташита по 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() {
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Merkalov,  а что вы шлёте в порт, куда и как включена "терминалка", к каким пинам?

Merkalov
Offline
Зарегистрирован: 14.07.2019

Плата подключена по USB, пытаюсь что-то послать через монитор порта из Arduino IDE  - он просто зависает, через плагин PlatformiO для Атома - подключается к плате, отпрапвляю рендомные символы - ничего не происходит, но и не зависает. По задумке после каждого посланного символа должно срабатывать прерывание и flag должен инвертироваться, соотвественно зеленый должен зажечься.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Merkalov, я может ещё не проснулся, но расскажите поподробнее какая взаимосвязь между USBCDC и USART1 ?? Это как опускать три копейки в один автомат, а газировку ждать из соседнего.

Merkalov
Offline
Зарегистрирован: 14.07.2019

Думалось мне, что USART и есть COM-порт, ну раз это не так, тогда буду копать дальше.