Buenas. Estoy realizando un programa en el cual simule un pasillo con led automatizado.
El programa consiste en 4 led y un botón, al oprimir el botón el primer led será encendido durante 4 segundos, al cabo de los cuales el primer led se apagará y se encenderá el segundo led, así hasta llegar al cuarto led y por último acabar la secuencia.
Otro caso sería oprimir el botón, se enciende el primer led 4 segundos, transcurridos se apaga el primer led y avanza al segundo led, transcurridos los 4 segundos el segundo led se apaga para encender el tercer led, pero si vuelvo a oprimir el botón se encendería el primer led y aún continuando la primera secuencia del led, o sea, estarían 2 led encendidos hasta acabar la secuencia, lo mismo si vuelvo a oprimir el botón otra vez.
En este momento me encuentro atorado con la configuración de los Timer 0, 1, 2 y 3
Recién estoy empezando en esto de los pic y agradecería que alguien pudiera orientarme.
Anexo mi código en ensamblador y la simulación en proteus.
El programa consiste en 4 led y un botón, al oprimir el botón el primer led será encendido durante 4 segundos, al cabo de los cuales el primer led se apagará y se encenderá el segundo led, así hasta llegar al cuarto led y por último acabar la secuencia.
Otro caso sería oprimir el botón, se enciende el primer led 4 segundos, transcurridos se apaga el primer led y avanza al segundo led, transcurridos los 4 segundos el segundo led se apaga para encender el tercer led, pero si vuelvo a oprimir el botón se encendería el primer led y aún continuando la primera secuencia del led, o sea, estarían 2 led encendidos hasta acabar la secuencia, lo mismo si vuelvo a oprimir el botón otra vez.
En este momento me encuentro atorado con la configuración de los Timer 0, 1, 2 y 3
Recién estoy empezando en esto de los pic y agradecería que alguien pudiera orientarme.
Anexo mi código en ensamblador y la simulación en proteus.
Código:
LIST P=18F2550 ;Directiva para definir el procesador
#include <P18F2550.INC> ;Definicion de SFRs para el procesador
;**********
;Bits de Configuracion
;Microchip ha cambiado el formato para definir los bits de configuracion, por favor
;revisar el archivo P18F2455.INC para informacion adicional de la notacion
;Abajo hay algunos ejemplos
;* Configuracion del Oscilador ***
CONFIG FOSC = INTOSCIO_EC ;Osc interno, RA6 como pin, USB usa Osc EC
;CONFIG FOSC = HSPLL_HS ;HS oscillator, PLL enabled (HSPLL)
;CONFIG PLLDIV = 5 ;Divide by 5 (20 MHz oscillator input)
;CONFIG CPUDIV = OSC1_PLL2 ;[Primary Oscillator Src: /1][96 MHz PLL Src: /2]
;* Otros bits de configuracion ***
CONFIG PWRT = OFF ;PWRT deshabilitado
CONFIG BOR = OFF ;Brown out reset deshabilitado
CONFIG WDT = OFF ;Watchdog deshabilitado
CONFIG MCLRE = on ;MCLR como entrada
CONFIG PBADEN = off ;Todos los pines como entradas analogicas deshabilitados
CONFIG LVP = OFF ;Programacion en bajo voltaje apagado
;* Bits de proteccion **
CONFIG CP0 = OFF ;los bloques del codigo de programa
CONFIG CP1 = OFF ;no estan protegidos
CONFIG CP2 = OFF
CONFIG CPB = OFF ;Sector Boot no esta protegido
CONFIG CPD = OFF ;La EEPROM no esta protegida
;**********
; Definicion de variables
; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
; interrupcion.
CBLOCK 0x080
;variable usada para salvar contexto
;variable usada para salvar contexto
;variable usada para salvar contexto
ENDC
CBLOCK 0x000 ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
ENDC
;**********
;Datos de la EEPROM
;Los Datos a ser programados en la EEPROM son definidos aqui
ORG 0xf00000
DE "Test Data",0,1,2,3,4,5
;**********
; Vector de Reset.
; Este codigo comenzara a ejecutarse cuando suceda un reset
ORG 0x0000
goto Main ;Se va al inicio del codigo principal
;**********
; Vector de interrupcion de alta prioridad
; Este codigo comenzara a ejecutarse cuando una interrupcion de alta prioridad ocurra
; o cuando cualquier interrupcion ocurra si es que las prioridades de las interrupciones
; no estan habilitadas
ORG 0x0008
bra HighInt ;Va a la rutina de interrupcion de alta prioridad
;**********
; Vector de interrupcion de baja prioridad y rutina
; Este codigo comenzara a ejecutrase cuando una interrupcion de baja prioridad ocurra
; Este codigo puede ser eliminado si las interrupciones de baja prioridad no son usadas
ORG 0x0018
; * El codigo de la interrupcion de baja prioridad va aqui *
;**********
; Rutina de interrupcion de alta prioridad
; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
; evitar conflictos con el vector de interrupciones de baja prioridad
HighInt:
; * El codigo para las interrupciones de alta prioridad va aqui *
;**********
; Comienzo del programa principal
; El codigo del programa principal es colocado aqui
; * EL codigo principal va aqui *
;One instruction cycle consists of four oscillator periods.
;Thus, for an oscillator frequency of 4 MHz, the normal
;instruction execution time is 1 µs.
;Para un Fosc de 48M cada ciclo de instruccion dura 4/48M => 83.3 ns
;*** Inicializamos perifericos ***
Main:
CLRF PORTB ;LIMPIA EL PUERTO B
BSF TRISB,0;PUERTO RB0 COMO ENTRADA
BCF TRISB,1;PUERTO DE SALIDA
BCF TRISB,2;
BCF TRISB,3;
BCF TRISB,4;
MOVLW 98H ; se habilitan interrupciones generales ext0 y RB5
MOVWF INTCON
#DEFINE BTN PORTB,0
#DEFINE LED PORTB,1;
#DEFINE LED2 PORTB,2;
#DEFINE LED3 PORTB,3;
#DEFINE LED4 PORTB,4;
MAIN1
BTFSS BTN ; SI TIENE 1 EN EL PUERTO RB1 SALTA LA SIGUIENTE LINEA DE CODIGO
GOTO APAGATODOSLEDS1
BSF LED ;ENCENDER LED
CALL TIMER0 ; ENCIENDE EL LED POR 4 SEG
CALL APAGALED ;APAGA LED
BSF LED2 ;ENCENDER LED2
CALL TIMER1 ; ENCIENDE EL LED 4 SEG
CALL APAGALED2 ;APAGA LED2
BSF LED3; ENCENDER LED3
CALL TIMER2 ;ENCENDER EL LED 4 SEG
CALL APAGALED3 ;APAGA LED3
BSF LED4; ENCENDER LED4
CALL TIMER3 ;ENCENDER LED 4 SEG
CALL APAGALED4 ;APAGAR LED4
GOTO MAIN1
TIMER0
MOVLW 0C2H
MOVWF TMR0H ;4 SEGUNDOS DE RETARDO
MOVLW 0F6H
MOVWF TMR0L
MOVLW 87H
MOVWF T0CON
ACABOTIMER
BTFSS INTCON,2 ;pregunta si acabo de contar el timer
GOTO ACABOTIMER ;si no ha acabado lo espera
BCF INTCON,2 ; si terminó borra bandera y regresa al programa principal
RETURN
TIMER1
MOVLW 0C2H
MOVWF TMR1H ;4 SEGUNDOS DE RETARDO
MOVLW 0F6H
MOVWF TMR1L
MOVLW B'01111101'
MOVWF T1CON
ACABOTIMER1
BTFSS PIR1,0 ;pregunta si acabo de contar el timer
GOTO ACABOTIMER1 ;si no ha acabado lo espera
BCF PIR1,0 ; si terminó borra bandera y regresa al programa principal
RETURN
TIMER2
MOVLW 0C2H
MOVWF TMR2 ;4 SEGUNDOS DE RETARDO
MOVLW 0F6H
MOVWF TMR2
MOVLW B'00010100'
MOVWF T2CON
ACABOTIMER2
BTFSS PIR1,1 ;pregunta si acabo de contar el timer
GOTO ACABOTIMER2 ;si no ha acabado lo espera
BCF PIR1,1 ; si terminó borra bandera y regresa al programa principal
RETURN
TIMER3
MOVLW 0C2H
MOVWF TMR3H ;4 SEGUNDOS DE RETARDO
MOVLW 0F6H
MOVWF TMR3L
MOVLW B'01110101'
MOVWF T3CON
ACABOTIMER3
BTFSS PIR2,1 ;pregunta si acabo de contar el timer
GOTO ACABOTIMER3 ;si no ha acabado lo espera
BCF PIR2,1 ; si terminó borra bandera y regresa al programa principal
RETURN
APAGALED
BCF LED ;APAGAR LED
RETURN
APAGALED2
BCF LED2 ;APAGA LED2
RETURN
APAGALED3
BCF LED3 ;APAGA LED3
RETURN
APAGALED4
BCF LED4 ; APAGA LED4
RETURN
APAGATODOSLEDS1
BCF LED ;APAGAR LED
BCF LED2 ;APAGA LED2
BCF LED3 ;APAGA LED3
BCF LED4 ; APAGA LED4
END