Com que frequência devo consultar um RTC?
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.
— user9993
A melhor abordagem é a que atende às suas especificações enquanto utiliza uma quantidade mínima de recursos. Como realmente não conhecemos suas necessidades, "melhor" tem muito pouco significado para nós.
Todas as respostas muito boas, não posso escolher uma resposta!
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.
Você obtém o tempo do chip uma vez no início do seu programa e, talvez ocasionalmente, a partir de então - talvez uma vez por hora.
O sinal de interrupção aciona uma rotina de interrupção no seu MCU, na qual você aumenta o tempo em um segundo.
Esse arranjo fornece a precisão do segundo RTC sem a sobrecarga de ler ativamente o RTC.
Ao usar essa abordagem, é importante saber qual borda do relógio representa um incremento e também garantir que qualquer leitura em andamento durante essa borda do relógio seja abandonada.
— 22720
Ou verifique se a leitura é acionada apenas pelo ISR - você recebe um intervalo de um segundo para fazer a leitura antes que o próximo ISR seja acionado.
— Majenko 12/12/2015
Sempre que possível, prefiro definir relógios em tempo real para executar mais rápido que um tique por segundo e usá-los para o tempo de eventos de uso geral, se a resolução RTC puder ser definida o suficiente para atender às necessidades de tempo de eventos; portanto, nem sempre pode ocorrer uma interrupção em todos os ticks do RTC. Além disso, ao definir alarmes, geralmente é importante saber exatamente qual é o tempo do RTC no momento em que o alarme está sendo definido e pesquisar o RTC para ver se ele se moveu enquanto o alarme estava sendo definido. Eu não sei por que os fornecedores de chips de 32 bits não oferecem simplesmente um contador de 47 bits com a capacidade de ler qualquer um ... #
... os 32 bits superiores ou os 31 inferiores, mais o estado de entrada do relógio, têm um alarme que pode ser ligado e desligado a qualquer momento sem atraso de sincronização e um registro de alarme que pode ser gravado a qualquer momento quando o alarme é acionado. desativado, com a semântica de que o alarme ocorre se ocorrer um incremento enquanto o alarme estiver ativado . Se um chip pode aceitar ativações assíncronas e o software verifica novamente a pesquisa quando apropriado, nenhuma outra sincronização de hardware seria necessária e o software não precisaria solucionar problemas causados ​​por outras formas de sincronização de hardware.
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.
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.
Tais projetos confundem a mente. Ter leituras que ocorrem durante um incremento gera dados aleatórios seria um problema fácil de solucionar. Fazer leituras faz com que as contagens sejam perdidas é um problema que não pode ser contornado, exceto pela aceitação de contagens perdidas.
— 21815
Aparentemente, o buffer duplo é algo que algumas pessoas não pensam quando projetam seus chips.
Se o código verificar durante a pesquisa para garantir que um valor não seja alterado, não há necessidade de buffer duplo. Para um relógio em tempo real no chip, essa pesquisa de repetição até mudança não funcionará mesmo se uma interrupção tentar ler o RTC ao mesmo tempo em que o código da linha principal estiver fazendo isso. Alguns projetos com buffer duplo dificultam a escrita da linha principal e do código de interrupção que podem coexistir com segurança, e eu nunca vi um que eu consideraria realmente "útil".
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" .