Hallo zusammen, ich habe ein komplexeres Problem. Ich habe einen Microcontroller vom Typ XC866. Diesem möchte ich von einem Rechner mit W2k über eine 8-Bit-Verbindung insgesamt 5 Byte übermitteln. Der Rechner verfügt dazu über eine GPIB-Interfacekarte. Vor dem Controller hängt eine Karte, die aus dem GPIB-Signal insgesamt 64 Signale macht, die einzeln an verschiedenen Pins abgreifbar sind. Sprich, wenn ich im Programm sage, setze das Bit 2 in Byte 5 der GPIB-Nachricht wird ein Pin der 64 auf high gezogen. Also habe ich an 8 der Pins meinen Controller gehängt. Ein 9. Bit nehme ich her, um dem Controller zu signalisieren, wann 8 Bit anliegen, damit er diese in Variablen zwischenspeichern kann. Der Controller reagiert auf eine steigende Flanke auf der 9. Leitung mit einem Interrupt (ISR siehe Anhang, Datei int.c, Funktion TriggerISR() ). In dem Programm steht P3_DATA für den 8-Bit-Eingang, an dem die 8 Leitungen für die Werte verbunden sind, P0.0 bis P0.2 sind mit Dioden (high-aktiv) verbunden, damit ich mir anzeigen lassen kann, wo im Programm ich mich gerade befinde (debuggen geht leider nicht). Für die folgende Frage muss man sich glaube ich den Code mal angeschaut haben. Mein Problem in Worten: Wenn ich eine Byte-Kombination übergebe, die in den if-else-Blöcken der ISR abgefragt wird läuft alles wunderbar. Wenn aber das erste Byte nicht im if-else-Block Dioden einschaltet, läuft das Programm beim zweiten Byte neben dem case 1 auch noch in den case 2 rein und das ganze Programm läuft falsch! In Zahlen: 1. Byte = 1 2. Byte = 0 3. Byte = 13 4. Byte = 0 5. Byte = 2 --> alles passt 1. Byte = 2 2. Byte = 0 alle anderen Bytes sind egal --> wenn ich das zweite Byte übertragen habe gehen kurz die Dioden für die 3 an, gleich anschließend sehe ich die 1 (obwohl das 3. Byte noch NICHT übertrage wurde). 1. Byte = 1 2. Byte = 13 3. Byte = 0 4. Byte = 0 5. Byte = 2 --> alles passt! Hoffentlich hat das jetzt jemand verstanden... Wenn nicht fragt bitte nach, dann versuche ich es anders zu erklären. Was ich schon zur Problemlösung versucht habe: 1. statt dem counter++ am Ende in jedem case den counter auf die nächste Stufe zu setzen 2. mit return aus der Funktion aussteigen, wenn er in den beiden if-Zweigen nicht erfolgreich war 3. den switch in 5 If-Abfragen umzuschreiben 4. statt den if-else-Blöcken jeweils einen switch mit default-Zweig 5. anderen Interrupt-Kanal zu verwenden Leider haben aber alle diese Ansätze nicht zum Erfolg geführt. Ich hoffe mal, jemand kann mir helfen, ich bin echt schon am verzweifeln und weiß nicht mehr, wie ich noch weiter kommen soll. Danke schonmal im voraus fürs lesen meines elendslangen Threads und viele Grüße
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.