TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ncoliv en 28 de Julio de 2008, 16:55:08

Título: incremento y visualizaciòn
Publicado por: ncoliv en 28 de Julio de 2008, 16:55:08
Solucionado el tema de la variable tal cual lo dijieron uds. Muchas gracias
Estoy tratando de hacer  un programa muy simple  que muestre el incremento de una variable mediante un lcd cada vez que por uno de los pines de un  puerto ( el b por ejemplo) del pic se presente un  estado alto de tensiòn (5 volts). Cuando lo compilo me arroja una serie de errores que no logro corregir. por favor dejo el programa para que me digan los errores que estoy cometiendo y corregirlos.
Muchas Gracias.

#include <16f877a.h>  //PIC utilizado         
#fuses XT,NOWDT,NOPROTECT,PUT  //Configuramos los fuses
#use delay (clock=4000000)     //Oscilador a 4Mhz
#use fast_io(b)   //Optimizamos E/S del PORTB
#include <lcd.c>
long int pulsos=0 //declaro la variable  pulsos de 16 bit y la inicializo

//------Programa principal-----
void main(void)
{set_tris_b(0xfe);//Pin RB1 del puerto B como salida, el resto como entrada
 disable_interrupts(global);// Toda las interrupciones desactivadas
do{
   if(input(Pin_b1));  // si se presenta un alto en el pin B1 del puerto
puslos++ // incremento la variable
lcd_init();
printf(lcd_putc,"pulsos= %lu" //presento la variable por el lcd
}while(true); //cicleo infinito
}
Título: Re: incremento y visualizaciòn
Publicado por: QIQE en 28 de Julio de 2008, 17:08:25
void main(void)
{lcd_init();
set_tris_b(0xfe);//Pin RB1 del puerto B como salida, el resto como entrada
 disable_interrupts(global);// Toda las interrupciones desactivadas
do{
   if(input(Pin_b1));  // si se presenta un alto en el pin B1 del puerto
puslos++ // incremento la variable
delay_ms(500);//Para que no incremente tan rápido
lcd_gotoxy(1,1);//Para escribir siempre en la misma posición
printf(lcd_putc,"pulsos= %lu" //presento la variable por el lcd
}while(true); //cicleo infinito
}

Prueba con esas variaciones del código

cuentanos que tal
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 28 de Julio de 2008, 18:48:39
Gracias por la respuesta. Ahora, cuando compilo me aparecen estos errores.

 *** Error 76 "inc.c" Line 13(1,9): Expect ;
*** Error 51 "inc.c" Line 16(1,2): A numeric expression must appear here


la línea 13 es:   delay_ms(500);//Para que no incremente tan rápido
 y la 16 es :     }while(true); //ciclo infinito

Te agradeceré las respuestas.
Título: Re: incremento y visualizaciòn
Publicado por: scientist en 28 de Julio de 2008, 18:55:29
en donde esta pulsos++ aun no le has puesto el ; acuerdate que despues de cada sentencia, debe de llevar el ; (punto y coma)
printf(lcd_putc,"pulsos= %lu"); en esta linea no pusist el ) y ; saludos
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 28 de Julio de 2008, 19:26:55
OK, scientist, no me había percatado de eso. Los errores son menos ahora. Solamente faltaría salvar este :

cuando compilo resulta esto:    Error 116 "inc.c" Line 15(30,31): Printf variable count (%) does not match actual count  ::
 
la línea 15 es:                     printf(lcd_putc,"pulsos= %lu"); //presento la variable por el lcd

gracias y un saludo.
Título: Re: incremento y visualizaciòn
Publicado por: jfh900 en 28 de Julio de 2008, 19:52:46
Falta poner la variable:

printf(lcd_putc,"pulsos= %lu"); //presento la variable por el lcd

Sustitúyelo por:

printf(lcd_putc,"pulsos= %lu",puslos); //presento la variable por el lcd

Bueno supongo que quisiste poner "pulsos"

Un saludo
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 28 de Julio de 2008, 20:46:13
0 ERRORES, 0 WARNING
AHORA VIENE EL MOMENTO DE LA VERDAD, VERE SI FUNCIONA EL HARD.
HASTA OTRA CONSULTA Y MUCHAS GRACIAS.
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 30 de Julio de 2008, 19:57:37
Nuevamente en línea. Todo bien, el programa está andando  solo que el incremento es automático y debería de hacerlo solo cuando un nivel de 5 volts aparezca en el PIN B1. Que puede estar sucediendo. Tengo conectado un micropulsador al pin B1 y no le lleva el apunte. Desde ya muchas gracias por su colaboración.
Título: Re: incremento y visualizaciòn
Publicado por: jfh900 en 30 de Julio de 2008, 20:12:06
El error es de libro:

if(input(Pin_b1));  // si se presenta un alto en el pin B1 del puerto
puslos++ // incremento la variable

Hay que sustituirlo por:

if(input(Pin_b1))  // si se presenta un alto en el pin B1 del puerto
puslos++; // incremento la variable

Fíjate donde va el punto y coma.

Un saludo
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 30 de Julio de 2008, 20:29:18
Persiste el conteo automático.
Título: Re: incremento y visualizaciòn
Publicado por: jfh900 en 30 de Julio de 2008, 20:33:23
¿Puedes poner todo el programa?

Un saludo
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 30 de Julio de 2008, 20:52:10
Creo que encontre el error que estoy cometiendo en el hard. El pin tiene que tener una conexión pull up? . Es decir mediante una R tiene que ir a 5volts. cuando lo mando a masa al pin cuenta? O itene que estar permenente en masa. y cuando lo saco de ese estado cuenta. Algo de eso debe ser. Te paso el programa .
 #include <16F877.h>
 #fuses HS,NOWDT,NOPROTECT,NOLVP
 #use delay(clock=20000000) 
 #include <lcd.c> 
 long int pulsos=0;
 void main(void)
{lcd_init();
set_tris_b(0xfe);//Pin RB0 del puerto B como salida, el resto como entrada
 disable_interrupts(global);// Toda las interrupciones desactivadas
do{
   if(input(Pin_b1)){  // si se presenta un alto en el pin B1 del puerto
pulsos++;
}//incremento la variable
delay_ms(500);//Para que no incremente tan rápido
lcd_gotoxy(1,1);//Para escribir siempre en la misma posición
printf(lcd_putc,"pulsos= %lu",pulsos); //presento la variable por el lcd
}while(true); //ciclo infinito
}

Saludos
Título: Re: incremento y visualizaciòn
Publicado por: jfh900 en 30 de Julio de 2008, 20:56:17
Efectivamente hay que poner una resistencia (10K) a +5V y a la patilla de RB0, al mismo tiempo ponemos un pulsador entre esta patilla y masa. De esta forma nos aseguramos que cuando no está apretado el pulsador tenemos +5V en RB0 y que cuando lo pulsamos se pone a masa o a 0V que es lo mismo.

Un saludo
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 31 de Julio de 2008, 16:47:48
Se podrìa realizar el incremento de esta variable cuando haya un cambio de 0 a 5volts ( es decir por un flanco positivo ) de ser asì, que funciòn serìa.
Muchas gracias
Título: Re: incremento y visualizaciòn
Publicado por: MLO__ en 02 de Agosto de 2008, 21:07:07
Hola.

Se podria usar las interrupciones, la de RB0 vendria bien.

Saludos
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 05 de Agosto de 2008, 18:46:21
Gracias por las respuestas. ¿Como sería la declaración de la interrupción por el RB0 en el encabezado del programa?. De esa manera cada vez que haya un cambio de 0 a 5 se Incremente una variable que es la que se muestra por el lcd.
Título: Re: incremento y visualizaciòn
Publicado por: MLO__ en 05 de Agosto de 2008, 19:43:33
Hola

Seria algo asi:

Código: [Seleccionar]
#int_EXT
void pulses_isr(void)
{
 .... // codigo de la interrupcion
}

y en el programa principal:

Código: [Seleccionar]
void main(void)
{
 ext_int_edge(L_TO_H);//Capturamos el flanco ascendente
 enable_interrupts(INT_EXT);
 enable_interrupts(GLOBAL);
 while(true)
 {
  //evaluo el flag de la interrupcion
 }
}

Saludos
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 05 de Agosto de 2008, 22:50:28
Este es el programa que tengo que modificar para que la variable se incremente por la interrupción por RB0.
#include <16F877.h>
 #fuses HS,NOWDT,NOPROTECT,NOLVP
 #use delay(clock=20000000) 
 #include <lcd.c> 
 long int Watts_Hora=0;
 #define in_pulsos pin_c0
 void main()
 {   
  Lcd_init(); 
  lcd_putc("\Potencia Activa/Hora");   
  while(TRUE) 
   {
  while(!input_state(in_pulsos));//Espero hasta que el pulsador sea presionado 
  delay_ms(200);//antirrebotes     
Watts_Hora++;
lcd_gotoxy(1,2);
  printf(lcd_putc,"Watts_Hora=%lu",watts_hora); 
  delay_ms(50);//una pulsacion por segundo   
   }
 }

La pregunta es :
1-  Cúal sería el codigo de la interrupción
2- Cuando pregunto por la bandera , estaría esta línea? -while(!input_state(in_pulsos));//Espero hasta que el pulsador sea presionado 
O como se preguntaría por la bandera?

De nuevo muchas gracias
Título: Re: incremento y visualizaciòn
Publicado por: MLO__ en 05 de Agosto de 2008, 23:11:54
Hola.

 :? Veamos seria algo asi:

Código: C
  1. #include <16F877.h>
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP
  3. #use delay(clock=20000000)
  4. #include <lcd.c>
  5.  
  6. unsigned int16 Watts_Hora=0;
  7.  
  8. #int_EXT
  9. void pulses_isr(void)
  10. {
  11.         ++Watts_Hora;                                                   //Incremento la variable con cada interrupcion
  12. }
  13. void main()
  14. {
  15.         ext_int_edge(L_TO_H);                                   //Activamos la deteccion del flanco ascendente
  16.         enable_interrupts(INT_EXT);                             //Activo interrupcion en RB0
  17.         enable_interrupts(GLOBAL);                              //Activo interrupciones globales
  18.         lcd_init();
  19.         lcd_putc("\fPotencia Activa/Hora");
  20.         while(TRUE)
  21.         {
  22.                 lcd_gotoxy(1,2);
  23.                 printf(lcd_putc,"Watts_Hora=%lu",watts_hora);//Muestro el valor de la variable
  24.         }
  25. }

No lo he compilado, prueba y me dices.

Si fuera con un flagg quedaria algo asi:
Código: C
  1. #include <16F877.h>
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP
  3. #use delay(clock=20000000)
  4. #include <lcd.c>
  5.  
  6. unsigned int16 Watts_Hora=0;
  7. int1 flagg_pulso=0;
  8.  
  9. #int_EXT
  10. void pulses_isr(void)
  11. {
  12.         flagg_pulso=true;
  13. }
  14. void main()
  15. {
  16.         ext_int_edge(L_TO_H);                                   //Activamos la deteccion del flanco ascendente
  17.         enable_interrupts(INT_EXT);                             //Activo interrupcion en RB0
  18.         enable_interrupts(GLOBAL);                              //Activo interrupciones globales
  19.         lcd_init();
  20.         lcd_putc("\fPotencia Activa/Hora");
  21.         while(TRUE)
  22.         {
  23.                 if(flagg_pulso)
  24.                 {
  25.                         ++Watts_Hora;
  26.                         flagg_pulso=false;
  27.                 }
  28.                 lcd_gotoxy(1,2);
  29.                 printf(lcd_putc,"Watts_Hora=%lu",watts_hora);//Muestro el valor de la variable
  30.         }
  31. }

Saludos
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 07 de Agosto de 2008, 23:39:23
Gracias por la colaboración. La compilación Ok!. Veré como responde con el hard. Hasta otro Post.
Título: Re: incremento y visualizaciòn
Publicado por: MLO__ en 08 de Agosto de 2008, 13:08:07
Hola.

Ok, mucha suerte ... no olvides colocar un buen antirrebotes en los pulsadores ...

Saludos
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 11 de Agosto de 2008, 13:06:34
El programa que presento en post anetriores muestra mediante un display el incremento de una variable cuando aparece un nivel alto por un pin del micro. Este programa se inicializa cada vez que le saco la alimentación, es decir empieza su conteo desde cero. La idea es que no ocurra esto, para ello tengo que guardar esto en la eeprom del pic y cada vez que se intrrumpa la energia guardar el conteo de tal forma que cuando se lo energice empiece desde donde quedo. De que manera se podría implementar el programa con lo que ya llevo desarrollado. El almacenaje podría ser tbien en una 24lc256 mediante I2C. No se que tan complicado debe ser quisiera una sugerencia, Muchas gracias. 
Título: Re: incremento y visualizaciòn
Publicado por: jfh900 en 11 de Agosto de 2008, 13:20:31
Si son pocas las variables a guardar, puedes utilizar la propia eeprom del PIC o la memoria de programa del PIC. Para ello el compilador CCS trae unas funciones desarrolladas que te permiten escribir y leer en dichas eeproms.

Un saludo
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 11 de Agosto de 2008, 23:07:25
Encontre el driver en ccsc de la eeprom interna . De que manera lo utilizo en mi pograma. El f877a tiene 256 bytes por lo que dice en su hoja de caracteristicas.
Título: Re: incremento y visualizaciòn
Publicado por: MLO__ en 12 de Agosto de 2008, 10:47:07
Hola.

Es sencillo. En el ciclo de visualizacion de la variable debes guardar periodicamente el valor en la EEPROM:
Código: [Seleccionar]
write_eeprom(0, value_cont);
De esta manera guardamos un dato de 8bits (1byte) en la EEPROM (direccion 0x00) del PIC.

Y al iniciar tu programa lo primero que se debe hacer es cargar el valor guardado en la EEPROM en la variable global:
Código: [Seleccionar]
value_cont = read_eeprom(0);

Saludos
Título: Re: incremento y visualizaciòn
Publicado por: MGLSOFT en 12 de Agosto de 2008, 11:26:30
Yo no lo guardaria toda vez que lo cambio, sino que lo mantendria en RAM mientras lo uso y lo guardaria cada vez que el PIC entre en RESET o cuando la tension baje de un umbral de tension determinado...
Sino la EEPROM la terminare muy rapido, no olvidemos que el numero de grabaciones, si bien es alto, no es ilimitado... :mrgreen:
Título: Re: incremento y visualizaciòn
Publicado por: MLO__ en 12 de Agosto de 2008, 14:01:34
Hola.

Muy cierto MGLSOFT  :-/ :-/ hay que ser cuidadoso con el uso de la EEPROM del PIC.

Saludos.
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 14 de Agosto de 2008, 11:49:10
Crreo que lo mas adecuado para lo que estoy ttratando de llevar a cabo, es la de guardar en memoria EEPROM cuando la tensiòn la tensiòn de alimentaciòn baje de un umbral.¿Como lo implementarìa en el programas? Para verificar, lo guardado tendrìa que leerlo? comolo harìa?
muchas gracias
Título: Re: incremento y visualizaciòn
Publicado por: MLO__ en 14 de Agosto de 2008, 12:09:17
Hola.

Pues habria que configurar el fuse del brown out reset a un valor bajo (2.7v) y para detectar la baja de tension, por medio de un comparador o el ADC se me ocurre.

Saludos
Título: Re: incremento y visualizaciòn
Publicado por: ncoliv en 20 de Agosto de 2008, 16:53:31
Seguirè con otro tema por el momento.
Tengo que adquirir datos analogicos con el pic 16f873 y mostrarlos via 232 en una pc. Como se configurarìa el pic para la señal analògica.en primer lugar me ocuparia de eso. Configurar y adquirir la señal
Desde ya muchas gracias