Hallo! Ich weiß nicht ob das hier die richtige News Group für die Frage ist, aber ich probiere es mal. Wenn ich auf das DDRA Register zugreifen, dann ändert der Präprozessor die Adresse des DDRA Registers (0x1A) auf folgendes: 0x1a+0x20. Wenn maan die Dokumentation des ATmega 16 ansieht, ist dieses auch klar, da im Data Adress Space das Register File vor den I/O Registern kommt und die genau bis 0x20 gehen. Im daraus erzeugten Assembler steht dann aber wieder 58-0x20. Der Wert wird also wieder abgezogen. Wenn man sich dann ein Dissassemble vom Objekt Code ansieht, danns teht da wieder 0x1a. Jetzt meine Frage: Wieso das ganze Gehampel? Vielen Dank schonmal für eure Tips! ;-) Viele Grüße Bastian
Weil der Compiler in absoluten Adressen rechnet, der Assembler für die Adressen in I/O-Befehle jedoch einen eigenen um 0x20 verschobenen Adressraum verwendet.
Um noch ein wenig weiter auszuholen: Generell kann man auf alle IO-Register mit Speicherzugriffen arbeiten (memory-mapped IO), nur auf einen Teil davon mit IN- und OUT-Befehlen und wiederum auf einen noch kleineren Teil davon mit SBI- und CBI-Befehlen (und das auch nur, wenn die Veränderung nur ein einzelnes Bit betrifft, dessen Position zur Compilezeit bekannt ist). Daher ist der Ansatz, über die Speicheradresse zu gehen, erstmal der generische. Der Rest wird dann über die Optimierung des Compilers erledigt, falls er merkt, dass er eine effektivere Zugriffsmethode anwenden kann (und dann weiß er auch, dass er die 0x20 abziehen kann). Klar, man hätte gleich alle IO-Register direkt mit ihren Speicheradressen in den Headerdateien angeben können (_SFR_MEM8 statt _SFR_IO8), aber gerade für die älteren AVRs war die Sichtweise nach Portadressen gängiger, durch die Verwendung eines eigenen Makros dafür war es daher günstiger, die Datenblattangaben auf die Headerdateien abzubilden.
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.