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 */ ; }
>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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.