Pasillo con LED automatizado

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.
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
 

Adjuntos

  • Captura de pantalla 2022-04-22 182346.png
    Captura de pantalla 2022-04-22 182346.png
    33.9 KB · Visitas: 7
  • Pasillo_de_leds.rar
    15.1 KB · Visitas: 1
Para empezar habilitas las interrupciones (eso dice el comentario, no revise bien en las hojas de datos que hace 0x98 en INTCON) pero no hay ninguna rutina en el vector de interrupción.

Segundo, usas un goto para ir a "apagatodosleds1" y saltas a un lugar donde no tiene retorno o salto a ningún lado. Para llamar a una subrutina se usa "CALL" y en la subrutina, al terminar, se usa "RETURN" para volver al lugar de donde se llamó.

No entiendo para que usas un PIC18F2550 para ese ejemplo y en ensamblador siendo que el microcontrolador esta preparado para ser programado en "C". Si lo que quieres es aprender ASM yo aconsejaría ir a uno de gama mas baja PIC12 o PIC16.

Por ultimo, usa la opción que tiene el editor del foro para subir código, así como esta se hace muy difícil seguir algo.
 
Arriba