Skocz do zawartości

16Mhz vs 32.768khz czyli kwarc a blad pomiaru czasu rzeczywistego


Pomocna odpowiedź

1 minutę temu, _LM_ napisał:

Jeśli odchyłka jest stała, zawsze można zrobić korekcję programową 

Myslalem o tym choc pasowalo by to odpalic na dzien czy dwa i sprawdzac zeby sie upewnic czy ta odchylka jest wlasnie stala (tak +/-)...tak z ciekawosci to odpale to to i wrzuce do szuflady...😉

(edytowany)

To już lepiej byś pokazał program, bo te 13s na godzinę to jest gorszy wynik niż by ten generator na elementach rc był zbudowany. 

Edytowano przez _LM_
(edytowany)
#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
////////////////////////////////////////////////////////////////////

volatile uint32_t czas = 0;
volatile int czas2 = 0;
byte f = 0;

void setup() {
    u8g.setColorIndex(255);     
    u8g.setColorIndex(3);         // max intensity
    u8g.setColorIndex(1);         // pixel on
pinMode(A3, INPUT_PULLUP);
    TCCR2B &= 0x00;
    TCCR2A &= 0x00;
   TCCR2A |= (1<<WGM21);  //CTC                            
   TCCR2B |= (1<<CS22);  //preskaler na 64
   TIMSK2 |= (1<<OCIE2A);    //wlaczenie przerwania od przepelnienia
   OCR2A = 250;  //255 max            
   sei();                 // przerwania globalne wlacz
}
 
void loop() {
  if (digitalRead(A3) == LOW && f == 0) {
    TCNT2 = 0;
    czas = 0;
    czas2 = 0;
    delay(100);
    f = 1;
}

 if (czas2 >= 1000 && f == 1) {
  czas2 = 0;
  oled();
 }
 }
 
 

 void oled()  {
   u8g.firstPage();
  do {
    
  u8g.setFont(u8g_font_unifont);    
  
  u8g.setPrintPos(0, 10);
  u8g.print(czas / 1000UL);   

}
  while(u8g.nextPage() );  
}

 ISR (TIMER2_COMPA_vect)
{ 

  czas++;
  czas2++;
 }

czas uruchamiany z guzika porownywany ze stoperem tel...wiadomo ze ciekzo to zsynchronizowac wiec +/- 1s bledu zakladam...reszta chyba dobra..przerwanie co 1ms...

Edytowano przez farmaceuta

No przy tej rozdzielczości to się nie dziwię że masz takie odchyłki. I zdaje się że zmienna czas powinna być odczytywana atomowo, to dzielenie /1000 jest kolejnym źródłem błędów, bo co się dzieje z resztą tego dzielenia? 

u mnie na każdej z tych płytek wyszło podobnie czyli ~2s na jakieś 3,5h. Przerwanie od timera1 raz na sekundę (lekko odmienne wartości dla OCR1A dla każdej płytki).

4 godziny temu, _LM_ napisał:

to dzielenie /1000 jest kolejnym źródłem błędów, bo co się dzieje z resztą tego dzielenia? 

Zostaje utracona ale tylko chwilowo...jak dobije do wartosci podzielnej przez 1000 to wynik bedzie juz prawidlowy..

 

4 godziny temu, _LM_ napisał:

No przy tej rozdzielczości to się nie dziwię że masz takie odchyłki.

A co to ma do rzeczy? Pytam powaznie bo nie wiem...

 

4 godziny temu, _LM_ napisał:

I zdaje się że zmienna czas powinna być odczytywana atomowo,

E tam..az takie bledu by nie bylo, a raczej takiego powtarzalnego...no ale wiem o co chodzi, tak powinienem zrobic...

 

2 godziny temu, slon napisał:

 (lekko odmienne wartości dla OCR1A dla każdej płytki).

A no widzisz...mi chodzilo wlasnie o to zeby tego nie robic a ustawic tak jak ze wzorow...wychodzi mniej wiecej 1/277 bledu wiec pyknac OCR o "oczko" i blad spada...no ale bylem ciekaw jaki bedzie wynik ze wzorow...choc na 1s tez sprawdze..

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...