Hallo zusammen,
ich habe eine selbstentwickelte Alarmanlage die ich über meine
Hausautomatisierung per USB alle paar Sekunden abfrage. Der Status wird
mir mit einer 16stelligen Hex beantwortet z.B. "0000000000050207".
Ändert sich ein Reed-Kontakt bekomme ich z.B. "0100800000050286".
Zum Verständniss es sind immer 2er Pakete, siehe haa_bus.h ab Zeile 23:
Erstes Paar 01 = Bit 1 von Byte 1 ist auf true
Zweites Paar 00 = alle Bits von Byte 2 sind auf false
drittes Paar 80 = letztes Bit von Byte 3 ist auf true
usw.
In den Fall sehe ich über die 01, dass es einen "Kontaktalarm" gibt und
über die 80, welcher Kontakt es ist. Hier INP7, ist der 7te
Reed-Kontakt. Jetzt ist es so, dass die Anlage ohne erkennbaren Grund
zwischendruch den Datensatz "0000800000050287" übermittelt, obwohl sich
in der Hardware nichts geändert hat. Ich bin mir sehr sicher, dass es an
der Übermittlung des Datensatzes liegt und nicht an der Hardware, das
begründe ich auch.
1. Das Erste HEX-Paar bleibt unverändert. Wenn ich die 7ten Reed-Kontakt
per Hand ändere (also öffne) übermittelt mir die Anlage
"0100800000050286", also mit 01 als erstes HEX-Paar, in den Fall aber
nicht.
2. Wenn die Anlage scharf ist und dieser Kontakt wird geöffnet, geht der
Alarm los. In den Fall passiert aber nichts weiter.
3. Im Code habe ich eine einzige Stelle an den ich den Bit manipuliere,
siehe main.c Zeile 283
1 | _inputs[7] = In_7_offen() ? true : false; //Auswertung, If-Kurzschreibweise
|
Wenn ich die Zeile immer mit Null beschreibe, taucht dieser Fehler
trotzdem auf
Ich hab verschiedene Baudraten versucht, 9600, 4800,19200, um zu sehen
ob es ein Übertragungsfehler sein könnte. Selbes Ergebniss, selber
fehlerhafte Datensatz.
In der Funktion
1 | void IN0_byte_schreiben (bool *input) //Zustände der Kontakte
|
2 | {
|
3 | /* int wert = 0;
|
4 |
|
5 | for (int i=1; i <=128; i *= 2)
|
6 | {
|
7 | wert += *input *i; //Wertigkeit berechnen und dazu addieren
|
8 | *input++;
|
9 | }
|
10 |
|
11 | IN0 = wert; //Wert übertragen
|
12 | */
|
13 | input[7] = 0 ;
|
14 | IN0 = (input[7] << 7) | (input[6] << 6) | (input[5]<< 5) | (input[4] << 4) | (input[3] << 3) | (input[2] << 2) | (input[1] << 1) | (input[0] << 0);
|
15 |
|
16 | }
|
wo die Bits an die "richtig" Positionen geschoben werden, siehe
haa_bus.c, Zeile 42, habe ich die Zeile
damit taucht der Fehler nicht mehr auf. Also muss er in der
Verarbeitungsreihenfolge zwischen
1 | _inputs[7] = In_7_offen() ? true : false; //Auswertung, If-Kurzschreibweise
|
und
1 | IN0 = (input[7] << 7) | (input[6] << 6) | (input[5]<< 5) | (input[4] << 4) | (input[3] << 3) | (input[2] << 2) | (input[1] << 1) | (input[0] << 0);
|
liegen. Ich finde ihn aber nicht.
Ihr seit doch ziemlich gut in versteckte Fehler finden, könnt Ihr da
weiterhelfen ?
Gruss