Forum: Mikrocontroller und Digitale Elektronik Portabfrage


von Voyager9 (Gast)


Lesenswert?

Hallo,

da ich noch ziemlich neu in der Assembler Programmierung bin und dieses 
Thema weiter vertiefen würde habe ich mir einen 4433 zum Experimentieren 
geholt. Nun hätte ich eine Bitte: Kann mir evtl jemand sagen wie ich 
einen Port Zustand im Programm abfrage der das programm je nach zustand 
veranlasst in ein Unterprogramm, bzw an eine bestimmte Stelle im 
Programm zu springen ? ( um zB verschieden texte je nach port zustand 
auf zB einem LCD auszugeben ) Die LCD Ansteuerung klappt schon ganz gut, 
nur würd ich das wie gesagt eben port zustandsabhängig machen. Auch port 
zustände im binärcode würden mich interessieren.

Bin für jede Hilfe echt dankbar

von crazy horse (Gast)


Lesenswert?

Bei Eingaben immer PINx verwenden.
mögliche Verzweigung:
sbic PINB,4       ;überspringe nächsten Befehl, wenn PINB.4 0 ist
rjmp PORT_ist_1
PORT_ist_0:
PORT_ist_1:

Kannst auch den kompletten Port einlesen und dann entsprechend 
verzweigen.

von Voyager9 (Gast)


Lesenswert?

Hallo, danke erst mal.
Soweit alles schön und gut, in dieser art habe ich das auch shon 
gemacht, klappt auch hervorragend, aber so wie ich das sehe, bzw. 
hinbekommen habe nur mit einem Port. wenn ich alle ports in einer 
schleife abfregen möchte und entsprechend verzweigen will geht das 
nicht, weil sbic oder sbis ja immer nur den nächsten Befehl überspringt 
wenn ein zustand eingetroffen ist. Nehme ich also:

        rcall text1
loop:   sbic PINB, 0

von Voyager9 (Gast)


Lesenswert?

Hallo, danke erst mal.
Soweit alles schön und gut, in dieser art habe ich das auch shon 
gemacht, klappt auch hervorragend, aber so wie ich das sehe, bzw. 
hinbekommen habe nur mit einem Port. wenn ich alle ports in einer 
schleife abfregen möchte und entsprechend verzweigen will geht das 
nicht, weil sbic oder sbis ja immer nur den nächsten Befehl überspringt 
wenn ein zustand eingetroffen ist. Nehme ich also:

start:  rjmp text1

loop:   sbic PINB, 0
        rjmp loop
        rjmp text 2
        rjmp start

text1:  .......
        rjmp loop
text2:  .......

loop2:  sbis PINB, 0
        rjmp loop2
        rjmp start

..... kann ich das mit einem eingang eines Portes machen. wie aber 
verschachtele ich alle eingänge eines ports um entsprechend des 
zustandes ( auch binär mit 63 möglichkeiten an PORTB ) als Beispiel 
??????????? zu verzweigen .. ? ? ?

Da wie gesagt die befehle sbis und sbic nur den nächsten Befehl 
überspringen wenn ein Zustand eigetroffen ist und ich dann Zwangsweise 
als nächsten Befehl den Verzweigepunkt angeben muss kann ich die nächste 
abfrage ja nicht als nächsten befehl setzen. Da steig ich noch nicht so 
recht durch. Oder gibts einen Befehl der mich den Zusatnd des ganzen 
Ports auswerten lässt???? sowas wie in Basic einen " IF then " Befehl, 
Nach dem Motto:

loop:  If PORTB,0 ist High then text1
       If PORTB,1 ist High then text2
       If PORTB,2 ist High then text3
       rjmp loop

( S I N N B I L D L I C H   Dargestellt )

jedenfalls werd ich aus der Befehlsliste von atmel nicht sonderlich 
schlau daraus.

Und.. Danke nochmal auch im Vorraus für eine evtl Erleuchtung :-)

von crazy horse (Gast)


Lesenswert?

wenn du wirklich ganz viele Verzweigungen hast, dürfte der Einsatz von 
ijmp (indirekt jump) die beste Lösung sein.
Z-Register mit der Grundadresse einer Sprungtabelle laden, Port 
einlesen, mit 2 multiplizieren und zum Z-Register addieren, dann ijmp 
ausführen.
jump_tab:
rjmp port_value_is_0
rjmp port_value_is_1
....
zu beachten ist dabei, dass für jeden Wert möglichen Z-Wert auch ein 
Sprungziel vorhanden sein muss, sonst gehts in die Abgründe.

Andere mögliche Alternativen: Port in ein Register laden und dann 
entsprechend verzweigen. Dazu kannst du z.B. das Register durchs Carry 
schieben

in R16, PINB
ror r16
brcs bit0_ist_1
ror r16
brcs bit1_ist_1
...

oder mit Hilfe des T-flag:
bst r16,0
brts bit0_ist_1
bst r16,1
brts bit1_ist_1
...

gibt noch mehr Möglichkeiten.

und ehe du über den AVR-Befehlssatz meckerst, zieh dir mal den PIC rein 
- von da an findest du AVR komfortabel.

von crazy horse (Gast)


Lesenswert?

oder auch so:

sbic PINB,0
rjmp bit0_ist_1
sbic PINB,1
rjmp bit1_ist_1
....

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.