Hilfe! Die serielle Kommunikation "stört" meinen restlichen programmverlauf

Hallo,

Ich sitze seit einer weile an diesem Projekt (Teil meiner Diplomarbeit) und habe die meisten Hürden überwunden, stecke nun jedoch ziemlich an folgendem Problem fest:

Ich habe an meinem Leonardo Hall-Sensoren, die an meiner Welle Drehrichtung und Umdrehungen messen (Positionsbestimmung) und dann habe ich noch Ultraschall-Distanzsensoren an einem Arduino-Micro hängen (weil die einen Delay benötigen und das zu Fehlern in meiner Messung mit den Hallsensoren geführt hat). Der Micro und Leonardo kommunizieren Seriell. Jetzt funktioniert es trotzdem nicht beides gleichzeitig... Hat da jemand einen Rat?

Einzeln Funktionieren die sketches ganz gut. Nur wenn ich im Setup- Serial1.begin(9600); -stehen habe geht die Distanzmessung aber die Positionsbestimmung nicht korrekt und ohne die Zeile geht zwar die Pos.bestimmung, aber die Distanzmessung nicht...

Ich hoffe wir können da eine Lösung finden!
Danke im voraus! :

das delay durch millis ersetzen und schon läufts

nicht die Serielle Kommunikation stört sondern die Serielle Kommunikation wird gestört.

Der Leonardo macht die serielle Kommunikation selbst "on board", während andere Arduinos dafür einen extra Prozessor oder Chip haben. Den Prozessor mit delay() anzuhalten, hält da dann wohl alles an.

Danke.
Also wenn ich das richtig verstehe, hält das delay auf meinem Sender-arduino die serielle Kommunikation an, und dadurch hängt es dann genauso bei dem Empfänger-arduino? Ich probiere es jetzt mal mit Millis.

...Auch mit Millis statt Delay tritt der selbe Fehler auf.

ich glaube es hängt nicht an dem delay bzw millis. Habe entdeckt dass da noch ein "PulseIn" drin steckt. daran könnte es natürlich liegen. Wie kann ich den denn ersetzen?

Mit millis() oder micros() zwei Zeitstempel erzeugen. Die Differenz ist die Länge des Pulses. Dann brauchst du noch etwas Logik um den Zustand des Pins abzufragen.

für dich und andere wärs einfacher wenn ein Sketch vorhanden wäre

Jetzt entstehen komische Werte... was habe ich falsch gemacht?
Hier mein pulseIn-ersatz:

int zeitA1 = micros();
int zeitA2 = micros();
int echostate=0;

if ( echostate == 0 and digitalRead(echo) == HIGH){
zeitA1 = micros();
echostate = 1;
}

if ( echostate == 1 and digitalRead(echo) == LOW){
zeitA2 = micros();
echostate = 0;
duration = zeitA2 - zeitA1;
}

Hier der Status Quo der problematischen Funktion

// Funktion Distanzmessung A
void distanzmessungA(){

if (millis()-zeit1 >= 2){
digitalWrite(trigger, LOW);

zeit1= millis();
}
if (millis()-zeit2 >= 10){
digitalWrite(trigger, HIGH);

zeit2= millis();
}

digitalWrite(trigger, LOW);
// duration = pulseIn(echo, HIGH,8300); // Echo-Zeit messen
// duration=1000;

//pulsein mit micros ersetzen

if (micros()-zeitA >= 8300){

if ( echostate == 0 and digitalRead(echo) == HIGH){
zeitA1 = micros();
echostate = 1;
}

if ( echostate == 1 and digitalRead(echo) == LOW){
zeitA2 = micros();
echostate = 0;
duration = zeitA2 - zeitA1;
}

zeitA= micros();
}

// Echo-Zeit halbieren (weil hin und zurueck, der doppelte Weg ist)
duration = (duration/2);
// Zeit des Schalls durch Luft in Zentimeter umrechnen
distance = duration / 29.1;

// Anzeige nur Aendern wenn neue Entfernung
if(distance!=distance_old){
Serial.print(distance);
Serial.println(" cm");
}

distance_old=distance; // letze Entfernung speichern
distanceA= distance;

if (distanceA==0 ){ //Fehlmessung/Kein wert ausklammern
distanceA=1000;
} }

// Ende Funktion Distanzmessung A

Serenifly:
Der Leonardo macht die serielle Kommunikation selbst "on board", während andere Arduinos dafür einen extra Prozessor oder Chip haben. Den Prozessor mit delay() anzuhalten, hält da dann wohl alles an.

Du verwechselst die Serielle Schnittstelle mit USB.
Grüße Uwe

Katse:
Hat da jemand einen Rat?

So völlig ins Blaue zu raten, ohne vollständigen Versuchsaufbau, ohne Schaltbild und ohne Programmsketch, ist das recht schwierig, etwas dazu zu sagen.

Aber wenn Du den Teil der Messaufgabe, den Du nicht blockierfrei programmiert bekommen hast, nun auf einen eigenen Controller ausgelagert hast, der nun die Messungen mit blockierendem Code vornimmt und nach jeder Messung Daten seriell an einen zweiten Controller weiterleitet, dann wird es vermutlich an der seriellen Auswertung der Daten bei dem Controller hängen, der die Daten empfangen soll.

Allerdings sehe ich hier nur, dass Dir die serielle Übertragung in die Suppe spuckt, aber nichts darüber, was das Problem sein könnte:

  • Baudrate?
  • Was für Daten werden übertragen?
  • Mit welchem Übertragungsprotokoll?
  • Und wie werden diese Daten empfangen und ausgewertet?

Noch ein kleiner Hinweis zum veröffentlichten Code: Die pulseIn()-Funktion macht auch nichts anderes als den Programmablauf wie ein delay() zu blockieren.

uwefed:
Du verwechselst die Serielle Schnittstelle mit USB.

Oops. Er hat ja Serial1 verwendest. Das hatte ich übersehen :frowning:

Ich habe jetzt alles wieder zusammen auf ein Board geladen- sowohl die Distanzmessung als auch meine Messung mit den Hallsensoren.
Habe die Hallsensoren nun aber an interrupt-Pins attached, sodass hier nichts verpasst wird.

Wenn bei der Distanzmessung ein paar werte flöten gehen ist das in meinem Falle nicht so wild- daher kann ich sagen ich bin zufrieden mit der momentanen Lösung.
Danke für eure Hilfe! Wenn ich den Sketch einigermassen "sauber" habe werde ich ihn dann hier posten.