TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: soymoe 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:
#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.
-
trata declarando TensionInt, AuxBin, Decena, AuxBinDec como float y asegúrate que se esta convirtiendo a char Decena,Unidad, Decima.
Saludos
-
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.
-
Gracias por las observaciones, voy a probar si es eso. ERA ESE EL PROBLEMA, gracias