¡Este problema me ha vencido! He creado un reloj binario para un proyecto de insignia de mérito scout. Cerca de 10 se han construido y funcionan, pero un explorador no lo hace. Parece estar relacionado con la puesta en marcha adecuada del PIC. Creé un "blinktest.asm" más simple para probar con los mismos resultados. A menudo, las salidas son mucho más rápidas de lo que deberían (no creo que la imagen se esté ejecutando / estable). Cambié el cristal, las tapas de cristal, resolví la toma de la foto, cambié las fotos, cambié el chip HC393, probé diferentes fuentes de alimentación, etc. voltaje con un multímetro (lee 4.78V, en algún momento deja de funcionar y el voltaje cambia a 4.81V). No funcionará con la fuente de alimentación de eBay cheapo-no name a 5,50V. Tengo 3 tapas de fuente de alimentación en el circuito (uso 490-5401-ND CAP CER 0.1UF 50V RADIAL) y una de ellas está muy cerca de los pines 2 y amp; 4. Reemplazar la tapa en las conexiones de la fuente de alimentación a electrolíticos de 10 o 100 uF no ayudó. El resistor en los dos primeros pines del encabezado ICSP (R2) es 10K. El comportamiento del circuito (se ejecuta o no se ejecuta) es el mismo si realizo una prueba con el código original o con el código de prueba de Blink. Cualquier ayuda sería apreciada!
#include <P16F57.inc> ; processor specific variable definitions
LIST P=16F57, F=INHX8M, R=DEC
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC; & _PWRT_ON
;***** VARIABLE DEFINITIONS
Count_RTC_1s equ 8 ;cycles thru main loop, every 20 msec
Count_Secs equ 9 ;seconds, RTC
Count_Mins equ 10 ;minutes, RTC
; other registers
DCount equ 16 ;in a different bank from other variables!
DCountHi equ 17
Constant TMR0_INIT=90 ; one TMR0 overflow from TMR0_INIT to 256
Constant TMR0_REINIT=100 ; N-1 overflows from TMR0_REINIT to 256
; This value cannot be zero. Otherwise TMR0 will
; automatically reenter main loop upon return to
; PollTMR0 if TMR0 hasn't incremented yet.
Constant N=50
;**********************************************************************
ORG 0x7FF ; processor reset vector
RESET CODE 0x00
goto MainLine
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Subroutines
Blink_LED
btfsc PORTC, 7
goto LED_is_ON
bsf PORTC, 7
goto LED_Updated
LED_is_ON
bcf PORTC, 7
LED_Updated
Return
Delay198m ;198 msec delay
Banksel DCount
; 32.768 kHz DCount=181 DCountHi=1
; 4 MHz DCount=255 DCountHi=255
movlw 255
movwf DCount
movlw 255
movwf DCountHi
decfsz DCount, f
goto $-1
decfsz DCountHi,f
goto $-3
;LB
Banksel Count_Secs
return
;..........................
Delay20m ;20 msec delay
Banksel DCount
; 32.768 kHz DCount=181 DCountHi=1
; 4 MHz DCount=255 DCountHi=26
movlw 255
movwf DCount
movlw 26
movwf DCountHi
decfsz DCount, f
goto $-1
decfsz DCountHi,f
goto $-3
;LB
Banksel Count_Secs
return
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PollTMR0 and Main Loop
PollTMR0 ;TMR0 is timer zero, it is always running per the XTAL.
movf TMR0, 0 ;If TMR0=0, it's been 20msec - go on to main loop
btfss STATUS, Z
goto $-2 ;Not zero, go back two lines.
; This is the MAIN LOOP!
movlw TMR0_REINIT ;Restart TMR0 with this value.
movwf TMR0
decfsz Count_RTC_1s, f ;Has it been 1.000 second yet?
goto PollTMR0 ;No. Go back and poll TMR0 more.
;It's been a second!
Banksel DCount
movlw 32 ; Need 66 instruction cycle delay
movwf DCount ; delay = 2 + (2 X DCount) [in cycles]
decfsz DCount, f
goto $-1
Banksel Count_Secs
movlw TMR0_INIT ;Restart TMR0 with this value.
movwf TMR0
movlw N ;It takes this many to get to 1.000 second.
movwf Count_RTC_1s
call Blink_LED
goto PollTMR0 ;Go back to polling TMR0 to see if it's timed out.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MainLine ;initialize timing variables
;setup STATUS, TMR0 & I/O ports....
call Delay198m ;This delay added 7/31/99
call Delay198m ;One of 2 16C84s using for development got different
call Delay198m ;results for RCTime depending on POR or MCLR.
call Delay198m ;This delay made that difference go away.
call Delay198m
call Delay198m
movlw 0x0D6 ; D6=1101 0110
; TMRO from instruction cycle
; prescaler for TMR0, prescaler=128
option
;initializations
movlw TMR0_INIT ;Initialize TMR0 value.
movwf TMR0
movlw N
movwf Count_RTC_1s
movlw 0x000 ; 00=0000 0000
; all outputs
TRIS PORTA ;& 0x07F
movlw 0x000 ; 00=0000 0000
; all outputs
TRIS PORTB ;& 0x07F
movlw b'00000000' ; 00=0000 0000
; all outputs
TRIS PORTC ;& 0x07F
goto PollTMR0
end