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
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
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
Hallo, die Register, speziell SREG, sichert der avr-gcc in der ISR auch? Gruß aus Berlin Michael
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.