Autor Tema: R.P.M de motor DC Visualizados en LCD o 7 segmentos  (Leído 6662 veces)

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

Desconectado etarrita

  • PIC10
  • *
  • Mensajes: 3
R.P.M de motor DC Visualizados en LCD o 7 segmentos
« en: 29 de Abril de 2010, 06:15:05 »
hola a todos...

estoy armando un proyecto que mostrata en un lcd o en 4 7-segmentos ya que las rpm max del motor son 3200, hasta ahora he logrado armar este codigo en picc, que se encarga de todo el proceso del calculo de las rpm ( gracias a pocher por sus comentarios en otros temas sobre esto) ahora bien, tengo en una variable llamada velocidad el calculo de las rpm en decimal, no encuentro la forma de mostrar esto en los 4 7-segmentos ya que tengo un int16 y no se me ocurre como hacer la division de los digitos para luego entrar en el proceso de los displays, de todo lo que he leido pude entender que me seria mas facil enviar toooooda la variable a un lcd ( creo que seria mas facil al lcd que a los 7-segmentos) el problema es que no tengo experiencia utilizando lcd.

OJO: este programa estaba originalmente disenado para enviar el valor de "velocidad" por puerto serial a la pc para ser manejado luego por visual basic.

PD: el programa fue realizado por pocher, xa, etc. gracias a ellos...

aqui va:

#include <16F877A.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)

int16 pulsos;
int16 interrupcion;
int16 velocidad;

Interrupcion A estoy tratando de elegir entre esta o la interrupcion B

/*#int_RTCC

void RTCC_isr()
{
pulsos=get_timer1();
interrupcion++;
if(interrupcion==100)
{
//pulsos=get_timer1();
velocidad=pulsos*60;
//printf("%lu ",pulsos);
//printf("%lu ",velocidad);

//delay_ms(1000);
interrupcion=0;
set_timer1(0);
set_rtcc(178);
}
else
{
set_rtcc(178);
set_timer1(pulsos);
} */


Interrupcion B
/*
 void RTCC_isr()
{   
interrupcion++;
if(interrupcion==100)
{
   pulsos=get_timer1();
   velocidad=pulsos*60;
  // printf("%lu   ",pulsos);
  // printf("%lu   ",velocidad);
   delay_ms(2000);
   interrupcion=0;
   set_timer1(0);
   set_rtcc(177);
}
*/

}


void main()
{

set_tris_c(0x01);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_128);
set_rtcc(177); //10ms -> 10000us -> 10000/128=78 -> 255-78=177

setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1);
set_timer1(0);

interrupcion=0;

while(true)
{

//aqui creo que tendria que empezar la rutina para enviar los datos al lcd o a los 7-segmentos
}

}

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: R.P.M de motor DC Visualizados en LCD o 7 segmentos
« Respuesta #1 en: 29 de Abril de 2010, 09:46:00 »
Mirate esto, un amigo de Mexico me pidio que le hiciese algo asi y se lo subi hace dos dias, a ver si te sirve

Desconectado erdanieee

  • PIC10
  • *
  • Mensajes: 44
Re: R.P.M de motor DC Visualizados en LCD o 7 segmentos
« Respuesta #2 en: 29 de Abril de 2010, 09:50:17 »

Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
Re: R.P.M de motor DC Visualizados en LCD o 7 segmentos
« Respuesta #3 en: 29 de Abril de 2010, 13:41:57 »
hola a todos...

estoy armando un proyecto que mostrata en un lcd o en 4 7-segmentos ya que las rpm max del motor son 3200, hasta ahora he logrado armar este codigo en picc, que se encarga de todo el proceso del calculo de las rpm ( gracias a pocher por sus comentarios en otros temas sobre esto) ahora bien, tengo en una variable llamada velocidad el calculo de las rpm en decimal, no encuentro la forma de mostrar esto en los 4 7-segmentos ya que tengo un int16 y no se me ocurre como hacer la division de los digitos para luego entrar en el proceso de los displays, de todo lo que he leido pude entender que me seria mas facil enviar toooooda la variable a un lcd ( creo que seria mas facil al lcd que a los 7-segmentos) el problema es que no tengo experiencia utilizando lcd.

OJO: este programa estaba originalmente disenado para enviar el valor de "velocidad" por puerto serial a la pc para ser manejado luego por visual basic.

PD: el programa fue realizado por pocher, xa, etc. gracias a ellos...

aqui va:

#include <16F877A.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)

int16 pulsos;
int16 interrupcion;
int16 velocidad;

Interrupcion A estoy tratando de elegir entre esta o la interrupcion B

/*#int_RTCC

void RTCC_isr()
{
pulsos=get_timer1();
interrupcion++;
if(interrupcion==100)
{
//pulsos=get_timer1();
velocidad=pulsos*60;
//printf("%lu ",pulsos);
//printf("%lu ",velocidad);

//delay_ms(1000);
interrupcion=0;
set_timer1(0);
set_rtcc(178);
}
else
{
set_rtcc(178);
set_timer1(pulsos);
} */


Interrupcion B
/*
 void RTCC_isr()
{   
interrupcion++;
if(interrupcion==100)
{
   pulsos=get_timer1();
   velocidad=pulsos*60;
  // printf("%lu   ",pulsos);
  // printf("%lu   ",velocidad);
   delay_ms(2000);
   interrupcion=0;
   set_timer1(0);
   set_rtcc(177);
}
*/

}


void main()
{

set_tris_c(0x01);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_128);
set_rtcc(177); //10ms -> 10000us -> 10000/128=78 -> 255-78=177

setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1);
set_timer1(0);

interrupcion=0;

while(true)
{

//aqui creo que tendria que empezar la rutina para enviar los datos al lcd o a los 7-segmentos
}

}


La parte que mencionas no es difícil; lo único que tienes que hacer es extraer el digito de la variable obteniendo la unidad, decena, centena, y asta el infinito y  mas allá, lo cual se hace dividiendo en el foro hay varios ejemplos de cómo hacerlo. El único detalle es que si el micro va a controlar los displey tendrás muchos problemas ya que el refresco de los mismos requiere la atención permanente del micro por lo cual te sugiero un controlador externo en maxim ay muchos.
Te recomiendo que optes por los displey de 7seg ya que se aprecian a mayor distancia que  el lcd además de ofrecer mayor Angulo de visión  ventajas muy buenas para una aplicación industrial
Suerte


Desconectado etarrita

  • PIC10
  • *
  • Mensajes: 3
Re: R.P.M de motor DC Visualizados en LCD o 7 segmentos
« Respuesta #4 en: 29 de Abril de 2010, 16:27:30 »
gracias por sus respuestas, pero claro mi problema es que para hacer lo de las unidades decena y centenas etc se me pierden recursos del micro, aun no se como hacer, seguire intentando

Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
Re: R.P.M de motor DC Visualizados en LCD o 7 segmentos
« Respuesta #5 en: 29 de Abril de 2010, 20:57:40 »
gracias por sus respuestas, pero claro mi problema es que para hacer lo de las unidades decena y centenas etc se me pierden recursos del micro, aun no se como hacer, seguire intentando


No para obtener las unidades decenas etc. no pierdes recursos del pic ya que solo son divisiones, en lo que el pic si  se entretiene es en refrescar los displey.
En una rutina obtén los dígitos  y en otra manda estos dígitos a un max7219  y listo  :-/ :-/  entiendo que el max no es fácil de conseguir y que es algo caro pero bien vale la pena conseguirlo te simplifica la programación bastante
En el foro hay varios ejemplos de cómo obtener los dígitos de una variable y como manejar el max7219 o en el ultimo de los casos visualiza en un lcd que no tiene mayor complicación.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
Re: R.P.M de motor DC Visualizados en LCD o 7 segmentos
« Respuesta #6 en: 29 de Mayo de 2010, 15:56:43 »
Hola. Acabo de ver el tema.

Decías que tenías problemas para trocear un número de 4 dígitos y convertirlo en unidades , decenas, centenas y unidad de millar.

Si todavía te sirve, esta es una forma (hay más):

unidad=valor%10;          //separo la unidad

decena=(valor/10)%10;      //separo la decena

centena=(valor/100)%10;      //separo centena

miles=(valor/1000);              //separo miles

Luego lo único que tienes que hacer es activar el K.C. (ó A.C.) de las unidades y enviar el valor de la unidad (tendrás previamente que hacer una tabla con la codificación a 7 segmentos), luego temporizas 5ms por ejemplo y lo mismo para las decenas etc.

Un saludo