mikrocontroller.net

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


Autor: Michael Klose (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.