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:
- // Tratamento da interrupção do timer 0
- ISR (TIMER0_OVF_vect)
- {
- static uint8_t c1 = 0;
- static uint8_t c2 = 0;
- static uint8_t cnt = 60;
- uint16_t padrao;
- if (--cnt == 0)
- {
- c1 = c2;
- c2 = msg[iMsg++];
- if ((c2 < 0x30) || (c2 > 'Z'))
- c2 = 0;
- else
- c2 = c2 - '0' + 1;
- if (msg[iMsg] == 0)
- iMsg = 0;
- cnt = 60;
- }
- if (iDisp == 0)
- {
- PORTA &= 0xFC;
- PORTA |= DIG1;
- padrao = pgm_read_word(&(fonte[c1]));
- }
- else
- {
- PORTA &= 0xFC;
- PORTA |= DIG2;
- padrao = pgm_read_word(&(fonte[c2]));
- }
- PORTB = padrao & 0xFF;
- PORTD &= 0xC0;
- PORTD |= padrao >> 8;
- iDisp ^= 1;
- }
O vídeo abaixo mostra o resultado final.
Nenhum comentário:
Postar um comentário