Forum: Mikrocontroller und Digitale Elektronik capture pic 16f88


von Sabine M. (zizo)


Lesenswert?

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

von Enrico L. (zassi)


Lesenswert?

hat dir schon wer helfen können?

von Edi (Gast)


Lesenswert?

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.

von Enrock J. (Firma: studi) (enrock)


Lesenswert?

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