www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu USART in SPI


Autor: joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich benutze von nem ATMEGA48 die USART im SPI Betrieb.
Nun möchte ich gern die folgende Abfolge durchführen.:

-Einen Bestimmten Pin runterziehen (CS)
-Daten in den Sendepuffer laden
-Warten bis die Daten gesendet wurden
-Einen Bestimmten Pin hochziehen (CS)

Mein Problem ist die Warteschleife, die warten soll bis die Daten den 
Controller verlassen haben. Ich habe es mit dem TXC0 Flag im UCSR0A 
Register probiert. Leider hat das nicht funktioniert.

whle (!(UCSR0A &(1<<TXC0)));

Gibt es evtl. ne andere Möglichkeit? Ich möchte halt von einem Baustein 
Chip Select runterziehen, Daten senden und danch CS wieder hochziehen.


Vielen Dank.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm das UDRE0-Flag.

Autor: joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nimm das UDRE0-Flag.

Das Geht auch nicht, weil dieses Flag ist dann gesetzt, wenn die Daten 
aus dem UDR0 Buffer in das Schieberegister geladen wurden. Das heisst 
aber nicht, dass die Daten schon gesendet worden sind.

Autor: sechs ueber drei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls die Moeglichkeit besteht, den SPI auf den maximalen speed laufen 
zu lassen, dh das Zieldevice das auch so kann, kann man die 8 
clockzyklen pollen bis das Byte draussen ist. Der Overhead ist geringer.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm, ich versteh jetzt nicht ganz, warum das mit dem TXC0 nicht 
funktionieren soll. Da scheint noch was Anderes schief zu laufen. Wenn 
in Deinem Programm nicht auch "whle" steht, sondern "while", dann sollte 
es klappen.

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm das Receive Flag ( keine Ahnug wie das bei den Atmels heißt) , nach 
dem Übertragen des Bytes ist immer auch ein Byte im RX buffer.

Autor: joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man muss nach
while (!(UCSR0A &(1<<TXC0)));
das TXC0 Flag einmal setzen um den Mechanismus neu vorzubereiten.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
joe wrote:
> Man muss nach
> while (!(UCSR0A &(1<<TXC0)));
> das TXC0 Flag einmal setzen um den Mechanismus neu vorzubereiten.
Aaah, Du hast das Flag gar nicht wieder gelöscht? Na, dann ist natürlich 
alles klar...

Autor: joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja mein Fehler.

die Tatsache, dass man ein Flag löscht, indem man es setzt is ja acuh 
erstmal komisch.

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.