TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: rodrigo_pinilla en 22 de Marzo de 2015, 12:08:10
-
bueno, lo que pasa es que necesito mostrar una medida de voltaje en el display 7 segmentos, pero sale todo raro osea por ejemplo el tres, los segmentos del tres salen apagados y los demas prendidos asi no sirve yo quiero que sea a lo contraro, tambien el display parpadea demasiado y es muy molesto quisiera saber como arreglo eso, yo vi un video que salia bien pero no se como hicieron, saludos. el codigo que tengo es este:
#include <16F88.h>
#device *=8 //para ke el adc llege asta 255 ndama mas
#FUSES nomclr //sin reset
#FUSES intrc //esto usa el cirstal interno del pic
#use delay(clock=8M) //cristal a 8 megabits de velocidad
#byte portb=6 //declaro la ubicasion del puerto b
#byte porta=5 //la ubicasion del puerto a
#bit led = porta.1 //declaro el led conectado en el pin a1
#bit display1 = porta.2 //el pin donde esta conectado el display 1
#bit display2 = porta.3 //el pin donde esta conectado el display 2
void main()
{
inicio:
int numeros[10]={0x7E, //Se declara un vector de longitud 10 que contenga los
0x30, //valores obtenidos de la tabla, acomodados en orden
0x6D, //Según su posición del 0 al 9
0x79,
0x33,
0x5B,
0x5F,
0x70,
0x7F,
0x7B};
char voltaje;
char sobrevoltaje;
char unidades;
char decenas;
setup_adc(ADC_CLOCK_INTERNAL); //configuramos el adc con el cristal interno
setup_adc_ports(sAN0);
voltaje=read_adc(); //leo el valor del voltaje
voltaje= (110/255) * voltaje; //la formula de la regla de tres para objeter el boltaje por el divisor resistivo
//con 255 tengo 110 voltios en la entrada del divisor de tension formula de kirchof
decenas = voltaje / 10;
unidades = voltaje - (decenas * 10 );
portb = numeros[decenas]; //muestro en el display el valor del voltaje de decenas
display1 = 1; //activo el primer display para multipletsarlo
delay_ms(100); //espero 100 milisegundos para ke se alcanse a ver
display1 = 0; //lo apago
portb = numeros[unidades]; //muestro en el display el valor del voltaje de unidades
display2 = 1; //lo mismo pero con el segundo
delay_ms(100);
display2 = 0;
if (voltaje > 99) //si hay mas de 99 voltios en el pin
sobrevoltaje = 1; //activo la alerta de sobrevoltaje
if(sobrevoltaje = 1) //si se actibo la alerta de sobreboltaje
led = 1; //activo el led que indica sobreboltaje en el pin
goto inicio; //vuelvo a ejecutar el programa de forma infinita
}
y otra cosa que pasa es que el led que indica sobrevoltaje esta siempre encendido, no se apaga nunca no se porque como le hago para que sirva bien??
-
Si se te estan encendiendo al contrario de como quieres, lo mas probable es que tengas la lógica cambiada, mira a ver si tu display es de anodo comun o de catodo comun.
lo de que parpade demasiado, es por el tiempo de refresco, ten en cuenta que para que no parpade como mucho debes refrescarlo cada 20ms, esos 20ms debes repartirlos entre los distintos digitos, por ejemplo si tienes 4 digitos cada digito debes refrescarlo cada 4 ms.
el led de sobretension, lo mismo mira a ver si tienes la logica cambiada, de este modo se te deberia apagar cuando detectes cortocircuito.
por cierto eso parece CCS yo he tenido muchos problemas de bug con CCS y recomiendo a todos que se cambien a mplab y los compiladores de microchip un saludo
-
Tienes que cambiar los valores en el array numero. Cambia cada numero por su complemento.
Lo del parpadeo lo arreglas bajando el tiempo del delay-ms 100. Bajalo a menos de 10 mseg.
Lo del led,veo que se enciende al superar los 99v y ya nunca se apaga, como haces para apagarlo?
Saludos!
-
muchas gracias, ya solucione el problema lo cambie a catodo comun los que tenia eran anodo y por eso salia mal, tambien le cambie el delay y ya no parpadeea, pero ahora tengo otro problema el pic lee mal el voltaje, si me pudieran ayudar se los agradeceria mucho:
http://www.todopic.com.ar/foros/index.php?topic=44258.0 (http://www.todopic.com.ar/foros/index.php?topic=44258.0)