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 #421135
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?
Gast #421138
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...
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