Forum: Mikrocontroller und Digitale Elektronik befehlstruktur im µC ohne interrupts


von Benedikt W. (Gast)


Lesenswert?

nabend
es geht um assembler code !

wie kann ich "if-schleifen" quasi parallel kontrollieren ohne
interrupts ?

als beispiel: ich habe 3 taster die liegen auf bin 0-2 auf PORTA am
AVR.

dann habe ich schleigen wie diese:

loop:
   sbic PINA, PA0
   rjmp loop

  -> befehl ! mach das !


so und jetzt halt 3 taster nicht nur einer ! wie mache ich es, dass
alle 3 taster hintereinander abgefragt werden ohne das die befehle
unter den schleifen ausgeführt werden und ohne interrupts, sondern mit
solchen schleifen ?
wenn das nicht funktioniert nennt mir eine andere lösung bitte.

grüße g1o

von remo (Gast)


Lesenswert?

loop:
   sbis PINA, PA0   ; MERKE: hier sbis nicht sbic
   rjmp machPA0
   sbis PINA, PA1
   rjmp machPA1
   sbis PINA, PA2
   rjmp machPA1
   rjmp loop
machPA0:
  -> befehl ! mach das !
   rjmp loop
machPA1:
  -> befehl ! mach das !
   rjmp loop
machPA2:
  -> befehl ! mach das !
   rjmp loop

so jetze hab ich dir die Steigeisen gehalten, reiten musst du nun
selbst. Also streng dinenen Grips an, dann kommst du selbst drauf.
Übrigens Interrupts können auch nicht für dich denken, eher im
Gegenteil.
Also frisch ans Werk und viel Spass
ciao
Remo

von Benedikt W. (Gast)


Lesenswert?

danke ! stimmt hätte ich auch selbst draufkommen können !


"MERKE: hier sbis nicht sbic"

warum das ? eigentlich nicht...meine taster sind gegen GND geschaltet,
das heißt am PIN0-2 muss ich 5V anlegen durch:

ldi r19, 0x00
out DDRA, r19    <- für eingang, hab ich allerdings weggelassen, geht
                     auch so

ldi r19, 0xFF
out PORTA, r19

wenn der taster nicht gedrückt ist hängt am pin weder 5V noch GND,
daher muss ich sie auf hohes potential setzen, damit die integrierten
pull-ups eingeschaltet werden. ansonsten würde bei tasterdruck gar
nichts passieren.

von johnny.m (Gast)


Lesenswert?

Der Befehl "sbis" steht für "Skip if Bit Is Set", das heißt,
überspringe den nächsten Befehl, wenn das abgefragte Bit gesetzt ist.
Und der folgende rjmp soll ja übersprungen werden, wenn der Taster
nicht gedrückt ist, also wenn das Bit gesetzt ist...

von Karl H. (kbuchegg)


Lesenswert?

> "MERKE: hier sbis nicht sbic"
> warum das ?

Weil sich die Sprunglogik umgedreht hat.

Im Original heist es:
  Springe zu Loop wenn Taster nicht gedrückt

In der Veränderung heist es:
  Springe zur Bearbeitungsfunktion wenn Taster gedrückt

von Benedikt W. (Gast)


Lesenswert?

das bit ist gesetzt wenn es auf potential liegt sehe ich das richtig ?
das kann bei mir aber nie der fall sein weils nicht gegen Vcc sondern
gegen GND angeschlossen ist. also muss ich doch den pin auf potential
setzen, dank der eingebauten pull ups kein problem, und dann wird bei
taster druck das bit gecleard.

von johnny.m (Gast)


Lesenswert?

Du musst die Pull-Ups aktivieren, damit ein definierter (High-) Pegel 
anliegt, wenn der Taster nicht gedrückt ist. Wenn er gedrückt ist, dann 
hast Du am Pin Low-Pegel, also ist auch das entsprechende Bit in PINx 
low. In dem Posting von remo wird der rjmp zur Ereignis-Bearbeitung 
übersprungen, wenn das Bit in PINx gesetzt ist, also wenn der Taster 
nicht gedrückt ist. Wenn er gedrückt ist, also wenn PINx Low-Pegel hat 
und damit das sbis keinen Sprung ausführt, dann wird der rjmp zur 
Ereignis-Bearbeitung ausgeführt.

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.