Page 33 - Microcontrolere - Indrumator de laborator
P. 33
; registrul TMR2 se găsește în același bank de
; memorie cu registrul T2CON și PIE1
CLRF T2CON ; T2CON este resetat
MOVLW b'1111011'
MOVWF T2CON ; se alege un factor de prescalare de 1:16 și un
; factor de postscalare tot de 1:16 presupunând
; frecvența semnalului de tact de 4 MHz
BANKSEL(PIE1)
BSF PIE1, 1 ; validarea la nivel periferic a întreruperii
; modulului de temporizare Timer2
BSF INTCON, 7 ; sau BSF INTCON, GIE
BANKSEL(T2CON)
BSF T2CON, 2 ; sau BSF T2CON, TMR2ON
; se pornește modul Timer2
loop: BTFSS PIR1, 1 ; sau BTFSS PIR1, TMR2IF
; se așteaptă cererea de întrerupere de la Timer2
GOTO loop
...
rdi: BCF INTCON, 7
; după caz, urmează salvarea contextului care depinde de context
BANKSEL(STATUS_TEMP)
MOVWF W_TEMP ; W este salvat într-un registru temporar
SWAPF STATUS, W ; Operația SWAP între STATUS și W
; fără să fie afectați biții de stare
MOVWF STATUS_TEMP; Rezultatul operației SWAP este
; salvat în registrul STATUS_TEMP
...
; se va indica rutina care deservește întreruperea, în cazul de față TMR2IF
...
; dacă a fost salvat contextul înainte de deservirea cererii de întrerupere
; are loc refacerea acestui context
; salvarea contextului este opțională, depinde de aplicație
; PC este reîncărcat în mod automat cu adresa de pe vârful stivei
BANKSEL(STATUS_TEMP)
SWAPF STATUS_TEMP, W ; Operația inversă SWAP salvată
; în registrul W
MOVWF STATUS ; Conținutul lui W este salvat în
; registrul STATUS
MOVF W_TEMP, 0 ; informația din registrul W_TEMP este
; readusă în registrul W
BANKSEL(PIR1, 1)
BCF PIR1, 1 ; se șterge bitul TMR2IF pentru a putea
; să indice o nouă întrerupere
30