TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: despojo en 07 de Marzo de 2019, 14:13:44
-
Hola a todos,
Tengo que reparar una placa que utiliza un PIC16F73 para comunicarse vía puerto serie con el ordenador, ya que ha dejado de emitir respuesta alguna. Mi primera comprobación para asegurarme de que el PIC seguía operativo fue intentar hacer "parpadear" una de las salidas del PIC. Cargo el programa y observo que la salida marca un valor positivo pero no parpadea. Descarté el código de delay (que no era más que varias cuentas atrás encadenadas) y le paso el siguiente código:
list p=16f73, c=80, n=0, r=dec
include <p16f73.inc>
__IDLOCS 0D0h
__CONFIG _CP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
bank0_var udata_shr 0x20
d1 res 1
; vector reset
; ****************
org 0
resvec
goto start
org 4
goto interrupt
interrupt
nop
retfie
start
bcf STATUS,RP1
bsf STATUS,RP0
clrf TRISB
bcf STATUS,RP1
bcf STATUS,RP0
loop movlw 0x55
movwf PORTB
nop
movlw 0xAA
movwf PORTB
nop
goto loop
end
Conecto la salida al osciloscopio y veo que hace el parpadeo bien, a la frecuencia adecuada (tardando 1us por instrucción), así que vuelvo a añadir un código de delay más simple para probar (incluyo únicamente los cambios del código) :
delay
movlw 3
movwf d1
delay_loop
nop
decfsz d1,f
goto delay_loop
return
loop movlw 0x55
movwf PORTB
call delay
movlw 0xAA
movwf PORTB
call delay
goto loop
Si cargo este código la salida vuelve a quedar estática. El código es muy simple, pero aún así probé con el simulador y en efecto hace su función. Si suprimo el "goto delay_loop" la salida vuelve a parpadear adecuadamente. ¿Es posible que un PIC en mal estado tenga un comportamiento similar? ¿Qué puede estar provocando que el programa se congele?
Muchas gracias
-
El codigo esta incompleto, podrias poner el codigo completo del segundo caso ?
-
Me temo que estás colocando la subrutina del delay en el lugar incorrecto.
Pero sería bueno que pusieras todo el código para corroborar mi suposición (tal como lo sugiere KILLERJC).
elreypic.
-
Gracias por responder, adjunto el segundo código completo:
list p=16f73, c=80, n=0, r=dec
include <p16f73.inc>
__CONFIG _CP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
bank0_var udata_shr 0x20
d1 res 1
org 0
resvec
goto start
org 4
goto interrupt
delay
movlw 3
movwf d1
delay_loop
nop
decfsz d1,f
goto delay_loop
return
interrupt
nop
retfie
start
bcf STATUS,RP1
bsf STATUS,RP0
clrf TRISB
bcf STATUS,RP1
bcf STATUS,RP0
loop movlw 0x55
movwf PORTB
call delay
movlw 0xAA
movwf PORTB
call delay
goto loop
end
-
Que tal despojo,
En realidad lo que está sucediendo es que la señal de salida si cambia, pero muy rápidamente. El delay que estás generando es muy pequeño, solamente de 17 ciclos. Suponiendo que estás usando un cristal de 4MHz (no mencionas el valor de cristal usado), entonces estás generando un delay de solo 17 microsegundos. Por lógica, si quieres ver un destello de led, nunca lo verás, solo verás que se queda encendido el led.
Solución: Necesitas generar un delay más grande para que se pueda ver el destello del led.
elreypic.