Autor Tema: ¿Barrido con Display 7Seg Multiplexado? | CCS  (Leído 3968 veces)

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

Desconectado elektronik29

  • PIC10
  • *
  • Mensajes: 18
¿Barrido con Display 7Seg Multiplexado? | CCS
« en: 23 de Junio de 2018, 02:50:11 »
Buenas a todos, como puedo hacer para hacer un barrido con pic y el display? por ejemplo el mensaje
HOLA
*HOL
**HO
***H
****

(el asterisco representa apagado)

Sería por interrupcion ??
Los leo gracias

Desconectado elektronik29

  • PIC10
  • *
  • Mensajes: 18
Re:¿Barrido con Display 7Seg Multiplexado? | CCS
« Respuesta #1 en: 23 de Junio de 2018, 02:51:37 »
POSDATA= Realizo multiplexacion, solo quiero saber masomenos como podria realizar el barrido:)

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 571
Re:¿Barrido con Display 7Seg Multiplexado? | CCS
« Respuesta #2 en: 23 de Junio de 2018, 07:58:58 »
Hola, una forma de hacerlo prolijo sería: crear un array de tu display. Es decir si el display posee 4 dígitos, pues el array deberá contener 4 elementos.
Entonces, lo único que debes hacer es escribir en ese array el dato que deseas mostrar, si quieres realizar el efecto que expones, con desplazar los datos dentro del array y ya.
Luego mediante interrupción el multiplexado se encarga de leer ese array y reflejarlo en el display. Básicamente es cómo si utilizaras una CGRAM pero utilizando memoria del micro.
« Última modificación: 23 de Junio de 2018, 08:11:07 por Robert76 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Barrido con Display 7Seg Multiplexado? | CCS
« Respuesta #3 en: 23 de Junio de 2018, 08:11:55 »
Robert te dice una forma de hacerlo, la otra MUY similar seria:

Un array donde cargues tu numero. Este lo podes cargar en la funcion que deberia actualizar lo que se muestra en el display.
Una interrupcion con un Timer, que es el que le da el tiempo, si el multiplexado es acda 5ms, entonces cada 5ms entra a la funcion esa, apaga el comun anterior, elige el numero que le corresponde y luego activa el comun que corresponde, si tenes los comunes repartidos en varios pines no consecutivos, te puede llegar a servir otro array con los valores de los comunes.

La interrupcion es solo para mostrar.

Luego si queres correrlo, en ves de correr el array y borrarse el contenido, aunque lo vas a hacer en un array aparte, (y es mas rapido de hacer con un memcpy) podrias definir otro indice, en el cual apartir de ese indice empezas a escribir sobre el display. Por ejemplo. Si tenes un indice 2. Los primeros 2 numeros no deberian encender, recien cuando indiceComienzo >= indiceAmostrar, mostras sobre tu display, obviamente el indice que vas a usar para tu array es indiceAmostrar - indiceComienzo.

Eligiras la opcion que mas te convenga. Esto lo podes hacer contando cuantas veces entra a esa interrupcion de 5ms por ejemplo, asi darle 1s cada desplazamiento.

Desconectado elektronik29

  • PIC10
  • *
  • Mensajes: 18
Re:¿Barrido con Display 7Seg Multiplexado? | CCS
« Respuesta #4 en: 24 de Junio de 2018, 20:02:15 »
Hay otra manera de hacerlo sin interrupcion?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Barrido con Display 7Seg Multiplexado? | CCS
« Respuesta #5 en: 24 de Junio de 2018, 20:28:57 »
Con 1 solo delay, pero eso significa que vas a tener que programarlo bien, sino vas a tener problemas.

Desconectado elektronik29

  • PIC10
  • *
  • Mensajes: 18
Re:¿Barrido con Display 7Seg Multiplexado? | CCS
« Respuesta #6 en: 24 de Junio de 2018, 20:38:12 »
Ciclo for?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Barrido con Display 7Seg Multiplexado? | CCS
« Respuesta #7 en: 24 de Junio de 2018, 20:57:25 »
No, el problema de usar delays, es que terminas haciendo algo asi:

Código: C
  1. while(1)
  2. {
  3.      Lo_que_haga_tu_programa();
  4.      Multiplexado_y_muestra();
  5.      Delay();
  6. }

Lo que pasa que donde dice "Lo que haga tu programa" esa funcion no deberia poseer ningun delay, ni ninguna funcion/instruccion que bloquee el funcionamiento del programa.
De no hacerlo asi, terminas con que la multiplexacion queda mal realizada.

Resumen, es mas simple configurar el timer para 10ms masomenos y hacer en una interrupcion el multiplexado, y en tu main haces lo que quieras.

Desconectado elektronik29

  • PIC10
  • *
  • Mensajes: 18
Re:¿Barrido con Display 7Seg Multiplexado? | CCS
« Respuesta #8 en: 24 de Junio de 2018, 21:09:45 »
lo que estaba haciendo es ejemplo:

arreglo[5]={*,H,O,L,A}

subrutina:

disp1=1
portb=arreglo
  • ;

delay_ms(50)
disp1=0;

disp2=1
portb=arreglo[y];
delay_ms(50)
disp2=0;

disp3=1
portb=arreglo[z];
delay_ms(50)
disp3=0;

disp4=1
portb=arreglo[w];
delay_ms(50)
disp4=0;

entonces con subrutina llamo a la subrutina y pongo ejemplo:

//primero hola

x=1
y=2
z=3
w=4

//*HOL

x=0
y=1
z=2
w=3

//**HO

x=0
y=0
z=1
w=2



Pero lo que pasa es que se ve como entre cortado (no engaña al ojo humano) ....

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Barrido con Display 7Seg Multiplexado? | CCS
« Respuesta #9 en: 24 de Junio de 2018, 21:30:29 »
Pero lo que pasa es que se ve como entre cortado (no engaña al ojo humano) ....

Tu problema es la multiplexacion, nuevamente lo mejor es dejarselo a un timer y su interrupcion.

Desconectado elektronik29

  • PIC10
  • *
  • Mensajes: 18
Re:¿Barrido con Display 7Seg Multiplexado? | CCS
« Respuesta #10 en: 25 de Junio de 2018, 00:01:02 »
Lo deseo realizar sin interrupciones, si me podrías ayudar sería genial!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Barrido con Display 7Seg Multiplexado? | CCS
« Respuesta #11 en: 29 de Junio de 2018, 11:44:45 »
Algo asi?
No probado y seguramente algun error en las condiciones.. Tampoco le puse demasiado enfasis, es cuestion tuya de ahora en adelante entenderle y arreglarlo..



Código: C
  1. const uint8_t comunes[] = {0b0001,0b0010,0b0100,0b1000,0b0000}; //Contiene los valores para encender los comunes y un 5to valor para apagarlo
  2. const uint8_t asciiToSegments[] = {,,,,,};                      //Array que transforma las letras en 7 segmentos
  3.  
  4. uint8_t display[4] = {'H','O','L','A'}; // Array con texto a mostrar
  5. uint8_t desface = 0;              // Indica el desfasaje del mensaje a mostrar
  6.  
  7. void MostrarDisplay(void)
  8. {
  9.  
  10.   static uint8_t indiceDisplay = 0;             // Indica en que letra estamos
  11.  
  12.  
  13.   if(indiceDisplay < desface)
  14.   {
  15.     PORTx = comunes[4]; //Apago display
  16.   }
  17.   else
  18.   {
  19.     uint8_t temp;
  20.        
  21.     //Protecciom
  22.     temp = indiceDisplay - desface;
  23.     if(temp >= sizeof display) while(1); //Error
  24.    
  25.     //Multiplexacion
  26.     PORTx = comunes[4]; //Apago
  27.     PORTB = asciiToSegments[display[temp]];
  28.     PORTx = comunes[indiceDisplay]; //enciendo el que corresponde
  29.   }
  30.   indiceDisplay++;
  31.   if(indiceDisplay >= ((sizeof display) - desface)) indiceDisplay = 0;
  32. }
  33.  
  34. void AumentoDesface(void)
  35. {
  36.   desface++;
  37.   if (desface > sizeof display) desface = 0;
  38. }
  39.  
  40. void main(void)
  41. {
  42.    //aca la configuracion inicial
  43.  
  44.  
  45.    uint8_t tiempoDesface = 0;           // Indica la cantidad de delays que ocurrierron
  46.  
  47.    while(1)
  48.    {
  49.      MostrarDisplay();
  50.      if ( ++tiempoDesface > 100)
  51.      {
  52.        AumentoDesface();
  53.        tiempoDesface = 0;
  54.      }
  55.      delay_ms(10);
  56.    }
  57. }


 

anything