LED parpadeantes con PIC16LF1829 con una frecuencia de 1 segundo en el código de ensamblaje

0

Nuevo alumno en Microchip. Ahora estoy tratando de hacer que el PIC16LF1829 haga parpadear los cuatro LED en una frecuencia de 1 vez / segundo. Mi intención era modificar la frecuencia del oscilador en diferentes posiciones del código con una cantidad fija de ciclos de instrucción para aproximar ese '1 punto'.

Al principio, todo lo que tengo es el comando con 197,376 ciclos de instrucción. Dado que la cantidad de ciclos que se ejecutan en 500KHz de frecuencia de oscilación duraría cuatro aproximadamente 1,5 segundos, pretendía usar varias frecuencias más altas, como 1MHz y 4MHz, para aproximarme a "1 segundo".

Esto me hace modificar la frecuencia del oscilador en diferentes posiciones del código. Sin embargo, las cosas resultaron que al agregar el mismo comando como:

    movlw   0x5A
    movwf   OSCCON

los LED llevan el doble de tiempo que antes.

¿Alguien puede ayudarme a averiguar qué hay de malo en esto?

Debajo está el código que tengo:

#include <p16f1829.inc>
 __CONFIG _CONFIG1, (_FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF);
 __CONFIG _CONFIG2, (_WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _LVP_OFF);
    ORG     0
    errorlevel -302     ; suppress the 'not in bank0' warning
    cblock  0x70
      Delay1
      Delay2
      Count
    endc

Start:
    banksel OSCCON      ; Select bank1
    movlw   0x5A        ; running at 1MHz
;   movlw   b'00111000' ; set CPU clock speed
    movwf   OSCCON      ; set the clock frequency of 2MHz
    bcf     TRISC,0
    bcf     TRISC,1
    bcf     TRISC,2
    bcf     TRISC,3
    banksel LATC
    clrf    LATC        ; set all the LEDs off
Timelag1:
    movlw   0x5A
    movwf   OSCCON
    decfsz  Dleay1,F
    bra     Timelag1
    decfsz  Dleay2,F
    bra     Timelag1
Timelag2:
    movlw   0x6A        ; 4M
    movwf   OSCCON
    decfsz  Dleay1,F
    bra     Timelag2
    decfsz  Dleay2,F
    bra     Timelag2
Main:
    bsf     LATC,0      ; turn on the LED-0,with 4MHz
    bcf     LATC,1
    bcf     LATC,2
    bcf     LATC,3
    decfsz  Dleay1,F
    bra     Main
    decfsz  Dleay2,F
    bra     Main
Main_1:
    movlw   0x5A        ; 1M
    movwf   OSCCON
    decfsz  Dleay1,F    ; prolong the time with another 1MHz
    bra     Main_1
    decfsz  Dleay2,F
    bra     Main_1
    end

Saludos cordiales,

Simon

    
pregunta Simon Song

1 respuesta

0

El código publicado está fallando porque las escrituras a OSCCON cambian el registro DACCON1 en BANK2, el banco donde se encuentra el registro LATC.

Para corregir este problema, cambie su código para seleccionar BANK1 antes de actualizar al registro OSCCON.

Creo que este código debería funcionar como pretendías:

#include <p16f1829.inc>
 __CONFIG _CONFIG1, (_FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF);
 __CONFIG _CONFIG2, (_WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _LVP_OFF);
    ORG     0
    errorlevel -302     ; suppress the 'not in bank0' warning
    cblock  0x70
      Delay1
      Delay2
      Count
    endc

Start:
    banksel OSCCON      ; Select bank1
    movlw   0x5A        ; running at 1MHz
;   movlw   b'00111000' ; set CPU clock speed
    movwf   OSCCON      ; set the clock frequency of 2MHz
    bcf     TRISC,0
    bcf     TRISC,1
    bcf     TRISC,2
    bcf     TRISC,3
    banksel LATC        ; Select bank2
    clrf    LATC        ; set all the LEDs off
Timelag1:
    banksel OSCCON      ; Select bank1
    movlw   0x5A
    movwf   OSCCON
    decfsz  Dleay1,F
    bra     Timelag1
    decfsz  Dleay2,F
    bra     Timelag1
Timelag2:
    banksel OSCCON      ; Select bank1
    movlw   0x6A        ; 4M
    movwf   OSCCON
    decfsz  Dleay1,F
    bra     Timelag2
    decfsz  Dleay2,F
    bra     Timelag2
Main:
    banksel LATC        ; Select bank2
    bsf     LATC,0      ; turn on the LED-0,with 4MHz
    bcf     LATC,1
    bcf     LATC,2
    bcf     LATC,3
    decfsz  Dleay1,F
    bra     Main
    decfsz  Dleay2,F
    bra     Main
Main_1:
    banksel OSCCON      ; Select bank1
    movlw   0x5A        ; 1M
    movwf   OSCCON
    decfsz  Dleay1,F    ; prolong the time with another 1MHz
    bra     Main_1
    decfsz  Dleay2,F
    bra     Main_1
    end
    
respondido por el Dan1138

Lea otras preguntas en las etiquetas