Zaloguj się, aby zobaczyć kod
Poczytałem o timerach z poradnika, który już czytałem wcześniej ale od samego czytania wiedzy nie przybyło.
Analizując powyższy kod natykam się na niejasności i rozwiązania, które chce dostosować do siebie.
//definicja początkowej wartości timera
#define timer_start 6
Rozumiem, że zależnie jaką wartość wpiszę timer będzie liczył od tej wartości tutaj od 6 do 255? czy definicja "timer_start" jest zawsze tak zapisana?
//zmienna pomocnicza-licznik używana w przerwaniu
volatile uint8_t cnt=0;
Czym jest ta linijka, jak to rozumieć, czym jest volatile czym uint8_t czym cnt i dlaczego =0?
//########### I/O ###########
DDRB |= (1<<LED1) | (1<<LED2); //Ustawienie pinów sterujących diodami
// jako wyjścia
Początek programu potrafię napisać jednak wolę to zapisywać szesnastkowo.
Jak zamienić tą linijkę?
DDRB = 0x01 | 0x02 (w tym przypadku bez definiowania LED1 i LED2) ?
//######## konfiguracja timera ##############
TIMSK |= (1<<TOIE0); //Przerwanie overflow (przepełnienie timera)
TCCR0 |= (1<<CS02) | (1<<CS00); // źródłem CLK, preskaler 1024
TCNT0 = timer_start;// //Początkowa wartość licznika
Takie samo pytanie o przekształcenie jak powyżej.
TIMSK |= (1<<TOIE0) oznacza włączenie przerwania od przepełnienia Timer0, zawsze zapisywana w taki sposób?
TCCR0 |= (1<<CS02) | (1<<CS00) mój preskaler 8, zostawiam taką samą wartość CS02 i CS00 dlaczego nie ma CS01
Czyli wybieram Timer0 jest on 8-bitowy
Za pomocą fusebitów ustawiłem wewnętrzny generator na 8 MHz czyli jest to sygnał click/o.
8 MHz/8 = 1 MHz
Jeden impuls trwa:
1/ f = t
1/ 1 000 000 Hz = 0,000001 s = 1 us
Timer0 generuje przerwanie w przypadku przepełnienia:
256 * 1 us = 256 us
sei(); //Globalne uruchomienie przerwań
Jak zostało to opisane: "Zmienne globalne, to zmienne dostępne w dowolnym miejscu Twojego programu. "
Przykład pokazywał:
char ilosc_koni = 5;
Tutaj mamy:
sei(); dlaczego użyto sei i nie ma nic w nawiasach?
//############ Procedura obsługi przerwania od przepełnienia timera ############
ISR(TIMER0_OVF_vect)
Do czego służy ta linijka?
cnt++; //zwiększa zmienną licznik
if(cnt>3) //jeśli 4 przerwania (czyli ok 1 s)
Jak działa cnt++, rozumiem, zę odnosi się do cnt=0 użytej na początku programu?
Rozumiem, że dopiero tutaj ustawiamy timer, czyli 4 przerwania po ok 250 ms co daje 1 s i następuje zmiana stanu?
Przerwanie to sygnał przerywający program.
-przerywa program -> przechodzi do obsługi przerwania -> powraca do przerwanego programu.
Jak to zatem działa?
250ms + 250ms + 250ms +250ms -> zmiana stanu -> 250ms + 250ms + 250ms +250ms -> zmiana stanu....
Czy 250ms trwa od 6 do 255 i kolejne liczenie (łącznie 4 cykle) czy podczas tego liczenia 6-255 odbywają się 4 przerwania?
Jak zatem ustawić zmienne w różnych odstępach czasu, np. 2s; 4s; 2s; 4s... ?
Pozdrawiam.
0