bitverknüpfungen

Gast #12867
Lesenswert?

hallo
könnt ihr mir mal sagen wie ihr einfache bitverknüpfungen in assembler 
für 90er serie programmiert. irgendwie tu ich sehr schwer.
bei der 89er serie ist das etwas einfacher, man vergibt den einzenlen 
bits der ports namen und dann kann mit den namen schon die pins 
ansprechen und progrmiert immer wieder über das carry-flag
zbsp.

mov c,e1
anl c, e2


danke pierre
Gast #12869
Lesenswert?

Hi Schmittchen
also, ich habe hier mal eine einfache und-bitverknüpfung, das ergebnis 
geht an einen ausgang. irgendwie finde ich etwas viel code für so eine 
einfache aufgabe.
noch eine frage: kann der akkumulator auch nur mit einem bit geladen 
werden. so könnte ich zum beispiel die einfachen and- und or-schaltungen 
mit dem t-flag im sreg realisieren.

gruß pierre
Gast #12870
Lesenswert?

Die 90er-Atmels (also die AVRs) haben keinen Akku. Hier kannst du direkt 
mit den Registern arbeiten, bzw. ein AVR hat 16 oder 32 Akkus.
Wenn du allerdings den Pegel an einem "Beinchen" ändern willst, dann 
mußt du einem ProzessorRegister (R0-R31) einen Wert zuweisen, der dann 
anschließend (per out) ins Ausgangslatch geschrieben wird. Direkt aufs 
Ausgangslatch verknüpfen geht nicht.

Bitverknüpfungen lassen sich nur auf ganze Register anwenden - 
einzelne_ Bits logisch _verknüpfen geht nicht. Einzelne Bits 
setzen/löschen hingegen funktioniert so:
sbi(PORTC,1) setzt z.B. das 1. Bit im PORTC-Register.
cbi(PORTC,1)


andi r16,0xF0
out r16,PORTC
Das "andi" verknüpft den Inhalt des Registers R16 logisch mit der 
Konstanten 0xF0 (löscht also die unteren 4 Bits...). "out" schreibt den 
so erhaltenen Wert ins Ausgangslatch des PortsC.

> irgendwie finde ich etwas viel code für so eine einfache aufgabe.
2 Zeilen - knapper gehts nicht.

Das T-Flag im SREG hat nicht die Funktion des Akkus - für 
Bitverknüpfungen ist das T-Flag nicht nötig.

Schmittchen.
Gast #12872
Lesenswert?

Zunächst:
> > Das "andi" verknüpft den Inhalt des Registers R16 logisch mit der Konstanten 
0xF0
Das ist falsch, sollte vielmehr heißen: ...R16 bitweise mit der 
Konstanten...

Zum Problem:
in r16, pina
andi r16, 0xC0
subi r16, 0xC0
breq led1_aus
...

d.h. PinA einlesen, alle Bits ausser Bit6 und Bit7 wegschneiden. Dann 
0xC0 (= 0b1100 0000) subtrahieren, wenn 0 dabei rauskommt (und 0 ergibt 
sich nur dann, wenn beide Bits gesetzt waren) nach led1_aus 
verzweigen... Und wenn du sicher bist, daß an PinA0-5 keine High-Pegel 
anliegen können, dann kannst du dir das "andi" auch noch sparen.

bei 3Eingängen:
in r16, pina
andi r16, 0xE0
subi r16, 0xE0
breq led1_aus


A propos: Wenn es keine low-current-LEDs sind, dann schließe sie besser 
gegen Vcc an, anstatt gegen Masse. Damit schaltet die LED bei 
high_-Pegel _aus. Muß natürlich dann im Code berücksichtigt werden. So 
verhinderst du ein vorzeitiges Ableben des AVRs, da dieser mehr Strom 
senken als liefern kann.

Schmittchen.
Gast #12874
Lesenswert?

> deinen name find ich cool :)
danke, danke. Bemühe mal spasseshalber ein Telefonbuch (z.B. 
www.telefonbuch.de). :-) Aber weitaus verbreiteter ist "Schmidtchen".

Schmittchen "der in diesem Thread sein Debüt als Konkrete-Antwort-Geber 
gefeiert hat, normalerweise äußert sich Schmittchen ja nur zu 
Meinungsthemen... :-)".

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