Hallo allerseits,
ich möchte für ein Projekt eine Variable per Hardwareinterrupt (Taster) heraufzählen und, wenn diese einmal heraufgezählt ist, anhand dieser das EEProm auslesen.
EEProm auslesen sowie Interrupt und Variable funktionieren auch jeder für sich.
Im ganzen Code kommt es, wenn die if- Abfrage für's EEProm-auslesen NICHT auskommentiert ist, nur zur darstellung der erste Buchstaben der seriellen Ausgabe, mit der ich die Abarbeitung des COde nachverfolgen wollte.
Sieht wer, wo hier der Fehler liegt?
Ich würde mich über Lösungshinweise wirklich freuen. Die EEProm- Anweisung sind ja recht übersichtlich, ich finde den Fehler nicht.
Gruß,
Moritz
#include <EEPROM.h> // EEprom- Bibliothek zum Speichern der Eingaben
const int ledPin = 13;
const int hallPin = 2;
const int wahlPin = 3;
//---------------------------- Variablen für das Eingabe- Interface deklarieren & initialisieren
char wort[9]; // Länge vom Wort (char- Array) muss angegeben werden, auch wenn nicht voll ausgenutzt. Willkürlich gewählt: 10. Eher 9, da erstes Byte die Länge beschreibt.
byte laenge;
byte stelle = 0;
bool lesen = LOW;
void setup() {
Serial.begin(9600); // seriellen Port aktivieren
pinMode(wahlPin, INPUT); // initialisiert wahlPin als Input. Vllt. egal, da interrupt- Pin eh ein Input ist?
pinMode(wahlPin, INPUT_PULLUP); // aktiviert Pullup- Widerstand am wahlPin. Nicht nötig, wenn hardwareseitig Pullup eingebaut
attachInterrupt(digitalPinToInterrupt(3), wahl, FALLING);// CHANGE // Interrupt, wenn Taster (active- low) an INT1 ≙ Pin3 betätigt
}
void loop() {
/* if (lesen == HIGH) { // falls Interrupt "wahl" ausgelöst, d.h. ausgewählten Speicherplatz einen weiter gedrückt
Serial.println(laenge);
laenge = byte(EEPROM.read(stelle)); // EEProm lesen an erster Adresse (≙ "stelle"), dies ist "laenge". Folgende 9 Stellen sind zugehöriges "wort".
if (laenge != 0) { // Wenn "stelle" nicht belegt (≙ 0), gibt es kein "laenge", dann auch kein "wort".
for (int i = stelle; i < (stelle + laenge + 1); i++) { // fängt beim Hochzählen bei ausgewählter Stelle an, zählt bis ausgewählte Stelle plus "laenge", d.h. das ganze gespeicherte Wort
wort[(i - stelle)] = char(EEPROM.read(i + 1)); // wenn EEProm(stelle) NICHT Null (≙ es IST etwas vorhanden, es GIBT ein "laenge"): Lese ab Stelle "stelle+1" (an voriger Stelle liegt ja "laenge"!) bis zu "stelle+laenge+1", dass muss dann "wort" sein.
}
}
else { // Fehlermeldung, falls gewählte Speicherstelle nicht belegt
wort[1] = 'L';
wort[2] = 'E';
wort[3] = 'E';
wort[4] = 'R';
for (int i = 4; i < laenge; i++) { // Rest von evtl. noch vorhandenen Buchstaben überschreiben
wort[i] = '_';
}
}
lesen = LOW; // Lesen abgeschlossen
}*/
}
void wahl() { // Interrupt Serive Routine: Stelle zum EEProm- Lesen auswählen
if (stelle < 50) stelle += 10; // max. fünf versch. Speicherplätze á ein Byte für Länge und 9 Characters (insges. 50 Speicherstellen). Bei Tastendruck springe 10 Stellen im EEProm weiter
else stelle = 0; // zurückspringen, falls weiter als fünf Speicherplätze durchgeklickt
lesen = HIGH; // setzt Variable "lesen", damit im Loop EEProm eingelesen wird
Serial.print("stelle: "); // for debugging purposes, zur Not auskommentieren: Angabe über errechnete Werte
Serial.println(stelle);
Serial.print("Zustand von 'lesen': "); // for debugging purposes, zur Not auskommentieren: Angabe über errechnete Werte
Serial.println(lesen);
}