Hallo,
@ Spanier, wäre eine Idee für morgen.
@ Serenifly, wegen '\0', dann bin ich doch nicht so blöd. Danke für Rückmeldung.
Man zweifelt bei der Fehlersuche an den banalsten Dingen. 
Jetzt möchte ich euch kurz an der Fehlersuche teilhaben lassen. Mit dem Oszi sieht man Dinge, die einem mit dem Datalogger verborgen bleiben.
Das Highsignal auf der Mega-Empfangsleitung wird langsam runtergezogen. In dieser fallenden Kurve sieht man das Sendesignal eingekoppelt.
Ich finde das nicht in Ordnung. Frage. Was ist hier los? Hardwarecheck ...
Das 15cm Doppelkabel zwischen Steckbrett und Mega komplett aufgetrennt und verdrillt wieder gesteckt. Ohne Erfolg.
Vermutung, Hardware zerstört.
Auf dem Mega die Serial1 gegen Serial2 getauscht. Ohne Erfolg.
Wieder zurück geändert.
Mein verdrilltes RS485 Verbindungkabel ist ca. 1m lang.
An den seriellen Uart's vom ATtiny und Mega ist je ein MAX487 IC dran.
Der 130 Ohm Abschlusswiderstand zwischen A-B ist auf beiden Seiten vorhanden.
Der Pullup an A und Pulldown an B ist nur auf der ATtiny Platine vorhanden.
Dachte mir bis jetzt, Mega seitig nicht so wichtig, weil Leitung so kurz ist.
Habe den Pullup/Pulldown Mega seitig nachgerüstet.
Fallende Kurve ist weg. Nur noch im "Grundrauschen" ist das Gezappel zu sehen.
Nicht perfekt, aber wesentlich besser. Seltsamerweise sieht man das Sendesignal nicht im Empfangssignal. Jedoch sieht man das vor der Startkennung 244 ein zusätlich Byte gesendet wird. Und das Sendesignal hat die Polarität geändert. Warum ist mir immer noch schleierhaft.
Die Fragezeichen in der grünen Decodierzeile erscheinen wenn der Dekoder meint er hätte keinen Platz zur Darstellung.
Im später eingeblendeten Fenster sieht man das er alles dekodieren kann.
Das was ich auf dem Oszi sehe, spiegelt sich im seriellen Monitor 1:1 wieder.
Jetzt weiß ich nicht was passiert ist bzw. was ich verstellt habe, ich bekomme auf dem Oszi kein Signal mehr angezeigt. Ab hier bin ich erstmal blind für heute.
Dann habe ich ATtiny seitig im Code vor der uart Initialisierung ein löschen des Ringbuffers eingefügt. Da ich diesen Ringbuffer vorm uart init für was anderes verwende. Sollte keine Rolle spielen, da Head und Tail beim init beide gleich auf 0 gesetzt werden. War natürlich ohne Erfolg. Hatten mir schon combie und Wandhall vor längerer Zeit gesagt das es überflüssig wäre.
Dann habe ich Mega seitig den Pullup/Pulldown von A/B wieder entfernt und bekomme gültige Werte "erstmal" übermittelt.
Es wird jedoch trotz
int c = Serial1.read()
im Fehlerfall immer eine 0 als eingelesen angezeigt. Was nicht sein kann, weil vorher mit
if (Serial1.available() > 0)
überprüft wird, dass heißt die 0 dürfte gar nicht gültig werden.
Wenn ich morgen wieder mit dem Oszi etwas sehe, dann weiß ich mehr ... hoffentlich.
bool read_Serial_1()
{
static byte index = 0;
static bool state_Read = false;
static bool state_Complete = false;
//static int c = 0;
if (Serial1.available() > 0) {
int c = Serial1.read();
Serial.print("read"); Serial.print('\t'); // Debug
Serial.print(state_Read); Serial.print('\t'); // Debug
Serial.print(state_Complete); Serial.print('\t'); // Debug
Serial.print(index); Serial.print('\t'); // Debug
Serial.println(c); // Debug
c = (byte) c; // ggf. casten
if (c == ENT && index > (sizeof(Nachricht)-1) ) { // Ende-Kennung ?
Serial.println("read Ende");
state_Read = false;
state_Complete = true;
}
if (state_Read == true && (index < sizeof(Nachricht))) {
empfDaten.asArray[index++] = c;
}
if (c == SNT && state_Read == false) { // Start-Kennung ?
state_Read = true;
}
if (state_Complete == true) { // Übertragung fertig ?
index = 0;
// Checksumme korrekt ?
if ( empfDaten.checksumme == calc_Checksumme(empfDaten.asArray, sizeof(Nachricht)) ) {
state_Complete = false;
return true;
}
}
}
return false;
}
void read_Serial_1_to_Serial_0 ()
{
if ( read_Serial_1() == true) { // wird nie ausgeführt
Serial.println(F("Serial.1 hat empfangen:"));
Serial.print(empfDaten.adresse); Serial.print('\t');
Serial.print(empfDaten.funktion); Serial.print('\t');
Serial.print(empfDaten.wert); Serial.print('\t');
Serial.println(empfDaten.checksumme);
Serial.println("komplett");
Serial.println();
}
}
Nur warum jetzt die falsch eingelese 0 (wo immer die auch herkommt) als > 0 gültig durch kommt ist mir dann doch für heute zu viel des Guten.
read 0 0 0 0
read 0 0 0 244
read 1 0 0 78
read 1 0 1 179
read 1 0 2 61
read 1 0 3 62
read 1 0 4 0
read Ende
Serial.1 hat empfangen:
78 179 61 62
komplett
read 0 0 0 0
read 0 0 0 244
read 1 0 0 78
read 1 0 1 179
read 1 0 2 62
read 1 0 3 63
read 1 0 4 0
read Ende
Serial.1 hat empfangen:
78 179 62 63
komplett
read 0 0 0 0
read 0 0 0 244
read 1 0 0 78
read 1 0 1 179
read 1 0 2 63
read 1 0 3 64
read 1 0 4 0
read Ende
Serial.1 hat empfangen:
78 179 63 64
komplett
read 0 0 0 0
read 0 0 0 244
read 1 0 0 78
read 1 0 1 179
read 1 0 2 64
read 1 0 3 65
read 1 0 4 0
read Ende
Serial.1 hat empfangen:
78 179 64 65
komplett