www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Portabfrage


Autor: Voyager9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Voyager9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Voyager9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder auch so:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.