[F] ATMega8, SPI

Gast #1474138
Die unten stehende Funktion stammt aus dem ATMega8-Datenblatt. Um die 
Zeit zu nutzen die zwischen dem Schreiben in das Register SPDR und der 
vollständigen Aussendung des Bytes vergeht, habe ich die beiden 
Anweisungen vertauscht. Nur jetzt funktioniert die Routine nicht mehr 
korrekt (Daten werden verstümmelt). Meine Frage: warum kann ich die 
Anweisungen nicht vertauschen?

void SPI_MasterTransmit(char cData)
{
 SPDR = cData ;  /* Start transmission */
 while(!(SPSR & (1<<SPIF)))  /* Wait for transmission complete */
  ;
}
Gast #1474196
>Nur jetzt funktioniert die Routine nicht mehr
>korrekt (Daten werden verstümmelt).

Wie werden sie verstümmelt?

>Meine Frage: warum kann ich die
>Anweisungen nicht vertauschen?

Du kannst schon. Allerdings könnte dein Programm dann
stehen bleiben, da SPIF nie gesetzt wird ohne etwas
in SPDR zu schreiben. Die andere Reihenfolge benötigt
also mindestens sowas wie einen Dummy Write z.B. in
der SPI-Init.
Gast #1474205
Danke für deine Antwort.

> Wie werden sie verstümmelt?

Beim Löschen eines Displays werden falsche Farben gesetzt. Tausche ich 
die Anweisungen wieder zurück funktioniert es.
Gast #1475750
Zitat:

Beim Löschen eines Displays werden falsche Farben gesetzt. Tausche ich
die Anweisungen wieder zurück funktioniert es.

Glaskugel:

Nächster Befehl früher, als die Ausführungszeit des Löschbefehls 
zulässt. Funktioniert zufällig noch mit der langsameren Version.
Gast #1475870
Liebe Glaskugel, du hast wahrscheinlich recht. Im Datenblatt 
(HM17CM4096) stehen zwar keine konkreten Wartezeiten, aber hier und da 
haben die chinesischen Kollegen das Wort "wait" eingestreut. Werde mich 
also peu à peu an die Wartezeiten herantasten.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.