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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.