Gast
#404778
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