www.mikrocontroller.net

Forum: Compiler & IDEs 16 bit Vergleich bei while


Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ein LCD mit einem T6963 Controller über das XMEM Interface an
einen mega8515 angeschlossen.
Die festen Adressen habe so definiert:
#define LCD_COM _SFR_MEM8(32768)
#define LCD_DAT _SFR_MEM8(32768+512)

Gibt es eine bessere Lösung ? Das war zumindest die einzige, die ich in
der Anleitung gefunden habe.
Wenn ich jetzt warte bis das LCD bereit ist, übersetzt mir der Compiler
diese Zeile so:
    while ((LCD_COM&3)!=3);

  26                 .L2:
  27 0000 8091 0080     lds r24,-32768
  28 0004 9927          clr r25
  29 0006 8370          andi r24,lo8(3)
  30 0008 9070          andi r25,hi8(3)
  31 000a 0397          sbiw r24,3
  32 000c C9F7          brne .L2

Wieso verwendet der Compiler 16bit für den Vergleich, wo doch ein Byte
ausreichen würde ? Kann man den Compiler irgendwie dazu bringen,
das so zu übersetzen:
lds r24,-32768
cpi r24, 3
brne .L2
Das wäre nämlich doppelt so schnel...

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ein cast nach char/uint8_t ?

while ( (uint8_t)LCD_COM != 3);

Keine Ahnung, ob das nun wirklich tut - aber man kann es ja mal
probieren ;-):

MfG, Daniel.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das war das erste was ich ausprobiert habe, aber leider ohne Erfolg.
_SFR_MEM8() sollte an sich sowiso schon char sein, es gibt nämlich auch
_SFR_MEM16()

Autor: Volkmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Thema wurde hier schon öfter diskutiert, habe es jetzt nicht parat,
aber über die Suche müßtest Du was finden.

Ansonsten würde ich den cast noch der '3' hinzufügen, schließlich
wird diese Zahl ja als integer angesehen.

Im übrigen ist Dein Wunschergebnis nicht kompatibel zu Deiner
ursprünglichen Abfrage, Du hast die UND-Verknüpfung nicht
berücksichtigt.

Volkmar

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, mit der UND Verknüpfung ist es eine Zeile mehr, aber immer noch
deutlich weniger als das was der Compiler liefert.

Unter welchem Stichwort wurde das Thema diskutiert ?
Meine Suche war leider ergebnislos, da ich keine Ahnung habe wonach ich
bei sowas eigentlich suchen muss...

Autor: Yagan Z. Dongobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benedikt,

wenn ich Dich richtig verstanden habe, benutzt Du 'memory-mapped
I/O'
für das LCD (also wie externe RAM-Speicheradressen)
Dann müssten folgende Definitionen gehen:
#define LCD_COM ((volatile char *)(0x8000))
#define LCD_DAT ((volatile char *)(0x8200))

Anschliessend mit

while ((*LCD_COM & 3)!= 3);

oder

*LCD_DAT = 'A';

benutzen.

Ciao, Yagan

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit den Pointer funktioniert zwar, das Ergebnis ist aber genau
dasselbe.

In der GCC Anleitung steht, dass &, |, ~ usw. intern als int
verarbeitet werden, und man daher nachher mit (char) casten soll, aber
leider ändert sich dadurch nichts am Ergebnis...

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.