Bits im SRAM bearbeiten

OP #614829
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.
#614847
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.