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?
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.
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.
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.
/* *********************************** */
/* 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
}
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.
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.