16F628A con comportamiento extraño

Hola

Tengo una placa que tiene un 16F628A el que program=E9 para que realice una secuencia de acciones que derivan en una llamada telef=F3nica en respuesta a un flanco descendente por RB0

Esto es as=ED:

RB0 est=E1 inicialmente en alto Al cambiar de estado, (ante el flanco descendente) Espero 2 segundos para prevenir el rebote Pongo un alto en RB1 por 1 seg (clear del movil) Pongo un alto en RB2 (redial del movil)

Grabo el pic con ID-Prog: Oscilador IntRC I/O WDT desactivado PWRT desactivado MCLR activado (tambi=E9n prob=E9 desactivado) BODEN activado LVP activadoCPD y CP activados el resto,todo por defecto.

El problema que tengo desde hace mas de un mes, es que a veces,cuando el pic se energiza cumple con su tarea tal cu=E1l lo programe, pero a veces,cuando se energiza, no hace nada.

Cuando lo compil=E9, lo tuve que hacer en modo debug, por que como release se negaba a funcionar.

No uso temporizadores por que me resultaron muy engorrosos a la hora de escribir el c=F3digo para contar varios segundos, demasiadas interrupciones para atender.

Este es el c=F3digo:

;------------------- CABECERA -------------------

list P=3D16F628A #include

;------------------ VARIABLES ------------------- ; variables internas del temporizador cnta equ 0x22 cntb equ 0x23 cntc equ 0x24 ;------------------------------------ CuentaTmprz equ 0x25 ; segundos que cuenta del temporizador EstTmprz equ 0x26 ; temporizador =3D 0 : inactivo / 1 : activo

;----------------- DIRECCIONES ------------------

org 0x00 goto Inicio org 0x04 goto SDI org 0x05

;-------------------- INICIO --------------------

Inicio bsf STATUS,RP0 ; cambio al banco 1 --------- movlw 0x01 ; habilito solamente el RB0... movwf TRISB ; en el PORTB, como entrada bcf OPTION_REG,INTEDG ; flanco descendente para RB0 IniCont bcf STATUS,RP0 ; vuelvo al banco 0 ---------

movlw 0x90 ; cargo w con 10010000... movwf INTCON ; ...para habilitar GIE y INTE clrf PORTB ; limpio PORTB

goto Dormir

;----------------- INTERRUPCI=D3N -----------------

SDI call CambFlnc ; cambia el flanco de la interrupci=F3n btfss PORTB,0 ; =BFes descendente? (1 ascendente y continua) call SDIPreTmprz ; no, entonces llama al temporizador btfsc EstTmprz,0 ; =BFel temporizador est=E1 activo? call ClrRedial ; est=E1 activo, llama a Clear y Redial goto SDIFin

SDIFin bcf INTCON,INTF ; borro la bandera de la int retfie

SDIPreTmprz call ResetTmprz movlw 0x02 movwf CuentaTmprz call Temporiz return

;- - - - - - - - - Clear y Redial - - - - - - - -

ClrRedial btfsc PORTB,0 return bsf PORTB,1 ; activo clear movil call Bucle ; bucle de 1 seg y medio bcf PORTB,1 ; desactivo clear movil

call Bucle

bsf PORTB,2 ; inicia Redial ------- movlw 0x06 ; cuenta 5 seg... movwf CuentaTmprz ; ...y llama... call Tmprz ; ...al temporizador bcf PORTB,2 ; finaliza Redial ----- clrf EstTmprz call ResetTmprz

return

;-------------------- Dormir --------------------

Dormir nop goto Dormir

;------------ Cambia el flanco de RB0 ----------- ; si esta en descendente tengo que contar y discar ; si esta en ascendente tengo que parar todo CambFlnc bsf STATUS,RP0 ; cambio al banco 1 --------- btfsc OPTION_REG,INTEDG ; =BFes descendente? goto cmbAFlDsc ; cambia a flanco descendente goto cmbAFlAsc ; cambia a flanco ascendente

cmbAFlDsc call ResetTmprz bcf OPTION_REG,INTEDG ; flanco descendente para RB0 bcf STATUS,RP0 ; vuelvo al banco 0 --------- return

cmbAFlAsc bsf OPTION_REG,INTEDG ; flanco descendente para RB0 bcf STATUS,RP0 ; vuelvo al banco 0 --------- call ResetTmprz return

;----------------- Temporizador ----------------- ;################################################ ; USO: ########################################## ; movlw 0x05 ; cuenta 4 seg... ; movwf CuentaTmprz ; ...y llama... ; call Temporiz ; ...al temporizador ;################################################

;----------- Resetea el temporizador ------------

ResetTmprz clrf EstTmprz ; anula el temporizador clrf CuentaTmprz ; pone a cero las variables... clrf EstTmprz ; ...del temporizador clrf cnta clrf cntb clrf cntc return

Temporiz incfsz CuentaTmprz,1 goto Tmprz return

Tmprz bsf EstTmprz,0 decfsz CuentaTmprz,1 goto tmprzA return tmprzA btfss EstTmprz,0 return call Bucle goto Tmprz

;-------------------- Bucle --------------------- ;#### llamar a Bucle para contar un segundo ##### Bucle btfss EstTmprz,0 return movlw 0x04 movwf cnta movlw 0x09 movwf cntb movlw 0x96 movwf cntc call Cont return

;--------------------- Cont ---------------------

Cont btfss EstTmprz,0 return call DecrB decfsz cnta,1 goto Cont return

DecrB btfss EstTmprz,0 return call DecrC decfsz cntb,1 goto DecrB return

DecrC btfss EstTmprz,0 return decfsz cntc,1 goto DecrC return

;################################################ ;------------------------------------------------ end ;------------------------------------------------

Reply to
LucasBols
Loading thread data ...

Hola

Tengo una placa que tiene un 16F628A el que program=E9 para que realice una secuencia de acciones que derivan en una llamada telef=F3nica en respuesta a un flanco descendente por RB0

Esto es as=ED:

RB0 est=E1 inicialmente en alto Al cambiar de estado, (ante el flanco descendente) Espero 2 segundos para prevenir el rebote Pongo un alto en RB1 por 1 seg (clear del movil) Pongo un alto en RB2 (redial del movil)

Grabo el pic con ID-Prog: Oscilador IntRC I/O WDT desactivado PWRT desactivado MCLR activado (tambi=E9n prob=E9 desactivado) BODEN activado LVP activadoCPD y CP activados el resto,todo por defecto.

El problema que tengo desde hace mas de un mes, es que a veces,cuando el pic se energiza cumple con su tarea tal cu=E1l lo programe, pero a veces,cuando se energiza, no hace nada.

Cuando lo compil=E9, lo tuve que hacer en modo debug, por que como release se negaba a funcionar.

No uso temporizadores por que me resultaron muy engorrosos a la hora de escribir el c=F3digo para contar varios segundos, demasiadas interrupciones para atender.

Este es el c=F3digo:

;------------------- CABECERA -------------------

list P=3D16F628A #include

;------------------ VARIABLES ------------------- ; variables internas del temporizador cnta equ 0x22 cntb equ 0x23 cntc equ 0x24 ;------------------------------------ CuentaTmprz equ 0x25 ; segundos que cuenta del temporizador EstTmprz equ 0x26 ; temporizador =3D 0 : inactivo / 1 : activo

;----------------- DIRECCIONES ------------------

org 0x00 goto Inicio org 0x04 goto SDI org 0x05

;-------------------- INICIO --------------------

Inicio bsf STATUS,RP0 ; cambio al banco 1 --------- movlw 0x01 ; habilito solamente el RB0... movwf TRISB ; en el PORTB, como entrada bcf OPTION_REG,INTEDG ; flanco descendente para RB0 IniCont bcf STATUS,RP0 ; vuelvo al banco 0 ---------

movlw 0x90 ; cargo w con 10010000... movwf INTCON ; ...para habilitar GIE y INTE clrf PORTB ; limpio PORTB

goto Dormir

;----------------- INTERRUPCI=D3N -----------------

SDI call CambFlnc ; cambia el flanco de la interrupci=F3n btfss PORTB,0 ; =BFes descendente? (1 ascendente y continua) call SDIPreTmprz ; no, entonces llama al temporizador btfsc EstTmprz,0 ; =BFel temporizador est=E1 activo? call ClrRedial ; est=E1 activo, llama a Clear y Redial goto SDIFin

SDIFin bcf INTCON,INTF ; borro la bandera de la int retfie

SDIPreTmprz call ResetTmprz movlw 0x02 movwf CuentaTmprz call Temporiz return

;- - - - - - - - - Clear y Redial - - - - - - - -

ClrRedial btfsc PORTB,0 return bsf PORTB,1 ; activo clear movil call Bucle ; bucle de 1 seg y medio bcf PORTB,1 ; desactivo clear movil

call Bucle

bsf PORTB,2 ; inicia Redial ------- movlw 0x06 ; cuenta 5 seg... movwf CuentaTmprz ; ...y llama... call Tmprz ; ...al temporizador bcf PORTB,2 ; finaliza Redial ----- clrf EstTmprz call ResetTmprz

return

;-------------------- Dormir --------------------

Dormir nop goto Dormir

;------------ Cambia el flanco de RB0 ----------- ; si esta en descendente tengo que contar y discar ; si esta en ascendente tengo que parar todo CambFlnc bsf STATUS,RP0 ; cambio al banco 1 --------- btfsc OPTION_REG,INTEDG ; =BFes descendente? goto cmbAFlDsc ; cambia a flanco descendente goto cmbAFlAsc ; cambia a flanco ascendente

cmbAFlDsc call ResetTmprz bcf OPTION_REG,INTEDG ; flanco descendente para RB0 bcf STATUS,RP0 ; vuelvo al banco 0 --------- return

cmbAFlAsc bsf OPTION_REG,INTEDG ; flanco descendente para RB0 bcf STATUS,RP0 ; vuelvo al banco 0 --------- call ResetTmprz return

;----------------- Temporizador ----------------- ;################################################ ; USO: ########################################## ; movlw 0x05 ; cuenta 4 seg... ; movwf CuentaTmprz ; ...y llama... ; call Temporiz ; ...al temporizador ;################################################

;----------- Resetea el temporizador ------------

ResetTmprz clrf EstTmprz ; anula el temporizador clrf CuentaTmprz ; pone a cero las variables... clrf EstTmprz ; ...del temporizador clrf cnta clrf cntb clrf cntc return

Temporiz incfsz CuentaTmprz,1 goto Tmprz return

Tmprz bsf EstTmprz,0 decfsz CuentaTmprz,1 goto tmprzA return tmprzA btfss EstTmprz,0 return call Bucle goto Tmprz

;-------------------- Bucle --------------------- ;#### llamar a Bucle para contar un segundo ##### Bucle btfss EstTmprz,0 return movlw 0x04 movwf cnta movlw 0x09 movwf cntb movlw 0x96 movwf cntc call Cont return

;--------------------- Cont ---------------------

Cont btfss EstTmprz,0 return call DecrB decfsz cnta,1 goto Cont return

DecrB btfss EstTmprz,0 return call DecrC decfsz cntb,1 goto DecrB return

DecrC btfss EstTmprz,0 return decfsz cntc,1 goto DecrC return

;################################################ ;------------------------------------------------ end ;------------------------------------------------

Reply to
LucasBols

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.