Interruptfunktion mit Timer

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

Warum das nicht ?
Der ATtiny45 hat auch einen funktionierenden I2C-Bus. Du brauchst nur die richtigen Libraries für einen ATtiny45.

Aber auch wenn du es per IRQ machen möchtest, kannst du den im ATtiny einfach in der Loop auswerten und deine Dinge machen.

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.

Das kannst Du auch im loop() ohne Interrupt machen. einfach ein Pin abfragen.
Grüße Uwe

Das bedeutet doch, Du benötigst zwei Programme:

  1. UNO oder vergleichbar zum Stellen der Alarmzeiten
  2. ATtiny45 zur Zeitauswertung per Interrupt

Oder?

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.

int potPin = 2; 
int ledPin = 13;
int relay = 7;
int val = 0;
const byte interruptPin = 3;
int relay_time;
bool trigger(bool);
bool relay_trigger;

void setup() {
 Serial.begin(9600);
 pinMode(relay,OUTPUT);
 pinMode(interruptPin, INPUT_PULLUP);
 }


void loop() {  
val = analogRead(potPin);
  
  if(val<=255){
  Serial.println("Wert 1");
  relay_time=10;
  }
  
  else if(val>255 && val<=512){
  Serial.println("Wert 2");
  relay_time=2000;
  }
  
  else if(val >512 && val <=768){
  Serial.println("Wert 3");
  relay_time=3000;
  }

  else if(val >768 && val <=1023){
  Serial.println("Wert 4");
  relay_time=4000;
  }

  attachInterrupt(digitalPinToInterrupt(interruptPin), trigger, RISING);

  if(relay_trigger){
  digitalWrite(relay,HIGH);
  delay(relay_time);
  digitalWrite(relay,LOW);
  relay_trigger=0;  
  }
  
  delay(1000);

}



//________________________________________________________________________________________


bool trigger(bool relay_trigger){
Serial.println("INTERRUPT");
relay_trigger = 1;
Serial.println(relay_trigger);
return relay_trigger;
}

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

Aha!

Bei welchem Programm möchtest Du Unterstützung, UNO oder ATtiny45 oder beiden?

Das müßte doch das Programm für den ATtiny45 sein, da gibt es keinen Pin 13.

Ich bin irritiert :roll_eyes:

Zurzeit teste ich das alles noch am UNO, tut mir leid für die Verwirrung. Ich adaptiere das dann in weiterer Folge noch für den ATtiny

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.

Ok....und Fragen beantwortest du auch nicht.
Wie schon mehrfach geschrieben wurde, du brauchst den Intrrupt auf dem Attiny 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.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.