mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega: SPI, while-Schleife und Rechenzeit


Autor: Andreas H. (heilinger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich benutze einen ATmega 644P und habe eine Frage zum Senden von Daten 
per SPI-Schnittstelle:

Und zwar sieht mein Code momentan so aus, dass ich ein Byte sende:

SPDR = cData;

und dann abwarte, bis das Byte übertragen wurde:

while(!(SPSR & (1<<SPIF)))
  ;

So ist es auch im Datenblatt als Beispiel geschrieben.

Jetzt hänge ich aber natürlich in der while-Schleife solange fest, bis 
das Byte übertragen wurde, ohne dass ich was anderes machen kann. Wäre 
es denn nicht sinnvoller die beiden Zeilen einfach umzudrehen:

while(!(SPSR & (1<<SPIF)))
  ;

SPDR = cData;

So kann ich direkt nach dem Senden weitere Rechnungen durchführen und 
falls es doch passieren sollte, dass ich ein weiteres Byte verschicken 
will, obwohl die aktuelle Sendung noch läuft, dann würde ich vor dem 
nächsten Senden in der while-Schleife hängen?

Also ist es für die Rechenzeit nicht besser die 2. Variante zu nehmen? 
Oder was wäre da der Nachteil?

Gruß

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist...

Das SPIF ist i.d.R. gelöscht und wird, falls gesetzt, beim lesen des 
SPSR zurückgesetzt.
Du hängst also in einer Endlosschleife.
Manuell setzen geht nicht.

Autor: Kurt Harders (Firma: KHTronik) (kurtharders)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Heil schrieb:
> while(!(SPSR & (1<<SPIF)))
>   ;

Du kannst in der while-Schleife beliebige andere erledigen :-). Oder Du 
steuerst den Versand der Daten per Interrupt.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Andreas Heil (heilinger)

>will, obwohl die aktuelle Sendung noch läuft, dann würde ich vor dem
>nächsten Senden in der while-Schleife hängen?

Ja.

>Also ist es für die Rechenzeit nicht besser die 2. Variante zu nehmen?

Ja.

>Oder was wäre da der Nachteil?

Keiner. Mann muss nur wissen, dass der AVR nen kleinen Bug hat. Nach dem 
Reset müsste das Bit gesetzt sein, weil die Übertragung ja nicht läuft 
bzw. abgeschlossen ist. Ist es aber nicht.

Abhilfe? Einfach am Programmanfang ein beliebiges Byte senden, ohne 
vorher das Statusbit abzufragen.

MFG
Falk

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Heil schrieb:
> Und zwar sieht mein Code momentan so aus, dass ich ein Byte sende:
>
> SPDR = cData;
>
> und dann abwarte, bis das Byte übertragen wurde:
>
> while(!(SPSR & (1<<SPIF)))
>   ;

und warum tauscht du es nicht?

Autor: Andreas H. (heilinger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> und warum tauscht du es nicht?

das war ja meine Frage. Will ja nicht einfach was machen, was evtl. 
Konsequezen hätte, was ich nicht direkt erkenne und wie es aussieht

Falk Brunner schrieb:
> Keiner. Mann muss nur wissen, dass der AVR nen kleinen Bug hat. Nach dem
> Reset müsste das Bit gesetzt sein, weil die Übertragung ja nicht läuft
> bzw. abgeschlossen ist. Ist es aber nicht.
>
> Abhilfe? Einfach am Programmanfang ein beliebiges Byte senden, ohne
> vorher das Statusbit abzufragen.

ist mein Gedanke nicht ganz unbegründet gewesen. Daher werde ich die 
beiden Zeilen nun tauschen und beim Ersten Senden die while-Schleife 
weglassen (so kann es mir egal sein, ob das Bit gesetzt ist oder nicht).

Ich denke so habe ich die Antworten jetzt richtig interpretiert...

Autor: Tek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier:
http://www.mikrocontroller.net/articles/Serial_Per...
findet man den weiterführenden Link zu
http://www.matuschek.net/atmega-spi/

da gehts auch darum.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Regel muß man nach dem Senden das /SS des Slave wieder 
hochziehen.
Also muß man warten.

Aber rechne erstmal aus wie lange ein Byte dauert. Und dann betrachte, 
ob das wirklich zulange ist.


Peter

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.