Autor Tema: Tacometro con 16f648 y multiplexado con registros desplazamiento  (Leído 5345 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Diego Gonzalez

  • PIC18
  • ****
  • Mensajes: 323
    • Visita mi web sobre electronica,fisica,mecanica y demas temas....
Hola a todos.

Lo primero tengo que pedir disculpas ante el posible tirón de orejas que me podais dar, pero el caso es que hace 2 o 3 años que no toco mucho los pics, aunque el lenguaje c lo tengo medio fresco, y recordarlo no creo que sea problema.

El caso es que me acabo de comprar una fresadora y quisiera hacer un tacometro, en el que queria emplear 4 displays multiplexados. La tecnica de multiplexacion la tengo muy probada, como en contadores y relojitos, pero para esta vez me plantee la logica de diseño del tacometro mediante interrupciones. Explico escuetamente.

El pic multiplexa continuamente.
Llega una interrupcion de un puerto (¿el B podria ser?) y la atiende inmediatamente.
Leemos el valor que tiene el timer de la anterior cuenta y calculamos las rpm en funcion del valor que alcanzase el timer entre interrupcion e interrupcion
ponemos a cero y salimos de la interrupcion
Luego en el principal seguimos mostrando las rpm calculadas en la interrupcion.

¿Que os parece? He intentado buscar sobre el tema pero estoy bastante oxidado amigos :?

Un saludo y mil perdones si es muy obvio para alguien.

pd: Cachisss, se me pasaba la principal pregunta. ¿Es la interrupcion del puerto b la mas apropiada? Puedo utilizar un pic "sencillo" como el 16f88 o similar para hacer la multiplexión y encima tener pin libre para la interrupcion por cambio de estado del puerto?

Gracias amigos!! :P
« Última modificación: 16 de Abril de 2010, 03:46:05 por Diego Gonzalez »
Visita mi web sobre electronica,fisica,mecanica y demas temas....

http://sites.google.com/site/skygaps/Home

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Tacometro con 16f648 y multiplexado (preguntas, no proyecto)
« Respuesta #1 en: 15 de Abril de 2010, 17:09:01 »
Una manera de hacerlo sería que el Timer0 cuente pulsos externos durante un período de tiempo (impuesto por nosotros) y luego hacer los cálculos correspondientes. El problema es que éste método difícilmente se podría llevar a cabo en un lenguaje de alto nivel, ya que uno no es capaz de tener un control preciso del tiempo. En assembler sé que funciona porque lo usé en un Frecuencimetro y en un tacómetro para aeromodelismo.

Con el 16F648 usando el modulo CCP en modo Capture se podría hacer fácilmente.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Diego Gonzalez

  • PIC18
  • ****
  • Mensajes: 323
    • Visita mi web sobre electronica,fisica,mecanica y demas temas....
Re: Tacometro con 16f648 y multiplexado (preguntas, no proyecto)
« Respuesta #2 en: 16 de Abril de 2010, 03:43:08 »
Hola Angelgris

Lo primero muchas gracias por responder :-/

El caso es que creo que he encontrado una solucion.
Mi idea inicial es y siempre pretendió ser emplear un pic de poco patillaje, y buscando y requetebuscando encontré la posibilidad de usar registros de desplazamiento para el control de los displays de 7 segmentos.

Creo que es mucho mejor incrementar el timer  (o timers/variables por si se desborda) un tiempo establecido, y lo suficientemente pequeño como para tener una buena resolucion, para después ver cuanto se ha incrementado cada vez que se atienda la interrupcion por cambio de estado.Mi maquina va de las 80rpm a las 3600 (pondremos 4000 de tope superior o algo mas) y con esta configuracion la cadencia de refresco en los datos creo que es mucho mayor

Ayer, y hoy, queria pelearme con el multiplexado, y cuando domine eso bien, creo que ya me meteré con el tacometro en si.

Cualquier duda os la agradezco. Como veis me lo curro yo, no pido nada ya hecho :D
Visita mi web sobre electronica,fisica,mecanica y demas temas....

http://sites.google.com/site/skygaps/Home

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tacometro con 16f648 y multiplexado con registros desplazamiento
« Respuesta #3 en: 16 de Abril de 2010, 06:26:43 »
Utiliza el timer1 en modo contador, cuenta cierta cantidad de pulsos por un determinado tiempo y lo expones en los display. Entre más tiempo cuentes los pulsos, mayor resolución.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Diego Gonzalez

  • PIC18
  • ****
  • Mensajes: 323
    • Visita mi web sobre electronica,fisica,mecanica y demas temas....
Re: Tacometro con 16f648 y multiplexado con registros desplazamiento
« Respuesta #4 en: 16 de Abril de 2010, 06:46:31 »
Hola Suki,

Eso mas o menos es lo que nos comento nuestro amigo Angelgris, sin embargo creo que no es el mejor modo de contar revoluciones ya que la tasa de refresco está impuesta por nuestro tiempo entre los "muestreos" ya sea 1 segundo, medio o un cuarto de segundo.

Con mi idea de emplear las interrupciones por cambio de estado, se atiene una interrupcion inmediatamente con cada vuelta del motor, con lo que dependiendo de la tasa de aumento del timer, podria tener una respuesta mas inmediata que tener que "leer" cada segundo o casa "X" tiempo.

No se son solo ideas. Mi principal problema (y que era mi problema inicial) era si seria posible dejar libre el puerto b para interrupcion por cambio de estado y multiplexacion, mientras que el A mostraba los digitos, pero el pin 5 del A siempre es entrada hagas loq ue hagas. La solución que encontre a todo este asunto es emplear tan solo dos pines con el registro de desplazamiento y  asi controlar los displays.

Aun no consigo controlar bien el asunto, pero espero en breve dominar el multiplexado, para meterme con los timer e interrupcion del B.

Uso el 16f88

Gracias por las respuestas. De verdad ;-)
Visita mi web sobre electronica,fisica,mecanica y demas temas....

http://sites.google.com/site/skygaps/Home

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tacometro con 16f648 y multiplexado con registros desplazamiento
« Respuesta #5 en: 16 de Abril de 2010, 08:26:45 »
Pero, actualizando cada 500 ms no lo vas a ni notar  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Tacometro con 16f648 y multiplexado con registros desplazamiento
« Respuesta #6 en: 16 de Abril de 2010, 09:54:37 »
No se son solo ideas. Mi principal problema (y que era mi problema inicial) era si seria posible dejar libre el puerto b para interrupcion por cambio de estado y multiplexacion, mientras que el A mostraba los digitos, pero el pin 5 del A siempre es entrada hagas loq ue hagas. La solución que encontre a todo este asunto es emplear tan solo dos pines con el registro de desplazamiento y  asi controlar los displays.

¿Supongo que utilizarías 4 displays? Si utilizás el RB0 (que genera interrupción externa) como entrada para el "contador" te quedarían libres 7 pines del puerto B, justo para manejar los 7 segmentos exceptuando el punto. Y se podrían utilizar desde RA0 hasta RA3 para el multiplexado...

Yo hice así con el frecuencímetro. Con el tacómetro fue un bardo porque usé un LCD de un equipo de Audio y tuve que generar rutinas para hacer la salida alterna y bla bla bla...

También se puede pensar en un MAX7221 para el display
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Diego Gonzalez

  • PIC18
  • ****
  • Mensajes: 323
    • Visita mi web sobre electronica,fisica,mecanica y demas temas....
Re: Tacometro con 16f648 y multiplexado con registros desplazamiento
« Respuesta #7 en: 16 de Abril de 2010, 10:11:08 »
Hola Angelgris

El tema del multiplexado y los registros de desplazamiento al fin los tengo solucionados :)

Pero llevo 4 o 5 horas delante del ordenador y estoy un poco atorado

Estoy teniendo problemas con las interrupciones. Segun he leido en esta ultima media hora existen problemas con el compilador y la atencion a las interrupciones rb4-rb7 por cambio de estado.

Ahora mismo ocupe el rb0 con el clock de los registros, por lo que solo he probado las interrupciones rb4-rb7 por cambio de estado, pero me dan problemas de conflicto con la interrupcion por timer.

Es decir, si anulo la parte del programa que atiende la interrupcion en el puerto, el programa que ahora estoy utilizando para saber si me funciona el multiplexado (un contador de 0000a9999 1hz) funciona bien, pero si ademas de meter la interrupcion del timer, meto la del puerto, hay problemas y deja de ser 1 hz. El pic se estanca por algun lado.


Muchas gracias por la atencion.
Visita mi web sobre electronica,fisica,mecanica y demas temas....

http://sites.google.com/site/skygaps/Home

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tacometro con 16f648 y multiplexado con registros desplazamiento
« Respuesta #8 en: 16 de Abril de 2010, 11:48:59 »
Muéstranos algo de código para ver el inconveniente. Si decides medir el pulso en lugar de contarlos, vas a tener que realizar un promedio de unas 10 medidas, para que sea más estable, sino va a ser muy oscilatorio.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Diego Gonzalez

  • PIC18
  • ****
  • Mensajes: 323
    • Visita mi web sobre electronica,fisica,mecanica y demas temas....
Re: Tacometro con 16f648 y multiplexado con registros desplazamiento
« Respuesta #9 en: 16 de Abril de 2010, 12:28:47 »
Hola Suki, En eso estaba. Estaba quitando toda la porqueria que sobraba,

Fijate. Si lo dejas asi atiende la interrupcion perfectamente de RB0, pero la temporizacion no es la misma. EDITOOOOO!!! Me acaba de saltar una chispa entre neuronas y recorde el tan usado durante mis estudios "stopwatch". Parece ser que el problema es de proteus, y no del programa.

Aqui os lo dejo: Parece que ya puedo encarar el tacometro propiamente dicho. (ahora tan solo es un contador con una interrupcion por el medio que parpadea un led de rb3)

Código: [Seleccionar]
//Device/Fuses/Etc.---------------------------------
#INCLUDE <16F88.H>            //Usamos un 16F88
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Con oscilador a cristal...
#use delay(clock=4000000)       //..de 4MHz.
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //No protegemos el codigo.
#FUSES NOBROWNOUT               //No Brownout Reset
#FUSES NOLVP                    //No low voltage prgming
#FUSES NOCPD                    //No EE protection
#use standard_io(B)
#use standard_io(A)
/*TABLA
7segmentos Decimal
0 252
1 96
2 218
3 242
4 102
5 182
6 190
7 224
8 255
9 230
*/
char i=0,j=0,w=0,z=0,flag=0,var=20;
int m=0;
//////////////////////////////////////////////////////////////////////////////////////////////////
void escribo(int8 aux){
   int m;
   for (m=0;m<8;m++) {   // "m" irá de 0 a 7, de 1 en 1.
      //Si el bit es "0", escribo un "0".
      if (bit_test(aux,m) == 0) {
         output_low(PIN_B2);    //Pongo "0" en DATA7...
         output_low(PIN_B1);   //Pongo el CLOCK en bajo...
         output_high(PIN_B1);  //...y de nuevo en alto. Listo!  
      }
      //Si el bit es "1", escribo un "1".
      if (bit_test(aux,m) == 1) {
         output_high(PIN_B2);    //Pongo "1" en DATA7...
         output_low(PIN_B1);   //Pongo el CLOCK en bajo...
         output_high(PIN_B1);  //...y de nuevo en alto. Listo!  
      }
   }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void borro_display(void){
   int m;
   for (m=1;m<33;m++) {   // "m" irá de 1 a 32, de 1 en 1.
         output_low(PIN_B2);    //Pongo "0" en DATA7...
         output_low(PIN_B1);   //Pongo el CLOCK en bajo...
         output_high(PIN_B1);  //...y de nuevo en alto. Listo!
   }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
#int_EXT

void Start_isr(void)
  {
disable_interrupts(int_EXT); //deshabilidatos la interrupcion
output_high(PIN_B3);  
delay_ms(100);  
output_low(PIN_B3);  
delay_ms(100);
output_high(PIN_B3);  
delay_ms(100);
output_low(PIN_B3);  
enable_interrupts(int_EXT); //deshabilidatos la interrupcion
  clear_interrupt(int_EXT);
  }
//////////////////////////////////////////////////////////////////////////////////////////////////////
#INT_TIMER0
void interrupcion()
{
   if(flag>var){            //¿ya es 1 segundo?
      var--;               //SI -> decremento var...
      if(var<18)
         var=20;            //...ajuste fino de 1s
      flag=0;               //reset flag para contar 1s
      if(i>8){            //¿se ha mostrado por 1º 7seg digito 9?
         i=0;            //SI -> i=0 (muestra digito 0) (*)
         j++;            //incremento indice j
         if(j>9){         //¿se ha mostrado por 2º 7seg digito 9?
            j=0;          //SI -> j=0 (muestra digito 0)
            w++;         //incremento indice w
            if(w>9){      //¿se ha mostrado por 3º 7seg digito 9?
               w=0;      //SI -> w=0 (muestra digito 0)
               z++;      //incremento indice z
               if(z>9)      //¿se ha mostrado por 4º 7seg digito 9?
                  z=0;   //SI -> z=0 (muestra digito 0)
               }
            }
            }
      else{         //(*) NO -> incrementa i
         i++;}
      }
   set_timer0(61);      //reset TMR0
   flag++;            //incremento variable flag
}
////////////////////////////////////////////////////////////////////////////////////////////////////

void main(void){
int tab7seg[10]={252,96,218,242,102,182,190,224,255,230};   //7seg Dec 0-9

set_tris_b(0b11111001); //1=ENTRADA, 0=SALIDA
    borro_display();


enable_interrupts(INT_RB);      
enable_interrupts(int_EXT);
    ext_int_edge(L_TO_H);        
enable_interrupts(INT_TIMER0);            
    setup_counters(RTCC_INTERNAL,RTCC_DIV_256);  
    set_timer0(61);                        
enable_interrupts(GLOBAL);    
clear_interrupt(int_EXT);          


do{
escribo(tab7seg[ i ]);
  escribo(tab7seg[ j ]);
        escribo(tab7seg[ w ]);
escribo(tab7seg[ z ]);
        delay_ms(1000); // delay para mostrar correctamente en la simulacion. En la vida real no existe para eliminar parpadeo (multiplexado)

}while(TRUE);

}


Un saludo y decirme que fallos le veis en funcionamiento (si teneis tiempo de simularlo claro)
Visita mi web sobre electronica,fisica,mecanica y demas temas....

http://sites.google.com/site/skygaps/Home

Desconectado Diego Gonzalez

  • PIC18
  • ****
  • Mensajes: 323
    • Visita mi web sobre electronica,fisica,mecanica y demas temas....
Re: Tacometro con 16f648 y multiplexado con registros desplazamiento
« Respuesta #10 en: 21 de Abril de 2010, 16:36:36 »
Hola

Regreso de nuevo por aqui.
Ya he realizado las primeras pruebas, pero acuso un parpadeo durante la carga de los registros, y aunque es una "pijada" me molesta ese pequeño parpadeo ya que pretendo hacer un montaje definitivo del tacometro en mi fresadora.

Ahora empleo un 16f84 que es el que tenia por los cajones, y lo muevo a 4mhz. Al final recurrí a los que me comentaron los compañeros de espèrar "x" tiempo y luego mostrar los pulsos.

Se me ocurre intentar hacerlo funcionar a 8 o forzarlo incluso a 20mhz, para que el proceso de carga sea mas rapido y se evite el mini parpadeo.

¿Que opinais? Podria recurrir a otros integrados con strobe, pero usé los 74ls164 y ya lo tengo todo montado en placa de topos. Me gustaria una alternativa sencilla.
En mi opinión hacer correr mas al pic, y que asi carge los registros podria mejorar, pero no estoy completamente seguro

Un poquito de ayudaaa :P Tormenta de ideaaaass ;-)

Os dejo el video del funcionamiento que grabe hoy

Visita mi web sobre electronica,fisica,mecanica y demas temas....

http://sites.google.com/site/skygaps/Home

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Tacometro con 16f648 y multiplexado con registros desplazamiento
« Respuesta #11 en: 21 de Abril de 2010, 17:55:02 »
Yo trabajé con F84 a 8MHz e incluso a 16MHz pero lo utilizaba poco tiempo (lo usaba para simular un tarjeta chip de telefonía pública), funcionaba bien pero habría que ver si estando mucho tiempo funcionando no comienze a fallar.

No queda otra que hacer la prueba.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Tacometro con 16f648 y multiplexado con registros desplazamiento
« Respuesta #12 en: 22 de Abril de 2010, 09:18:53 »
Diego, has probado aumentando la frecuencia de refresco de los displays?

Es int_EXT  quien se encarga de eso, no?

Probaría a aumentar la tasa de refresco y quitando los delay de la interrupción, usando el timer1 para levantar el flag de apagado o encendido.

Un saludo.

Desconectado Diego Gonzalez

  • PIC18
  • ****
  • Mensajes: 323
    • Visita mi web sobre electronica,fisica,mecanica y demas temas....
Re: Tacometro con 16f648 y multiplexado con registros desplazamiento
« Respuesta #13 en: 22 de Abril de 2010, 10:51:37 »
Hola InoxSteel.

La frecuencia de refresco está marcada por la velocidad del ciclo instruccion del pic. Es decir, de la frecuencia del cristal, ya que la funcion que muestra los datos, los vuelca en los registros a la maxima velocidad que puede (no se emplean delays de ningun tipo)

Los delays de ahi arriba sobran para lo que estoy haciendo, pero me sirvieron para conocer el estado de la interrupcion durante el funcionamiento del programa, y me sacaron la duda si tenia un problema de programacion o no. No lo tengo, y como casi siempre, el problema fue proteus, que el pobre a veces le cuesta hacer andar los programas "correctamente". Pero bueno. Solucionado!!

Int ext no se encarga del refresco, solo cuenta pulsos del sensorhall. El timer es el encargado de refrescar los displays cada 250ms, 500ms o 1000ms (todo depende del rango de rpm a medir y la precision que se quiera obtener)
Bueno hay muchas formas de hacer un tacometro, pero para conocer las rpm de mi fresadora que van desde 70 a 500 en engranajes cortos, y de 500 a 3000 en largas, pues me vale de sobra refrescar cada segundo.

saludos
Visita mi web sobre electronica,fisica,mecanica y demas temas....

http://sites.google.com/site/skygaps/Home


 

anything