Forum: Mikrocontroller und Digitale Elektronik Bits im SRAM bearbeiten


von Michael B. (gm8816)


Lesenswert?

Hallo,
hat jemand einen Lösungsansatz für folgendes Problem: Ich habe auf einem 
ATtiny84 10 Byte im Sram unter einer Variable reserviert. Das entspricht 
80 Bits. Ich möchte nun eine Funktion Schreiben, welche ein Bit in 
dieser Variable auf 0 oder 1 setzt. Das zu bearbeitende Bit soll mit 
einem anderen Register gewählt werden. Ich Programmiere mit Assembler 
und AVR Studio 4.

von Karl H. (kbuchegg)


Lesenswert?

Geoffrey M. wrote:
> Hallo,
> hat jemand einen Lösungsansatz für folgendes Problem: Ich habe auf einem
> ATtiny84 10 Byte im Sram unter einer Variable reserviert. Das entspricht
> 80 Bits. Ich möchte nun eine Funktion Schreiben, welche ein Bit in
> dieser Variable auf 0 oder 1 setzt. Das zu bearbeitende Bit soll mit
> einem anderen Register gewählt werden. Ich Programmiere mit Assembler
> und AVR Studio 4.

Z-Pointer auf das erste SRAM Byte
Index Register sichern
Das 'Index' Register durch 8 teilen (3 mal nach rechts schieben)
das Zwischenergebnis zum Z-Pointer dazuaddieren -> der Z-Pointer
enthält schon mal die Byte Adresse des zu manipulierenden Bytes

Index Register wiederherstellen und modulo 8 rechnen (mit 0x07
verunden). Damit hast du die Bitnummer des zu manipulierenden
Bits im Byte.
In einer Schleife nun das Index Register um 1 bis auf 0
erniedrigen und gleichzeitig in einem zweiten Register eine
1 nach links schieben -> die 1 steht dann an der Bitposition
deren Nummer vorher im Indexregister war. Effektiv wird dadurch
1 << Index bestimmt, wobei Index variabel ist.

Somit hast du:
Eine Maske die eine 1 an einer Bitposition enthält und im
Z-Pointer die SRAM Adresse an der diese Maske anzuwenden
ist.

Zum Setzen des Bits: mittels Z-Pointer das Byte holen und
mit der Maske verodern. Byte über den Z-Pointer zurückschreiben.

Zum Löschen des Bits: die Maske komplementieren (COM). Wieder
das Byte über den Z-Pointer holen. Durch verunden mit der
jetzt invertierten Maske das eine Bit auf 0 setzen und das
Ergebnis über den Pointer zurückschreiben.

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.