quinta-feira, dezembro 08, 2016

Multifunction Shield - Parte 2

Nesta segunda parte vamos ver a parte mais complexa da placa: o display.


O display em si é um velho conhecido dos leitores do blog: um display com quatro dígitos, cada um com 7 segmentos e um ponto decimal. O que pode confundir um pouco é a conexão, feita através de dois integrados 74HC595 em série. O 595 é um shift register de 8 bits; usando dois integrados temos um registrador de 16 bits para o qual você envia os os bits um a um através de um sinal de dados (pino digital 8 do Arduino) e de um sinal de clock (pino digital 7). Um terceiro sinal (latch, pino digital 4) é usado para colocar o valor atual do registrador nos pinos do display. A figura abaixo (adaptada do esquema da placa) mostra a conexão.


O esquema de uso é o tradicional: mostramos rapidamente um dígito de cada vez e a vista é enganada para pensar que todos estão acesos ao mesmo tempo. Abaixo um exemplo simples:
  1. // Exemplo de uso da Multi Function Shield - Display  
  2. // DQ, dez/2016  
  3. // http://dqsoft.blogspot.com  
  4.   
  5. #include <TimerOne.h>  
  6.   
  7. const int pinLatch = 4;  
  8. const int pinClock = 7;  
  9. const int pinDado = 8;  
  10.   
  11. // Desenho dos numeros  
  12. const uint8_t numero[10] = {  
  13.   0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90  
  14. };  
  15.   
  16. // Selecao dos digitos  
  17. const uint8_t digito[4] = {  
  18.   0x01, 0x02, 0x04, 0x08  
  19. };  
  20.   
  21. // Valor a apresentar no display  
  22. uint8_t valor[4];  
  23.   
  24. // Iniciação  
  25. void setup() {  
  26.   // Inicia os pinos ligados ao display  
  27.   pinMode (pinLatch, OUTPUT);  
  28.   pinMode (pinClock, OUTPUT);  
  29.   pinMode (pinDado, OUTPUT);  
  30.     
  31.   // Inicia o timer  
  32.   Timer1.initialize(2000); // 2 ms  
  33.   Timer1.attachInterrupt (timerIsr);  
  34. }  
  35.   
  36. // Programa principal  
  37. void loop() {  
  38.     static uint8_t cont = 0;  
  39.       
  40.     // mudar cada digito do valor com um ritmo diferente  
  41.     cli();  
  42.     if (++valor[3] > 9) {  
  43.         valor[3] = 0;  
  44.     }  
  45.     if (((cont & 0x03) == 0) && (++valor[2] > 9)) {  
  46.         valor[2] = 0;  
  47.     }  
  48.     if (((cont & 0x0F) == 0) && (++valor[1] > 9)) {  
  49.         valor[1] = 0;  
  50.     }  
  51.     if (((cont & 0x03F) == 0) && (++valor[0] > 9)) {  
  52.         valor[0] = 0;  
  53.     }  
  54.     sei();  
  55.    
  56.     cont++;  
  57.     delay (100);  
  58. }  
  59.   
  60. // Interrupção do timer, atualiza o display a cada 2 ms  
  61. void timerIsr() {  
  62.   static uint8_t iDig = 0;  
  63.     
  64.   digitalWrite(pinLatch, LOW);  
  65.   shiftOut(pinDado, pinClock, MSBFIRST, numero[valor[iDig]]);  
  66.   shiftOut(pinDado, pinClock, MSBFIRST, digito[iDig]);  
  67.   digitalWrite(pinLatch, HIGH);  
  68.   iDig = (iDig+1) & 3;  
  69. }  
Lembrando, o código está no github.

Nenhum comentário: