Witam!
Chciałem wykorzystać timer0 do dokładnego odmierzania czasu, jednak coś powoduje zawieszenie całego programu. Dzieje się tak gdy próbuję odczytać wartość zmiennej w obsłudze przerwania lub w pętli głównej programu. Przerwania od timera są na pewno obsługiwane ponieważ działa zmiana stanu portu w obsłudze przerwania. Kod wygląda następująco:
Z góry dziękuję za pomoc jak i cenne wskazówki
Chciałem wykorzystać timer0 do dokładnego odmierzania czasu, jednak coś powoduje zawieszenie całego programu. Dzieje się tak gdy próbuję odczytać wartość zmiennej w obsłudze przerwania lub w pętli głównej programu. Przerwania od timera są na pewno obsługiwane ponieważ działa zmiana stanu portu w obsłudze przerwania. Kod wygląda następująco:
//ZMIENNE GLOBALNE
volatile unsigned long miliSekundy=0;
void Init(void){
DDRA=0xFF; //port A jako wyjscie
DDRD=0x00; //Potr D jako wejścia
PORTD=0xFF; //z podziagnieciem do Vcc
}
void InitTimer0() // Inicjalizacja Timera0 w trybie CTC do dokładnego odmierzania czasu
{
TCNT0 = 0x00; // Wyzerowanie zawartości rejestru Timera2
/* Praca w trybie Clear Timer on Compare (CTC) */
TCCR0 = 0x0a; // 0 0 0 0 1 0 1 1 - linia portu OC2 odcięta, tryb: CTC,
// preskaler: 128;
// Częstotliwość zegara: 16MHz/128 = 125kHz
OCR0 = 125; // Porównania będą następować z częstotliwością: 125kHz/125 = 1kHz
// czyli reset co 1ms
/* Aktywacja przerwań */
Set(TIMSK, OCIE0); // Zezwolenie na przerwanie od porównania
Set(SREG, 7); // Globalne zezwolenie na przerwania
}
int main(){
Init();
InitTimer0();
Clr(PORTA,PA3);
Set(PORTA,PA0);
Set(PORTA,PA1);
while(1){
}}
ISR(TIMER0_COMP_vect) // Przerwanie występujące przy porównaniu (co 1ms)
{
++miliSekundy;
Flip(PORTA,PA2); //DZIAŁA
/*
if(miliSekundy>=100){
miliSekundy=0; // NIE DZIAŁA
Flip(PORTA,PA2);}
*/
}Z góry dziękuję za pomoc jak i cenne wskazówki