mikrocontroller.net

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


Autor: Mario M. (mariom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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-Tutori...

>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

Autor: Mario M. (mariom)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario M. (mariom)
Datum:

Bewertung
0 lesenswert
nicht 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:

  SPDR = command;
  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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.