Arduino Uno & RTClib - Uhrzeit & Datum Timer-basiert auslesen

OP #5050964
Lesenswert?
• ▲
▼
Hallo,

ich will auf einem Arduino Uno Uhrzeit und Datum zyklisch mit Hilfe der 
RTClib von einer DS1307 RTC auslesen.

Für die RTC habe ich eine eigene C++- und H-Datei angelegt (Header ist 
in der ino-Datei eingebunden):
RtClock.cpp:
1
RTC_DS1307 rtc;
2

3
void RtClock_Init(void)
4
{
5
  if ( rtc.begin() == (uint8_t)1 )
6
  {
7
    RtClockData.State = RT_CLOCK_STATE_INITIALIZED;
8
  }
9

10
  /* Start the real time clock */
11
  if ( RtClockData.State == RT_CLOCK_STATE_INITIALIZED )
12
  {
13
    if ( rtc.isrunning() == (uint8_t)1 )
14
    {
15
      RtClockData.State = RT_CLOCK_STATE_RUNNING;
16
      Serial.println("RTC is running");
17
    }
18
    else
19
    {
20
      RtClockData.State = RT_CLOCK_STATE_NOT_RUNNING;
21
      Serial.println("RTC is not running");
22
    }
23
  }
24
}
25

26
void RtClock_Cyclic(void)
27
{
28
  Serial.println("RTC Cyclic");
29

30
  DateTime now = rtc.now();
31
}

Die Init wird natürlich in der setup() aufgerufen. Die RTC läuft, was 
ich durch "RTC is running" über die serielle Schnittstelle mitgeteilt 
bekomme.

Die Cyclic würde ich gerne mit Hilfe eines Timers wie folgt aufrufen:
1
void Timer1_Init()
2
{
3
  TCCR1A = 0;
4
  TCCR1B = 0;
5
  TCNT1  = 0;
6

7
  OCR1A   = 62500;          // compare match register 16MHz/256/1Hz
8
  TCCR1B |= (1 << WGM12);   // CTC mode
9
  TCCR1B |= (1 << CS12);    // Prescaler: 256
10
  TIMSK1 |= (1 << OCIE1A);  // enable timer compare interrupt
11
}
12

13
ISR(TIMER1_COMPA_vect)          // timer compare interrupt service routine
14
{
15
  Serial.println("1s ISR");
16
  RtClock_Cyclic();
17
}

Auch hier wird die Init in der setup() aufgerufen.
Wenn ich diese SW auf den Arduino flashe, kommen beim Aufruf der 
RtClock_Cyclic auf der seriellen Schnittstelle jedoch lediglich die 
Zeichen "1s" an. Anschließend scheint es, dass der µC/die SW stehen 
bleibt.

Führe ich den gleichen Code allerdings in der loop() aus, funktioniert 
das ganze ohne Probleme:
1
void loop()
2
{
3
  
4
  Serial.println("1s in loop");
5
  RtClock_Cyclic();
6

7
  delay(1000);
8
  
9
}

Kommentiere ich die RtClock_Cyclic in der Timer-ISR aus, kommt der in 
der ISR enthaltene String "1s ISR" im Sekundentakt über die serielle 
Schnittstelle. Der Timer sollte also korrekt laufen...

Ich kann mir leider nicht erklären, warum es nicht funktioniert, wenn 
ich die Cyclic der RTC im Timer-Interrupt aufrufe.
Hat jemand hierzu eine Idee an was das liegen könnte?

Vielen Dank!
Gast #5052642
Lesenswert?
• ▲
▼
Warum verwendest du nicht eine fertige Library zu deiner RTC und 
startest die Anzeige per millis() im gewünschten Takt. Da brauchst du 
keinen Interrupt.

Zudem ist die von dir verwendete RTC sehr ungenau, die geht schon in 
kurzer Zeit um Minuten falsch.

Setze lieber die DS3231 ein, die ist teperaturkompensiert und hat damit 
eine sehr hohe Genauigkeit.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.