16F628A que no arranca

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:

Al energizar la placa enviar un estado alto durante 10 segundos al puerto RB3 ( encendido del celular )

Al entrar un evento

RB0 (entrada de evento) se encuentra en estado alto, cuando se produce un evento de disparo, este cambia de estado pasa a un estado bajo verificar el bajo durante un tiempo 4 segundos y si este continua entonces

Enviar un alto durante 2 segundos al puerto RA2 (clear de celular )

Enviar un alto durante 6 segundos al puerto RA3 (redial celular) para que este disque

Esperar 15 segundos y enviar un tren de pulsos al puerto RB4 (buzzer) durante 30 segundos

Verificar si el puerto RB0 continua en estado bajo, si es as=ED, volver a llamar dos veces m=E1s

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.

Con este programa, el p=ECc pone un estado alto en RB3 y no hace mas nada, ni responde al evento

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 ;------------------------------------ varTmprzSeg equ 0x25 ; segundos que cuenta del temporizador EstTmprz equ 0x26 ; temporizador =3D 0 : inactivo / 1 : activo ; variables del buzzer cntBuzzer equ 0x27

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

---------------------------------

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

;--------------------------------------------------------------------------=

---- ;//////////////////////////////////////////////////////////////////////////= //// ;----------------------------------- INICIO

-----------------------------------

; 1. Al energizar la placa (PIC) el puerto RB1 se pone en alto permanente ; mientras tenga alimentaci=F3n.

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

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

; 2. Enviar un estado alto durante 10 segundos al puerto RB3 ( encendido del celular ) call EncendCelu ; enciende el celular

goto Dormir ; entra en espera de un evento

;//////////////////////////////////////////////////////////////////////////= ////

;3.RB0 (entrada de evento) se encuentra en estado alto, cuando se produce un evento de disparo, ; este cambia de estado pasa a un estado bajo verificar el bajo durante un tiempo 4 segundos ; y si este continua entonces

SDI ;movlw 0x04 ; espera 4 segundos ;movwf varTmprzSeg ; carga los segundos en el contador ;call Temporiz ; llama al temporizador

; 7.Verificar si el puerto RB0 continua en estado bajo, si es as=ED ;btfsc PORTB,0 ; si RB0 sigue en bajo... ; b.Si este continua en bajo finalizar el ciclo y esperar el pr=F3ximo evento ;goto SDIFin ; si es alto, retorna y queda en espera ; a.Repetir la operaci=F3n un vez mas desde el punto 4 hasta el 7 call ProcLlamada ; ...realiza la llamada

; 7.Verificar si el puerto RB0 continua en estado bajo, si es as=ED btfsc PORTB,0 ; si RB0 sibue en bajo... ; b.Si este continua en bajo finalizar el ciclo y esperar el pr=F3ximo evento goto SDIFin ; si es alto, retorna y queda en espera ; a.Repetir la operaci=F3n un vez mas desde el punto 4 hasta el 7 call ProcLlamada ; ...realiza la llamada

; 7.Verificar si el puerto RB0 continua en estado bajo, si es as=ED btfsc PORTB,0 ; si RB0 sibue en bajo... ; b.Si este continua en bajo finalizar el ciclo y esperar el pr=F3ximo evento goto SDIFin ; si es alto, retorna y queda en espera ; a.Repetir la operaci=F3n un vez mas desde el punto 4 hasta el 7 call ProcLlamada ; ...realiza la llamada

; 8.Si el puerto RB0 est=E1 en alto finalizar el ciclo y esperar el pr=F3ximo evento (bajo) SDIFin bcf INTCON,INTF ; borro la bandera de la int retfie ; retorno restaurando las int

;--------------------------------------------------------------------------=

---- ;//////////////////////////////////////////////////////////////////////////= //// ;--------------------------------------------------------------------------=

----

;----------------------------- Enciende el celular

----------------------------

EncendCelu bsf PORTB,3 ; inicia el encendido del celular

---------- ;btfsc PORTB,4 ;bcf PORTB,4 ; FALSE bsf PORTB,4 ; TRUE call ResetTmprz movlw 0x04 ; define 4 segundos a contar movwf varTmprzSeg ; carga los segundos en el contador call Temporiz ; llama al temporizador bcf PORTB,4 ; FALSE bcf PORTB,3 ; finaliza el encendido del celular ---------- return

;-------------------------- Procedimiento de llamada

--------------------------

; 4.Enviar un alto durante 2 segundos al puerto RA2 (clear de celular ) ProcLlamada call ClearCel ; activa el clear del celular ; 5.Enviar un alto durante 6 segundos al puerto RA3 (redial celular) para que este disque call RedialCel ; marca el numero de telefono movlw 0x0F ; espera 15 segundos movwf varTmprzSeg ; carga los segundos en el contador call Temporiz ; llama al temporizador ; 6.Esperar 15 segundos y enviar un tren de pulsos al puerto RB4 (buzzer) ; durante 30 segundos=85=85=85. call SuenaBuzzer ; hace sonar el buzzer return

;----------------------------- Clear del celular

------------------------------

; 4.Enviar un alto durante 2 segundos al puerto RA2 (clear de celular )

ClearCel bsf PORTA,2 ; pone en alto el clear movlw 0x01 ; define los segundos a contar movwf varTmprzSeg ; carga los segundos en el contador call Temporiz ; llama al temporizador bcf PORTA,2 ; pone en bajo el clear return

;----------------------------- Redial del celular

-----------------------------

; 5.Enviar un alto durante 6 segundos al puerto RA3 (redial celular) para que este disque

RedialCel bsf PORTA,3 ; pone en alto el redial movlw 0x05 ; define los segundos a contar movwf varTmprzSeg ; carga los segundos en el contador call Temporiz ; llama al temporizador bcf PORTA,3 ; pone en bajo el redial return

;----------------------------------- Buzzer

-----------------------------------

; 6.Esperar 15 segundos y enviar un tren de pulsos al puerto RB4 (buzzer) durante 30 segundos

SuenaBuzzer movlw 0x0E ; define 15 pitidos y 15 silencios movwf cntBuzzer ; en el contador del buzzer

pntBuzzer01 decfsz cntBuzzer,1 ; decrementa y si NO llego a cero... goto pitarBuzzer ; ...ejecuta el pitido... return ; ...pero si llego a cero, retorna

pitarBuzzer bsf PORTB,4 ; envia un alto al buzzer movlw 0x01 ; define una espera de 1 segundo movwf varTmprzSeg ; carga los segundos en el contador call Temporiz ; llama al temporizador bcf PORTB,4 ; envia un bajo al buzzer movlw 0x01 ; define una espera de 1 segundo movwf varTmprzSeg ; carga los segundos en el contador call Temporiz ; llama al temporizador goto pntBuzzer01 ; vuelve para decrementar y continuar

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

-----------------------------------

Dormir nop goto Dormir

;--------------------------------------------------------------------------=

---- ;##########################################################################= #### ;-------------------------------- Temporizador

--------------------------------

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

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

;-------------------------------- Temporizador

--------------------------------

Temporiz incfsz varTmprzSeg,1 goto Tmprz return

Tmprz bsf EstTmprz,0 decfsz varTmprzSeg,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 ...

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.