Proyecto Anemómetro. Tacometro con CCP1 del PIC16f877

Hola a todos.

Os expongo una pequeña duda respecto a este proyecto.

Estoy tratando de realizar un anemómetro como parte del proyecto final de carrera. Para ello uso un CNY70 sobre un eje accionado por un anemómetro de cazoletas. El CNY70 envía pulsos en función de la velocidad de giro que introduzco al pic por RC2/CCP1 (patilla17).

Mediante TIMER1 mido el periodo de la señal entre dos flancos de subida (rissing edge). Para comprobar la existencia de viento minimo, compruebo el desbordamiento del contador de timer1 (en ese caso almaceno 255 en Msb y Lsb) y si no desborda, continúa la cuenta. Cuando se produce el segundo flanco de subida, almaceno el valor de CCPR1H y CCPR1L en Msb y Lsb respectivamente.


Bien, ésta es mi pregunta. Al conectarlo a Labview, siempre recibo 255. He depurado en MPLab el software y parece funcionar correctamente y por otro lado, en CCP1 recibo correctamente los pulsos del sensor.


¿que puede estar pasando? ¿por que no funciona correctamente?


Os dejo la programación por si veis algo que se me esté pasando.

Muchas Gracias por adelantado.


Código:
; **** Encabezado ****
   list    p=16f877; directiva que define al microcontrolador
   #include   <p16f877.inc>   ; definiciones de variables especificas del microcontrolador
   __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _LVP_OFF

;**** Definicion de variables ****
Msb      equ    0x20   ; Guarda Byte alto de Captura para enviar por RS232
Lsb          equ    0x21   ; Guarda byte bajo de Captura para enviar por RS232
Contador1   equ    0x22   ; Para demora
Contador2   equ    0x23   ; Para demora
;**** Definiciones para el ensamblador ****

;**** Definición de macros ****
; Se envia la data de un registro a PC.-
Putreg   macro   Registro
   movfw   Registro
   call   RS232_EnviaDato
   endm

;/////////////////////////////////
;**** Inicio del Micro ****
Reset.   
   org    0x00    ; Aquí comienza el micro.-
   goto   Inicio    ; Salto a inicio de mi programa.-
   
; **** Programa Principal ****
   org    0x05

Inicio
   bsf    STATUS,RP0   ; Banco 1
   movlw   b'11101111'
   movwf   TRISC
   movlw     b'00100100'      ; Configuración USART
   movwf  TXSTA         ; y activación de transmisión
   movlw   .25            ; 9600 baudios
   movwf   SPBRG         
   bsf        TXSTA,TXEN ; Habilita transmision
   bcf       STATUS,RP0   ; Banco 0.-
   bsf       RCSTA,SPEN ; Habilitacion puerto serie

   movlw   b'00110001'   ; Se selecciona TMR1, preescaler de 1/8, modo temporizador.-
   movwf   T1CON
   movlw   b'00000101'   ; Se configura CCP modo captura cada flanco de subida.-
   movwf   CCP1CON
Bucle
   bcf       PIR1,CCP1IF   ; Borramos bandera 
pto1
    btfss   PIR1,CCP1IF   ; Testeamos bandera.-
   goto   desborde1      ; No se activo. Comprobamos desbordamiento
   bcf      PIR1,CCP1IF   ; Se activo, la borramos.-
   clrf      TMR1H    ; Borramos Timer1.-   
   clrf      TMR1L    ; 

pto2
   btfss   PIR1,CCP1IF   ; Volvemos a testear bandera.-
   goto   desborde2      ; No se activo, comprobamos desbordamiento
   movfw   CCPR1L    ; Copiamos el valor capturado.-
   ;addlw   0x30
   movwf   Lsb
   movfw   CCPR1H   
;   addlw   0x30
   movwf   Msb
   bsf      PORTC,4
   goto    marcado

desborde1
   btfss   PIR1,TMR1IF   ; Testeamos bandera desbordamiento TRM1.-
   goto   pto1
   movlw   .255
   movwf   Lsb
   movwf   Msb
   goto    marcado

desborde2
   btfss   PIR1,TMR1IF   ; Testeamos bandera desbordamiento TMR1.-
   goto   pto2
   movlw   .255
   movwf   Lsb
   movwf   Msb
   goto    marcado

marcado
   Putreg   Msb    ; Enviamos lo guardado en el registro Msb.-
   Putreg   Lsb    ; Enviamos lo guardado en el registro Lsb.-
;   call   Demora_30ms
    goto   Bucle    ;
;..............................................
;**** Rutinas ****
;**** Se envia Dato ****
RS232_EnviaDato
   bsf       STATUS,RP0   ; Banco 1
   btfss   TXSTA,TRMT  ; chequea si esta listo
   goto   $-1    ; Esperamos  a que se desocupe.-
   bcf       STATUS,RP0 ; Banco 0
   movwf   TXREG ; envia Dato.-
   return
;...............................................
; *** Demora****
Demora_30ms
   movlw   0xFF    ; 
   movwf   Contador1    ; Iniciamos contador1.-
Repeticion1
   movlw   0xC3    ; 
   movwf   Contador2    ; Iniciamos contador2
Repeticion2
   decfsz   Contador2,1    ; Decrementa Contador2 y si es 0 sale.-   
   goto   Repeticion2    ; Si no es 0 repetimos ciclo.-
   decfsz   Contador1,1    ; Decrementa Contador1.-
   goto   Repeticion1    ; Si no es cero repetimos ciclo.-
   return              ; Regresa de la subrutina.-
;...............................................
   end

problema solucionado.

En esta version había eliminado las interrupciones por timer1 y CCP1 y no me habia dado cuenta. A demás tenia algún problemilla con los bancos de trabajo asi que no actuaba en los registros deseados.
 
Última edición por un moderador:
Atrás
Arriba