Forum: Mikrocontroller und Digitale Elektronik ATMEL-AVR-µC Eingangsbits ausmaskieren bzw. selektieren


von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Hallo zusammen,

um nicht immer nach zu sehen bzw. mir merken zu müssen welcher Taster an 
welchen Portpin hängt, wollte ich den einzelnen Portpins Labels 
zuweisen.

.equ   FUNKTION  = PORTB3  ;Portpin fuer Taster FUNKTION
.equ   TEST      = PORTB1  ;Portpin fuer Taster TEST

um den entsprechenden Tastern den internen Pull-Up zu zu schalten bin 
ich so verfahren.

  sbi   PORTB,TEST      ;PortBx Eingang mit internen Pull-Up
  sbi   PORTB,FUNKTION  ;PortBy Eingang mit internen Pull-Up

Dies funktioniert ja soweit auch, da ja z.B. FUNKTION den Wert 3 
enthält.
Jedoch das ausmaskieren bzw. selektieren der einzelnen Taster 
funktioniert nicht.

  in   IN_TASTER,PINB  ;Portpins einlesen
  com  IN_TASTER       ;Eingelesene Portpins invertieren und...
  andi IN_TASTER,EXP2(FUNKTION) & EXP2(TEST)
                       ;...relevanten Bits ausmakieren...
  tst  IN_TASTER       ;...testen ob ein Taster betaetigt...
  breq NOT_PUSH        ;...falls nicht springen...

Da die Taster den internen Pull-Up des µC nutzen,
schalten diese nach GND.
Falls kein Taster betätigt ist soll dies durch ein komplett gelöschetes 
Arbeitsregister (IN_TASTER = r20) erkannt werden.

Ansonsten sollte durch den ANDI Befehl mit der Assembleranweisungsmaske 
EXP2(Ausdruck) erkannt werden,
ob einer oder beide Taster (FUNKTION,TEST) betätigt wurden.

Auf die EXP2-Assembleranweisung bin ich gekommen, weil ja z.B.
FUNKTION den Wert 3 enthält aber ich ja Bit 3 testen muss,
da der Taster an PortB3 hängt und dieser hat nun mal den Wert 8
( 8 = 2^3 ).

Die Assembleranweisung EXP2(Ausdruck) sollte ja als Ergebnis
2^ (Ausdruck) liefern.
Jedoch springt im AVR-Studio der Simulator immer nach NOT_PUSH.
Im Listfile (xyz.lst) sehe ich das der ANDI-Befehl mit $7040 übersetzt 
wird, was ja bedeutet das die Anweisung EXP2(Ausdruck) Null zurück 
liefert was ich jedoch nicht verstehe.

$7040  andi IN_TASTER,EXP2(FUNKTION) & EXP2(TEST)

IN_TASTER liefert $01 => 0000 0001
invertiert        $FE => 1111 1110

Wenn ich doch $FE und $0A ( Beide Taster betätigt ) AND verknüpfe
kommt doch $0A heraus und dies ist eindeutig ungleich Null.

Ich benutze das AVR-Studio in der Version 4.18 Build 700 und den 
AVR-Simulator 2 für den ATtiny13.



Hoffe jemand blickt da durch und ist auch noch in der Lage mir dies 
begreiflich zu machen.

Bis dann
Bernd_Stein

von spess53 (Gast)


Lesenswert?

Hi

>andi IN_TASTER,EXP2(FUNKTION) & EXP2(TEST)

-> andi IN_TASTER, 1<<FUNKTION | 1<<TEST

MfG Spess

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

spess53 schrieb:
> Hi
>
>>andi IN_TASTER,EXP2(FUNKTION) & EXP2(TEST)
>
> -> andi IN_TASTER, 1<<FUNKTION | 1<<TEST
>
Danke,

mehr fällt mir dazu nicht ein.



Bis demnächst
Bernd_Stein

von Karl H. (kbuchegg)


Lesenswert?

Dein Augenmerk sollte sich auf das | richten. Dein & war falsch.

Ich kenne zwar EXP2 nicht, wenn es das gibt dann wird es wohl das 
machen, was du dir vorstellst, und was gelichbedeutend mit 1 << x ist.

Deine Ausführungen im Eröffnungsposting waren übrigens exzellent. Man 
sieht das du dir Gedanken machst und dass deine Gedankengänge gut 
überlegt sind. Du bist einzig und alleine über unseren umgangssprachlich 
oft laxen bis falschen Gebrauch der Wörter UND bzw. ODER gestolpert.

In  EXP2(FUNKTION) & EXP2(TEST)
sind nun  mal nicht die Bits FUNKTION und TEST gesetzt, sondern kein 
einziges, solange FUNKTION und TEST nicht einen identischen Zahlenwert 
darstellen.

von spess53 (Gast)


Lesenswert?

Hi

>Ich kenne zwar EXP2 nicht,

Gehört zum AVR-Assembler2. Mit '|' ergibt es das gleiche Ergebnis.

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.