Mais um update a esta engenhoca...
Quando se tenta gastar o menos possível a contrapartida é o longo tempo de espera para que algo chegue a casa...
Tal como já tinha dito na parte 1 uma parte principal era o RTC (Real Time Clock, wiki). Os módulos à venda no ebay são extremamente baratos, já possuem um suporte para pilha (caso a energia ao circuito falhe, o relógio não perde os dados) e têm imensas funções, muitas das quais nem sequer vão ser usadas aqui...
Uma rápida procura levou-me à compra de um módulo com um DS1302 da MAXIM, que me custou cerca de 80 cêntimos, tal como podem ver no ebay.
O DS1302 conta segundos, minutos, horas, dias do mês e da semana, etc..., para mais detalhe aconselho uma leitura do datasheet.
Ora, o módulo chegou e o que interessa é colocar isto a fazer o trabalho que lhe é devido... enviar as horas certas quando solicitado.
Este IC usa um protocolo de comunicação chamado 3-wire interface. Muitas confusões são criadas em torno disto... isto funciona como o I2C? Funciona como o SPI?
Muito li em torno disto e fartei-me do que lia pela internet e fui ao único sitio onde isto tinha de estar claro: o datasheet!
Na figura 4 (pag. 8) esta tudo o que é preciso e este protocolo é facilmente implementado em software (explicado em seguida).
A comunicação pode ser dividida em dois tipos: a leitura de um byte e a escrita de um byte para o RTC.
A leitura de um byte do RTC é feita enviando o endereço do byte a ler e nos 8 clock's seguintes irá ser recebida a informação contida nesse byte. Os endereços disponíveis no DS1302 podem ser vistos na tabela 3 do datasheet, tal como as respectivas "respostas".
O RTC guarda o estado do pino I/O (bit 0 ou 1) no flanco ascende do clock e passados 8 flancos, ele já recebeu o endereço completo e nos próximos 8 pulsos, no flanco descendente, irá enviar o byte contigo no endereço.
A escrita de um byte para um endereço do RTC, é feita de forma muito semelhante. São enviados 16 pulsos de clock, os primeiros 8 correspondentes ao endereço e os seguintes correspondentes ao byte a guardar.
Mas melhor que isto, a figura 4 explica bastante bem como tudo se processa.
Para colocar o RTC em funcionamento e retirar alguns valores, fiz o seguinte código que com os comentários penso que fica bem explicito o que se passa em cada etapa.
Neste caso, usei um PIC18F46k20 para testar o módulo, embora não seja este que irei usar no circuito final.
Neste caso, usei um PIC18F46k20 para testar o módulo, embora não seja este que irei usar no circuito final.
Alguns defines importantes para as funções de escrita e leitura:
Função de inicialização:
Função de leitura:
Função de escrita:
Bem... agora que finalmente chegou o RTC e já consegui comunicar com ele é altura de começar a montar tudo.
Não percam os próximos episódicos...