Ainda não usei um RTC, por isso não tenho certeza da maneira "normal" de ler um relógio em tempo real. Há algumas abordagens diferentes em que pensei, mas esperava alguns conselhos.
Aqui estão as maneiras que pensei em ler e usar o tempo até agora:
- Obtenha a data e a hora na inicialização e salve na RAM e, com o uso da interrupção do timer, aumente os valores da RAM a cada segundo etc. O código usaria os valores na RAM sempre que necessário para saber a data / hora.
- Com o uso de uma interrupção do timer, consulte o RTC a cada segundo e copie a data e a hora recebidas para a RAM. Novamente, o código usaria os valores na RAM sempre que necessário para saber a data / hora.
- Sempre que preciso descobrir o horário, consulte o RTC e use sua resposta diretamente.
Qual seria a melhor abordagem?
microcontroller
rtc
user9993
fonte
fonte
Respostas:
Eu usaria uma quarta opção.
A maioria dos chips RTC tem a opção de emitir um pulso de 1 segundo. Você deve conectar esse pulso a uma entrada com interrupção no seu MCU.
Esse arranjo fornece a precisão do segundo RTC sem a sobrecarga de ler ativamente o RTC.
fonte
3 e 2 são mais viáveis.
Terceira abordagem é o que eu uso na maioria dos casos. O benefício é que não preciso me preocupar em espelhar o RTC na RAM. Sua falha em potencial é que o interrogatório do RTC através do barramento serial introduz um atraso. Se você estiver gravando dados uma vez por segundo, esse atraso provavelmente não será importante.
A segunda abordagem também é boa. A manutenção de um relógio espelhado pode apresentar um erro de cronometragem, se o dispositivo estiver em execução por um longo período de tempo. O relógio de espelho pode se afastar do RTC. Se você ler o RTC regularmente, o desvio não se acumulará.
No entanto, eu desaconselharia fazer comunicação serial na própria rotina de serviço de interrupção (ISR). Defina um sinalizador no ISR e faça a comunicação serial no principal ().
ps Em todos os casos, eu estava usando o DS1307.
fonte
Alguns RTCs (por exemplo, MC68HC68T1 [que reconhecidamente quase ninguém deveria mais usar]) interromperão sua contagem interna ao serem lidos, a fim de fornecer uma resposta consistente. Eles devem ser lidos o mais raramente possível , para minimizar as interrupções. Leia-os uma vez e, em seguida, use as interrupções do timer para atualizar o valor do tempo armazenado na RAM do MCU.
fonte
Suponho que o RTC seja um chip separado com seu próprio cristal ou um módulo integrado ao seu microcontrolador que novamente tenha uma fonte de tempo separada (como um cristal de 32 kHz) que o relógio principal. E a fonte de tempo para o RTC é mais precisa do que a fonte para o microcontrolador.
Para determinar com que frequência você precisa ler o RTC, precisa descobrir qual o erro máximo que seu relógio principal pode ter. Por exemplo, se o cristal principal for especificado em 20 ppm, será igual a 0,002%. Portanto, um relógio baseado apenas na fonte principal de relógio pode derivar 0,00002 * 3600 * 24 = 1,728 segundos por dia.
Portanto, se você ler o RTC apenas duas vezes por dia e aumentar o tempo uma vez por segundo usando uma interrupção do temporizador, você nunca estará desligado por mais de um segundo - nunca estará desligado por mais de um segundo em comparação com o RTC.
Se, como assumi anteriormente, o seu RTC é um chip separado com seu próprio cristal ou um módulo integrado ao seu microcontrolador, isso não significa que esteja correto. Um RTC também pode ter um erro. Por exemplo, se estiver usando um cristal de 32 kHz com uma tolerância de 5 ppm (que são apenas um pouco mais caras que 10 ppm), ele poderá ser desligado em 0,43 segundos por dia - ou 13 segundos por mês.
Para contornar isso, você precisará ajustar o RTC, onde escreve um fator de correção em um registro. Isso permitirá que você obtenha o erro praticamente zero. Mas é claro que você precisará ter uma terceira fonte de relógio externa para usar como referência ao fazer o ajuste. Uma referência extremamente precisas nos EUA é a linha 60 Hz CA, que está garantido para ser exactamente 60 * 60 * 60 * 24 (5,184,000) ciclos num período de 24 horas entre midnights sucessivas. Para que isso seja útil, é necessário tempo para as 24 horas inteiras, pois os 60 Hz podem variar entre meia-noite.
Outra referência de tempo excelente seria usar GPS (precisão de 10 ns), se já houvesse hardware GPS em seu projeto.
Se, em vez disso, o horário do RTC vier de uma fonte externa, como o horário da rede celular (chamada AT + CCLK?) Ou um servidor de horário da rede usando NTP, você poderá usar o valor do RTC como está, pois não haverá nada para "ajustar" .
fonte