Autor Tema: Tacometro digital para autos  (Leído 7074 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado PICFaf

  • PIC10
  • *
  • Mensajes: 8
Tacometro digital para autos
« en: 04 de Agosto de 2004, 09:37:00 »
Tengo hecho un circuito completo del tacómetro pero me falta terminar el programa del PIC. La idea es contar una serie de pulsos invertidos que entran por el PORTA.4 y muestrearlos en 4 displays de 7 segmentos por barrido. He usado el 16F84A el cual anda perfecto para esta aplicación. Y he logrado manejar el display y todo lo demás menos el conteo de pulsos.

¿Es posible contar esos pulsos en un tiempo determinado sin interrumpir los otros procesos ? (Usando TRM0 y TMR1 o algo así )

Agradezco cualquier ayuda.

Saludos

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: Tacometro digital para autos
« Respuesta #1 en: 04 de Agosto de 2004, 11:19:00 »
Creoque tu problema principal no es la visualización sino el contar pulsos. Es decir, en tu programa la rutina principal es el cálculo de pulssos y cuando los hayas contado los visualizas.

No sé la cantidad de pulsos que debes contar, pero en PBP hay una función que se llama COUNT y que cuanta pulsos que entran por un pin.

COUNT Pin,Period,Var

Count the number of pulses that occur on Pin during the Period and stores the result in Var. Pin is automatically made an input. Pin may be a constant, 0-15, or a variable that contains a number 0-15 (e.g. B0) or a pin name (e.g. PORTA.0).
The resolution of Period is in milliseconds. It tracks the oscillator frequency based on the DEFINEd OSC.

COUNT checks the state of Pin in a tight loop and counts the low to high transitions. With a 4MHz oscillator it checks the pin state every 20us. With a 20MHz oscillator it checks the pin state every 4us. From this, it can be determined that the highest frequency of pulses that can be counted is 25KHz with a 4MHz oscillator and 125KHz with a 20MHz oscillator if the frequency has a 50% duty cycle (the high time is the same as the low time).

Example

" Count # of pulses on Pin1 in 100 milliseconds
COUNT PORTB.1, 100, W1

" Determine frequency on a pin
COUNT PORTA.2, 1000, W1 " Count for 1 second
SEROUT PORTB.0, N2400, [W1]

Saludos

Ricky
Madrid-España


Desconectado PICFaf

  • PIC10
  • *
  • Mensajes: 8
RE: Tacometro digital para autos
« Respuesta #2 en: 04 de Agosto de 2004, 14:10:00 »
Muchas gracias, pero ya he probado eso. No me sirve ya que el COUNT detiene todos los procesos para contar.....

La idea es que cuente en segundo plano sin interrumpir los otros procesos, como por ejemplo el barrido en el display.

Se les ocurre algo.... ?  Algo con interrupciones o algo así

Muchas gracias

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: Tacometro digital para autos
« Respuesta #3 en: 04 de Agosto de 2004, 14:22:00 »
Por qué hacerle trabajar al pic tanto? (se puede cansar)!!

Yo haría lo siguiente:
Pondría un lacht para retener los últimos valores capturados y mantenerlos en los displays sin parpadeos ni nada. El lacht el 4511. Esto te aisla del problema de refresco etc y te deja contar a tus anchas, por ejemplo cada segundo.  Eso si te saldrá más caro. Además podrás hacer otras cosas con el micro. Ganas tiempo.

Otra forma es contar los pulsos por el pin de interrupción externa, que esto te quita poco tiempo y con el otro timer cuentas 1 segundo  o una fracciín de segundo. Es otra idea.

Saludos

Ricky
Madrid-España

Desconectado PICFaf

  • PIC10
  • *
  • Mensajes: 8
RE: Tacometro digital para autos
« Respuesta #4 en: 04 de Agosto de 2004, 14:45:00 »
Tengo un 4511 en el circuito para pasar el BCD a 7 segmentos y con cuatro salidas del pic y un ULN2003 controlo qué display quiero encender.

Pero, cómo hago a que mientras cuente con el comando COUNT me siga mostrando el último numero de 4 cifras que había calculado (Frecuencia anterior)?

Salu2

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: Tacometro digital para autos
« Respuesta #5 en: 04 de Agosto de 2004, 15:11:00 »
Necesitas un lacht para cada display, es decir di tienes cuatro dígitos, necesitas 4--> 4511 o un 4511 y 4 circuitos de lacth, nio se que es más barato. Los latht o cerrojos en español lo que hacen es guardar el último valor que has metido hasta que de nuevo los refrescas. De este modo te da igual el tiempo que pase hasta el nuevo refresco, tus displays estrán iluminados con los valores de la cuenta anterior sin problemas.

Saludos
Ricky
Madrid-España

Desconectado PICFaf

  • PIC10
  • *
  • Mensajes: 8
RE: Tacometro digital para autos
« Respuesta #6 en: 04 de Agosto de 2004, 15:17:00 »
Te cuento que con el circuito que tengo viene un PIC grabado... Anda perfecto con un solo el 4511 y sin latch. Lo que no tengo es el programa del PIC. Y es lo que estoy tratando de hacer....

O sea que parto de un circuito fijo y tengo que hacer el programa a medida.

Muchas gracias igual por la sugerencia.

La entrada de pulsos es por la pata 3 (RA4/TOCK1), capas que eso te de una idea de como solucionarlo.

Muchas gracias.

Salu2

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: Tacometro digital para autos
« Respuesta #7 en: 04 de Agosto de 2004, 15:36:00 »
Tienes que activar timer0  como contador de pulsos en su registro correspondiente y luego generas la base de tiempos de 1 segundo por ejemplo en el timer1. Como se te desbordará el timer 0 antes de llegar a un segundo (no se cuantos pulsos tienes que contar) utilizas una variable intermedia por ejemplo una tipo word que vas aumentando según se va desbordando. Cuando llegas al tiempo estipulado por timer 1 haces la gestión del recuento para ver los numeros que tienes que poner en el display. Esta es la filosofía.

Saludos
Ricky
Madrid-España

Desconectado PICFaf

  • PIC10
  • *
  • Mensajes: 8
RE: Tacometro digital para autos
« Respuesta #8 en: 04 de Agosto de 2004, 15:41:00 »
Tengo que contar en 500 ms no más de 200 pulsos. La verdad no se como activar el contador y el timer. Me podrías ayudar con eso.... Quieres que te pase él archivo .bas que he hecho para que veas como he encarado el programa.. ?


Muchas Gracias

Salu2

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: Tacometro digital para autos
« Respuesta #9 en: 05 de Agosto de 2004, 02:46:00 »
Este es un ejemplo del timer 1 para retardar. Se producen 2 cuentas por segundo. En tu caso deberás ajustar el timer para que saltara cada 0.5 segundos. Se explican cada uno de los registros y se hacen los cálculos metodicamente:

"*************************************************************************
"** SUBRUTINA: retardar
"** conecta el timer1 para medir los retardos y activa f_retardo
"*************************************************************************
 
"DEFINICION DEL TIMER 1

"T1CON=%00110001  "TIMER 1 CONTROL REGISTER
"Ajusto el Timer1 para que cuente con el oscilador interno y utilice
"el prescaler por 8
"Prescaler a 8 bit<5-4> --> 11
"T1OSCEN Timer 1 osc enable control bit, bit <3> --> 0 (disable)
"T1SYNC no importa, bit<2> --> 0
"TMR1CS clock source, bit<1> --> 0 (internal clock, Fosc/4)
"TMR1ON timer1 On, bit<0> --> 1 (enable) comienza la cuenta

"Fosc=4000000, entrada prescaler=Fosc/4=1000000
"Salida prescaler=1000000/8=125KHz
"periodo=1/125KHz=8 microsegundos
"En un contador por 16 contara 65536 cuentas, pero para que salga un numero
"entero de veces que se desborda por segundo tiene que contar 62500 cuentas.
"por lo tanto tengo que cargar en el Timer 1 65536-62500=3036
"En un segundo la señal cambia 125000 veces con lo que
"el contador se desbordara en un segundo (125000/62500) =2 veces. Si deseo
"contar 30 seg., 2*30= 60 veces que debe desbordarse el TMR1.
"Este valor puedo guardarlo en una variable WORD (16 bit).
"El valor máximo del retardo es 255 segundos que son 510 desbordamientos

retardar:
 
  tiempo=0    " inicializo las cuentas de desbordamiento
  TMR1H=%00001011:TMR1L=%11011100  "cargo timer1 al valor 3036--> 101111011100
  PIR1.0=0 "reseteo el flag para seguir contando
  T1CON=%00110001  "TIMER 1 CONTROL REGISTER arranco el timer1
   
Return
   
"** FIN SUBRUTINA: retardar


En tu caso, todas estas cuentas te valen porque el tiempo transcurrido en un desbordamiento según está son 500000 microsegundos. Con lo que un desbordamiento son 0.5 segundos. Ya tienes la base de tiempo calculada.

--------------------------------------

Por otra parte debes ajustar el Timer cero para que cuente los pulsos exteriores.  Te pongo este ejemplo que tengo aquí pero tienes que modificarlo, porque está conectado al oscilador interno y tu debes conectarlo al pin externo tambien es posible que tengas que ajustar el prescaler.

"DEFINICION DEL TIMER 0

"OPTION_REG=%10000111  "OPTION REGISTER (TIMER0)
"<bit7> /RBPUA pull up port B. No aplicable. 1 deshabilitadas
"<bit6> INTEDG flanco activo para la INT. No aplicable.
"<bit5> T0CS  Timer0 Clock Source. 0 para reloj interno
"<bit4> T0SE  Flanco activo si clock entra por RA4. No aplicable.
"<bit3> PSA  El prescaler lo asigno a Timer0. 0 para Timer0
"<bit2> <bit1> <bit0> PS2,PS1,PS0, Divido el reloj por 256, --> 1,1,1
"TMR1ON timer1 On, bit<0> --> 1 (enable) comienza la cuenta

"Fosc=4000000, entrada prescaler=Fosc/4=1000000
"Salida prescaler=1000000/256=3906,25Hz
"periodo=1/3,90625KHz=256 microsegundos
"En un contador por 8 contara 256 cuentas, pero para que salga un numero
"entero de veces que se desborda por segundo tiene que contar 244 cuentas.
"por lo tanto tengo que cargar en el Timer 1 256-244=12 (%00001100)
"En un segundo la señal cambia 3906,25 veces con lo que
"el contador se desbordara en un segundo (3906,25/244) =16,0092 veces. Si deseo
"contar 60 seg., 16*60= 960 veces que debe desbordarse el TMR0.
"Este valor puedo guardarlo en una variable WORD (16 bit).
"El valor máximo del retardo es 255 segundos x 16 son 4080 desbordamientos



Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: Tacometro digital para autos
« Respuesta #10 en: 08 de Agosto de 2004, 04:29:00 »
Hola:
si te sirve en este sub foro he puesto el programa para rpm hecho en pbplus y lcd asi el pic descansa un poco ......por eso de los 7 segmentos y es mas practico ...y facil


saludos
khasistos

Desconectado srspinho

  • PIC10
  • *
  • Mensajes: 1
RE: Tacometro digital para autos
« Respuesta #11 en: 09 de Agosto de 2004, 08:49:00 »
Hola,

desculpe-me não falo espanhol, mas acho que posso ajudar :

O exemplo abaixo foi adaptado de um código escrito por Tim Box para PB Plus.

Fiz alguma modificações e tem funcionado bem com um 16F628 a 4 Mhz para ler a frequencia em RB7.

Pose-se usar este codigo para ler a frequencia e então calcular os RPMs

Não sei se o código está ótimo ou se pode ser melhorado.

Os companheiros do forum poderiam dar sugestões...

Abraços.

ps. Desculpem-me pelo portugues....

Sérgio Pinheiro


Define LCD_DREG PORTA
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5

REM Variables
TMR0_POSTCOUNT1 var WORD " POSTSCALER COUNTERS
COUNT_RESULT var WORD " THE RESULT OF THE COUNT
REFRESHED var BIT " FLAG TO SAY COUNT REFRESHED

"-------------------------"
ON INTERRUPT GOTO PULSE_COUNT " DEFINE WHERE TO JUMP TO ON AN INTERRUPT
"-------------------------"

GOTO INITIALIZE " JUMP ALL INT CODE

"----- INTERRUPT CODE -------------------
Disable
PULSE_COUNT:
TMR0 = TMR0 + 7 " RELOAD THE TIMER
TMR0_POSTCOUNT1 = TMR0_POSTCOUNT1 - 1
IF TMR0_POSTCOUNT1 = 0 THEN
TMR0_POSTCOUNT1 = 500 " 1/4 sec (may need some adjust)
T1CON.0 = 0 " TURN OFF THE TMR1
COUNT_RESULT.lowbyte = TMR1L " GET THE COUNT
COUNT_RESULT.Highbyte = TMR1H " GET THE COUNT
TMR1L = 0
TMR1H = 0
T1CON.0 = 1
REFRESHED = 1 " SET FLAG TO SAY COUNT READ
ENDIF
INTCON.2 = 0 " CLEAR INTTERUPT FLAG
Resume
enable " RELOAD THE SYSTEM VARS
"------ END OF INTERRUPTS CODE ----------

"------ INTIALIzE ALL REGS --------------
INITIALIZE:

TMR0_POSTCOUNT1 = 500 " INITIALZE THE POST SCALERS
OPTION_REG.0 = 0 " SET THE PRESCALER TO 1:1
OPTION_REG.1 = 0
OPTION_REG.2 = 0
OPTION_REG.5 = 0 " TMR0 CLOCK FROM MAIN OSC
OPTION_REG.3 = 0 " IN THIS INSTANCE PRESCALER IS ASSINED TO TMR0
INTCON.2 = 0 " CLEAR INTERRUPT FLAG
T1CON = %00000110
T1CON.0 = 1 " TURN TIMER 1 ON
TMR0 = 7 " LOAD THE TIMER
INTCON.5 = 1 " ENABLE TMR0 INTERRUPTS
REFRESHED = 0 " DONT MAKE FIRST READ UNTIL MAIN INT HAS OCCURED
INTCON.7 = 1 " START THE WHOLE THING RUNNING
COUNT_RESULT = 0
pause 500
lcdout $FE,1



"------ MAIN CODE BELOW HERE -------------

LOOP:
IF REFRESHED = 1 THEN
lcdout $fe,1,$fe,2, "Freq = ", dec (COUNT_RESULT * 4) " Show results in pulses / Sec
REFRESHED = 0 " PREVENT A RE-READ UNTIL NEXT MAIN INTERRUPT
ENDIF
GOTO LOOP

END

Desconectado PICFaf

  • PIC10
  • *
  • Mensajes: 8
RE: Tacometro digital para autos
« Respuesta #12 en: 10 de Agosto de 2004, 13:54:00 »
RGL me parece estupendo lo que me diste como ejemplo, es más estoy seguro que esa es la forma de implementarlo pero...

No puedo... Me larga error de compilación por todos lados...
 
Querés que te mande por mail el programa que hice en PBP para ver como incluir eso en el.

Muchísimas gracias por todo.

Salu2

Desconectado Mazinger_bcn

  • PIC10
  • *
  • Mensajes: 42
    • e-repair
RE: Tacometro digital para autos
« Respuesta #13 en: 30 de Septiembre de 2004, 07:15:00 »
Si te sirve para algo mira en esta pagina web
http://www.hobbyelectronica.tk
http://www.e-repair.tk

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: Tacometro digital para autos
« Respuesta #14 en: 30 de Septiembre de 2004, 09:01:00 »
Hola.

este funciona con 4 4511 ,tiene alarma programable,y borra los ceros innecesarios delante .esta funcionando perfectamente,
el pic no multiplexa saca los datos BCD y el 15 que ves en las instrucciones es para borrar el digito cuando es cero ,los pulsos debajo de dig son para el lacht de 4511

"*  Name    : RPMPROG.BAS  
"*  Date    : 12/05/04

 
          DEVICE = 16F877A
        XTAL = 20
        ALL_DIGITAL = TRUE
      
      
      
        PORTB_PULLUPS = ON      
        trisa=0         
        trisd.0=1
      trisc=0
       trise=0
        symbol led = PORTA    
     
        DIM X  AS BYTE
          DIM N as byte
        DIM RPM as DWORD
        DIM RPMR AS DWORD
        DIM A  as word
        Delayms 500   
      
"                       ****DATOS INICIALES*******   
      
         
   EDATA $42,$3A,$07  "ajustes iniciales se graba en la EEprom cuando lo programO

N = EREAD 0   
A= EREAD 1

                     "*** PRINCIPAL ***
      





   
   MAIN:
   
RPM = COUNTER PORTD.0 , 1000
RPMR= ((RPM*60)/66)
IF RPMR > A THEN PORTc.4=1
if rpmr < A then PORTc.4=0





led=low
led= dig rpmr,0
portc.0=0
delayus 2
portc.0=1

led= low
if rpmr < 9 then led=15
if rpmr > 9 then led= dig rpmr,1
portc.1=0
delayus 2
portc.1=1

led=low
if rpmr < 99 then led=15
if rpmr > 99 then led= dig rpmr,2
portc.2=0
delayus 2
portc.2=1



led=low
if rpmr < 999 then led=15
if rpmr > 999 then led= dig rpmr,3
portc.3=0
delayus 2
portc.3=1

if portb.3=0 then goto alarma

goto main




ALARMA:



led=low
led= dig a,0
portc.0=0
delayus 2
portc.0=1

led= low
if a < 9 then led=15
if a > 9 then led= dig a,1
portc.1=0
delayus 2
portc.1=1

led=low
if a < 99 then led=15
if a > 99 then led= dig a,2
portc.2=0
delayus 2
portc.2=1


led=low
if a < 999 then led=15
if a > 999 then led= dig a,3

portc.3=0
delayus 2
portc.3=1

     if  PORTB.1=0 then a=a+10
     if  a > 2000 then a =  10
    delayms 150
   
   
   
   if  PORTB.0=0 then a=a-10
    if  a < 10 then a= 2000
    delayms 150
   
   
   
   
   IF PORTB.2=0 THEN EWRITE 1 ,[A ]
   DELAYMS 100
   
   if portb.4=0 then goto main
    goto alarma
 
 

Ojo con el 66 esta hecho para contar a partir de una corona de 66 dientes ajusta este valor a tus necesidades....
Los valores iniciales que se graban en la eeprom cuando lo grabas puedes cambiarlos o cuando esta en marcha y programas la alarma se cambiaran y guardaran solosen la eeprom
Suerte
khasistos





 

anything