Forum: Mikrocontroller und Digitale Elektronik Arduino Uno & RTClib - Uhrzeit & Datum Timer-basiert auslesen


von Matt B. (mattb)


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!

von Brain 2.0 (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.