Arduino und Threading

Hallo liebe Gemeinde :wink:

ich habe ein Arduino Mega 2560 sowie 2 Rainbowduino.
An dem Arduino hängt ein KeyPad.

Nun habe ich meine "Firmware" soweit geschrieben, dass wenn man auf dem KeyPad eine Zahl eingibt diese auf den Rainbowduinos angezeigt wird.
Gibt man eine weitere Zahl ein, blinkt erst die erste dann die 2 u.s.w. bis man auf "Löschen" drückt.

Jetzt das Problem:
wenn man auf löschen drückt reagiert das Arduino (auf grund der noch laufenden schleifen und "Waits) nicht. Nur wenn ich löschen gedrückt halte wird nach ablauf der Zahlendarstellung der Befehl angenommen und alles gelöscht.
Wie kann ich es realisieren, dass sobald eine Taste gedrückt wird das Arduino sofort darauf reagiert?

Hufy1990:
wenn man auf löschen drückt reagiert das Arduino (auf grund der noch laufenden schleifen und "Waits) nicht.
...
Wie kann ich es realisieren, dass sobald eine Taste gedrückt wird das Arduino sofort darauf reagiert?

Du darfst im Programm beispielsweise "delay" nicht verwenden.

Lass mich mal raten: In Deinem Programm verwendest Du "delay", oder?

Ja, genau, weil zwischen dem Anzeigen der Zahlen eine Pause seien soll.

Hufy1990:
Ja, genau, weil zwischen dem Anzeigen der Zahlen eine Pause seien soll.

Falsche Maßnahme.

Pausen im Ablauf mußt Du realisieren, indem Du den Status setzt und mit Hilfe des Stands des millis() Timers feststellst, wann es weitergehen soll.

http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Hi, du kannst auch mal hier reinschauen, wobei ich morgen noch ein Update der Lib hochladen werde in dem die Initialisierung weiter vereinfacht wurde und mehr als 3 Beispiele beinhaltet sind.

http://forum.arduino.cc/index.php?topic=165552.0

Jomelo:
Hi, du kannst auch mal hier reinschauen, wobei ich morgen noch ein Update der Lib hochladen werde in dem die Initialisierung weiter vereinfacht wurde und mehr als 3 Beispiele beinhaltet sind.

Projektvorstellung: simpleThreads auf dem Arduino mit Hilfe von Makros - Deutsch - Arduino Forum

Sehr cool, aber kann ich dem Thread eine Variable übergeben (als Parameter) und wenn ja, wie?

Hi, die Lib wurde soeben nochmal aktualisiert.

Du kannst an einen Thread keine Parameter übergeben. Es ist genau so wie bei der setup() {} und loop() {} Funktion des Arduinos. Es können innerhalb des Threads lokale Variablen angelegt werden, ansonsten ist die Kommunikation nur über globale Variablen möglich.

Also ich habe eine "Datei" wo folgende Variable (global) gesetzt wird:

char *wrtGlobe;

in den Threads lese ich diese Aus, da ist Sie aber dann leer...?

/* *********************************** */
/* Thread A  
/* *********************************** */
/* This thread is called once per second. When the thread counter reached the value 5, thead B is starting */
/* thread A setup */
void __simpleThread_SETUP(Thread_A)(void)
{
  // reset counter value
  g_thread_counter = 0;
  // output
  Serial.println("Thread A: setup");
}
/* thread A loop */
void __simpleThread_LOOP(Thread_A)(void)
{
  // output counter value
  Serial.println("Thread runs");
  
  //OUTPUT
  Serial.println("wrtGlobe on ThreadPage: ");
  Serial.println(wrtGlobe);
  writeOutput(wrtGlobe);    //-> ist leer
}

Wo wird die Variable den eingelesen ?
Im Thread findet im Moment nur die Ausgabe statt und wenn die Variable leer ist, dann liegt das vermutlich nicht am Thread. Stell mal bitte mehr Quellcode von deiner Software zur Verfügung.

char *wrtGlobe;

void setup()
{
}

void loop()
{
        char wrt[OutputString.length()+1];
        OutputString.toCharArray(wrt, OutputString.length()+1);
        wrtGlobe = wrt;
        Serial.println("wrtGlobe: ");
        Serial.print(wrtGlobe); //-> Hat einen Inhalt!
        Serial.println("");
}
/* *********************************** */
/* Thread A  
/* *********************************** */
/* This thread is called once per second. When the thread counter reached the value 5, thead B is starting */
/* thread A setup */
void __simpleThread_SETUP(Thread_A)(void)
{
  // reset counter value
  g_thread_counter = 0;
  // output
  Serial.println("Thread A: setup");
}
/* thread A loop */
void __simpleThread_LOOP(Thread_A)(void)
{
  // output counter value
  Serial.println("Thread runs");
  
  //OUTPUT
  Serial.println("wrtGlobe on ThreadPage: ");
  Serial.println(wrtGlobe);
  writeOutput(wrtGlobe); //->Hat keinen Inhalt
}

Hmm, schlauer werde ich dadurch auch nicht:

  • Wo wird der Thread aufgerufen ? In der Loop kann ich den Eintrag __simpleThread_run nicht finden.
  • Werden die Ausgaben vom Thread ausgegeben, also über die Serielle Schnittstelle ?
  • Geben die Zeilen: Serial.println("wrtGlobe on ThreadPage: "); Serial.println(wrtGlobe); etwas aus, oder ist der Inhalt hier schon nicht mehr vorhanden ?
  • Wenn du anstatt des Threads eine neue Funktion erstellst und versuchst in dieser auf die globale Variable zuzugreifen, ist der Inhalt noch vorhanden ?
  • Wird der Thread in der setup Funktion mit __simpleThread_start(thread_name) gestartet ? In deinem Beispiel Code ist das nicht der fall.

Ich kann nur raten. Häng doch einfach dein Projekt unten als Zip File an deinen nächsten Beitrag oder stell den kompletten Quellcode zur Verfügung.

Die Threads laufen völlig unabhängig von den Variablen die du festlegst oder anlegst. Die Threads können auch keine Variablen löschen. Eine mögliche Fehlerquelle liegt darin, wenn man bei __simpleThread_init ( xxx ) die falsche Anzahl angibt, dann laufen die Threads nicht, da die Speicherbelegung nicht richtig funktioniert.

Anbei mein Projekt...

PTR_LED_Anzeigetafel_V__1_13_3.rar (5.93 KB)

Im Prinzip sollte es laufen. Ich habe da nun wieder ein paar Fragen, da ich das Programm so nicht testen kann:

  • Welche Arduino Version verwendest du ? Da du an vielen Stellen noch den Type byte verwendest, vermute ich das es nicht die neuste ist, da es den Type da nicht mehr gibt. Ich habe die Lib nur mit der Arduino Version 1.04 getestet.

  • Auf meiner Projektseite gibt es noch eine neuere Version der Lib, dort wurde die Initialisierung und der Aufruf der Funktionen weiter vereinfacht. Verwende doch bitte die Version.

  • Läuft der Thread denn, also kommen die Ausgaben das er gestartet wurde und das er danach in der Loop läuft ?

  • Kannst du, dass noch mit einer globalen Variable testen die nur ein Integer beinhaltet ? Wenn es dann nicht funktioniert liegt irgendwo anders der Fehler.

Wenn ich dein Beispiel bei mir nur mit einer Seriellen Schnittstelle teste, kann ich den Wert aus der Loop an den Thread übergeben.

Jomelo:
Im Prinzip sollte es laufen. Ich habe da nun wieder ein paar Fragen, da ich das Programm so nicht testen kann:

  • Welche Arduino Version verwendest du ? Da du an vielen Stellen noch den Type byte verwendest, vermute ich das es nicht die neuste ist, da es den Type da nicht mehr gibt. Ich habe die Lib nur mit der Arduino Version 1.04 getestet.

1.0.1

Jomelo:

  • Auf meiner Projektseite gibt es noch eine neuere Version der Lib, dort wurde die Initialisierung und der Aufruf der Funktionen weiter vereinfacht. Verwende doch bitte die Version.

Das probiere ich

Jomelo:

  • Läuft der Thread denn, also kommen die Ausgaben das er gestartet wurde und das er danach in der Loop läuft ?

Ja, das kommt

Jomelo:

  • Kannst du, dass noch mit einer globalen Variable testen die nur ein Integer beinhaltet ? Wenn es dann nicht funktioniert liegt irgendwo anders der Fehler.

Probiere ich

Ok, in meinen Beispielen zu den Threads wird ja auch mit globalen Variablen gearbeitet die auch ankommen, daher wundere ich mich ein wenig.