Bits einen Namen geben

Gast #1679700
Lesenswert?

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
Gast #1679737
Lesenswert?

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
Gast #1679748
Lesenswert?

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
#1679753
Lesenswert?

>> .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.
Gast #1679757
Lesenswert?

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
#1679763
Lesenswert?

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.
Gast #1679807
Lesenswert?

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
#1679811
Lesenswert?

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.
#1679939
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren