Forum: Mikrocontroller und Digitale Elektronik C-Programm auf XC866 'verzählt' sich


von Michael Klose (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.