Ping Pong con Interrupción Externa (PIC18F4550)

Hola!
Necesito hacer el típico juego de ping pong usando el PIC18F4550 pero usando la interrupción externa con RB0. El programa principal del ping pong ya lo he hecho y funciona de la siguiente manera. Se tienen dos botones para las raquetas que estarían en las entradas de RD0 y RD1 y se tienen tres botones que sirven para cambiar el retardo de las luces del ping pong. Un botón es para un retardo de 1.5 segundos, el otro para uno de 0.5 segundos y otro de 0.1 segundos. Si no se aprieta uno de estos botones, el retardo por default es de 1 segundo, estos botones están en el RD2, RD3 Y RD4. En el puerto B están las salidas de los leds. Ahora lo que necesito hacer es seleccionar estos retardos pero utilizando solo un push botton con la interrupción externa en el RB0. Les agradecería mucho que me ayudaran para saber como queda el código pero con esta nueva condición.
Gracias.

Código:
;Programa que rota luces
    LIST P=18F4550        ;Directiva para definir el procesador
    #include <P18F4550.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:

VAR EQU 21H

    MOVLW    B'00001111'
    MOVWF    ADCON1,.0                     ;Todos los pines como I/O digitales 
    
    MOVLW 62H                       ; Reloj interno 4MHz
    MOVWF OSCCON
    
    MOVLW 1FH                        ;se pone el puerto a como entrada como 00001111 (0F)
    MOVWF TRISD                       

    MOVLW 00H                        ;se pone como salida el puerto b "0000 0000"
    MOVWF TRISB
    
    MOVLW 01H                        ;se pone de salida 1 del puerto b
    MOVWF PORTB
    
    MOVLW 00H
    MOVWF VAR
    
CICLO
    
    BTFSC PORTD,2
    CALL ALLA
    BTFSC PORTD,3
    CALL ALLA2
    BTFSC PORTD,4
    CALL ALLA3
    BTFSC PORTD,0                    ;se revisa la entrada del puerto a
    GOTO SEC1                        ;si es uno lee esta instruccion y se manda a SEC1
    GOTO CICLO                    ;si si es 1 manda a esta instruccion y manda a SEC2
                                    ; si es 0 vuelve a checar los bits hasta que sea 1 el bit 0 o el bit 1
    

ALLA
    MOVLW 01H
    MOVWF VAR
    RETURN
    
ALLA2
    MOVLW 02H
    MOVWF VAR
    RETURN
ALLA3
    MOVLW 03H
    MOVWF VAR
    RETURN

SEC1

    MOVLW B'00000001'
    MOVWF PORTB                         
    CALL RETARDO
    MOVLW B'00000010'
    MOVWF PORTB                         
    CALL RETARDO
    MOVLW B'00000100'
    MOVWF PORTB                         
    CALL RETARDO                   
    MOVLW B'00001000'
    MOVWF PORTB                         
    CALL RETARDO
    MOVLW B'00010000'
    MOVWF PORTB                         
    CALL RETARDO
    MOVLW B'00100000'
    MOVWF PORTB                         
    CALL RETARDO
    MOVLW B'01000000'
    MOVWF PORTB
    CALL RETARDO
    MOVLW B'10000000'
    MOVWF PORTB                         
    CALL RETARDO
AHI
    BTFSC PORTD, 1
    GOTO SEC2
    GOTO AHI
                                                    
SEC2   

    BTFSC PORTD,2
    CALL ALLA
    BTFSC PORTD,3
    CALL ALLA2
    BTFSC PORTD,4
    CALL ALLA3
    MOVLW B'10000000'
    MOVWF PORTB                         
    CALL RETARDO
    MOVLW B'01000000'
    MOVWF PORTB                         
    CALL RETARDO
    MOVLW B'00100000'
    MOVWF PORTB                         
    CALL RETARDO                   
    MOVLW B'00010000'
    MOVWF PORTB                         
    CALL RETARDO
    MOVLW B'00001000'
    MOVWF PORTB                         
    CALL RETARDO
    MOVLW B'00000100'
    MOVWF PORTB                         
    CALL RETARDO
    MOVLW B'00000010'
    MOVWF PORTB
    CALL RETARDO
    MOVLW B'00000001'
    MOVWF PORTB                         
    CALL RETARDO
    GOTO CICLO

RETARDO

    MOVLW 00H
    CPFSEQ VAR
    GOTO UNO
    GOTO RETARDO0

UNO
    MOVLW 01H
    CPFSEQ VAR
    GOTO DOS
    GOTO RETARDO1

DOS
    MOVLW 02H
    CPFSEQ VAR
    GOTO TRES
    GOTO RETARDO2

TRES
    MOVLW 03H
    CPFSEQ VAR
    GOTO RETARDO3

RETARDO0
    MOVLW 0C2H
    MOVWF TMR0H
    MOVLW 0F6H
    MOVWF TMR0L
    MOVLW 85H
    MOVWF T0CON
CICLO0
    BTFSS INTCON, B'10'
    GOTO CICLO0
    BCF INTCON, B'10'
    RETURN

RETARDO1
    MOVLW 48H
    MOVWF TMR0H
    MOVLW 0E4H
    MOVWF TMR0L
    MOVLW 84H
    MOVWF T0CON
CICLO1
    BTFSS INTCON, B'10'
    GOTO CICLO1
    BCF INTCON, B'10'
    RETURN

RETARDO2
    MOVLW 0C2H
    MOVWF TMR0H
    MOVLW 0F6H
    MOVWF TMR0L
    MOVLW 84H
    MOVWF T0CON
CICLO2
    BTFSS INTCON, B'10'
    GOTO CICLO2
    BCF INTCON, B'10'
    RETURN

RETARDO3
    MOVLW 9EH
    MOVWF TMR0H
    MOVLW 57H
    MOVWF TMR0L
    MOVLW 85H
    MOVWF T0CON
CICLO3
   BTFSS INTCON, B'10'
   GOTO CICLO3
   BCF INTCON, B'10'
   RETURN

    END
 
Atrás
Arriba