Autor Tema: Programación de Balanza electrónica  (Leído 775 veces)

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

Desconectado Saul_78

  • PIC10
  • *
  • Mensajes: 2
Programación de Balanza electrónica
« en: 18 de Diciembre de 2016, 14:52:57 »
Hola amigos, estoy tratando de programar una balanza electrónica que cuenta con las siguientes características:

--> Una celda de carga junto a un circuito de ampificacion, entregan de 0 a 5 voltios a la entrada (AN0) del pic 16f877A .
--> Luego, uso el modulo del ADC para obtener una salida digital del peso de (0 a 30 kg), este peso es proporcional al voltaje de entrada
--> Después, el peso se muestra en un LCD.

Al realizar las características mencionadas anteriormente no tengo problemas en hacerlo; pero también necesito conectar un keypad 3x4 para poner el precio por unidad de quilo, del producto; y ese precio que se multiplique por el peso y así obtener el precio total que se va a pagar. ahi es donde entra mi problema, ya que según he estado leyendo el pic solo puede realizar una sola tare a la vez; asi que  no puede estar Usando el Modulo ADC y a la vez detectando el numero que se esta pulsando en el keypad. el codigo de la primera parte es la siguiente:

#INCLUDE       <16F877A.H>
#DEVICE        ADC = 10
#FUSES         HS
#USE           DELAY(CLOCK = 20M)
#INCLUDE       <lcd.c>
#include       <kbd4x4_1.c>
#define        use_portd_lcd TRUE    //Configuración puerto D control lcd

float          peso;
int16          ADC;

void main ()
{
   SETUP_ADC(ADC_CLOCK_INTERNAL);
   SETUP_ADC_PORTS(ALL_ANALOG);
   SET_ADC_CHANNEL(0);
   delay_us(20);
   lcd_init();
   lcd_putc("\f    Balanza   \n");
   lcd_putc("  Electronica  ");
   delay_ms(1000);
   
   lcd_putc("\f");                             // Limpia pantalla
   
   lcd_putc("Peso = ");
   lcd_gotoxy(15,1);                       // Acomoda cursor LCD
   lcd_putc("Kg");
   delay_ms(50);
   
   lcd_putc("\nValor =");
   lcd_gotoxy(9,2);                       // Acomoda cursor LCD
   lcd_putc("s/");
   delay_ms(50);
 
   while (TRUE)
   {
      ADC = READ_ADC();
      peso = 30.0*ADC/1023.0;
     
      lcd_gotoxy(8,1);
      printf(lcd_putc,"%02.2g",peso);
      delay_ms(100);
   }   
   }

EL CIRCUITO EN PROTEUS LES DEJO MAS ABAJO

--> como habia dicho anteriormente el codigo que puse solo realiza la primera parte, ¿podrían ayudarme con la ultima parte ? por ahi vi que tenia que hacer con interrupciones pero como recien estpy iniciando en programacion todavia no entiendo de que se trata.

estoy utilizando PIC C COMPILER GRACIAS........   :oops:
« Última modificación: 19 de Diciembre de 2016, 01:43:52 por Saul_78 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6994
Re:Ayuda con Programación de Balanza electrónica
« Respuesta #1 en: 18 de Diciembre de 2016, 16:34:40 »
Citar
ya que según he estado leyendo el pic solo puede realizar una sola tare a la vez; asi que  no puede estar Usando el Modulo ADC y a la vez detectando el numero que se esta pulsando en el keypad. el codigo de la primera parte es la siguiente:

Cualquier microcontrolador con 1 solo nucleo, puede llegar a hacer 1 cosa a la vez (exceptuando el uso de DMA ).

Pero como se hace tan rapido ( a no ser que pongas delays grandes ) la persona no deberia ser capaz de diferenciar entre uno u otro.

Ademas, no necesitas gran velocidad. un pulso de un boton esta entre el orden de las decenas de milisegundos.
Actualizar el LCD lo tenes que hacer 2 veces por segundo o 3 maximo, es suficientemente rapido para cualquier persona. Tomemos 4 veces por segundo, esos son cada 250ms
Tomar valores del ADC lo necesitarias solo para mostrar en el LCD, por lo cual tambien otros 250ms.
Un micro PIC con un cristal de 4Mhz ejecuta instrucciones cada 1us. Es decir que entre que se pulso un boton y se solto siendo un pulso masomenos corto, estamos hablando de que el microcontrolador ejecuto unas 10.000 instrucciones. Lo cual leer el pin y alguna que otra cosa mas le puede llevar maximo 100. Todos esos 9.900 instrucciones los vas a gastar esperando con delays.

A lo que voy. SI ejecutan 1 tarea a la vez, pero lo hacen tan rapido, y vos tenes que reaccionar tan lento a las entradas que el usuario no va a notar la diferencia ( si es que esta bien programado)

Citar
--> como habia dicho anteriormente el codigo que puse solo realiza la primera parte, ¿podrían ayudarme con la ultima parte ? por ahi vi que tenia que hacer con interrupciones pero como recien estpy iniciando en programacion todavia no entiendo de que se trata.

Ahi donde se puse el comentario, podes poner las funciones para detectar si es que hay algun numero.
CCS posee una libreria, que creo que es kbd.c o .h con las funciones para el mismo. Lo unico que vas a tener que agregar es que primero suelte el boton antes de tomar otro valor. Sino al tener presionado 1 boton cada 100ms aproximadamente estaria ingresando ese valor.

Código: C
  1.    while (TRUE)
  2.    {
  3.       // Agregar aca lo del teclado
  4.  
  5.       ADC = READ_ADC();
  6.       peso = 30.0*ADC/1023.0;
  7.      
  8.       lcd_gotoxy(8,1);
  9.       printf(lcd_putc,"%02.2g",peso);
  10.       delay_ms(100);
  11.    }  

Desconectado Saul_78

  • PIC10
  • *
  • Mensajes: 2
Re:Ayuda con Programación de Balanza electrónica
« Respuesta #2 en: 18 de Diciembre de 2016, 17:14:24 »
hoa KILLERJC gracias por tu respuesta, aquí ya lo realice la parte del teclado y compila perfectamente pero; cuando lo simulo no me funciona, donde estaría el error ??

#INCLUDE       <16F877A.H>
#DEVICE        ADC = 10
#FUSES         HS
#USE           DELAY(CLOCK = 20M)
#INCLUDE       <lcd.c>
#include       <kbd4x4_1.c>
#define        use_portd_lcd TRUE    //Configuración puerto D control lcd
#define        use_portb_kbd true

float          precio;
float          peso;
int16          ADC;
int            x;
char           key;

void main ()
{
   SETUP_ADC(ADC_CLOCK_INTERNAL);
   SETUP_ADC_PORTS(ALL_ANALOG);
   SET_ADC_CHANNEL(0);
   delay_us(20);
   port_b_pullups(true);
   
   lcd_init();
   lcd_putc("\f    Balanza   \n");
   lcd_putc("  Electronica  ");
   delay_ms(1000);
   
   lcd_putc("\f");                             // Limpia pantalla
   
   lcd_putc("Peso = ");
   lcd_gotoxy(15,1);                       // Acomoda cursor LCD
   lcd_putc("Kg");
   delay_ms(50);
   
   lcd_putc("\nValor =");
   lcd_gotoxy(9,2);                       // Acomoda cursor LCD
   lcd_putc("s/");
   delay_ms(50);
 
   while (TRUE)
   {
   
      key=kbd_getc();  // detecta la tecla pulsada
      x=key-48;        // comvirtiendo en valor entero
      if(key!=0)       // si se pulsa una tecla entra a ......
      {
         precio = x * peso; // calculo del precio
         lcd_gotoxy(10,2); 
         printf(lcd_putc,"%02.2g",precio); // nuestra el valor del peso
      }
 
 
      ADC = READ_ADC();
      peso = 30.0*ADC/1023.0;
     
      lcd_gotoxy(8,1);
      printf(lcd_putc,"%02.2g",peso);
      delay_ms(100);
   }   
   }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6994
Re:Programación de Balanza electrónica
« Respuesta #3 en: 19 de Diciembre de 2016, 08:42:57 »
Primero que no se como intentas que funcione, tampoco se a que te referis con "no me funciona"

Una de las cosas que veo es que cada 100ms si tenes presionado estaria dibujando en el LCD al tener presionado una tecla.
La otra es que cuando presiones es simplemente un modificador entero, es decir 1* precio, 2* precio, 3*precio hasta 9.