Forum: Compiler & IDEs AVR Studio - Simulator - Statusregister automatisch setzen


von Mario M. (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Mario M. (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Mario M. (Gast)


Lesenswert?

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