;*******************************************************************************
; Programa: Contador.pbp
; Versión: 1.0
; VELOCIMETRO en base a Contador de 3 digitos y displays de 7 segmentos (0-999)
; controlando 3 74XS164 de D@rkbytes
;*******************************************************************************
@ DEVICE PIC16F628a ; Microcontrolador utilizado
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,WDT_OFF,PWRT_ON,BOD_OFF,LVP_OFF
;*******************************************************************************
DEFINE OSC 4 ; Definir que se trabajará con 4MHz.
Include "MODEDEFS.BAS" ; Incluir definiciones del modo serial
CMCON = 7 ; Comparadores analógicos OFF
TRISA = %11111100
PORTA = TRISA
TRISB = %00000001
PORTB = 0
; Nombres para los pines
Symbol SCL_Pin = PORTA.0
Symbol SDA_Pin = PORTA.1
Symbol T1CKPS1 = T1CON.5 'Preescaler para timer1
Symbol T1CKPS0 = T1CON.4 'Preescaler para timer1
Symbol T1OSCEN = T1CON.3 'Bit de habilitación del Oscilador
Symbol TMR1CS = T1CON.1 'Bit selección clock de trabajo (1=clock externo por portc.0, 0=clock interno)
Symbol TMR1ON = T1CON.0 'Bit de habilitación para el timer1 (1=On, 0=Off)
Symbol TMR1IE = PIE1.0 'interrupción por timer1
Symbol TMR1IF = PIR1.0 'bandera desborde tmr1
Symbol GIE = INTCON.7
Symbol PEIE = INTCON.6
Symbol INTE = INTCON.4
Symbol INTF = INTCON.1
Symbol INTEDG = OPTION_REG.6
Symbol LED3 = PORTB.3
;----
; Declaración de variables
KILOMETRAJE VAR WORD
Counter VAR Word
Dsp1 VAR Byte
Dsp2 VAR Byte
Dsp3 VAR Byte
Index VAR Byte
;{{{{{
; Declaración de variables
T VAR Byte
X VAR Byte
TIMER1 VAR Word
PRECARGA VAR Word
INTB0 VAR Byte
;}}}}
PRECARGA=40536 ' Valor obtenido con la calculadora RRPicTimerCalculator para que salte el timer1 cada 100ms
TMR1H=PRECARGA.HighByte ' Precargamos el timer1 inicialmente
TMR1L=PRECARGA.LowByte
On Interrupt GoTo interrupcion ' En caso de interrupción ir a subrutina interrupción
INTCON=%10010000 ' el bit 7 habilita las interrupciones en general
' El bit 4 habilita la interrupción B.0
T1CON=%00001101 ' Timer1 on, incremento por Osc interno
Clear ; Inicializar variables a 0 (Limpiar RAM)
; Mandar ceros en formato 7 segmentos a los registros de desplazamiento.
ShiftOut SDA_Pin,SCL_Pin,LSBFIRST,[$FC,$FC,$FC]
MainProgram:
Gosub Tabla ; Ir a las tablas de conversión
GoTo MainProgram
interrupcion:
If INTF=1 Then INTB0=INTB0+1 ' Contamos los giros que da la rueda
INTE=1 ' Habilitar la interrupción nuevamente
INTF=0 'Borrar la bandera de int B.0
Resume ' Retorna al programa donde ocurrió la interrupción
Enable ' Habilita las interrupciones después del handler
END
Tabla:
; Subrutina de conversión para código de 7 segmentos cátodo común.
Index = Counter DIG 0 ; Tomamos las unidades
LookUp Index,[$FC,$60,$DA,$F2,$66,$B6,$BE,$E0,$FE,$F6],Dsp1
Index = Counter DIG 1 ; Tomamos las decenas
LookUp Index,[$FC,$60,$DA,$F2,$66,$B6,$BE,$E0,$FE,$F6],Dsp2
Index = Counter DIG 2 ; Tomamos la centenas
LookUp Index,[$FC,$60,$DA,$F2,$66,$B6,$BE,$E0,$FE,$F6],Dsp3
; Mandamos los datos hacia los registros de desplazamiento.
ShiftOut SDA_Pin,SCL_Pin,LSBFIRST,[Dsp1,Dsp2,Dsp3]
Return