PIC16F57 ¿No se iniciará (MCLR?)

1

¡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
    
pregunta Dave Scott

1 respuesta

-1

El circuito ha estado funcionando desde que agregué el resistor de 100 ohmios en MCLR el 23 de marzo de 2015, por lo que parece estar resuelto.     

respondido por el Dave Scott

Lea otras preguntas en las etiquetas