Timer1
Will man mir dem Timer0 einen sekundengenauen Takt erzeugen, ist man auf spezielle Quarze angewiesen, also 3,2768 oder 4,096 MHz angewiesen. Nicht so bei Benutzung des Timer1. Hierzu stellt man im Register CCP1CON den Special Event Trigger ein (CCP1M3:CCP1M0 -> 1011). Dieser setzt nicht wie beim Auslösen des Timer1-Interrups üblich das Flag TMR1IF sondern das CCPIF!
um beispielsweise aller 8 millisec (entspricht 125 Hz) einen Interrupt zu erhalten, besetzt man CCPR1H:CCPR1L nach folgender Formel:
- Fosz/4/(prescaler1)/125Hz = 1000 (0x3E8)

;********************************************************************** ; * ; Filename: timer1.asm * ; Author: Michael Kellner * ; * ;********************************************************************** ; * ; Files required: 4 MHz * ; * ; * ; * ;********************************************************************** list p=16f628 ; list directive to define processor errorlevel 0,-302,-305 #include __CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _ER_OSC_CLKOUT & _MCLRE_ON & _LVP_ON #define Konst1sek .125 ;***** VARIABLE DEFINITIONS w_temp EQU 0x7E ; variable used for context saving status_temp EQU 0x7F ; variable used for context saving ;******************************** Eigene Register (in Registerbank 0) ************************* Flags equ 0x20 ;beinhaltet Botschaftsflags ISR -> HP Zaehler_1Sek equ 0x21 ;******************************** Bits in den eigenen Registern der Registerbank 0 ************ ; Flag1Sek equ 1 ;******************************** Portbelegung ************************************************ ;******************************** Konstanten ************************************************** ;********************************************************************** ORG 0x000 ; processor reset vector goto Beginn ; beginning of program ORG 0x004 ; interrupt vector location movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register ; isr code can go here or be located as a call subroutine elsewhere bcf STATUS,RP0 ; Wähle register page 0 btfss PIR1,CCP1IF goto no_timer_isr ; ist es timer interrupt ? decfsz Zaehler_1Sek,f ; Zaehlregister fuer 1-Sekunden-Zeitbasis um 1 vermindern goto ISRENDE bsf Flags,Flag1Sek ; Botschaftsflag setzen movlw Konst1sek ; Zaehlregister fuer den Sekundentakt mit movwf Zaehler_1Sek ; der Konstanten Konst1sek laden ISRENDE bcf PIR1,CCP1IF ; lösche "timer" interrupt flag no_timer_isr movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt ;************************************************************************************** ;********************************************************************************************** ;** Initialisierung des Prozessor: ** ;** + Comparatoreingaenge auf digitale I/O-Pins umschalten ** ;** + TMR1-ISR soll 125 mal pro Sekunde aufgerufen werden, daher Vorteiler = 8 ** ;** + Port: als Ausgaenge definieren und loeschen ** ;********************************************************************************************** INIT clrf TMR1L clrf TMR1H movlw 0x07 movwf CMCON ; disable comparators (= enable Port A 16F628) movlw 0x31 movwf T1CON ; prescaler 8, timer 1 enabled movlw 0x0b movwf CCP1CON ; compare mode, trigger special event movlw low 0x3E8 movwf CCPR1L ; Fosz/4/(prescaler)/(125Hz) movlw high 0x3E8 movwf CCPR1H bsf STATUS,RP0 ; select Register-Page 1 movlw 0x04 movwf PIE1 ; enable Compare Interrupt movlw 0x00 ; PORTB7..0 output movwf TRISB movwf TRISA bcf STATUS,RP0 ; select Register-Page 0 clrf PORTB clrf PCLATH bsf STATUS,RP0 ; select Register-Page 1 movlw 0xc0 ; Enable Peripherial Int movwf INTCON bcf STATUS,RP0 ;Registerseite 0 clrf PORTB return ;******************************** Hauptprogramm *********************************************** Beginn call INIT ;Controller initialisieren HPSCHLEIFE btfss Flags,Flag1Sek goto HPENDE incf PORTB bcf Flags,Flag1Sek HPENDE goto HPSCHLEIFE end |