Pic16f877A se reinicia solo

Todos los Microcontroladores y sus diferentes "familias". Todo este espacio es tuyo para mostrar tu código, consultar con los que más conocen del tema y para disfrutar de estos increíbles y poderosos componentes electrónicos.

Moderador: HJ

Pic16f877A se reinicia solo

Notapor mdptweety » Mar Jul 28, 2015 8:26 pm

Buenas amigos, tengo otra consulta en esto de la programación. Pude finalmente realizar mi programa el cual controle mediante rutinas de espera largas y un par de leds que funcionara correctamente, el problema surgió cuando el programa termina en breve vuelve a arrancar como si se reiniciara. La misión del programa es mediante el puerto B enviar distintos bits para configurar un PLL (lmx2306). La prueba la estoy realizando en una protoboard y controlo el "reiniciado" del pic mediante un led en el bit RB0. Lo programo usando el PICKIT2. Les paso en programa en Assembler:

Código: Seleccionar todo
; Sintetizador para LMX2306
; Frecuencia para convertir a canal 8 VCO = 227 Mhz
; R Counter = 40 
; N Counter = 908
; Fcomp = 250 Khz
; B=113 ; A=4 ; Fvco = [ ( P x B ) + A ] x Fcomp / R ; P = 8 Preescaler
; Cristal = 10 Mhz
;*********************************************************************
;(RB1) high        DATA HI
;(RB2) high        LE HI
;(RB3) high        CLK HI
;------------------------------------------------------------------------

    list        p=16f877a       ; list directive to define processor
    #include    <p16f877a.inc>  ; processor specific variable definitions
    errorlevel -302             ; suprimimos el mensaje "not in bank 0"
    __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

   cblock   0x20                ; declaramos las variables
      reg_h
      reg_m
      reg_l
      mcount
      ncount
        ocount
   endc

RESET_VECTOR    CODE    0x0000 ; processor reset vector
    nop                        ; nop for icd
    pagesel start
    goto    start              ; go to beginning of program


MAIN_PROG       CODE

start   org      0x010
      clrf   reg_h
      clrf   reg_m
      clrf   reg_l
      clrf   mcount
      clrf    ncount
        clrf    ocount
      clrf   PORTB

      bsf   STATUS,RP0   ; PASO A BANCO 1
      bcf STATUS,RP1   ;

      movlw b'00000000'
      movwf TRISB   ; PORTB TODAS OUTPUTS

      bcf   STATUS,RP0   ; PASO A BANCO 0
      call wait

;***** make enable high************ Puede no ser necesario
        bsf      PORTB,2
        nop
        nop
        call     wait         ; Wait a short while
        bcf      PORTB,2   

        nop
        nop
        movlw   0x00            ; load low bits
        movwf   PORTB           ; make all output bits low
;
; Load the 21 bit F register C1,C2 = 1,1
; MSB first 00000000:00000001:10110011 ; Vco positivo, LD high, power down normal
;
   clrf    reg_h
   clrf    reg_m
   clrf    reg_l
   movlw   0x00          ; Load reg_h with f_high
   movwf   reg_h         ;
   movlw   0x02          ; Load reg_m with f_mid
   movwf   reg_m         ;
   movlw   0xB3          ; Load reg_l with f_low
   movwf   reg_l         ;
   call    sendreg       ; Send data to LMX
;
; Load the 21 bit R register C1,C2 = 0,0
; MSB first R = 40 :00000000:00000000:10100000
;
   clrf    reg_h
   clrf    reg_m
   clrf    reg_l
   movlw   0x00         ; Load reg_h with r_high
   movwf   reg_h        ;
   movlw   0x00         ; Load reg_m with r_mid
   movwf   reg_m        ;
   movlw   b'10100000'  ; Load reg_l with r_low
   movwf   reg_l        ;
   call    sendreg      ; Send data to LMX
;
; Load the 21 bit N register C1,C2 = 1,0;
; MSB first N = 908 ; A = 4 B = 113 ; 000100000:00111000:10010010
; Go bit = 1 ; A = 5 bits = 00100 = 4 ; B = 1110001 = 113
   clrf    reg_h
   clrf    reg_m
   clrf    reg_l
   movlw   b'00010000'      ; Load reg_h with n_high
   movwf   reg_h            ;
   movlw   b'00111000'      ; Load reg_m with n_mid
   movwf   reg_m            ;
   movlw   b'10010010'      ; Load reg_l with n_low
   movwf   reg_l            ;
   call sendreg             ; Send data to LMX
   call final


; Rutina de espera
;
; time = (((ncount * 3 + 2) * mcount) * ocount) *0.4-microseconds
wait
        movlw   0x01      ; 1 = aproximadamente 0.5 segundos
        movlw   ocount
loadM   movlw   0x0A      ; set w = 10
        movwf   mcount    ; mcount = 10
loadN   movlw   0xFF      ; set w = 256
        movwf   ncount    ; ncount = 256
decN    decfsz  ncount, f ; decrement ncount by 1
        goto    decN      ; if ncount not 0 then decrement again
        decfsz  mcount, f ; else decrement mcount by 1
        goto    loadN     ; if mcount not 0 then reload ncount
      decfsz  ocount, f ; if ocount not 0 then decrement again
      goto    loadM     ; if ocount not 0 then reload mcount
        return            ;

; Load the 21 bit register
;
sendreg
   btfss reg_h,4   ; Bit 21
   call  zero      ; 0
   btfsc reg_h,4   ;
   call  one       ; 1
   btfss reg_h,3   ; Bit 20
   call  zero      ; 0
   btfsc reg_h,3   ;
   call  one       ; 1
   btfss reg_h,2   ; Bit 19
   call  zero      ; 0
   btfsc reg_h,2   ;
   call  one       ; 1
   btfss reg_h,1   ; Bit 18
   call  zero      ; 0
   btfsc reg_h,1   ;
   call  one       ; 1
   btfss reg_h,0   ; Bit 17
   call  zero      ; 0
   btfsc reg_h,0   ;
   call  one       ; 1
   btfss reg_m,7   ; Bit 16
   call  zero      ; 0
   btfsc reg_m,7   ;
   call  one       ; 1
   btfss reg_m,6   ; Bit 15
   call  zero      ; 0
   btfsc reg_m,6   ;
   call  one       ; 1
   btfss reg_m,5   ; Bit 14
   call  zero      ; 0
   btfsc reg_m,5   ;
   call  one       ; 1
   btfss reg_m,4   ; Bit 13
   call  zero      ; 0
   btfsc reg_m,4   ;
   call  one       ; 1
   btfss reg_m,3   ; Bit 12
   call  zero      ; 0
   btfsc reg_m,3   ;
   call  one       ; 1
   btfss reg_m,2   ; Bit 11
   call  zero      ; 0
   btfsc reg_m,2   ;
   call  one       ; 1
   btfss reg_m,1   ; Bit 10
   call  zero      ; 0
   btfsc reg_m,1   ;
   call  one       ; 1
   btfss reg_m,0   ; Bit 9
   call  zero      ; 0
   btfsc reg_m,0   ;
   call  one       ; 1
   btfss reg_l,7   ; Bit 8
   call  zero      ; 0
   btfsc reg_l,7   ;
   call  one       ; 1
   btfss reg_l,6   ; Bit 7
   call  zero      ; 0
   btfsc reg_l,6   ;
   call  one       ; 1
   btfss reg_l,5   ; Bit 6
   call  zero      ; 0
   btfsc reg_l,5   ;
   call  one       ; 1
   btfss reg_l,4   ; Bit 5
   call  zero      ; 0
   btfsc reg_l,4   ;
   call  one       ; 1
   btfss reg_l,3   ; Bit 4
   call  zero      ; 0
   btfsc reg_l,3   ;
   call  one       ; 1
   btfss reg_l,2   ; Bit 3
   call  zero      ; 0
   btfsc reg_l,2   ;
   call  one       ; 1
   btfss reg_l,1   ; Bit 2
   call  zero      ; 0
   btfsc reg_l,1   ;
   call  one       ; 1
   btfss reg_l,0   ; Bit 1
   call  zero      ; 0
   btfsc reg_l,0   ;
   call  one       ; 1

;*******make enable high para transmitir los datos****
   bsf      PORTB,2
   nop
   bcf      PORTB,2
   return

;
; Subrutinas para mandar ceros y unos
;                                                                           
zero
      BCF    PORTB,1      ; Load 0 on data line
      nop
      BSF    PORTB,3      ; Clock high
     nop
      BCF    PORTB,3      ; Clock Low
      RETURN
;
one   
      BSF    PORTB,1      ; Load 1 on data line
      nop
      BSF    PORTB,3      ; Clock high
     nop
      BCF    PORTB,3      ; Clock Low
      RETURN
final
      clrf   PORTB
      bsf   PORTB,0
      call wait
     call wait
     call wait
      call wait
      call wait
      call wait
    END                       ; directiva 'final del programa'


Agregue al final esas rutinas de espera para ver con mejor precision el momento en el que termina el programa (se enciende el LED) y el momento donde vuelve a empezar (se apaga el LED al borrar el puerto B). Probablemente sea un problema de programacion, en la protoboard tome todos los recaudos y coloque los correspondientes capacitores de desacople. El unico problema que tiene es que se reinicia indefinidamente. Desde ya gracias por su atencion.
mdptweety
 
Mensajes: 40
Registrado: Lun Sep 02, 2013 9:18 pm

Re: Pic16f877A se reinicia solo

Notapor HJ » Mié Jul 29, 2015 12:50 am

Hola.

A simple vista y sin estudiar el código veo varias cosas.

Tienes una llamada a subrutina que denominaste "final" pero a dicha subrutina le falta la instrucción de retorno, es decir, le falta el RETLW x, o el RETURN
La directiva END hace el que la compilación se detenga, pero no que se detenga la ejecución el programa, como el resto de la memoria de programa que no fué ocupada por tu programa está borrada, es decir en 0xFFFF, y que el código 0xFFFF es precisamente un NOP, entonces tu código ejecuta desde "final" en adelante hasta el último CALL WAIT, pero cuando retorna de esa última subrutina sigue ejecutándose los NOP hasta que el contador de programa "CP" se desborda y comienza de nuevo desde cero, por lo que tu programa se reinicia.....

Si quieres que el programa "se detenga" lo mas fácil es hacer un lazo infinito (si no tienes el watchdog habilitado ya que en ese caso se resetearía y comenzaría de nuevo)
Por ejemplo puedes hacer:
loop GOTO loop ;lazo infinito

Saludos
HJ
"Cuando llegue la inspiración, que me encuentre trabajando"
Picasso, Pablo
Avatar de Usuario
HJ
 
Mensajes: 477
Registrado: Jue Mar 21, 2013 3:16 pm
Ubicación: Tanti - Córdoba - Argentina

Re: Pic16f877A se reinicia solo

Notapor mdptweety » Mié Jul 29, 2015 8:04 am

Genio, ahi lo hice y funciona de maravillas. Muchas gracias nuevamente. Era una pregunta boluda pero como decia un profesor de mi facultad "Es mejor hacer una pregunta boluda una vez y quedar como un boludo una vez, en vez de no preguntar y ser un boludo toda la vida" jaja. Quedo todo barbaro, despues comento como sigue el pruyecto, nuevamente gracias!
mdptweety
 
Mensajes: 40
Registrado: Lun Sep 02, 2013 9:18 pm

Re: Pic16f877A se reinicia solo

Notapor HJ » Mié Jul 29, 2015 8:16 am

Me alegra que ya lo tengas funcionando.

Saludos
HJ
"Cuando llegue la inspiración, que me encuentre trabajando"
Picasso, Pablo
Avatar de Usuario
HJ
 
Mensajes: 477
Registrado: Jue Mar 21, 2013 3:16 pm
Ubicación: Tanti - Córdoba - Argentina


Volver a Microcontroladores

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron