Ich hab mich jetzt endlich durchgerungen, meine AVR-Basteleien in Assembler zu programmieren, da mein LCD mit C einfach keinen Mucks von sich geben wollte. Bin jetzt auch erstaunlich weit gekommen und mein LCD zeigt jetzt diese Zeilen auf den 16x4 Zeichen an: 59: string1: 60: .db "Auf dieses LCD",0 61: string2: 62: .db "passt eine Menge",0 63: string3: 64: .db "nichtssagender",0 65:string4: 66: .db "Text!",0 Wie man sieht, habe ich per ASM-Direktive die anzuzeigenden Strings in den Programmspeicher gepackt. Das funktioniert auch wunderbar, nur bekomme ich beim Assemblen eine verwirrende Warnung in den Zeilen 60, 63 u. 65: warning: .cseg .db misalignment - padding zero byte Nunja, mich verwirrt sowohl die Meldung als auch die Zeilen, in denen sie auftaucht. Im Quellcode-Snippet seht ihr ja, welche das sind. Wie gesagt, funktionieren tut es. Seltsamerweise sind im .hex-File nach den String auch zwei 0-Stellen, außer beim letzten. Forensuche hat nichts ergeben, weiß einer von euch was darüber?
Das ist normal. Flash ist wortorientiert, wenn du Bytes definierst, sollte deren Anzahl geradzahlig sein. Ist das nicht der Fall, hängt der Assembler eben eine Null dran und meldet das mit dieser Warnung. ...
Ist ganz einfach: du musst immer eine gerade Anzahl Bytes eintragen. Wenn das nicht so ist, dann wird eines angehängt, und zwar ne 0... Das ganze liegt darin, dass der Programmspeicher Wort-weise aufgebaut ist. dave
Hi Ich vermute mal das der Assembler labels mit Wortaddressen berechnet. Hat das Datenfeld dann eine ungerade Anzahl Bytes wird eben zur nächsten Wortaddresse mit 0-Bytes aufgefüllt. Sollte aber eigentlich nicht nötig sein da der AVR ja auch Byteweise auf seinen Programmspeicher zugreifen kann. Matthias
Mensch ihr seid ja schnell! Danke für die Info. Da fällt mir nämlich ein, dass ich mich beim eingeben des Quellcodes noch fragte, ob meine Strings eine gerade Anzahl an Bytes haben muss, weil ja die Speicheradressen beim Ansprechen im Programm mit 2 multipliziert werden, aufgrund von "Das ist einfach so"(tm). ;)
Beim Datenzugriff mit LPM Befehl ist zwar byteweiser Zugriff auf den Programmspeicher möglich, aber als Programmspeicher und Zugriff mittels PC nur mit 16 Bit Breite. Atmel hat sich bei seinem Assembler für die Organisation Label im .CSEG als Word Adresse entschieden, während IAR auch im .CSEG byte-orientiert arbeitet. Beim Atmel Assembler werden automatisch immer gerade Adressen erzeugt.
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.