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
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.
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
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 :-)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.