Forum: Mikrocontroller und Digitale Elektronik Ich finde den fehler nicht...


von Sebastian Voitzsch (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche, eine 2-wire-Schnittstelle durch einen ATmega8 zu
schleifen, um die Kommunikation zu verändern (ist ein Blitzprotokoll
eines Systemblitzgerätes).

Die Kommunikation läuft wie folgt: clock wird immer von der Kamera
vorgegeben und hängt auf INT1. Nach einem Clock-Puls von 9us werden
Daten vom Blitz byteweise gelesen, der Takt wird vom Master (Kamera)
erzeugt. Zum Schreiben von Daten an den BLitz wird Clock für 17us auf
high gesetzt, danach schickt die Kamera Daten und Takt an den Blitz.

Der angehängte Code soll diese Kommunikation erstmal nur transparent
durchleiten. F_CPU sind 8 MHz, der Timer0 läuft mit clkio/8, also 1 MHz
und zählt daher in 0,1us-Schritten. Int1 wird bei jeder Änderung am Pin
aufgerufen, sofern INT1 auf high gesetzt wurde, wird der Timer
zurückgesetzt und die Taktleitung durchgeschleift. Wurde INT1 auf low
gesetzt, wird über den Timerwert bestimmt, ob gelesen oder geschrieben
werden soll und die Portpins entsprechend geändert (DDR). Die
Datenleitung wird permannent in der Hauptschleife auf Änderungen
überwacht und entsprechend auf den Ausgang durchgeschleift. INT0 ist
derzeit deaktiviert, die Handler-Routine ist nur ein Dummy.

Mein Problem: das Lesen der Daten vom BLitz funktioniert, die Kamera
erkennt ihn. Aber ich kann keine Daten zuverlässig an den Blitz
schreiben, nach ein paar Bits (manchmal auch einem kompletten
Datensatz) stirbt die Kommunikation. Clock läuft weiter, aber die
Datenleitung bleibt auf low. Und ich komme einfach nicht darauf, woran
es hängt! Das Ärgerlichste: es hat schon funktioniert, ich wollte
Anpassungen vornehmen. Und jetzt komme ich nicht mehr zurück.

Achso: der Stack wird vom avr-gcc automatisch initialisiert, deswegen
habe ich´s mir im File geschenkt. Daran liegt´s also nicht...

Hat jemand mehr Abstand als ich und entdeckt evtl. den Fehler?

Danke,
Sebastian

von Michael U. (Gast)


Lesenswert?

Hallo,

Du schreibst:
F_CPU sind 8 MHz, der Timer0 läuft mit clkio/8, also 1 MHz
und zählt daher in 0,1us-Schritten

1MHz sind 1µs-Schritte, 0,1µs wären 10Mhz Takt...

Gruß aus Berlin
Michael

von Sebastian Voitzsch (Gast)


Lesenswert?

Hallo Michael,

Du hast natürlich recht. Es sind auch nicht 9 und 17 us, sondern 90 und
170us... Aber die Werte im Programm sind passend.

Sebastian

von Michael U. (Gast)


Lesenswert?

Hallo,

die Register, speziell SREG, sichert der avr-gcc in der ISR auch?

Gruß aus Berlin
Michael

von A.K. (Gast)


Lesenswert?

GCC schon, nur muss man dem eine Chance geben. Hier ist das Programm
direkt in Assembler geschrieben, da ist der Programmierer für sowas
zuständig. Und das ist nicht erfolgt, folglich wird beim Interrupt SREG
gesemmelt.

von Sebastian Voitzsch (Gast)


Lesenswert?

Hallo,

danke für den Hinweis, das macht er natürlich nicht. Da ich nicht viele
Register benötige, hatte ich für die Interrupts ein eigenes vorgesehen
(temp_i). Aber SREG hatte ich natürlich vergessen... Dann geht´s.

Nun muß ich nur noch herausfinden, warum es mit einer Kamera geht, mit
einer anderen jedoch in Richtung Blitz einige Bits verloren gehen
(scheinbar zufällig, habe noch keine Regelmäßigkeit ausmachen können).

Danke,
Sebastian

von Sebastian Voitzsch (Gast)


Lesenswert?

Hallo nochmal,

ich hab´s gefunden: der interne Pullup des ATmega war der neuen Kamera
zu schwach. Mit externen 10k funktioniert´s mit beiden Kameras.

Gute Nacht,
Sebastian

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.