www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bits einen Namen geben


Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: syn_error (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.def tmp = r16

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: syn_error (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.equ LCD_DDR = DDRD

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Walter Tarpan (nicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.def SUPERBIT = 0b01000000

Autor: syn_error (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Walter Tarpan (nicolas)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
.include "m8def.inc"

.def STATE = r16
.equ FUNKT1 = 3


   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.

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also muss ich das ganze mit

.equ FUNKT1 = 0b01000000

...

sbr STATE, FUNKT1

machen?

Autor: Hannes (Gast)
Datum:

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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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:

.def FLAGS = r20 ; Flags für Funktionen

.equ FLAG_KEY          = 0  ; Taste als gedrückt erkannt 
.equ FLAG_KEY_PRESS    = 1  ; Taste noch nicht losgelassen

.equ FLAG_FREQ         = 2      ; Frequenzmessung gestartet
.equ FLAG_PERIODE      = 3  ; Periodendauermessung gestartet
.equ FLAG_PERIOD_AKT   = 4  ; Periodendauermessung Messzyklus läuft
.equ FLAG_PERIOD_PRE   = 5  ; Periodendauermessung Prescale 8

...

 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.