Do zrealizowania na zaliczenie kursu był program wykorzystujący timery i przerwania do pomiaru czasu. W skrócie wprowadzamy czas w [ms] do odliczenia z klawiatury (+wszystko wyświetla sie na LCD alfa) startujemy, w tym momencie dioda sie zapala i świeci przez ten czas potem gaśnie i procek sie resetuje. Funkcja start() wywoływania jest gdy odliczanie startuje. Timer jest skonfigurowany tak aby generował przerwanie co 1ms (OCR1A=1000; zegar taktujacy 1MHz). W petli "while(counter<=nr)" counter i nr to zmienne globalne. counter to obecna odliczona liczba ms (w przerwaniu), natomiast nr to liczba/czas do odliczenia wprowadzana/y z klawiatury. Problem polega na tym iż jeśli zostanie tam wstawiona pusta pętla w postaci "while(counter<=nr);" lub "while(counter<=nr){}" program sie zapętla, a jesli jest tak jak jest poniżej czyli probuje wyswietlic na LCD obecną zawartość zmiennej counter co obieg pętli,widać na wyswietlaczu jak ta zmienna wzrasta i po pewnym czasie warunek w while zostanie niespełniony i program pojdzie dalej. Czemu jeśli petla jest pusta program sie zapętla w tym miejscu? Ma to związek z ograniczonymi zasobami? Błędem kompilatora WinAVR (jedna z najnowszych wersji)? Nie rozumiem.
void start(void)//rozpoczecie odliczania
{
sprintf(message,"Odliczanie ");
message[15]=' ';
LCD2x16_clear();
display(message, false);
//konfiguracja timerow
TCCR1B |= (1 << WGM12); //wlaczenie trybu CTC
OCR1A = 1000; //obliczanie wartosci pozadanej dla porownania, 1000 cykli=1ms (1MHz)
TCCR1B |= (1 << CS10); //preskaler 1;
TIMSK |= (1 << OCIE1A); //zezwolenie na przerwania dla CTC
sei();//wlaczenie przerwan
PORTA ^= (1 << 6); //zmiana stanu led (PA6)
while(counter<=nr)
{
sprintf(message,"%4d ",counter);
message[15]=' ';
display(message,true);
}
TIMSK ^= (1 << OCIE1A); //wylaczenie przerwania od timera
PORTA ^= (1 << 6); //zmiana stanu led (PA6)
LCD2x16_clear();
sprintf(message,"KONIEC xD ");
message[15]=' ';//wpisanie ' ' zamiast znaku '\0'
display(message,false);
play(hymn,0,15);
WDTCR |= 7; //2 sekundy do resetu
WDTCR |= (1<<3); //wlacz watchdoga
while(true);//nieskonczona petla; po 2 sek. watchdog zresetuje uC
}
//**********************************************************************************************************
ISR(TIMER1_COMPA_vect)//obsluga przerwania od timer1 compare
{
//cli(); //wylaczenie przerwan
++counter;
}
