www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik verändern von Bits


Autor: Stevko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Hallo

an alle Mitstreiter in diesem Forum. Auch wenn die Frage simpel
erscheint bitte ich Euch mir mal kurz zu helfen, da meine Unterlagen zu
Hause sind.
Folgendes Problem:
In einem Register(nicht I/O) z.B. R16 muß ich in der Bitfolge ein
einzelnes Bit setzen(Bit3 soll "1" sein). Alle anderen dürfen nicht
verändert werden. Natürlich wird dieses später im Programm wieder
gelöscht, also das gleiche Problem nochmal. In diesem Byte sind die
Statusbits von meinem Programm enthalten.
Fragen:
*Gibt es dafür ein Befehl wie SBI oder muß ich eine zweite Bitmaske
addieren.
*Könnte ich den Statusbits Namen verpassen(z.B. Time_Flag_1) um die
Sache zu vereinfachen?

Gruß Stevko

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Welcher Prozessor?

Autor: obiwan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Stevco
Für das verändern von Bits innerhalb von Registern gibts wie bei den
Ports auch 2 befehle.
Register setzen ,  SBR rh,k255
Register löschen,  CBR rh,k255

Das funktioniert nur mit den Registern 16-31 (rh)
k255 steht für die Bitmaske. Jedes bit , das in der Maske gesetzt ist
wird entsprechend des Befehls gesetzt bzw. gelöscht.
Du kannst den Bits auch Namen geben.

.equ Time_Flag_1=0b00000001 wäre dann Bit 0
SBR flags,time_flag_1   würde dann Bit 0 setzen

aber achtung. Wenn du aufgrund der bits springen willst, zB. mit
SBRC flags,... kannst du den Namen nicht verwenden , da man da explizit
das Bit angeben muss und keine maske. Würde also heissen:
SBRC flags,0

Autor: Stevko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo OldBug

ich habe einen ATMega32 mit 8MHz. Wäre es möglich die Statusbits zu
benennen? Das Byte ist aber im SRAM abgelegt, muß ich erst mit lds ins
R16 laden. Gibt es eine bessere Lösung?

Gruß Stevko

Autor: obiwan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach so , ja . Die befehle gibts zumindest bei den Atmel at90s1200 und
90s2313

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Das Byte ist aber im SRAM abgelegt, muß ich erst mit lds ins
R16 laden."

Im SRAM kann nichts gemacht werden. Du mußt also immer erst ein
Register laden und auch wieder abspeichern.


"Gibt es eine bessere Lösung?"

In Assembler kannst Du Dir doch Register für bestimmte Sachen
reservieren.

Eine andere Möglichkeit sind nicht benutzte IOs, z.B. wenn du den
EEPROM nicht brauchst, kannst Du EEDR und EEAR nehmen.


Peter

Autor: Stevko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die schnelle Hilfe!

obiwan:
Die Befehle gibt es auch im ATMega32. Hatte in der falschen Rubrik
gesucht.

peter:
Im EEPROM liegen später mal meine Sterndaten, als das wird wohl nix
werden.

schönen Tag noch
   Stevko

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Wäre es möglich die Statusbits zu benennen?"

Jep, z.B. so:

.equ Status_1 = 3
.equ Status_2 = 7

SBR R16,(1<<Status_1|1<<Status_2)

CBR R16,(1<<Status_1)

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi...

Zurück zur Frage. Du wolltest einzelne Bits im Register setzen/löschen,
ohne die anderen zu beeinflussen. Dazu fällt mir erstmal SBR/CBR ein
(oder ANDI/ORI). Das geht, wie oben schon erwähnt nur in den obreren
Registern.

Wenn du den Bits (nenne die aber bitte nicht "Statusbits", denn da
denkt man schmell an die Flags im Statusregister) eigene Namen geben
willst, dann weist du den Namen die Bitnummer (0...7) zu.

Zum Setzen/Löschen brauchst du aber die Maske (0...255), dies erreichst
du durch Linksschieben einer 1 um den Wert des Bits.

Beispiel:

.equ deinbit=3            ;Bit 3 heißt nun "deinbit"
...
sbr r16,1<<deinbit        ;Bit 3 (Maske=8) wird in R16 gesetzt
...
sbrs r16,deinbit          ;hupft wenn Bit 3 gesetzt ist
...
cbr r16,1<<deinbit        ;Bit 3 (Maske=8) wird gelöscht

Ich hoffe, das hilft dir weiter...

Bit- & Bytebruch...
...HanneS...

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da war Thkais schneller... ;-))

Autor: Stevko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank noch mal an alle Helfer. Habe das Problemchen wie folgt
gelöst:

.equ OT_Time_Flag_Reg = $84 ;Flagregister für die Ortszeit
.equ OT_New_Time_Flag = 0   ;Neue Ortszeit von Timer

...laber, laber

lds r16,OT_Time_Flag_Reg
sbr r16,1<<OT_New_Time_Flag
sts OT_Time_Flag_Reg, R16

Jetzt kommt aber noch ein Problem mit der Sternzeit, da ein Sterntag
ca. 4min kürzer ist.
Eröffnet man für die Frage einen neuen Thread oder bleibt man im
alten?

Gruß Stevko

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.