Ahoj, prosím o radu s přerušením u ATMegy8. Potřebuji pomocí něho reagovat na přijetí Bytu po UART a tento Byte vyhodnotit. Nejlepší by pro mne bylo předat přijatý Byte z ISR funkce přerušení do hlavní main části, ale netuším, jak to udělat a jestli to vůbec jde. Zde je můj pokusný kód v C:
#include <avr/io.h>
#include <avr/interrupt.h>
#define USART_BAUDRATE 31250
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
char ReceivedByte;
int main (void)
{
DDRB = 0b11111111;
PORTB = 0b00000110;
UCSRB |= (1 << RXEN) | (1 << TXEN);
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
UBRRL = BAUD_PRESCALE;
UBRRH = (BAUD_PRESCALE >> 8);
UCSRB |= (1<<RXCIE);
sei();
for(;;)
{
/****** UART ******/
//while ((UCSRA & (1 << RXC)) == 0) {};
//ReceivedByte = UDR;
if (ReceivedByte==0xF8)
{
PORTB ^= (0b00000010);
}
/*konec****** UART ******/
}// /for
}// /main
/****** přerušení-UART ******/
ISR(USART_RXC_vect)
{
ReceivedByte = UDR;
/*
if (ReceivedByte==0xF8)
{
PORTB ^= (0b00000010);
}
*/
}
/*konec****** přerušení-UART ******/
Jakmile vyhodnocuji přijatý znak ve funkci přerušení ISR a odtud ovládám port, je vše OK. Když nepoužívám přerušení a použiji po odkomentování část v hlavní smyčce, po odstranění sei(); to taky funguje. Ale když bych potřeboval pomocí ISR(USART_RXC_vect) jen Byte přijmout a zpracovat v hlavní smyčce, funguje to blbě. Přesněji - na vstup znaku to někdy reaguje a někdy ne, někdy jakoby dvakrát po sobě. Jsem začátečník a tak mne to mate, nevím kde je chyba.
Tenhle kód je jen příklad, přijatý Byte musím testovat pomocí mnoha podmínek a na jeho základě řídit další funkce v hlavní nekonečné smyčce.
Díky předem za pomoc.
Pavel