Autor Tema: Problema con rutina para voltimetro  (Leído 1425 veces)

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

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Problema con rutina para voltimetro
« en: 11 de Junio de 2013, 00:15:55 »
Hola estoy haciendo un voltimetro en CCS pero a pesar de que la rutina para los displays de 7 segmentos anda bien, no me muestra el voltaje real, muestra siempre 0, a pesar de que detecto cuando es menor a 10 volts. Esta es la rutina:

Código: [Seleccionar]
#include <16F88.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES PUT                      //Power Up Timer
#FUSES PROTECT                  //Code protected from reads
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#device adc=8//La resolución del módulo A/D es de 8 bits.
#use delay(int=4000000,RESTART_WDT)
int adc=0,AuxBin=0,AuxBinDec=0,TensionInt,VoltInt;
char Decena=0,Unidad=0,Decima=0;
#include <Display.c>   
#include <Display_Punto.c>
void main()
{
   setup_adc_ports(all_analog);
   setup_adc(ADC_CLOCK_INTERNAL );     
   set_adc_channel(0);
   delay_us(20);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1 );
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   set_tris_b(0x00);            //
   set_tris_a(0xff);
   output_b (0x00);
   while(1){
   adc=read_adc();
   TensionInt=adc*1176;
   AuxBin=TensionInt/1000;
   Decena=AuxBin/100;
   AuxBinDec=AuxBin%100;
   Unidad=AuxBinDec/10;
   Decima=AuxBinDec%10;
   if (adc<85)
   MostrarDecima();
   else
   Mostrar_Numero();
 
           }
}
Para mostrar el voltaje descompongo el valor de los volts en decena, unidad y decimas.

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: Problema con rutina para voltimetro
« Respuesta #1 en: 11 de Junio de 2013, 02:18:04 »
trata declarando  TensionInt, AuxBin, Decena, AuxBinDec como float y asegúrate que se esta convirtiendo a char Decena,Unidad, Decima.
Saludos

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 209
Re: Problema con rutina para voltimetro
« Respuesta #2 en: 11 de Junio de 2013, 14:30:43 »
Hola Don Moe....
mira, tenés varios descuidos en tu código, esa parte que te indicaron de las variables Char, no hace falta que sean Char, conceptualmente los pines del pic, no entienden char, solo int8.
Tampoco es necesario que emplees variables tipo float, si el pic es de poca memoria, dudo que el compilador incrunste las rutinas del caso, por falta de memoria.

Cuando trabajas, con led display siete segmentos, tenés que plantearte cuantas cifras mostrarás, partiendo de ese punto, maquinás la rutina que "descompone" tu número a mostrar en simples cifras de 7bit, (o 4 bit BCD si empleas un decodificador).

Parece que queres mostrar tres cifras, dos enteros y una cifra decimal.
de ser el caso, te has planteado que la variable "adc" puede ser hasta 255 (según configuración '#fuses')), y por lo tanto "TensionInt" podría ser:  255*1176=299880
Esto es SEIS cifras!.

TensionInt=adc*1176;
   AuxBin=TensionInt/1000;
   Decena=AuxBin/100;
   AuxBinDec=AuxBin%100;
   Unidad=AuxBinDec/10;
   Decima=AuxBinDec%10;

No lo miré, pero le problema podría estar en la rutina anterior.
Yo empleo esta:

void Long2bcd( int16 num1) {

    fourth=num1/1000;
    num1=num1-fourth*1000;

    tree=num1/100;
    num1=num1-tree*100;

    two=num1/10;
    num1=num1-two*10;

    one=num1; }

fourth, tree, two, one
son variables globales, int8, que se corresponden con las cifras a mostrar en los led display, contando desde derecha a izquierda.
La función que dejo, no fallará mientras la entrada numérica sea entre 9999 y 0.-
Al punto decimal trabajalo FIJO, no intereza que aparezca o no, lo mostras siempre.
p.e.   21v  serán  21.0v  comprendes?

Cuando haces un programa que muestre números con led display, es buena idea empezar poniendo un LCD o el puerto serial a un terminal en el simulador, esos ahorra tiempo.

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Problema con rutina para voltimetro
« Respuesta #3 en: 11 de Junio de 2013, 15:50:13 »
Gracias por las observaciones, voy a probar si es eso. ERA  ESE EL PROBLEMA, gracias
« Última modificación: 11 de Junio de 2013, 15:56:49 por soymoe »