Uso de interrupciones para teclado, en la programación de balanza electrónica

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 amplificación, entregan de 0 a 5 voltios a la entrada (AN0) del PIC16F877A .
Luego, uso el módulo 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 teclado 3x4 para poner el precio por unidad de kilo del producto, y ese precio que se multiplique por el peso y así obtener el precio total que se va a pagar.
Ahí es donde entra mi problema, ya que según he estado leyendo el PIC sólo puede realizar una sola tarea a la vez,
así que no puede estar usando el módulo ADC y a la vez detectando el número que se está pulsando en el teclado.

El código de la primera parte es el siguiente:
PHP:
#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);
   }   
   }
El circuito en Proteus, lo dejo más abajo.

Como había dicho anteriormente, el código que puse sólo realiza la primera parte.
¿Podrían ayudarme con la ultima parte?
Por ahí vi que tenía que hacerlo con interrupciones, pero como recién estoy iniciando en programación, todavía no entiendo de qué se trata.

Estoy utilizando PIC C Compiler. Gracias. :oops:
 

Adjuntos

  • Captura.PNG
    Captura.PNG
    34.7 KB · Visitas: 16
Última edición por un moderador:
Hola. Más allá de tu petición, hay un detalle que vale la pena mencionar, que quizás ya lo has tenido en cuenta, y es lo siguiente...
Como tu conversor es de 10 bits y debes convertir una magnitud de 30000 gramos, además debes dejar un margen para números negativos, al menos 5000 gramos, para que la balanza tenga un funcionamiento respetable.

Dicho todo ésto, me parece que la resolución final será algo pobre. Pero claro, depende de la resolución que pretendas.
 
Última edición por un moderador:
Hola, Gudino Roberto duberlin. Gracias por tu ayuda, lo tendré en cuenta.
Pero eso de la resolución, ¿Cómo puedo hacer para que sea más precisa? :)
 
Última edición por un moderador:
En lugar de un PIC cambiar a un ADC de 16 bits, necesitarías mínimo 15 bits para tener resolución por gramos, ya usas PIC24 si quieres ADC Sigma-Delta de 16 bits.

Lo de la interrupción, me parece que en esos pic todas apuntan al mismo vector y luego tienes que enmascarar las banderas para saber cual disparo la interrupción, asi que es fácil. solo debes ver cual es la bandera y como declara la interrupción tu compilador, al final solo haces un if(registro==bandera) agregas tu código.
 
Nuyel, con respecto a un ADC de 16 bits ¿que integrado que me recomendarías usar ? y si ese fuera el caso puedo optar por un PIC mas pequeño ???? como el 16f628A. también quisiera que el circuito no sea demasiado grande, ya que tambien are el circuito de la fuente de alimenticion y d amplificación. gracias por tu aporte. :)
 
Hola, para definir el tema resolución, debes tú saber lo que pretendes. Con 10 bits de ADC, tendrás una resolución máxima de poco más de 30g. en 30kg. más un margen negativo para soportar TARA en dicha balanza.
Para una balanza comercial en el rango de 30kg. una resolución de 30g. es pobre. Pero vuelvo a reiterar, todo depende de tus requerimientos.
 
Última edición:
Atrás
Arriba