Serwis Edukacyjny
Nauczycieli

w I-LO w Tarnowie
obrazek

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu
 mgr Jerzy Wałaszek
Konsultacje:
Wojciech Grodowski
mgr inż. Janusz Wałaszek

©2026 mgr Jerzy Wałaszek

obrazek

Mikrokontrolery

Rodzina średnia PIC

PIC12F629/675

Moduł Timera 0


obrazek

Educational and Non-Profit Use of Copyrighted Material:

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s permission is not required when using copyrighted material in: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI KONSERWACJA
Podrozdziały

Działanie Timera 0

Moduł Timera/Licznika 0 posiada następujące cechy:

Rys.4-1 jest schematem blokowym modułu Timera 0 oraz preskalera współdzielonego z WDT (ang. Watch Dog Timer - timer licznika zegarowego).

Rys.4-1 Schemat blokowy Timera 0/Preskalera WDT

Uwaga:   T0SE, T0CS, PSA, PS0-PS2 są bitami rejestru OPTION_REG.

Działanie Timera 0

Tryb Timera zostaje wybrany przez wyzerowanie bitu T0CS (OPTION_REG[5]). W trybie tym moduł Timera 0 będzie zwiększał swój stan przy każdym cyklu instrukcji (bez preskalera). Jeśli rejestr TMR0 zostanie zapisany, to zwiększanie jest wstrzymywane przez dwa następne cykle instrukcji. Użytkownik może ominąć to zapisując odpowiednio poprawioną wartość do rejestru TMR0.

Tryb licznika jest wybierany przez ustawienie na 1 bitu T0CS (OPTION_REG[5]). W tym trybie moduł Timera 0 będzie zwiększał swój stan albo przy każdym narastającym lub opadającym zboczu sygnału na końcówce GP2/T0CKI. Zwiększające zbocze określane jest przez stan bitu kontrolnego T0SE (OPTION_REG[4]). Wyzerowanie bitu T0SE wybiera zbocze narastające.


do podrozdziału  do strony 

Przerwanie od Timera 0

Przerwanie od Timera 0 jest generowane, gdy rejestr TMR0 przepełnia się, czyli zmienia swój stan z wartości FFh (255) na 00h. To przepełnienie ustawia bit T0IF (INTCON[2]). Przerwanie można maskować przez wyzerowanie bitu T0IE (INTCON[5]). Bit T0IF musi być zerowany programowo w procedurze obsługi przerwania z modułu Timera 0, zanim przerwanie będzie mogło być uaktywnione. Przerwanie od Timera 0 nie może wybudzać procesora, ponieważ podczas uśpienia timer jest wyłączony.

do podrozdziału  do strony 

Używanie Timera 0 z zegarem zewnętrznym

Gdy nie jest używany preskaler, sygnał wejściowy zegara zewnętrznego jest tym samym, co sygnał wyjściowy z preskalera. Synchronizacja sygnału końcówki T0CKI z wewnętrznymi zegarami fazy jest dokonywana poprzez próbkowanie wyjścia preskalera w taktach Q2 i Q4 wewnętrznych zegarów fazy. Dlatego konieczne jest, aby końcówka T0CKI znajdowała się w stanie wysokim i niskim przez okres co najmniej 2TOSC (z małym opóźnieniem RC 20 ns). Zobacz do parametrów elektrycznych mikrokontrolera.
REJESTR OPTION_REG (ADRES: 81h)
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
GPPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
b7 b6 ... b1 b0
Legenda
R = bit odczytywalny W = bit zapisywalny     U = bit niezaimplentowany, daje odczyt '0'
-n = wartość przy POR     ‘1’ = bit ustawiony ‘0’ = bit wyzerowany     x = bit o nieznanym stanie
bit 7      GPPU: bit włączający oporniki podciągające w GPIO
1 = oporniki podciągające wyłączone w porcie GPIO
0 = oporniki włączone przez indywidualne wartości zatrzasków portu GPIO
bit 6   INTEDG: bit wyboru zbocza przerwania
1 = przerwanie przy narastającym zboczu na końcówce GP2/INT
0 = przerwanie przy opadającym zboczu na końcówce GP2/INT
bit 5   T0CS: bit wyboru źródła zegarowego timera TMR0
1 = zmiana poziomu logicznego na końcówce GP2/T0CKI
0 = wewnętrzny zegar cyklu rozkazowego (CLKOUT)
bit 4   T0SE: bit wyboru zbocza źródła timera TMR0
1 = zwiększenie stanu TMR0 przy przejściu ze stanu wysokiego w niski na końcówce GP2/T0CKI
0 = zwiększenie stanu TMR0 przy przejściu ze stanu niskiego w wysoki na końcówce GP2/T0CKI
bit 3   PSA: bit przypisania preskalera
1 = preskaler przypisany do timera licznika zegarowego WDT
0 = preskaler przypisany do modułu TIMER0
bity 2-0   PS2:PS0: bity wyboru podziału preskalera
Wartość bitów Podział dla TMR0 Podział dla EDT
000
001
010
011
100
101
110
111
1 : 2    
1 : 4    
1 : 8    
1 : 16  
1 : 32  
1 : 64  
1 : 128
1 : 256
1 : 1    
1 : 2    
1 : 4    
1 : 8    
1 : 16  
1 : 32  
1 : 64  
1 : 128

do podrozdziału  do strony 

Preskaler

Jako preskaler dla modułu Timera 0 dostępny jest 8-bitowy licznik, który również jest preskalerem Timera Licznika Zegarowego. Dla prostoty w tej instrukcji licznik ten będziemy nazywać "preskalerem". Przydział preskalera kontrolowany jest programowo przez bit sterujący PSA (OPTION_REG[3]). Wyzerowanie bitu PSA przydzieli preskaler  do Timera 0. Wartości preskalowane ustawiane są poprzez bity PS2:PS0 (OPTION_REG[2:0]).

Samego preskalera nie można odczytywać ani zapisywać. Po przydzieleniu go do modułu Timera 0 wszystkie instrukcje zapisu do rejestru TMR0 (np. CLRF 1, MOVWF 1,
BSF 1, x....itd.)
spowodują wyzerowanie preskalera. Po przydzieleniu preskalera do WDT (ang. Watch Dog Timer, Timer Licznika Zegarowego) instrukcja CLRWDT wyzeruje preskaler wraz z Timerem Licznika Zegarowego.

Zmiana przydziału preskalera

Przydział preskalera znajduje się w całości pod kontrolą programu (tzn. można go zmieniać "w locie" podczas wykonywania programu). Aby uniknąć niezamierzonego resetu mikrokontrolera, należy wykonać poniższą sekwencję instrukcji przy zmianie przydziału preskalera z Timera 0 na WDT:

Przykład 4-1: Zmiana preskalera (Timer 0 → WDT)
    BCF STATUS,RP0    ;Bank 0
    CLRWDT            ;Zeruj WDT
    CLRF TMR0         ;Zeruj TMR0
                      ;i preskaler
    BSF STATUS,RP0    ;Bank 1
    MOVLW b’00101111’ ;Wymagane, jeśli
    MOVWF OPTION_REG  ;PS2:PS0 ma mieć
    CLRWDT            ;stan 000 lub 001
    ;
    MOVLW b’00101xxx’ ;Ustaw preskaler na
    MOVWF OPTION_REG  ;pożądany podział
    BCF STATUS,RP0    ;Bank 0

Aby przełączyć przydział preskalera z modułu WDT na moduł Timera 0, użyj sekwencji rozkazów z przykładu poniżej. Ostrożność tę należy podjąć, nawet gdy moduł WDT jest wyłączony.

Przykład 4-2: Zmiana preskalera (WDT → Timer 0)
    CLRWDT            ;Zeruj WDT wraz z
                      ;preskalerem
    BSF STATUS,RP0    ;Bank 1
    MOVLW b’xxxx0xxx’ ;Wybierz TMR0,
                      ;preskaler oraz
                      ;źródło zegara
    MOVWF OPTION_REG  ;
    BCF STATUS,RP0    ;Bank 0
Tablica 4-1: Rejestry powiązane z modułem Timera 0
Adres Nazwa Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Po POR, BOD Po pozostałych Resetach
01h TMR0 Rejestr modułu timera 0 xxxx xxxx uuuu uuuu
0Bh/8Bh INTCON GIE PEIE T0IE INTE GPIE T0IF INTF GPIF 0000 0000 0000 000u
81h OPTION_REG GPPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111
85h TRISIO TRISIO5 TRISIO4 TRISIO3 TRISIO2 TRISIO1 TRISIO0 --11 1111 --11 1111
Legenda:   — = niezaimplementowany bit, daje odczyt ‘0’, u = stan niezmieniony, x = stan nieznany, szare = niezaimplementowane.
    Szare tło oznacza bity nieużywane przez moduł Timera 0.

do podrozdziału  do strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2026 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.