mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Port variabel setzen/löschen


Autor: Manfred Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich suche nach einer Lösung um in AVR-Assembler folgendes zu machen:

ldi r16,5         ;kann zwischen 0 und 7 sein (Port bit)
...
sbi PORTB,r16

Mir ist schon klar, dass ich so etwas machen könnte:

ldi r16,5         ;kann zwischen 0 und 7 sein (Port bit)
...

cpi r16,5
brne weiter
sbi PORTB,5

weiter:
cpi r16,6
brne weiter1
sbi PORTB,6

weiter1:
....

Irgendwie sieht das aber nicht so elegant aus und braucht auch einiges
an Speicher wenn ich da 14 ports setzen oder löschen will.

Hat jemand eine Idee, wie man das eleganter lösen könnte?

Danke,
Manfred

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"sbi PORTB, r16" dürfte eine Fehlermeldung geben. Der zweite Operand
von sbi muss eine Zahl zwischen 0 und 7 sein und kein Register!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, jetzt verstehe ich... Du suchst nen Ersatz dafür...

Mach es z.B. mit

ldi r16, 5
in r17, PORTB
or r17, r16     ; logische ODER-Verknüpfung, setzt Bitmaske
out PORTB, r17

So in der Art, oder hab ichs immer noch falsch verstanden?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...und zum Löschen:

ldi r16, 5
com r16      ; r16 invertieren
in r17, PORTB
and r17, r16 ; logisches UND mit der invertierten Bitmaske
out PORTB, r17

Autor: Andreas Hesse (asmhesse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich glaube Manfred will ein einzelnes Bit setzen. Das zu setzende Bit
steht in einer Variablen.

  ldi r16,0
  ldi r17,5
  sec
Schleife:
  rol r16
  dec r17
  brne Schleife
  in  r17, PORTB
  or  r17. r16
  out PORTB, r17

Gruss
Andreas

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas hat recht. Hatte das nicht richtig gesehen, dass Du nur die
Nummer des Bits angeben willst. Da ist seine Methode das Sinnvollste.
Es muss nur in der vorletzten Zeile "or r17, r16" heißen...

Autor: Manfred Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

vielen Dank für die schnelle Hilfe - genau das war es was ich suchte
:)))

Grüsse,
Manfred

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab noch ein Problem bei Andreas' Lösung gefunden: Die Bit-Nummer in
r17 muss vor der Schleife noch um eins erhöht werden. Wenn Bit Nr. 0
gesetzt werden soll (also in der zweiten Zeile "ldi r17, 0" steht),
dann gehts schief, weil dann das brne nicht greift ("dec r17" gibt in
dem Fall einen Überlauf). Die Schleife wird also nicht verlassen.
Außerdem wird die Schleife immer einmal zu wenig durchlaufen.

Das Problem ließe sich lösen, indem man vor dem "sec" ein "inc r17"
einfügt. Dann wird auch mit dem Aufruf "ldi r17, 5" das Bit Nr. 5
(also das sechste von hinten) gesetzt.

Löschen geht dann so, wie ich es oben beschrieben habe, indem anstelle
von
  in  r17, PORTB
  or  r17. r16
  out PORTB, r17
folgendes eingesetzt wird:
  in r17, PORTB
  com r16
  and r17, r16
  out PORTB, r17

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.