Attiny13 na standardowych fusach ma 125 Khz. Reszta taktowań w dataheecie.
Z tego co pamiętam to po wyłączenia fusa DIV8 jest 1Mh, do uzyskania jeszcze 4,8Mhz i chyba 9,6Mhz.
Po co nam taktowanie?
W attiny13 masz timera 8-bitowego. Ustawiasz go, oraz wrzucasz do niego przerwanie (po zakończeniu zliczania - przepełnienie licznika = przerwanie). Ta wiedza jest dostępna w pierwszym lepszym tutorialu pod Atmegi. W Attiny tylko zmieniasz nazwy rejestrów zgodnie z dokumentacją i dedukcją logiczną i wszystko powinno działać jak należy
W przerwaniu ustawiasz licznik jako zmienną volatile, która informuje Cię kiedy należy zmienić poziom na wyjściu.
Przykład:
Ogólny wzór:
(H * T) / (L * D)
= wartość zmiennej przy której należy zmienić poziom na porcie.
H
- częstotliwość (hertze)
T
- czas (sekundy)
L
- ilość taktów w timerze (256 dla 8-bitowego)
D
- dzielnik
Dla 125 Khz czyli 125 000 Hz i dzielniku na timerze równym 1024, mamy obliczenia typu:
(125000 * 60) / (256 * 1024) = 28.6102294921875
Jak widać liczba nie jest pełna. Należy policzyć dla niej resztę:
((125000 * 60) - (1024 * 256 * 28)) = 159968
Sprawdzamy czy reszta jest dobrze policzona (reszta / (1024 * 256)
):
159968.0 / 262144.0 = 0.6102294921875
Czyli wszystko się zgadza. Resztę należy podzielić przez dzielnik (1024)
159968.0 / 1024.0 = 156.21875
Otrzymamy ilość taktów w ostatnim przejściu dla rejestru TCNT0. Jako że maksymalna liczba dla TCNT0 to 256, a my potrzebujemy 156, to należy tą różnicę dodać przy ostatnim takcie przed zmianą wartości. Czyli należy dodać 100. Skomplikowane?
Pseudo kod:
port_wysoki();
volatile zmienna = 0;
inicjuj_timer();
wlacz_przerwania();
while(1);
przerwanie(){
zmienna ++;
if(zmienna == 28){
TCNT0 += 100;
}else if(zmienna > 28){
zmienna = 0;
port_zmien_stan();
}
}
Można też jak człowiek podpiąć zewnętrzny kwarc zegarkowy lub podobny, który jest podzielny przez potęgi liczby 2.
Np: 32756
, wtedy obliczenia są trywialne i 32768.0 / 64.0 / 256 = 2.0
(taktowanie / dzielnik na timerze / pojemnosc timera = ilosc przerwan do zmiany poziomu na porcie dla jednej sekundy). Aby podpiąć taki kwarc do attiny trzeba zrobic generator, ponieważ attiny przyjmuje sygnał zewnętrzny tylko "jednopinowo".