Autor Tema: Como fazer caracter deslizar display 7 seg? Max7219  (Leído 5886 veces)

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

Desconectado elzirobotelho

  • PIC10
  • *
  • Mensajes: 7
Como fazer caracter deslizar display 7 seg? Max7219
« en: 02 de Febrero de 2013, 08:17:57 »
Estou tentando e até o momento sem sucesso, fazer um caracter deslizar da direita para esquerda num conjunto de 8 display´s 7 seg. Estou usando o MikroC Pro, Pic 16F887 e o Max7219. Sem o uso do Max7219 consegui implementar sem problemas, fazendo o uso de multiplexação. Mas, agora com o uso deste "max7219", não obtive sucesso até o momento.
Alguém poderia me ajudar, com dicas ou parte do código para o max7219? :?:

Sds
Elziro Botelho
 

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Como fazer caracter deslizar display 7 seg? Max7219
« Respuesta #1 en: 02 de Febrero de 2013, 08:48:10 »
Sencillo.
Armas una tabla con los numeros o letras de la frase que vas a enviar al display, y cada un determinado intervalo de tiempo debes rotar cada caracter de esa frase dentro de tu tabla de datos.
La rutina de envío al MAX7219 siempre debe enviar los elementos de esa tabla, sin enterarse siquiera que la estas rotando. :mrgreen:


Portugues (gracias GOOGLE !!)  :D :D

Único.
Armas uma tabela com números ou letras da frase que você está enviando para a tela, e cada vez que um dado intervalo deve girar cada personagem dessa frase em sua tabela de dados.
A rotina de expedição para MAX7219 deve sempre enviar os itens na tabela, mesmo sem saber que estes rotativo. :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Como fazer caracter deslizar display 7 seg? Max7219
« Respuesta #2 en: 02 de Febrero de 2013, 09:19:50 »
Muchas gracias Marcos por traducir los mensajes. Después de leer tu mensaje me tomo una Guaraná.! :)



Muito obrigado Marcos por traduzir mensagens. Depois de ler seu post eu tomar um guaraná. :)
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado elzirobotelho

  • PIC10
  • *
  • Mensajes: 7
Re: Como fazer caracter deslizar display 7 seg? Max7219
« Respuesta #3 en: 02 de Febrero de 2013, 12:36:01 »
Estou tentando e até o momento sem sucesso, fazer um caracter deslizar da direita para esquerda num conjunto de 8 display´s 7 seg. Estou usando o MikroC Pro, Pic 16F887 e o Max7219. Sem o uso do Max7219 consegui implementar sem problemas, fazendo o uso de multiplexação. Mas, agora com o uso deste "max7219", não obtive sucesso até o momento.
Alguém poderia me ajudar, com dicas ou parte do código para o max7219? :?:

Sds
Elziro Botelho
 

Segue o código que estou tentando rodar

Código: C
  1. //-----------------------Precedência de Todas as Rotinas------------------------
  2. void mensagem();
  3. void max7219_init1();
  4.  
  5. //--------------------------Variáveis Globais-----------------------------------
  6. unsigned char est_menu=0,delta=250,j=0,x,y=0,dados=0,
  7.               cnt=0,veloc_rot=0,
  8.               dia[9]={0x30,0x31,0x3B,0x30,0x31,0x3B,0x30,0x39,0x0D},
  9.               hora[9]={0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x0D},
  10.               temp[9]={0x3E,0x3E,0x32,0x35,0x33,0x3D,0x3C,0x3E,0x0D};
  11. char seg[9]={0x37,0x06,0x00,0x37,0x4F,0x0E,0x0E,0x7E,0x00};   // "HI HELLO"
  12. //char seg[8]={0x4F,0x77,0x5B,0x3B,0x67,0x06,0x4E,0x5F};   // "EasyPIC6"
  13. //char msg[8]={0x4F,0x0E,0x6D,0x04,0x05,0x1D,0x00,0x00};   //ELZiro
  14. sbit Chip_Select at RC0_bit;
  15. sbit Chip_Select_Direction at TRISC0_bit;
  16. //------------------------Fim das Variáveis Globais-----------------------------
  17.  
  18. //----------------------------Definições de Flags-------------------------------
  19. #define led PORTB.F0
  20. #define rotaciona x.F0
  21. //------------------------Fim das Definições de Flags---------------------------
  22.  
  23. //----------Rotina que irá exibir uma mensagem deslizante no display------------
  24. //------------------------------escrita pelo usuário----------------------------
  25. void mensagem() {
  26. unsigned char display[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  27.              caracter[9]={0x4F,0x0E,0x6D,0x04,0x05,0x1D,0x00,0x00,0x00},  // Elziro
  28.            //caracter[9]={0x4f,0x77,0x5b,0x3b,0x67,0x06,0x4e,0x5f,0x00},  // "EasyPIC6"
  29.            //caracter[9]={0x37,0x06,0x00,0x37,0x4f,0x0e,0x0e,0x7e,0x00},  // "HI HELLO"
  30. ponteiro,*aponta_carac,i;
  31.              
  32. aponta_carac = &caracter[0];  //Inicializa ponteiro
  33. display[7] = *aponta_carac;
  34. do {
  35.   if(cnt >= 200) {   //Aqui se altera a vel. de deslizamento (speed slide)
  36.   led=~led;         //Pisca LED
  37.   cnt = 0;
  38. //Contador em anel
  39.   display[6] = display[7];  //das variáveis, fazendo com que os caracteres deslizem
  40.   display[5] = display[6];  //nos 8 display´s
  41.   display[4] = display[5];
  42.   display[3] = display[4];
  43.   display[2] = display[3];
  44.   display[1] = display[2];
  45.   display[0] = display[1];
  46.   display[7] = *aponta_carac;
  47.   aponta_carac++;
  48.  
  49.   for (i = 1; i<=8; i++) {
  50.   Chip_Select = 0;       // select max7219
  51.   SPI1_write(i);         // send i to max7219 (digit place)
  52.   SPI1_write(display[8-i]);  // send 9-i to max7219 (digit value)
  53.   Chip_Select = 1;       // deselect max7219
  54.   }
  55.   }
  56. }
  57. while(1);
  58. }
  59. //-------------------------Fim da Rotina Mensagem-------------------------------
  60.  
  61. //--------Rotina que irá retorna o caracter que será escrito no display---------
  62. void trata_dados() {
  63. switch (dados) {  //               Caracter             Valor em Decimal
  64. case 0x30: dados = 0X7E; break;  //   0                       126
  65. case 0x31: dados = 0X30; break;  //   1                        48
  66. case 0x32: dados = 0X6D; break;  //   2                       109
  67. case 0x33: dados = 0X79; break;  //   3                       121
  68. case 0x34: dados = 0X33; break;  //   4                        51
  69. case 0x35: dados = 0X5B; break;  //   5                        91
  70. case 0x36: dados = 0X5F; break;  //   6                        95
  71. case 0x37: dados = 0X70; break;  //   7                       112
  72. case 0x38: dados = 0X7F; break;  //   8                       127
  73. case 0x39: dados = 0X73; break;  //   9                       115
  74. case 0x3A: dados = 0X77; break;  //   A                       118
  75. case 0x3B: dados = 0X1F; break;  //   b                        31
  76. case 0x3C: dados = 0X4E; break;  //   C                        78
  77. case 0x3D: dados = 0X3D; break;  //   d                        61
  78. case 0x3E: dados = 0X4F; break;  //   E                        79
  79. case 0x3F: dados = 0X47; break;  //   F                        71
  80. case 0x40: dados = 0X5E; break;  //   G                        94
  81. case 0x41: dados = 0X17; break;  //   h                        23
  82. case 0x42: dados = 0X04; break;  //   i                         4
  83. case 0x43: dados = 0X3C; break;  //   J                        60
  84. case 0x44: dados = 0X27; break;  //   k                        39
  85. case 0x45: dados = 0X0E; break;  //   L                        14
  86. case 0x46: dados = 0X76; break;  //   M                       118
  87. case 0x47: dados = 0X15; break;  //   n                        21
  88. case 0x48: dados = 0X1D; break;  //   o                        29
  89. case 0x49: dados = 0X67; break;  //   P                       103
  90. case 0x4A: dados = 0X7B; break;  //   q                       123
  91. case 0x4B: dados = 0X05; break;  //   r                         5
  92. case 0x4C: dados = 0X5B; break;  //   S                        91
  93. case 0x4D: dados = 0X0F; break;  //   t                        15
  94. case 0x4E: dados = 0X1C; break;  //   u                        28
  95. case 0x4F: dados = 0X3E; break;  //   V                        62
  96. case 0x50: dados = 0X7E; break;  //   W                       126
  97. case 0x51: dados = 0X37; break;  //   X                        55
  98. case 0x52: dados = 0X3B; break;  //   y                        59
  99. case 0x53: dados = 0X6D; break;  //   Z                       109
  100. case 0x54: dados = 0X80; break;  //   . (Ponto Dec.)          128
  101. case 0x55: dados = 0X40; break;  //   ¨ (Segmento A do dsp)    64
  102. case 0x56: dados = 0X01; break;  //   - (Hífen ou menos)        1
  103. case 0x57: dados = 0X08; break;  //   _ (underline)             8
  104. case 0x58: dados = 0X63; break;  //   º (Grau)                 99
  105. case 0x59: dados = 0x09; break;  //   = (Igual)                 9
  106.   default: dados = 0X00;         //blank
  107. }
  108. }
  109. //------------------------Fim da Rotina Trata_Dados-----------------------------
  110.                      
  111. //--------------------------Configuração MAX7219--------------------------------
  112. void max7219_init1() {
  113.   Chip_Select = 0;    // Habilita MAX
  114.   SPI1_write(0x09);   // Modo de codificação
  115.   SPI1_write(0x00);   // Modo não codificado
  116.   Chip_Select = 1;    // Desabilita MAX
  117.  
  118.   Chip_Select = 0;    // Habilita MAX
  119.   SPI1_write(0x0A);
  120.   SPI1_write(0x02);   // Ajusta o brilho dos display´s (00 a
  121.   Chip_Select = 1;    // Desabilita MAX
  122.  
  123.   Chip_Select = 0;    // Habilita MAX
  124.   SPI1_write(0x0B);
  125.   SPI1_write(0x07);   // Scan dos display´s
  126.   Chip_Select = 1;    // Desabilita MAX
  127.  
  128.   Chip_Select = 0;    // Habilita MAX
  129.   SPI1_write(0x0C);
  130.   SPI1_write(0x01);   // Habilita a ligação de todos os display´s
  131.   Chip_Select = 1;    // Desabilita MAX
  132.  
  133.   Chip_Select = 0;    // Habilita MAX
  134.   SPI1_write(0x00);
  135.   SPI1_write(0xFF);   // Modo não codificado
  136.   Chip_Select = 1;    // Desabilita MAX
  137. }
  138. //--------------------------Fim Configuração MAX7219----------------------------
  139.  
  140. //-----------------Rotina para tratamento da Interrupção------------------------
  141. void interrupt() {
  142.   if (TMR1IF_bit) {
  143.   veloc_rot++;
  144.   cnt++;                 // Increment counter
  145.   TMR1IF_bit = 0;           // Clear TMR0IF
  146.   TMR1H = 0x80;
  147.   TMR1L = 0x00;
  148.   }
  149. }
  150. //------------------------Fim da Rotina de Interrupção--------------------------
  151.  
  152. //---------------------------Rotina Principal-----------------------------------
  153. void main() {
  154. ANSEL  = 0;                 // Configure AN pins as digital
  155. ANSELH = 0;
  156. C1ON_bit = 0;               // Disable comparators
  157. C2ON_bit = 0;
  158. PORTB = 0xFF;               // Initialize PORTB
  159. TRISB = 0b11111110;         // PORTB is output
  160.  
  161. //------------Config. Timer1 para det. a vel. de desliz. da mensagem------------
  162. TMR1IF_bit = 0;  //Limpa Flag TMR1IF
  163. TMR1H = 0x80;    // Initialize Timer1 register
  164. TMR1L = 0x00;
  165. INTCON = 0xC0;   // Set GIE, PEIE
  166. T1CON = 1;       //Habilita Timer1
  167. TMR1IE_bit = 1;  //Habilita flag interrupção Timer1
  168. //------------------------Fim Config. Timer 1-----------------------------------
  169.  
  170. Chip_Select_Direction = 0;  // Set RC0 pin as output
  171. SPI1_init();                // Initialize SPI1 module
  172. max7219_init1();            // initialize  max7219
  173.  
  174. do {
  175. //data();
  176. //relogio();
  177. //temperatura();
  178. mensagem();
  179. }
  180. while(1);
  181. }
  182. //-------------------------Fim da Rotina Principal------------------------------
« Última modificación: 03 de Febrero de 2013, 11:53:46 por MGLSOFT »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Como fazer caracter deslizar display 7 seg? Max7219
« Respuesta #4 en: 02 de Febrero de 2013, 19:28:07 »
En que parte del programa cambias o cargas los valores que van a ser mostrados en los displays ??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado elzirobotelho

  • PIC10
  • *
  • Mensajes: 7
Re: Como fazer caracter deslizar display 7 seg? Max7219
« Respuesta #5 en: 03 de Febrero de 2013, 11:41:08 »
En que parte del programa cambias o cargas los valores que van a ser mostrados en los displays ??

Fica dentro desta rotina chamada void mensagem(), onde a mensagem que estiver com a linha habilitada, neste caso "Elziro", será passada através de um ponteiro para a variável matriz display[8], e o conteúdo desta será rotacionado através de um contador em anel a cada xmsegundos. Pois foi +/- assim que fiz no meu primeiro projeto, e funcionou perfeitamente. Só que devido as várias multiplexações e leituras que o pic tinha que fazer, o brilho dos display ficou muito fraco, por isso estou migrando para o max7219, mas estou apanhando muito e de goleada 10 x 0 kkkkkk. Se você tiver uma solução bem diferente desta eu aceito.

Sds
Elziro Botelho

Código: C
  1. void mensagem() {
  2. unsigned char display[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  3.              caracter[9]={0x4F,0x0E,0x6D,0x04,0x05,0x1D,0x00,0x00,0x00},  // Elziro
  4.            //caracter[9]={0x4f,0x77,0x5b,0x3b,0x67,0x06,0x4e,0x5f,0x00},  // "EasyPIC6"
  5.            //caracter[9]={0x37,0x06,0x00,0x37,0x4f,0x0e,0x0e,0x7e,0x00},  // "HI HELLO"
  6. ponteiro,*aponta_carac,i;
  7.              
  8. aponta_carac = &caracter[0];  //Inicializa ponteiro
  9. display[7] = *aponta_carac;
  10. do {
  11.   if(cnt >= 20) {   //Aqui se altera a vel. de deslizamento (speed slide)
  12.   led=~led;         //Pisca LED
  13.   cnt = 0;
  14. //Contador em anel
  15.   display[6] = display[7];  //das variáveis, fazendo com que os caracteres deslizem
  16.   display[5] = display[6];  //nos 8 display´s
  17.   display[4] = display[5];
  18.   display[3] = display[4];
  19.   display[2] = display[3];
  20.   display[1] = display[2];
  21.   display[0] = display[1];
  22.   display[7] = *aponta_carac;
  23.   aponta_carac++;
  24.  
  25.   for (i = 1; i<=8; i++) {
  26.   Chip_Select = 0;       // select max7219
  27.   SPI1_write(i);         // send i to max7219 (digit place)
  28.   SPI1_write(display[8-i]);  // send 9-i to max7219 (digit value)
  29.   Chip_Select = 1;       // deselect max7219
  30.   }
  31.   }
  32. }
  33. while(1);
  34. }
« Última modificación: 03 de Febrero de 2013, 11:53:04 por MGLSOFT »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Como fazer caracter deslizar display 7 seg? Max7219
« Respuesta #6 en: 03 de Febrero de 2013, 12:03:23 »
Disculpa las dos ediciones a tus mensajes, cuando pongas código, usa la herramienta GeSHi que esta arriba, eligiendo C, para que aparezca según lo que ves ahora, que es mas legible el código, ya que lo estructura parecido al compilador.

Yo no veo problemas en tu código, si bien MikroC es un poco diferente a CCS, que yo uso, la sintaxis sigue siendo de C.

  • El problema que tienes es que no puedes mostrar nada??   >>>> podría ser problema del código de escritura sobre el MAX7219.
  • Si usas el texto sin rotarlo, se muestra bien??      >>>>>>  Seria entonces un problema del código de rotación.
  • Estas emulandolo o lo usas en un circuito real??  >>>>>> los emuladores tienen problemas con las multiplexaciones y este puede ser uno.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado elzirobotelho

  • PIC10
  • *
  • Mensajes: 7
Re: Como fazer caracter deslizar display 7 seg? Max7219
« Respuesta #7 en: 03 de Febrero de 2013, 14:22:34 »
Disculpa las dos ediciones a tus mensajes, cuando pongas código, usa la herramienta GeSHi que esta arriba, eligiendo C, para que aparezca según lo que ves ahora, que es mas legible el código, ya que lo estructura parecido al compilador.

Yo no veo problemas en tu código, si bien MikroC es un poco diferente a CCS, que yo uso, la sintaxis sigue siendo de C.

  • El problema que tienes es que no puedes mostrar nada??   >>>> podría ser problema del código de escritura sobre el MAX7219.
  • Si usas el texto sin rotarlo, se muestra bien??      >>>>>>  Seria entonces un problema del código de rotación.
  • Estas emulandolo o lo usas en un circuito real??  >>>>>> los emuladores tienen problemas con las multiplexaciones y este puede ser uno.

Da forma que foi escrito o programa conforme descrito, a palavra está sendo escrita nos display´s, mas não estão se deslocando, como o desejado.
Se você tiver algo mesmo no CCS pode exibir aqui?

Estou usando um circuito real placa da mikroelektronika "easypic6" e a placa "Serial 7-seg Display 8-Digit"

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Como fazer caracter deslizar display 7 seg? Max7219
« Respuesta #8 en: 03 de Febrero de 2013, 16:42:24 »
Estuve mirado los ejemplos para esa placa y no encuentro detalles en tu software para escribir.
Por lo que dices un numero estatico se escribe bien.
Creo que deberas estudiar muy bien la parte del codigo donde haces la rotacion, y ver si esta bien el valor pasado al puntero de datos.
Creo que viene por alli tu problema, y debers disponer de una herramienta de depuracion para ir observando los valores que toma tu puntero en cada interaccion.

de otro modo no lo encontraras...

Yo no tengo esa placa y los ejercicios con MAX7219 los hice hace bastante tiempo, no se donde los tengo siquiera, porque ya pasaron por lo menos tres PCs desde esas practicas.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado elzirobotelho

  • PIC10
  • *
  • Mensajes: 7
Re: Como fazer caracter deslizar display 7 seg? Max7219
« Respuesta #9 en: 03 de Febrero de 2013, 20:59:28 »
Estuve mirado los ejemplos para esa placa y no encuentro detalles en tu software para escribir.
Por lo que dices un numero estatico se escribe bien.
Creo que deberas estudiar muy bien la parte del codigo donde haces la rotacion, y ver si esta bien el valor pasado al puntero de datos.
Creo que viene por alli tu problema, y debers disponer de una herramienta de depuracion para ir observando los valores que toma tu puntero en cada interaccion.

de otro modo no lo encontraras...

Yo no tengo esa placa y los ejercicios con MAX7219 los hice hace bastante tiempo, no se donde los tengo siquiera, porque ya pasaron por lo menos tres PCs desde esas practicas.

Gracias, pelas dicas qualquer novidade posto aqui neste site, mui bueno, diga-se de passagem.

Sds


 

anything