| Você está aqui: Kiko > SistemasEmbutidos > RelogioDCB | Imprimível | fim do tópico |
em um invólucro de papelão amadorístico mas visualmente decente. Clique para ampliar.
e botões serão soldados com suas frentes para o outro lado. Clique para ampliar.
|
MODO (o botão mais da direita) enquanto o relógio estiver contando, ele passará para o modo de exibição seguinte. Ao chegar no último, voltará para o primeiro.
HR, MIN e MODO.
Pressionando HR ou MIN entra no modo de ajuste, parando o relógio e zerando o contador de segundos. Pressionar HR incrementa as horas; MIN incrementa os minutos. Eles voltam a zero ao atingirem seus valores máximos.
Em modo de ajuste, pressionar MODO reinicia o relógio: o contador de segundos vai voltar a contar. A contagem reinicia quando você solta a tecla MODO. Isso facilitar sincronizar manualmente com outro relógio com precisão limitada apenas pela sua velocidade de reação, tipicamente de poucos décimos de segundo.
VCC e terra obrigatórios, resta-nos seis pinos usáveis como E/S.
A primeira observação importante é que podemos controlar todos os 20 LEDs com apenas cinco pinos. A animação abaixo mostra como: vislumbre cada pino de controle como um vértice de um K5 (o grafo completo em cinco vértices, desenhado abaixo como um pentágono com todas as suas diagonais) onde em cada uma das dez arestas temos dois LEDs conectados em antiparalelo. Fornecendo corrente (i.e., enviando um "1" lógico) em um pino especifico e consumindo essa corrente (um "0" lógico) ao mesmo tempo em que se deixa todos os outros pinos disconectados (como "entradas"), podemos acender um LED de cada vez.

VCC; o outro tem o divisor de voltagem clássico usando resistores para evitar que os LEDs apaguem ao pressionar as teclas, ao mesmo tempo provendo uma diferença de voltagem suficiente para ser detectado pela MCU. Com LEDs de alta intensidade, dá pra vê-los levemente iluminados quando se pressiona um dos botões.
O sexto pino é usado como entrada do sinal de clock do oscilador externo. Em teoria poderíamos usar o oscilador interno do AVR, mas mesmo após propriamente calibrado e sob as melhores das condições, sua precisão, de apenas uns 2%, é muito baixa para nossa aplicação -- nada mais irritante que um relógio que precisa ser acertado com freqüência. Com a estabilidade típica de 200 partes por milhão que os osciladores de quartzo tipicamente têm, obtemos um relógio que só precisará ser ajustado apenas umas poucas vezes por ano.
Não dá pra usar um cristal diretamente porque isso requeriria dois pinos do AVR, quando só temos um restante. Chafurdando minha pilha de sucata, achei uma placa de rede Ethernet 10BaseT que tinha um oscilador Aker AX0-200A de 20MHz. É muito mais rápido do que precisamos, só que era o único que eu tinha. Isso me forçou a usar um ATtiny45 porque era o único AVR de 8 pinos que eu tinha na ocasião que oficialmente suporta uma freqüência alta como essa. Mas também é exagero, porque o firmware usa menos de 1KB e, exceto pelo stack, não requer nenhuma RAM. Algumas semanas depois eu comprei um ATtiny13 muito "menor" e, como suspeitava, funciona perfeitamente.
A fonte de alimentação é o circuito clássico do regulador de voltagem 7805. Há também pinos para conectar, através de um diodo, uma bateria de 9V à entrada do regulador para atuar como reserva em caso de queda de energia -- isso alivia o problema de ter de reajustar o relógio com freqüência que acontece em áreas com fornecimento intermitente de energia. Aqui onde moro a disponibiliade de energia é >99,95%, mas uma ou duas vezes por mês acontece uns "clicks" que 3 a 5 segundos que são suficientes para fazer com que computadores que não estejam protegidos por no-breaks sejam reiniciados. Eu recomendo baterias alcalinas de 9V; não recomendo baterias recarregáveis por causa da sua elevada taxa de auto-descarga: como só serão consumidas nos raros momentos em que faltar energia, é provável que elas já tenham se auto-descarregado quando isso acontecer.
As versões que tenho feito mais recentemente usam um ATtiny13 com um oscilador de 4MHz SG-531P. Elas consomem menos de 10mA de correte, mesmo com "todos os LEDs ligados" (lembre-se, isso não acontece de fato; a cada instante há apenas um LED ligado). Uma bateria alcalina de 9V típica costuma ter um a capacidade de pouco mais de 600mAh, de sorte que podemos esperar que o relógio funcione por cerca de 60 horas com uma dessas. Isso é mais de 10 vezes o tempo médio anual sem energia elétrica aqui em Recife. Em outras palavras, a não ser por um apagão nacional, é improvável que eu venha a ter de trocar a bateria mais do que uma vez a cada dois anos.
/RESET como E/S, o processo de programação vai desabilitá-lo. Isso significa que se você não tiver um programador de alta voltagem (tal como o STK-500 da Atmel), você só conseguirá usar a programção "em circuito" via SPI uma única vez.
Coloque a MCU na sua placa de programação favorita. Se você usa o avrdude e o usbasp como eu, verifique que os caminhos e configurações no Makefile estão OK para o seu sistema e digite:
Para configurar os fusíveis, digite:make upload_isp
Lembre-se: desse ponto em diante você não mais poderá usar ISP via SPI. Se você quiser atualizar o firmware novamente usando programação de alta voltagem, remova a MCU, coloque-a em um programador de alta voltagem e digite:make fuses
Depois, coloque a MCU de volta na placa do RelógioBCD.make upload_hvsp
Makefile para que façam sentido no seu sistema. Feito isso, digite make clean para remover as versões precompiladas e qualquer outra sujeira e por fim digite make. O resultado deve sair nos arquivos main.hex, eeprom.hex.
avr1 (adiw, sbiw, lds, std e afins);
PB5 só pode atuar como saída em modo "open-drain" (ou seja, existe um PINB5 e um DDRB5, mas não um PORTB5, de sorte que ele só pode ser ou entrada de alta impedância ou puxando para o terra). Isso significa que não dá para controlar todos os 20 LEDs; ficamos limitados a 16.
O ATtiny11 é ainda pior: o PB5 dele só pode ser usado como entrada; não pode ser usado como saída em absoluto (ou seja, só há um PINB5; não há nem DDRB5 nem PORTB5).
Já o ATTiny15 não funcionaria por uma razão totalmente diferente: ele não aceita clock externo.
Deveria ser possível usar esses chips, contudo, se usarmos as portas PORTB4..0 para os LEDs e o PINB5 para obter a base de tempo a partir dos 50/60Hz da tomada elétrica, tal como fazem muitos relógios. Esta página (em inglês) discute como as companhias elétricas na Holanda e ao redor da Europa condicionam as formas de onda da energia elétrica para que sejam bastante estáveis a longo prazo, precisamente para que relógios baseados nelas não atrasem nem adiantem demais. Eu não sei o quão bem feito isso é aqui no Brasil, nem mesmo se é feito; mas eu suspeito que sim, porque é necessário para que as companhias elétricas possam vender energia umas para as outras. Planejo pesquisar mais sobre isso e quem sabe construir outra versão desse relógio baseado nessa técnica e nesses processadores "menores".
O conteúdo deste site está disponibilizado nos termos de uma Licença Creative Commons, exceto onde dito em contrário.