16 bit Vergleich bei while

Gast #182541
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...
Gast #182542
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.
Gast #182543
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()
Gast #182544
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
Gast #182545
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...
Gast #182546
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
Gast #182547
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.