Forum: Mikrocontroller und Digitale Elektronik [F] ATMega8, SPI


von Martin (Gast)


Lesenswert?

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 */
  ;
}

von holger (Gast)


Lesenswert?

>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.

von Martin (Gast)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

Hängt da noch was an SPI dran?

von Martin (Gast)


Lesenswert?

An der SPI hängt nur das Display

von ich (Gast)


Lesenswert?

Wird deine Funktion innerhalb einer Interuptroutine aufgerufen?

von Klaus2m5 (Gast)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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.

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
Noch kein Account? Hier anmelden.