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
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
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
ach so , ja . Die befehle gibts zumindest bei den Atmel at90s1200 und 90s2313
"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
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
"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)
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...
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
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.