mikrocontroller.net

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


Autor: Sebastian Voitzsch (Gast)
Datum:
Angehängte Dateien:

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

Autor: Michael U. (Gast)
Datum:

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

Autor: Sebastian Voitzsch (Gast)
Datum:

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

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß aus Berlin
Michael

Autor: A.K. (Gast)
Datum:

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

Autor: Sebastian Voitzsch (Gast)
Datum:

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

Autor: Sebastian Voitzsch (Gast)
Datum:

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

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.