Interrupt, sobald Daten in Serial Eingangspuffer stehen

Hallo,

ich suche nun schon ne ganze Weile, hab mich auch etwas in die Interrupt- und UART- Tuts von Microcontroller.net eingelesen, komme aber einfach nicht weiter.

Ich schreibe gerade ein Programm, um an einer LED-Matrix Animationen darzustellen. Ich lasse die Daten der Animation per Serial.read() einlesen und in Arrays speichern.

Da es allerdings pro dargestelltes Bild 48 Bytes sind, die ich einlese, muss ich sie natürlich sobald sie eintreffen einlesen, sonst gehen die Daten der folgenden Bilder verloren. Klappt beim ersten mal auch ganz gut, aber sobald ich mich im loop() zum ausgeben befinde, sind beim erneuten Senden die Daten natürlich aufgelaufen bis ich wieder am Anfang der loop()-Schleife bin.

Ich nehme an, dass die beste Möglichkeit nun ein Interrupt wäre, das darauf reagiert, dass Daten im Eingangspuffer ankommen, diese einliest und dann wieder an den Anfang der loop()-Schleife springt um auch gleich das neue Bild auszugeben.

Leider komme ich hier nicht weiter :frowning:

Könnt Ihr mir vllt mit einem Beispiel auf die Sprünge helfen?

Vielen Dank für Eure Antworten
Metti

Metti:
Da es allerdings pro dargestelltes Bild 48 Bytes sind, die ich einlese, muss ich sie natürlich sobald sie eintreffen einlesen, sonst gehen die Daten der folgenden Bilder verloren. Klappt beim ersten mal auch ganz gut, aber sobald ich mich im loop() zum ausgeben befinde, sind beim erneuten Senden die Daten natürlich aufgelaufen bis ich wieder am Anfang der loop()-Schleife bin.

Ich nehme an, dass die beste Möglichkeit nun ein Interrupt wäre, das darauf reagiert, dass Daten im Eingangspuffer ankommen, diese einliest und dann wieder an den Anfang der loop()-Schleife springt um auch gleich das neue Bild auszugeben.

Leider komme ich hier nicht weiter :frowning:

Könnt Ihr mir vllt mit einem Beispiel auf die Sprünge helfen?

Laut Serial.available() - Arduino Reference ist der Puffer der Hardware-Serial Schnittstelle beim Arduino 64 Bytes gross. Da sollten Deine 48 Bytes locker drin Platz finden.

Im übrigen: Arbeitest Du vielleicht irgendwo im Programm mit delay()?
Dann wird Deine loop()-Funktion nicht schnell genug abgearbeitet!

Wenn Deine loop()-Funktion immer auf Drehzahl gehalten wird und zigmal pro Sekunde durchläuft und die bereitstehenden Zeichen an der seriellen Schnittstelle ausliest, dann sollte es ein schnarchlangsamens Interface wie das serielle Interface es niemals schaffen, zwischendurch seinen Puffer mit 64 Zeichen vollzubekommen.

Stimmt, ein Bild findet im Puffer Platz, aber die Animationen bestehen ja aus mehreren Bildern.

Bei einer Animation mit 30 Bildern kommt auf einmal ein Strom aus (30*48) 1440 Bytes zusammen.

Leider sehe ich auch keine Möglichkeit die delays aus dem Programmteil für die Ausgabe zu nehmen, weil die LEDs einer Zeile eine bestimmte Zeit leuchten müssen bis die nächste Zeile angesteuert wird, ansonsten wird es zu dunkel.

Theoretisch könnte ich noch den Erhalt jedes Bildes quittieren lassen und erst dann das nächste Bild schicken lassen, aber ich dachte ein Interrupt wäre die elegantere Lösung.

Metti:
...Leider sehe ich auch keine Möglichkeit die delays aus dem Programmteil für die Ausgabe zu nehmen, weil die LEDs einer Zeile eine bestimmte Zeit leuchten müssen bis die nächste Zeile angesteuert wird, ansonsten wird es zu dunkel...

Das lässt sich mit etwas Programmiertechnik lösen.

Du setzt dir eine Variable mite dem Timerwert und steuerst die LEDs in Abhängigkeit davon an.

LED AN
Setzt Zeitwert in Variable z.B.: LED1_AN = millis();

Überprüfe Zeitwert:
Wenn millis()-LED1_AN > 1000 dann LED_AUS

So in der Art...

Metti:
Stimmt, ein Bild findet im Puffer Platz, aber die Animationen bestehen ja aus mehreren Bildern.

Bei einer Animation mit 30 Bildern kommt auf einmal ein Strom aus (30*48) 1440 Bytes zusammen.

1,4k setzen bei 2k SRAM des Arduino Uno aber ein gutes Speichermanagement voraus.

Metti:
Leider sehe ich auch keine Möglichkeit die delays aus dem Programmteil für die Ausgabe zu nehmen, weil die LEDs einer Zeile eine bestimmte Zeit leuchten müssen bis die nächste Zeile angesteuert wird, ansonsten wird es zu dunkel.

Dann stimmt an deinem Konzept etwas nicht, schau Dir mal "Blink without delay" an.

Schau Dir mal meine Beispiele hier http://blog.blinkenlight.net/experiments/basic-effects/pov-reloaded/ und hier http://blog.blinkenlight.net/experiments/basic-effects/vu-meter/ an. Der Trick ist die Anzeige per Interrupts zu bedienen :wink: