tryb ctc timer w bascom jak to zrobic
Timer0
, Timer1
, Timer2
…), CTC
(najprościej: Config Timerx = Ctc …
lub ręczna zmiana bitów WGM), ComparexA
/OCRxA
, Compare Match
, TCCRnA/B
, OCRnA
, TIMSKn
. Timer zlicza od 0
do OCRxA
, po czym automatycznie zeruje licznik TCNTx
i – jeśli odblokowane – podnosi flagę/wyzwala przerwanie OCFxA
. Pozwala to uzyskać interwał czasowy nieograniczony maksymalną wartością licznika, lecz definiowany dowolnie przez użytkownika.
Przy zegarze \(F_{CPU}=16\;\text{MHz}\) i żądanym przerwaniu co \(10\;\text{ms}\) (\(f_{interwału}=100\;\text{Hz}\)) testujemy kolejne preskalery, aż \(OCR\) zmieści się w zakresie timera (255 dla 8-bit., 65535 dla 16-bit.). Przykładowo dla Timer1:
Preskaler 64 → \(OCR=\dfrac{16\,000\,000}{64\times100}-1=2499\).
a) Najprostszy (BASCOM makro):
$regfile = "m328pdef.dat"
$crystal = 16000000
Config Timer1 = Ctc , Prescale = 64 , Compare A = Toggle 'auto-zerowanie
Compare1a = 2499 '10 ms
On Compare1a Tick_10ms
Enable Compare1a
Enable Interrupts
Do : Loop
Tick_10ms:
'kod ISR
Return
b) Ręczna konfiguracja rejestrów (gdy potrzebny nietypowy wariant):
TCCR1A = &B00000000 'WGM11=0, WGM10=0
TCCR1B = &B00001011 'WGM12=1 (CTC) + CS11|CS10 = 64
OCR1A = 2499
TIMSK1.1 = 1 'OCIE1A
Enable Interrupts
c) 8-bitowy Timer0 – impulsy 1 kHz na wyjściu OC0A:
Config Portd.6 = Output 'OC0A (ATmega328P)
Config Timer0 = Ctc , Prescale = 8 , Compare A = Toggle
Compare0a = 199 ' (16 MHz/8)/(2*1000) – 1
(W trybie Toggle uzyskujemy 50 % wypełnienia, połowę częstotliwości klatkowania).
Enable Interrupts
). OCR
dla timera 8-bit. OCFx
przy obsłudze “pollingowej”.Compare A = Toggle / Set / Clear / Disconnect
steruje sprzętowym pinem OCnx, dzięki czemu można generować sygnał bez obciążania CPU. Brak szczególnych kwestii etycznych; warto pamiętać o zgodności z normami EMC, a w urządzeniach medycznych wymagana jest walidacja dokładności zegara.
CompareB
) lub osobny licznik. Clear Timer = On
). Tryb CTC w BASCOM konfigurujesz, ustawiając odpowiednie bity WGM, preskaler i OCRxA
. Pozwala to na precyzyjne interwały czasowe lub generację sygnału na pinie OCx. Korzystaj z makra Config Timer
dla prostoty lub ręcznie ustaw rejestry, gdy potrzebujesz pełnej kontroli. Prawidłowo dobrany preskaler i wartość OCR gwarantują dokładność – wzór \(\dfrac{F_{CPU}}{\text{Preskaler}\cdot f}-1\) jest tu kluczowy.