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