terça-feira, dezembro 09, 2014

Display LED Alfanumérico por Segmentos - Parte 2

Nesta segunda parte vamos ver uma montagem em protoboard  usando um display alfanumérico de 14 segmentos ligado a um ATtiny2313.


O circuito é bastante simples e utiliza quase todos os pinos de saída digital do ATtiny2313. Os oito pinos do PORTB e seis pinos do PORTD são ligados aos segmentos, através de resistores de 220 ohms. Os dois pinos do PORTA são usados para controlar os catodos dos caracteres; um transistor MOSFET de uso geral é usado pois a corrente pode ultrapassar o limite do ATtiny:


É usado o clock interno de 8MHz do ATtiny. Como demonstração, o software mostra continuamente os caracteres de 0 a 9 e A a Z e um texto. A tabela que indica quais segmentos devem ser associados a cada caracter foi obtida a partir uma imagem na wikipedia (artigo, imagem - criação de Michael J). Ela é armazenada na Flash, na forma de 16bits para cada caracter; os bits estão na posição correta para escrita nos PORTS B e D.

A ação toda do programa se passa na interrupção de tempo real, que ocorre a cada 8,192 milisegundos. A cada interrupção um dos caracteres do display é apresentado, a cada 60 interrupções (cerca de meio segundo) passa-se para o caracter seguinte da mensagem:
  1. // Tratamento da interrupção do timer 0  
  2. ISR (TIMER0_OVF_vect)  
  3. {  
  4.     static uint8_t c1 = 0;  
  5.     static uint8_t c2 = 0;  
  6.     static uint8_t cnt = 60;  
  7.     uint16_t padrao;  
  8.       
  9.     if (--cnt == 0)  
  10.     {  
  11.         c1 = c2;  
  12.         c2 = msg[iMsg++];  
  13.         if ((c2 < 0x30) || (c2 > 'Z'))  
  14.             c2 = 0;  
  15.         else  
  16.             c2 = c2 - '0' + 1;  
  17.         if (msg[iMsg] == 0)  
  18.             iMsg = 0;  
  19.         cnt = 60;  
  20.     }  
  21.       
  22.     if (iDisp == 0)  
  23.     {  
  24.         PORTA &= 0xFC;  
  25.         PORTA |= DIG1;  
  26.         padrao = pgm_read_word(&(fonte[c1]));  
  27.     }  
  28.     else  
  29.     {  
  30.         PORTA &= 0xFC;  
  31.         PORTA |= DIG2;  
  32.         padrao = pgm_read_word(&(fonte[c2]));  
  33.     }  
  34.     PORTB = padrao & 0xFF;  
  35.     PORTD &= 0xC0;  
  36.     PORTD |= padrao >> 8;  
  37.     iDisp ^= 1;  
  38. }  
O projeto completo (AlfaSegto.zip) pode ser baixado dos arquivos do blog.

O vídeo abaixo mostra o resultado final.


Nenhum comentário: