hallo, ich wollte mit meienem Pic die Zeit von vier Impulse messen, dafür habe ich ein testplatinemit zwei LEDs zusammengebaut. Pin 0 PORTA mit rote LED und mit RB0 verbunden. ich erzeuge ander Pin 0 PORTA vier Impulse, dh. die rote LED leuchtet vier mals, dann messe ich die Zeitdauer von diesen Impulsen, und speichere die Ergebnisse unter ergebnisl und ergebnish, dann sollte die zweite LED (LED1) einmal blinken. das problem funktioniert das nicht, und ich finde die fehler in mein code nicht, kann mir jemand helfen. #include <P16F88.inc> LED equ 0 LED1 equ 1 Wait1 equ 0x25 Wait2 equ 0x26 RB0 equ 0 ergebnisl equ 0x21 ergebnish equ 0x22 W_TEMP equ 0x70 STATUS_TEMP equ 0x31 PCLATH_TEMP equ 0x72 org 0x0000 ERRORLEVEL -302 ; __CONFIG _CONFIG1, _PWRTE_ON & _WDT_OFF & _CCP1_RB0 ; goto capture org 0x04 Interrupt MOVWF W_TEMP ;Copy W to TEMP register SWAPF STATUS, W ;Swap status to be saved into W CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0 MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register MOVF PCLATH, W ;Only required if using page 1 MOVWF PCLATH_TEMP ;Save PCLATH into W CLRF PCLATH ;Page zero, regardless of current page ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;btfss PIR1, CCP1IF clrf ergebnisl clrf ergebnish bcf STATUS, RP0 movfw CCPR1H movwf ergebnish movfw CCPR1L movwf ergebnisl bsf PORTA,LED1 nop nop nop nop nop nop bcf PORTA, LED1 ; ; int_done ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOVF PCLATH_TEMP, W ;Restore PCLATH MOVWF PCLATH ;Move W into PCLATH SWAPF STATUS_TEMP, W ;Swap STATUS_TEMP register into W ;(sets bank to original state) MOVWF STATUS ;Move W into STATUS register SWAPF W_TEMP, F ;Swap W_TEMP SWAPF W_TEMP, W ;Swap W_TEMP into W bcf PIR1,TMR1IF ; Timer1 Überlaufflag löschen bcf PIR1,CCP1IF ; Interupt-Flag löschen movlw 0x00 movwf TMR1L ; Timer 1 zurücksetzen movwf TMR1H movwf CCPR1H movwf CCPR1L retfie capture bcf STATUS, RP0 clrf CCP1CON movlw b'00000100' movwf CCP1CON TIMER1 bsf STATUS, RP0 bsf TRISB, RB0 BCF STATUS, RP0 movlw b'00000001' movwf T1CON movlw 0x00 movwf TMR1L ; Timer 1 zurücksetzen movwf TMR1H Main bsf STATUS, RP0 movlw 0x00 movwf TMR1L ; Timer 1 zurücksetzen movwf TMR1H movwf CCPR1H movwf CCPR1L bsf STATUS, RP0 bcf OSCTUNE, 0x00 movlw b'0000110' movwf OSCCON clrf INTCON movlw 0x00 movwf ANSEL bcf TRISA, LED bcf TRISA,LED1 bcf STATUS, RP0 ;Bank 0 bsf PORTA, LED ;LED leuchtet call Warten ;zum Unterprogramm; bcf PORTA, LED ;LED leuchtet nicht call Warten ;zum Unterprogramm; bsf STATUS, RP0 bsf PIE1, CCP1IE bsf INTCON, PEIE ;Interrpt erlauben bsf INTCON, GIE goto Main Warten ;Wartezeit initialisierung movlw 0x25 movwf Wait2 loop2 movlw 0x25 ;Wartezeit initialisierung movwf Wait1 loop decfsz Wait1,1 goto loop decfsz Wait2,1 goto loop2 retlw .0 end
Zwar habe ich mich nicht tiefer in den Sourcecode vertieft, aber was mir auf Anhieb aufgefallen ist: Die Zeit, die LED1 leuchtet, wird offenbar nur durch die 6 NOPs bestimmt. Das ist viiiiiel zu kurz, das wird man nie sehen. Ich würde allerdings die Zeit in der ISR nicht einfach länger machen, die ISR sollte so kurz wie möglich sein.
Servus, die nop-operation ist auf jeden Fall zu kurz. Teste doche infach mal ob die LED an bleibt, wenn du diese nicht wieder zurück setzt. Gruß
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.