TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: sylar7112 en 17 de Marzo de 2012, 21:25:18

Título: Problema con un conteo PIC16F628a
Publicado por: sylar7112 en 17 de Marzo de 2012, 21:25:18
Hola! necesito ayuda con un programa que no he logrado hace, espero alguno de ustedes me pueda ayudar.

Necesito hacer un programa en PBP para el PIC16F628a que, cuando un sensor sense algo, envíe un 1 al PIC y encienda un LED, y si después de 5 segundos no vuelve a recibir un 1 del sensor, el LED se apague, pero si antes de que pasen los 5 seg el sensor emite otro 1, el LED sigua encendido y el conteo de los seg se reinicie.

¿Esto se puede hacer con los timers integrados del PIC o es de otra forma?

Muchas Gracias
Título: Re: Problema con un conteo PIC16F628a
Publicado por: Suky en 17 de Marzo de 2012, 23:53:08
Sencillo!  :mrgreen: Sensas el pin y al detectarse un flanco ascendente enciendes en LED y habilitas un timer configurado para que a los 5 seg apague el led. Vas a necesitar una variable adicional para contar varios overflow del timer.

Después, si vuelves a detectar un flanco ascendente y el timer esta contando, entonces reseteas la cuenta...


Saludos!
Título: Re: Problema con un conteo PIC16F628a
Publicado por: jorsss en 20 de Marzo de 2012, 09:50:35
Hola sylar7112 como va?? aca te dejo un programa que hice que resolveria tu problema, el tema es que esta en ASM ya que no soy muy partidario del PBP el programa funciona conectando el sensor en Rb0 y el LED en Rb1
El programa corre con un cristal de 4MHz en caso de usar otro hay que cambiar los retardos....

Código: [Seleccionar]
#INCLUDE <P16F628>
LIST P=16F628
ERRORLEVEL -302

#DEFINE LED_OFF BCF PORTB, 1
#DEFINE LED_ON BSF PORTB, 1
#DEFINE SENS PORTB, 0

CBLOCK
COUNT ;Contador
W_TEMP ;Guardo el valor de W ante las interrupciones
ST_TEMP ;Guardo el valor de STATUS ante una interrupcion
ENDC

V_REG ORG 0x000 ;Vector de reset en la direccion 0 del programa
GOTO INICIO ;Se dirige a la etiqueta INICIO
ORG 0x004 ;Vector de interrupciones, lo redirecciona a la
GOTO INTER ;etiqueta Inter

;Configuracion del micro

INICIO
MOVLW 0x007 ;Apaga el comparador
MOVWF CMCON
BSF STATUS, RP0
MOVLW 0x000 ;Declara el puerto A como salida digital
TRISA
MOVLW 0x001
MOVWF TRISB ;Unicamente Rb0 es tomado como entrada (sensor)
MOVLW 0x0C7
MOVWF OPTION_REG ;Configuro el TMR0 y el flanco de interrupcion
MOVLW 0x090 ;Configuro las interrupciones...
MOVWF INTCON ;inicialmente solo existe RB0
BCF STATUS, RP0
MOVLW 0x0C4 ;Cargo previamente el TMR0 para generar un retardo
MOVWF TMR0 ;de 50ms (50ms x 100 = 5s)
CLRF PORTB
BUCLE NOP ;bucle infinito
GOTO BUCLE

programa de interrupciones

INTER
MOVWF W_TEMP
SWAPF STATUS, W
MOVWF ST_TEMP
BTFSC INTCON, T0IF
GOTO CLK
BTFSC INTCON, INTF
GOTO SENSOR

SALE_IN
SWAPF ST_TEMP, W
MOVWF STATUS
BCF INCTON, T0IF
BCF INCTON, INTF
BCF INTCON, RBIF
MOVF W_TEMP, W
RETFIE

;----------------------------------------------------
;Interrupcion por TMR0:
;Basicamente se interrumpe cada 50ms
;y carga un contador hasta 100, al llegar a 100
;el micro sabe que pasaron los 5 segundos
;lo que apaga el led indicador
;----------------------------------------------------

CLK
MOVLW
MOVWF TMR0
MOVLW .100
XORWF COUNT, W
BTFSS STATUS, Z
GOTO INC_CLK
LED_OFF
BCF INTCON, T0IE
CLRF COUNT
GOTO SALE_IN
INC_CLK
INCF COUNT, F
GOTO SALE_IN

;-----------------------------------------------------
;Interrupciones por Rb0:
;Aqui el micro detecta que el sensor emite un "1"
;lo que configura el TMR0 para los 5segundos
;encendiendo el LED indicador
;por cada interrupcion, pondra el contador en 0
;para iniciar de nuevo la cuenta de 5s
;-----------------------------------------------------
SENSOR
MOVLW 0x0C4
MOVWF TMR0
BSF INTCON, T0IE
CLRF COUNT
LED_ON
GOTO SALE_IN
        
        END                                   ;Fin del programa


Si nunca trabajaste en ASM no te preocupes simplemente pega este codigo en MPLAB y compilalo, te generara el *.hex el cual luego colocas en el micro.... NO OLVIDES configurar los switch o fusibles del micro....  :-)

Ojala te sea de ayuda mi aporte. Saludos!!