Port variabel setzen/löschen

Gast #421133
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
Gast #421140
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren