www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATXMEGA128A1-AU und C


Autor: Hman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgenden C-Code, den ich compiliert habe und dann mit dem 
Deassembler vom AVR-Studio angezeigt habe.

Ich finde das merkwürdig, was der Compiler da erzeugt und kann nach 
meinem Verständnis eigentlich gar nicht funktionieren:
279:        sbi(SPIF_CTRL, SPI_MASTER_bm);
+0000058C:   91800BC0    LDS       R24,0x0BC0     Load direct from data space
+0000058E:   93800BC0    STS       0x0BC0,R24     Store direct to data space
281:        cbi(SPIF_CTRL, SPI_MODE0_bm);
+00000590:   91800BC0    LDS       R24,0x0BC0     Load direct from data space
+00000592:   7E8F        ANDI      R24,0xEF       Logical AND with immediate
+00000593:   93800BC0    STS       0x0BC0,R24     Store direct to data space
282:        cbi(SPIF_CTRL, SPI_MODE1_bm);
+00000595:   91800BC0    LDS       R24,0x0BC0     Load direct from data space
+00000597:   93800BC0    STS       0x0BC0,R24     Store direct to data space
284:        cbi(SPIF_CTRL, SPI_DORD_bm);
+00000599:   91800BC0    LDS       R24,0x0BC0     Load direct from data space
+0000059B:   93800BC0    STS       0x0BC0,R24     Store direct to data space
286:        cbi(SPIF_CTRL, SPI_PRESCALER0_bm);
+0000059D:   91800BC0    LDS       R24,0x0BC0     Load direct from data space
+0000059F:   7F8D        ANDI      R24,0xFD       Logical AND with immediate
+000005A0:   93800BC0    STS       0x0BC0,R24     Store direct to data space
287:        cbi(SPIF_CTRL, SPI_PRESCALER1_bm);
+000005A2:   91800BC0    LDS       R24,0x0BC0     Load direct from data space
+000005A4:   7F8B        ANDI      R24,0xFB       Logical AND with immediate
+000005A5:   93800BC0    STS       0x0BC0,R24     Store direct to data space
288:        sbi(SPIF_CTRL, SPI_CLK2X_bm);
+000005A7:   91800BC0    LDS       R24,0x0BC0     Load direct from data space
+000005A9:   93800BC0    STS       0x0BC0,R24     Store direct to data space
290:        sbi(SPIF_CTRL, SPI_ENABLE_bm);
+000005AB:   91800BC0    LDS       R24,0x0BC0     Load direct from data space
+000005AD:   93800BC0    STS       0x0BC0,R24     Store direct to data space

Und das funktioniert anscheinend auch nicht:
291:        SPIF_CTRL = (1<<SPI_MASTER_bm) | (1<<SPI_CLK2X_bm) | (1<<SPI_ENABLE_bm);
+0000058C:   92100BC0    STS       0x0BC0,R1      Store direct to data space
153:

Aber so geht es:
291:        SPIF_CTRL = 0b11010000;//(1<<SPI_MASTER_bm) | (1<<SPI_CLK2X_bm) | (1<<SPI_ENABLE_bm); 
+0000058C:   ED80        LDI       R24,0xD0       Load immediate
+0000058D:   93800BC0    STS       0x0BC0,R24     Store direct to data space

Ich hab das AVR-Studio Version 4.17 Build 666 und dazu WinAVR 20090313.

Autor: Tobias K. (tobi123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiers mal mit
SPIF_CTRL = SPI_MASTER_bm | SPI_CLK2X_bm | SPI_ENABLE_bm;

Es handelt sich um Bitmasken, die nicht mehr geshiftet werden müssen. Am 
besten du liest "AVR1000: Getting Started Writing C-code for XMEGA". 
Dort ist das genau erklärt.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder Du nutzt statt

Bitmasken (_bm) die Bitpositionen wie gehabt (_bp) und shiftest 
weiterhin:


aus
"SPI_MASTER_bm"
wird
"SPI_MASTER_bp"

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schon angedeutet ist doch völlig klar, warum das nicht funktioniert.

Die Bitmasken sind schon die geshifteten Werte. Wenn du dann ne 1 zum 
Beispiel noch mal um 128 bzw. 0x80 shiftest, dann passt das nicht mehr 
in einen Integer. Das sollte dir der Compiler auch als Warnung ausgeben, 
die du scheinbar ignoriert hast.

Abhilfe, wie schon gesagt, statt _bm Konstanten _bp hinten dranhängen.

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.