Navigation: Home » Elektronik » Timer1
letzte Aktualisierung: 12.07.2010 

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:


Timer1
;**********************************************************************
;                                                                     *
;      Filename:      timer1.asm                                      *
;      Author:      Michael Kellner                                   *
;                                                                     *
;**********************************************************************
;                                                                     *
;      Files required: 4 MHz                                          *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************

    list    p=16f628 ; list directive to define processor
    errorlevel  0,-302,-305
    #include   ; processor specific variable definitions

    __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



↑ nach oben