Forum: Mikrocontroller und Digitale Elektronik Timer 2 Capture Mode


von Matthias J. (xc866)


Lesenswert?

Hallo

Ich habe noch schnell eine Frage zum Timer 2 Capture Mode.
Den Prescaler habe ich auf 16 eingestellt.
fpclk ist 26,7 MHz. Das Register im Timer ist 16 BIT. Dann sollte doch
alle 0,0392s ein Interupt ausgelöst werden.
Dann hat es 8 BIT im CNTRL Register und 8 Bit im CNTRH Register.
Das heist alle 0,0392s wird das CNTRL Register um 1 Incrementiert. Das
heisst 1 Stelle im CHTRH Register sollte 10,0352s sein. Das stimmt
aber
irgendwie nicht ganz?
An was könnte das liegen?

Gruss

Code:
;-------------------------Reaktionszeitmessung-------------------------- 
----------------------------

#include <xc866.inc>

;-------------------------User
Register-------------------------------------------------------------
CNTRL equ r2     ;Counter Low Register zuweisen
CNTRH equ r3     ;Counter High Register zuweisen

;----------------------------Flag
Adressen----------------------------------------------------------
SEND_TXT_FLAG equ 020h
;----------------------------Interups----------------------------------- 
----------------------------
 JMP Start
 ORG 002Bh
 JMP THL2
 ORG 100h

;----------------------------Ports
initialisieren---------------------------------------------------
START:  MOV PORT_PAGE,#00h
MOV P3_DIR,#00000100b  ; P3.1 reset Taster Input    P3.2 LED Output
MOV P1_DIR,#00000010b  ; P1.0 Taster Input T2EX enable
MOV  PORT_PAGE,#001H
MOV  P1_PUDEN,#00000000b  ;ENABLING PULLUP
MOV  P1_PUDSEL,#00000000B
MOV PORT_PAGE,#02h
MOV P1_ALTSEL0,#00000000b  ; ALT2 einstellen für T2EX
MOV P1_ALTSEL1,#00000011b  ; ALT2 einstellen für T2EX
MOV PORT_PAGE,#000H    ; wichtig ohne das läuft nichts




;----------------------------Serielle Schnittstelle
einrichten---------------------------------------
MOV BG,#10101110b     ;174d Baudrate 9600 BAUD
MOV SCON,#01010000b    ;Modus1 und recieive einschalten
MOV BCON,#00000001b    ;bd generator einschalten
MOV FDCON,#00000000b  ;Fractional Divider Control Register

;----------------------------Timer 2 Capture
Unit----------------------------------------------------
MOV T2CON,#00001101b  ;CP/RL2=1      EXEN2=1
MOV T2MOD,#10111000b  ;T2PRE = 100 Prescaler =16 PREN=1
;EDGESEL=1    T2RHEN=1 T2REGS=1

;-----------------------------Initialisiere
Interupps------------------------------------------------
Setb ET2
Setb EA
CLR TI
;-----------------------------Programm---------------------------------- 
-----------------------------
Hauptprogramm:
           NOP
           NOP
           NOP
        NOP
           NOP
        JMP Hauptprogramm

;-----------------------------Timer2
Interuppt--------------------------------------------------------
THL2:  CLR A     ; Akku löschen
  MOV A,T2CON     ; T2CON in Akku verschieben
  XRL A,#01000000b   ; 6.Bit wechseln "das ist EXF2 Bit"
  CJNE A,#00001101b,INC_CNT  ; Ist der Interuppt durch TF2 ausgelöst,
gehe zu INC-CNT
  call SEND_TIME     ; jump send Time

INC_CNT:    INC CNTRL  ; R0 um 1 inkerementieren
      MOV A,CNTRL  ; R0 in Akku laden
      JNZ IRQ_T2_end; Wenn Akku = 0 eine Zeile weiter springen
      INC CNTRH  ; INC R1
      CLR TF2  ; Akku löschen
      RETI

;---------------------------------------
SEND_TIME:    MOV A,CNTRH
      CALL SEND
      MOV A,CNTRL
      CALL SEND
      MOV A,RC2H
      CALL SEND
      MOV A,RC2L
      CALL SEND
      CLR EXF2
      RETI


SEND:  CLR TI
        MOV SBUF,A

SEND_WAIT:    jbc ti, back
        jmp SEND_WAIT

back:    RET

IRQ_T2_end:   Clr TF2
    RETI

END

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.