Hallo zusammen,
ich beschäftige mich zurzeit mit der DS3231 RTC, die kann man ja so programmieren, dass sie zu einer bestimmten Zeit einen Interrupt an den MC schickt. Mit diesem Interrupt möchte ich eine Funktion starten, die dann für eine gewisse Zeit ein Relais aktiviert. Da im Interrupt ja weder delay noch millis funktionieren und ich nicht weiß, wie ich das sonst lösen könnte, wollte ich mich mal bei euch erkundigen, wie man das Problem angehen könnte. In anderen Beiträgen dazu hab ich bereits gelesen, dass ein Interrupt in Kombination mit einem Timer die schlechteste Idee ist.
Ich hatte mir bereits überlegt in die Interruptfunktion eine Bool-Variable auf 1 zu setzen, der aktiviert dann im darauffolgenden loop eine do-while Schleife, in der das Relais eingeschaltet wird Mit millis wird die Zeit gemessen und nach Ablauf der Zeit wird die Bool-Variable wieder auf 0 gesetzt und die Funktion wartet wieder bis der Interrupt getriggert wird. Ist das eine Möglichkeit?
Warum willst du es mit einem Interrupt lösen ?
das macht nur Sinn, wenn du ständig ein Programm laufen hast, welches du nur mittels IRQ unterbrechen kannst/musst.
Es gibt da sicher bessere bzw. einfachere Lösungen.
Da ich als mc einen Attiny45 verwende und ich mit I2C keine Daten von der RTC übertragen bekomme. Deshalb soll der Attiny nur durch einen Alarm seitens der RTC aktiviert werden
Ist ok so.
Mit dem Interrupt liest du du nur den Alarmausgang vom DS3231. Du setzt ein Flag und im Loop fragst du das Flag ab. Das geht schnell und dafür ist ein Interrupt da.
Bist mit deinen Alarmierungen fertig setzt das Flag retour und lässt den Interrupt wieder auf den Alarmausgang aufpassen.
Ich habs jetzt mal so probiert zum Testen, den Interrupt erkennt er, der relay_trigger wird auch auf 1 gesetzt, aber in der main loop wird die if-Schleife nicht ausgeführt.
Mit dem UNO programmiere ich die RTC so, dass sie mir die Alarmzeiten liefert, dann steck ich die RTC ab und verbinde sie mit dem ATtiny, der dann nur noch auf die Interrupts von der RTC wartet
Ich bin nicht sicher, ob die Adaption so einfach möglich ist, da sich ATmega328P und ATtiny45 doch unterscheiden.
Muß es denn unbedingt ein Interrupt sein? Du kannst doch die Interruptleitung der RTC als Meldeeingang verwenden und in loop() abfragen. So wie ich es sehe, bringt Dir das keinen Nachteil gegenüber setzen eines Merkers in der ISR und Auswertung des Merkers in loop().
Oder?
Allerdings fürchte ich, Dein Vorhaben ist nicht durchführbar, weil nach einem DS3231-Interrupt dieser zurückgesetzt werden muß. Das geht aber meines Wissens ohne I²C-Verbindung nicht.
Also mit der AttinyCore Lib von Spence Konde (über den Bordveralter zu installieren) lässt sich die RTC auch mit dem Attiny per Wire programmieren ohne gleich eine "fette" RTC Bibliotek dafür installieren zu müssen.
Da der Zweck ja nicht allzu aufwändig erscheint, könnten die 4K Speicher auch reichen.