Hallihallo zusammen, ich nutze den GCC-Compiler in der AVR Studio Umgebung. Zum Debuggen nutze ich den AVR Studio Simulator. Aktuelles Beispiel: Ich arbeite mit der SPI-Schnittstelle. Dabei müssen zum Teil viele Bytes hintereinander geschickt werden. Das Problem ist nur, dass ich den Simulator nicht durchlaufen lassen kann... Denn bei der Statusabfrage "Wurde das Byte korrekt auf das SPI geschickt" (Abfrage des SPIF-Bits in SPSR) bleibt der Simulator stecken - ich muss nämlich das Statusbit jedes mal von Hand setzen, damit es weitergeht... Wie löst man dieses Problem? Einfach die Abfrage-Zeile aus dem Code entfernen ist etwas holzig... Kann man nicht dem Sim sagen, er soll diese Zeile einfach überspringen? Oder er soll doch gleich das SPIF-Bit selbst setzen... Wie macht man das, damit der Sim auch durchlaufen kann? Ich möchte nicht hunderte Male ein Bit setzen, nur um zu sehen, obs läuft.... :) Gruss Mario
@ Mario M. (mariom) >Das Problem ist nur, dass ich den Simulator nicht durchlaufen lassen >kann... >Denn bei der Statusabfrage "Wurde das Byte korrekt auf das SPI >geschickt" (Abfrage des SPIF-Bits in SPSR) bleibt der Simulator stecken >- ich muss nämlich das Statusbit jedes mal von Hand setzen, damit es >weitergeht... Nein. Aber es gibt eien kleinen Bug im Simulator, das ist wahr. Siehe http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister#Bekannte_Probleme >Wie macht man das, damit der Sim auch durchlaufen kann? Ich möchte nicht >hunderte Male ein Bit setzen, nur um zu sehen, obs läuft.... :) Breakpoint setzen? MFG Falk
Ja wie Breakpoint setzen... der nützt mir ja nix... der Sim schickt mir jeweils nur ein Byte aufs mal an das SPI, dann muss ich von Hand das Statusbit setzen, damit das nächste Byte gesendet werden kann usw. Ich muss aber hunderte Bytes ans SPI schicken... Die Prüfung, ob das Byte gesendet wurde, ist sozusagen ein "unfreiwilliger" Breakpoint, den ich wegkriegen möchte. Jetzt hier beim SPI ist es nur ein Beispiel, es gibt noch andere Beispiele, wo Statusregister-Prüfungen (bei mir) einen unfreiwilligen Breakpoint darstellen...
@ Mario M. (mariom) >Ja wie Breakpoint setzen... der nützt mir ja nix... der Sim schickt mir >jeweils nur ein Byte aufs mal an das SPI, dann muss ich von Hand das >Statusbit setzen, damit das nächste Byte gesendet werden kann usw. Nein, AVR Studio simuliert das SPI-Modul fehlerfrei, wenn du die Hinweise im Link berücksichtigst. Dann kannst du auch tonnenweise Daten über SPI schicken. Ohne unfreiwillige Breakpoints. >Jetzt hier beim SPI ist es nur ein Beispiel, es gibt noch andere >Beispiele, wo Statusregister-Prüfungen (bei mir) einen unfreiwilligen >Breakpoint darstellen... Welche? Hast du auch im Simulator den gleichen Prozessor eingestellt, für den du auch die Include-Files verwendet hast? Da bin ich auch schonmal gestolpert . . . :-) MFG Falk
Welche Hinweise im Link meinst du? Double Speed Modus brauche ich nicht und ist nicht eingeschaltet. Dass ich das SPIF-Bit selbst setzen kann hab ich auch schon gemerkt. Ebenfalls ist die richtige MCU eingestellt. Hier die kritische Zeile:
1 | SPDR = command; |
2 | while ( (SPSR & 0x80) != 0x80 ); //warten bis fertig übertragen |
Der Mega88 ist Master und SPI läuft mit 2MHz. Zuerst wird das Byte "command" geschickt. Dann wird eine Schleife durchlaufen, bis das SPIF_Bit in SPSR 1 wird, was bedeutet, dass alles übertragen wurde. Lasse ich dies nun im Sim laufen (schrittweise Abarbeitung) und schaue mir das Register SPSR an, dann bleibt der Pfeil bei der while-Zeile stehen, da das Bit SPIF vom Simulator nicht gesetzt wird. In der realen Hardware tut alles wie es soll. Ich mag mich erinnern, dass ich bei der Simulation der UART auch schon dieses Phänomen hatte. Edit: Aaaah.... jeeetzt komm ich draus... Bei der Schrittweisen Abarbeitung muss man einfach ein paar mal auf den Knopf für den nächsten Schritt drücken... Nach 8 mal drücken wird das SPIF dann gesetzt.... Sowas dummes aber auch... :) Als ich ihn laufenliess ist mir einfach nicht aufgefallen, dass er schon weitergemacht hatte, da er viel zu senden hat und der Pfeil durch Zufall dann wieder an der selben Stelle stand... grmpf :) Gruss und Danke Mario
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.