TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: sistemasorp en 10 de Marzo de 2009, 20:32:57
-
Hola
Estoy probando la multiplexación de 2 displays de 7 segmentos con un pic 16F84A. Funciona correctamente, pero, como os muestro en el video que viene a continuación, en cada uno de los display hay como un remanente del otro display. Los dos displays son de anodo común: Los ánodos van al pin RA3 y RA4 respectivamente y los cátodos a los pines de RB con resistencias de 330 ohm. No entiendo por qué se solapan tenuemente los números de un display en el otro:
Este es el código fuente en CCS C:
int8 sacaNumero(int8 numero)
{
int8 valores[] = {
0b10001000, // 0
0b11101011, // 1
0b01001100, // 2
0b01001001, // 3
0b00101011, // 4
0b00011001, // 5
0b00011000, // 6
0b11001011, // 7
0b00001000, // 8
0b00001001 // 9
};
return valores[numero];
}
void main()
{
int8 contador = 0;
int8 numero = 0;
//setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
// TODO: USER CODE!!
set_tris_a(0);
set_tris_b(0);
while(1)
{
output_low(PIN_A3);
output_high(PIN_A2);
output_b(sacaNumero(numero / 10));
delay_ms(5);
output_low(PIN_A2);
output_high(PIN_A3);
output_b(sacaNumero(numero % 10));
delay_ms(5);
++contador;
if(contador == 50)
{
contador = 0;
numero++;
if(numero == 100)
{
numero = 0;
}
}
}
}
El programa muestra los números del 0 al 99. Cada cifra del número se muestra unos 5 milisegundos en su display correspodiente (así no hay parpadeo). Y cada medio segundo se cambia el número a mostrar.
-
prueba a aumentar esos 5 milisegundos con 150 milisegundos yo creo que funcionara de todas formas yo lo voya a probar mañana y te contesto como me fue
-
Antes de activar un display, apaga todos los segmentos. Luego activa el display q toque, mostra el numero, y volve a apagar todo.
Seria algo asi:
while(1)
{
output_low(PIN_A3);
output_b(0);
output_high(PIN_A2);
output_b(sacaNumero(numero / 10));
delay_ms(5);
output_low(PIN_A2);
output_b(0);
output_high(PIN_A3);
output_b(sacaNumero(numero % 10));
delay_ms(5);
++contador;
......
saludos!
-
Hola.
Revisa esto: 7 Segmentos con int Timer0 (http://www.todopic.com.ar/foros/index.php?topic=21738.0) te puede ser de utilidad
-
Gera: Tu solución me ha ido a las mil maravillas. Solo que en vez de poner 0 en el puerto b he puesto 0xff (ya que al ser ánodo común hace que esten apagados todos los led del segmento). Pero con eso ya no se ve ningún solapamiento.
MLO: Ese es el siguiente paso que tenía en mente. Ya que al ser un termómetro lo que quiero construir, no quería que interferiese el display con la toma de temperatura.
juansi: Si pongo 15 milisegundos o más, se nota el parpadeo de los displays.
Gracioas a todos. Un saludo.
-
Gera tiene razon, seguramente tu codigo muestra el numero y luego cambia el display, de ese modo durante cuatro ciclos de reloj se monta el numero en el otro display
-
tienes razon con 15 mili segundos parpadea lo he simulado fisicamente, y con 5 ml es lo suyo
-
Hola, estoy haciendo un contador de eventos externos de 0 - 9 el problema que tengo, bueno que casi siempre tengo :mrgreen: es que no me funciona una vez armado. Les adjunto el codigo, la simulacion en proteus y el video.
En la entrada de RA0 va un fototransistor y un led infrarojo, los cuales siempre envian un alto y al inteferir un objeto entre ellos mandan un voltaje bajo, esto ya lo comprobe con el multimetro, siempre mandan 3.5 volts y con un objeto mandan 0.15 volts, entonces esta parte si funciona, la verdad no tengo idea de que es lo que esta mal, espero me puedan ayudar gracias.
El display es Catodo comun.
#include <16F873A.h>
#include <math.h>
#fuses nowdt //No Watch Dog Timer
#fuses xt
#fuses noput //No Power Up Timer
#fuses noprotect //Code not protected from reading
#fuses nobrownout //No brownout reset
#fuses nolvp //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#fuses nocpd //No EE protection
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
byte CONST DISPLAY[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7f,0x6f};
void main(void){
int ban=0;
char iU=0;
set_tris_A(0x01);
set_tris_B(0x00);
do{
if(input(PIN_A0)==1){
iU++;
if(ban==0){
iU--;
ban++;
}
if(iU>9)
iU=0;
while(input(PIN_A0)==1){
output_B(DISPLAY[iU]);
}
}
}while(true);
}
gracias.
Nos vemos
-
hola Vash, te recomiendo que le coloques un inversor a la salida del fototransistor, porque los niveles de tensión y correinte quizá no sean los adecuados para el micro para que lo tome como uno o cero, mejor si el inversor es un smith trigger, son los 74xx14 creo.
O podría ir algún operacional, pero es mucho rollo, mejor el inversor.
Si tu código esta bien, tendría q funcionar
saludos.