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.