Witam. Próbuje uruchomić program testowy, który polega na tym, że po wysłaniu na RS-a liczby 2 dioda zapala się na okres 1 sekundy i na ten sam czas również gaśnie przez okres 30 s. Wysyłanie na port szeregowy wykonuje za pomocą przerwania z USART. Odmierzanie sekund z przerwania Timera w trybie asynchronicznym(RTC). Program nie działa, bo mam problem z priorytetami przerwań. Próbowałam zamienić ISR na Signal, jednak to nie przynosi efektów. Czy dostanę małą podpowiedź jak ustawić priorytety?
#define F_CPU 8000000UL //czestotliwosc zegara w Hz
#define UART_BAUD 9600 //prędkość transmisji
#define UART_CONST (F_CPU/(16ul*UART_BAUD)-1)
unsigned char x=0;
int volatile sekunda=0x00; //zmienna globalna wystepujaca w przerawniu
volatile unsigned char i=0; //zmienna przy przerwaniu UART
void USART_Transmit( unsigned char data )
{
while ( !( UCSRA & (1<<UDRE)) ); /* Czekaj na pusty bufor transmisji */
UDR = data; /* włóż dane do bufora i wyślij je */
}
unsigned char USART_Receive( void )
{
while ( !(UCSRA & (1<<RXC)) ); /* czekaj na dane do wysłania*/
return UDR; /*odbierz i zwróć odebrane dane z bufora */
}
void USART_Init( unsigned int ubrr )
{
UBRRH = (unsigned char)(ubrr>>8); /* ustaw prędkość transmisji*/
UBRRL = (unsigned char)ubrr;
UCSRB = (1<<RXEN)|(1<<TXEN); /* zezwól na transmisje i odbiór */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); /* 8bitów danych, 2bity stopu */
SIGNAL(SIG_UART_RECV) // podprogram przerwania od USART
{
i=UDR;
}
ISR(TIMER2_OVF_vect) //podprogram przerwania timer'a
{
sekunda++;
if (sekunda==30)
{
sekunda=0;
TIMSK &= ~_BV(TOIE2); //po czasie 30s wylacz przerwania
}
PORTD ^=_BV(7); //zapala sie dioda i gasnie co 1s
}
int main(void)
{
DDRD=0xff; //dioda na PB7;
PORTD=0xff;
ASSR |= _BV(AS2); // TC2 z taktowania zegarem CPU na generator asynchroniczny
// preskaler fclk/128 ->dokładnie co 1 s
TCCR2 = 1<<CS00 | 1<<CS02 | 0<<CS01 ;
TCNT2 = 0;
//TIFR = 0;
sei(); // włącz obsługę przerwań
USART_Init(UART_CONST);
while(1)
{ UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXC); //wlacz obsluge przerwan USART
if (i==2)
{TIMSK |= _BV(TOIE2); // włącz przerwania z TC2
}
UCSRB =(1<<UDRIE)|(0<<RXEN)|(0<<TXEN)|(0<<RXC); //przestan nadawac i
}
}