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...
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.
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()
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
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...
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.