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