Hallo zusammen,
Vorweg: der Titel ist bestimmt unpassend gewählt, leider weiß ich nicht, wie ich mein Problem kurz und knapp benenne und wahrscheinlich hab ich daher auch bei Google nichts gefunden
Ich möchte ein 5V Signal mit dem Arduino messen und, je nach anliegender Spannung, einen oder zwei (von drei möglichen) Ausgängen schalten.
Soweit läuft der Code auch, nur habe ich einen Knoten im Kopf und bekomme mein Problem nicht behoben...
Code:
Problem:
Durch die 6 IF Abfragen, werden die gesetzten Ausgänge auch gelöscht, obwohl sie es nicht sollten.
Bspw. bei einer Spannung von 4,7V (ADC Wert von 962, also zwischen Low_6 und High_6). Da der Wert nicht zwischen Low2 und High2 liegt, greift die dortige else Bedingung und setzt den Ausgang auf low. Anschließend wird bei If Nr. 6 wieder auf High gesetzt. Dies führt zu einem ~3ns langem Low-Signal auf der Leitung, was in der Endanwendung zu einem Brummen oder einer anderen Störung führen kann.
Ich möchte gern, dass die aktiven Ausgänge aktiv bleiben, ohne unnötige Rechenleistung zu verbraten. Ein verschachteltes IF(IF(IF(IF))) würde zwar das falsche Deaktivieren verhindern, im Zweifelsfalls aber 12 Abfragen beinhalten... Das Programm läuft aktuell mit ~8,94kHz und soll auch möglichst schnell bleiben.
Das XOR in Zeile 25 wird noch entfernt, das dient aktuell nur zum Nachmessen der Durchlauffrequenz.
Leider stehe ich wie gesagt auf dem Schlauch und bekomme diesen wahrscheinlich dummen und hoffentlichen einfachen Fehler nicht behoben
Hat jemand eine Idee für mich?
Grüße
Vorweg: der Titel ist bestimmt unpassend gewählt, leider weiß ich nicht, wie ich mein Problem kurz und knapp benenne und wahrscheinlich hab ich daher auch bei Google nichts gefunden
Ich möchte ein 5V Signal mit dem Arduino messen und, je nach anliegender Spannung, einen oder zwei (von drei möglichen) Ausgängen schalten.
Soweit läuft der Code auch, nur habe ich einen Knoten im Kopf und bekomme mein Problem nicht behoben...
Code:
C++:
//Start Definition der Konstanten
const int sensorPin = A0; // Analogpin Eingang
const int Low_1 = 434; //unterer Grenzwert 1 Ausgang1+2
const int High_1 = 475; //oberer Grenzwert 1
const int Low_2 = 502; //unterer Grenzwert 2 Ausgang 1+3
const int High_2 = 543; //oberer Grenzwert 2
const int Low_3 = 549; //unterer Grenzwert 3 Ausgang 1
const int High_3 = 590; //oberer Grenzwert 3
const int Low_4 = 659; //unterer Grenzwert 3 Ausgang 2+3
const int High_4 = 700; //oberer Grenzwert 3
const int Low_5 = 737; //unterer Grenzwert 3 Ausgang 2
const int High_5 = 778; //oberer Grenzwert 3
const int Low_6 = 948; //unterer Grenzwert 3 Ausgang 3
const int High_6 = 989; //oberer Grenzwert 3
int sensorValue = 0; // Variable für Messwert
byte out = 0;
void setup() {
DDRD = B00111100; //setze Pin D2,D3,D4,D5 auf Ausgang
}
void loop() {
while(1){
PORTD ^= B00100000;
sensorValue = analogRead(sensorPin);
if(sensorValue>=Low_1 && sensorValue<=High_1) { PORTD |= B00001100; goto ende; } else { PORTD &= B11110011; }
if(sensorValue>=Low_2 && sensorValue<=High_2) { PORTD |= B00010100; goto ende; } else { PORTD &= B11101011; }
if(sensorValue>=Low_3 && sensorValue<=High_3) { PORTD |= B00000100; goto ende; } else { PORTD &= B11111011; }
if(sensorValue>=Low_4 && sensorValue<=High_4) { PORTD |= B00011000; goto ende; } else { PORTD &= B11100111; }
if(sensorValue>=Low_5 && sensorValue<=High_5) { PORTD |= B00001000; goto ende; } else { PORTD &= B11110111; }
if(sensorValue>=Low_6 && sensorValue<=High_6) { PORTD |= B00010000; goto ende; } else { PORTD &= B11101111; }
ende:;
}
}
Problem:
Durch die 6 IF Abfragen, werden die gesetzten Ausgänge auch gelöscht, obwohl sie es nicht sollten.
Bspw. bei einer Spannung von 4,7V (ADC Wert von 962, also zwischen Low_6 und High_6). Da der Wert nicht zwischen Low2 und High2 liegt, greift die dortige else Bedingung und setzt den Ausgang auf low. Anschließend wird bei If Nr. 6 wieder auf High gesetzt. Dies führt zu einem ~3ns langem Low-Signal auf der Leitung, was in der Endanwendung zu einem Brummen oder einer anderen Störung führen kann.
Ich möchte gern, dass die aktiven Ausgänge aktiv bleiben, ohne unnötige Rechenleistung zu verbraten. Ein verschachteltes IF(IF(IF(IF))) würde zwar das falsche Deaktivieren verhindern, im Zweifelsfalls aber 12 Abfragen beinhalten... Das Programm läuft aktuell mit ~8,94kHz und soll auch möglichst schnell bleiben.
Das XOR in Zeile 25 wird noch entfernt, das dient aktuell nur zum Nachmessen der Durchlauffrequenz.
Leider stehe ich wie gesagt auf dem Schlauch und bekomme diesen wahrscheinlich dummen und hoffentlichen einfachen Fehler nicht behoben
Hat jemand eine Idee für mich?
Grüße