torres.electronico
Well-known-Alfil
Hola a todos,
agregando al contador de isaiasjea la interrupción externa b0 y desborde por timer1, junto a un pequeña modificación en la simulación en proteus, es posible convertir el contador en una especie de velocímetro o cuentavueltas segun se necesite, en la simulación parece funcionar pero publico la modificación a ver que opinan ustedes.
Código:;******************************************************************************* ; 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
No te quiero pinchar el globo, pero el problema de los velocimetros o cuenta vueltas de "vehiculos" que implementan display 7 segmentos, es malisima la visualizacion de los valores... mas aun cuando hay una histeresis, producto del ciclo o loop del programa... se entiende? no esta mal la idea de implementar la interrupcion por hardware mas un timer...fijate que ya lo mencione anteriormente aca, en un tema similar al tuyo....