1
I’m having trouble using USART serial transmission interrupt in a program made in pure C and run in Rduino (Atmega 328p).
My application requires pure C for reasons of efficiency and speed, but still want to maintain serial communication for debug and printing information in real time.
The following is a minimal representation of the program
The problem is the interruption, I have a problem with it, I tried to use TX in the interruption, but it generates inconsistent data in the output and, as I want to use the circular vector method, the UDRE register seems the best way, adding to this, the sample program found on the site http://jamesgregson.blogspot.com.br/2012/07/sample-code-for-atmega328p-serial.html works best.
In short, the interruption is not executed, because the program is stuck in the while
. How can I fix this? I can disable the interruption in the middle
hers?
The program is being compiled by AVR-GCC in the codeblocks IDE and the example given on the previously referenced site works, but it is not what the application requires.
#include<avr/io.h>
#include<avr/interrupt.h>
//void intToStr(unsigned long, char*);
#define USART_BAUDRATE 57600
#define BAUD_PRESCALE (((F_CPU/(USART_BAUDRATE*16UL)))-1)
char ok = 0;
ISR(UART_UDRE_vect)
{
ok = 1;
UCSR0B &= ~(1<<5);
}
int main(void){
UBRR0H = (BAUD_PRESCALE >> 8);
UBRR0L = BAUD_PRESCALE;
UCSR0B |= (1<<TXEN0);
UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01);
sei();
UCSR0B |= (1<<5);
while(1){
// write the byte to the serial port
UDR0 = '0';
UCSR0B |= (1<<5);
while(ok != 1){}
UDR0 = '\n';
UCSR0B |= (1<<5);
while(ok != 1){}
}
return 0;
}