www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bits im SRAM bearbeiten


Autor: Michael B. (gm8816)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

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.