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
ja, das kenne ich schon ich würde aber dann gern statt "sbi temp, 0b01000000" das bits mit namen versehn und "sbi temp, funkt1" schreiben.
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.
also muss ich das ganze mit .equ FUNKT1 = 0b01000000 ... sbr STATE, FUNKT1 machen?
und sbi geht auch bei den steuerregister zb für timer oder adc, nur bei normalen "arbeits"-registern gehts wieder nich. ^^
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 |
5 | |
6 | .equ FLAG_FREQ = 2 ; Frequenzmessung gestartet |
7 | .equ FLAG_PERIODE = 3 ; Periodendauermessung gestartet |
8 | .equ FLAG_PERIOD_AKT = 4 ; Periodendauermessung Messzyklus läuft |
9 | .equ FLAG_PERIOD_PRE = 5 ; Periodendauermessung Prescale 8 |
10 | |
11 | ... |
12 | |
13 | 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
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.