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!