Autor Tema: problema grave con display siete segmentos :(  (Leído 1318 veces)

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

Desconectado rodrigo_pinilla

  • PIC10
  • *
  • Mensajes: 11
problema grave con display siete segmentos :(
« en: 21 de Marzo de 2015, 23:07:08 »
ola, es la primera ves que pregunto aqui, lo que pasa es que necesito diseñar un medidor de voltaje de 0 a 99 voltios, y que lo muestre en dos displays 7 segmentos multiplexados.

tambien tiene que tener un led que indique sobrevoltaje, o sea si el voltaje de entrada es mayor de 99 voltios este se tiene que prender. el problema es que he echo de todo y no funciona, yo estoy que me tiro por la ventana del estres que tengo.

me salen los dos displays todo el tiempo encendidos y me muestran simbolos raros, porfabor si me pueden ayudar amigos.

el display lo tengo conecctado en el puerto b, la entrada de voltaje es en el puerto a0, el led de sobrevoltaje en el puerto a1, el display de las desenas lo tengo en el puerto a2 y el de las unidades en el puerto a3. la verdad no se porque no funciona si el compilador me dice que no tengo ningun error, me parece muy raro. aqui pongo el codigo:

Código: [Seleccionar]
#include <16F88.h>

#FUSES nomclr    //sin reset             
#FUSES intrc      //esto usa el cirstal interno del pic               

#use delay(clock=1000000)  //cristal a 1 megabit de velocidad

#byte portb=6   //declaro la ubicasion del puerto b
#byte porta=5   //la ubicasion del puerto a

#byte led = pin_a1   //declaro el led conectado en el pin a1

#byte display1 = pin_a2   //el pin donde esta conectado el display 1
#byte display2 = pin_a3   //el pin donde esta conectado el display 2


void main()
{

inicio:

char voltaje;
char sobrevoltaje;

setup_adc(ADC_CLOCK_INTERNAL);   //configuramos el adc con el cristal interno
setup_adc_ports(ALL_ANALOG);    //ponemos las patas del pic analogicas

voltaje=read_adc();   //leo el valor del voltaje

portb = voltaje;   //muestro en el display el valor del voltaje

display1 = 1;   //activo el primer display para multipletsarlo
delay_ms(100);   //espero 100 milisegundos para ke se alcanse a ver
display1 = 0;   //lo apago

display2 = 1;    //lo mismo pero con el segundo
delay_ms(100); 
display2 = 0; 


if (voltaje = 100)    //si hay mas de cien 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

}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: problema grave con display siete segmentos :(
« Respuesta #1 en: 22 de Marzo de 2015, 00:05:34 »
Tu problema es que no sabes como mostrar los datos...

Me explico:

vos hace esto:

voltaje=read_adc()

voltaje no es de 0v a 99v, sino que es un valor de 0 a 255 (si el ADC es de 8bits) y de 0 a 1023 ( si es de 10 bits )

De ahora en adelante supongo que es de 10 bits
Entonces ahi tenes que calcular exactamente el valor ... ejemplo..

Tengo 90v, y tengo unos divisores resistivos con una ganancia de 0.05 , cuando tenga 90V voy a tener en la entrada del ADC 4.5V
Si el ADC lo tengo con referencias entre GND y VCC ( 0v y 5v ) entonces 4.5V es (1023 * 4.5/5) = 921
Es decir que cuando sea mayor a 921 lo que obtenes en voltaje significa que es mayor a 90v

Por ahi una parte.

La otra parte es que es un dato binario:
921d = 399h = 0011 1001 1001

Con lo cual si mando eso al puerto el dislpay no va a entender nada.
Lo que deberia hacer es pasarlo al verdadero vaolr de voltaje:         ( 921 * 5 / 1024 ) * ( 20 ) = 89.94 = 89V    ( Ese 20 es 0.05^-1 , es decir la inversa de la ganancia del divisor resistivo )
Perfecto, ahora guardo ese 89 en un registro... pero eso es un valor en decimal!
89d = 59h = valor

Para multiplexar deberia de sacar de ese numero hexadecimal los valores por separado de 8 y 9

int decenas = valor / 10
int unidades = valor - (decenas * 10 )

Ahora si quedaria:
decenas = 8
unidades = 9

Pero ahora depende de si tenes el puerto directo al display o si usas un decodificador BCD a 7 segmentos.
En el primer caso deberias de pasar el numero a 7 segmentos

Suponete algo asi:

int Seg[10]={0x00,0x00,0x00,0x00. .. .. . .0x7F,0x00}    (Falta completar la tabla aca)

Cada uno de esos valores son 8 bits, que en realidad te interesan solo 7 ( para manejar todos los segmentos ), Yo solo puse el ejemplo del 8.
Como en el 8 se encienden todos los segmentos del display mi valor es
             abc defg
0x7F = 0111 1111

Entonces lo usaria como
Puertob = Seg[decenas];
Lo mismo para las unidades.

Ahora si tenes un decodificador BCD a 7 segmentos solo deberias mandar esos 4 bits al puertob :
puertob = decenas;

Finalmente si no me entendiste deberias buscar info sobre como manejar un display  o como se manejan los displays 7 segmentos. ( son 7 leds no es mucho drama ) , depende de como lo tengas conectado ( ej. puerto b1 es el segmento A ) eso va a hacer cambiar el valor de tu array.

Y una cosa mas, tene ojo con no exceder la tension limite del pin, supone un maximo de 5v ( si es que es de 5V el micro ), no se que tal funcionaran unos diodos de campling en la entrada del ADC
« Última modificación: 22 de Marzo de 2015, 00:11:50 por KILLERJC »

Desconectado rodrigo_pinilla

  • PIC10
  • *
  • Mensajes: 11
Re: problema grave con display siete segmentos :(
« Respuesta #2 en: 22 de Marzo de 2015, 00:36:25 »
uff que complicado, al menos ya se como se hace, gracias por la explicacion.

pero hay algo que todavia no entiendo, porque el compilador me dice que no tengo ningun error??? mira todos los errores que encontraste en mi codigo, y el ccs no me dijo nada...

yo estoy usando el ccs que me paso un amigo sera que esta dañado??

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: problema grave con display siete segmentos :(
« Respuesta #3 en: 22 de Marzo de 2015, 00:59:19 »
el compilador hace lo que debe. Corregir la sintaxis, interpretar las directivas, etc etc

Pero vos tenes que saber lo que estas haciendo. Y como funciona el micro por dentro.