Hallo,
ich programmiere grad einen atmege8 (assembler) und wollte wissen ob ich
die Pins vordefinieren bzw. den Bits in Registern Namen geben kann, da
ich zum Ansteuern ein Statusregistern angelegt habe und die Pin belegung
sicher noch einige male ändern werde.
Es geht mir nur darum, dass ich nicht immer die Bits abzählen muss bzw.
den ganzen Quellcode ändern muss nur weil ich die Belegung am Controller
ändere.
z.B. wie bei "SBI ADCSRA, ADCS" nur eben für eines der Register r16 bis
r31
somit könnte ich bei einer Änderung der Belegung mit nur einer Änderung
im Quellcode da weitermachen wo ich aufgehört habe.
Außerdem wäre dann der Code um einiges übersichtlicher wenn direkt beim
Bits setzen/löschen klar ist welche Funktion betroffen ist.
also -> SBI state, funktion1 (das wäre optimal)
hoffe mir kann da einer weiterhelfen.
MfG Hannes
hm, das ändert nur den namen von DDRD oder?
würde ja gern ein register haben mit dem namen STATE und dann die bits
als FUNKT1, ANZ1, ANZ2, ...
dann kann ich die immer wieder hin und her schieben und würde nur die
vordefinierte bitposition in STATE ändern und das register ausgeben und
fertig
>würde ja gern ein register haben mit dem namen STATE und dann die bits>als FUNKT1, ANZ1, ANZ2, ...
.def STATE = r16
.equ FUNKT1 = 0
.equ ANZ1 = 1
.equ ANZ2 = 2
sbi STATE, FUNKT1 = sbi r16, 0
Hi
>ich würde aber dann gern statt "sbi temp, 0b01000000" das bits mit namen>versehn und "sbi temp, funkt1" schreiben.
"sbi temp, 0b01000000" ist schon mal falsch. Im Gegensatz zu 'sbr'
braucht 'sbi' die Bitnummer (0..7).
.equ funkt1 = 6 vor dein Programm geschrieben löst dein Problem.
MfG Spess
>> .equ LCD_DDR = DDRD> hm, das ändert nur den namen von DDRD oder?
Nein.
Das vereinbart zuallerst mit dem Assembler, das er überall wo er den
Text LCD_DDR vorfindet, dieses LCD_DDR durch den Text DDRD ersetzen
soll. Wenn du lustig bist, könntest du auch
.equ LCD_DDR hotzenplotz
vereinbaren.
Dann würde ein
out LCD_DDR, 0xFF
vom Assembler per Textersetzung zu
out hotzenplotz, 0xFF
umgemodelt werden und zu einem Fehler führen. Aber es wäre das, was du
mit dem .equ veranlasst hast.
ok, danke schonmal ^^
gibts da noch einschränkung in der namensgebung?
also keine umlaute und nur 8 zeichen oder so?
und das is dann nur im assemblercode so, also nur eine lösung seitens
der programmier sparche?
ich werds dann gleich mal testen, wäre super wenn das funktioniert.
lg hannes
Hannes schrieb:> ok, danke schonmal ^^> gibts da noch einschränkung in der namensgebung?> also keine umlaute und nur 8 zeichen oder so?
Am besten fährt man immer, wenn man sich an 7-Bit ASCII ohne viele
Sonderzeichen hält. ALso Buchstaben, Ziffern, und ein paar Sonderzeichen
wie _, # und $ und alles was nicht im Programmtext irgendeine spezielle
Bedeutung hat (wie , ; etc). Umlaute, scharfes ß und was da sonst noch
so kreucht und fleucht sind tabu.
> und das is dann nur im assemblercode so, also nur eine lösung seitens> der programmier sparche?
Die Ersetzung wird vom Assembler vorgenommen. Hauptsächlich weil ja das
Ergebnis eines Assemblerlaufs eigentlich nur eine Abfolge von Zahlen
ist, welche die Befehle darstellen, so wie die CPU sie versteht.
Nicolas S. schrieb:> .def SUPERBIT = 0b01000000
Mea culpa.... sollte natürlich ".equ" heißen. Das kommt davon, wenn man
ein halbes Jahr asm-Abstinenz übt.
hm, also irgendwie is da was komisch -.-
ich hab jetzt nur mal zum test geschrieben:
.def STATE = r16
.equ FUNKT1 = 3
...
sbi STATE, FUNKT1
nun zeigt er mir aber "invalid number" an immer wenn ich FUNKT1
setzen/löschen will
sbi ist für I/O Register.
Für normale Register gibt es SBR, und das will die zu setzenden Bits als
Maske
SBR STATE, 1<<FUNKT1
1
.include "m8def.inc"
2
3
.def STATE = r16
4
.equ FUNKT1 = 3
5
6
7
sbr STATE, 1<<FUNKT1
(PS: Im AVR Studio gibt es eine ausgezeichnete Hilfe)
Übrigens muss ich meine Aussage von weiter oben relativieren. .equ macht
nicht einfach nur eine Textersetzung. .equ geht nur dort, wo ein
Ausdruck vorkommt, .equ STATE = r16 würde nicht gehen.
Hallo,
Hannes schrieb:> und sbi geht auch bei den steuerregister zb für timer oder adc, nur bei> normalen "arbeits"-registern gehts wieder nich. ^^
sbi (set bit in IO) setzt ein Bit in einem Peripherie-Register wie Timer
oder ADC, richtig.
Die gehöären nicht zum eigentlich Prozessor, sind sozusagen nur intern
gleich eingebaut und angeschlossen.
Da wird die Bitnummer übergeben.
sbr (set bit in register) bedient die eigentlichen CPU-Register.
Hier wird eine Bitmaske übergeben, so können auch mehrere Bits in einem
Befehl gesetzt werden.
Für Deine Frage als Beispiel:
1
.def FLAGS = r20 ; Flags für Funktionen
2
3
.equ FLAG_KEY = 0 ; Taste als gedrückt erkannt
4
.equ FLAG_KEY_PRESS = 1 ; Taste noch nicht losgelassen
cbr FLAGS,(1<<FLAG_IRQ) ; Flag löschen für nächsten IRQ
einach daran gewöhnen, daß cbr/sbr eine Maske wollen und eben passend
schieben.
Bei sbrs FLAGS,FLAG_KEY reicht es dann eben so.
Immer als Bitnummer definieren ist also günstiger (Ausnahme die
Macro-Freaks, die da jetzt ein Dutzend Macros für basteln ;)).
Gruß aus Berlin
Michael