Forum: Mikrocontroller und Digitale Elektronik Bits einen Namen geben


von Hannes (Gast)


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

von syn_error (Gast)


Lesenswert?

.def tmp = r16

von Hannes (Gast)


Lesenswert?

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.

von syn_error (Gast)


Lesenswert?

.equ LCD_DDR = DDRD

von Hannes (Gast)


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

von Walter T. (nicolas)


Lesenswert?

.def SUPERBIT = 0b01000000

von syn_error (Gast)


Lesenswert?

>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

von spess53 (Gast)


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

von Karl H. (kbuchegg)


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.

von Hannes (Gast)


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

von Karl H. (kbuchegg)


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.

von Walter T. (nicolas)


Lesenswert?

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.

von Hannes (Gast)


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

von Karl H. (kbuchegg)


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.

von Hannes (Gast)


Lesenswert?

also muss ich das ganze mit

.equ FUNKT1 = 0b01000000

...

sbr STATE, FUNKT1

machen?

von Hannes (Gast)


Lesenswert?

und sbi geht auch bei den steuerregister zb für timer oder adc, nur bei 
normalen "arbeits"-registern gehts wieder nich. ^^

von Michael U. (amiga)


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

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
Noch kein Account? Hier anmelden.