Autor |
AVR Assembler "Verzweigungen" |
|
|
|
|
BID = 335655
clembra Inventar
Beiträge: 5404 Wohnort: Weeze / Niederrhein
|
|
Also wenn es jetzt auch nicht geklappt hätte, dann hätte ich auch nicht mehr helfen können...
Aber die letztgenannte Seite kannst du dir auf jeden Fall merken. Da wird man schlauer draus als den (complete) Datenblättern von Atmel
_________________
Reboot oder be root, das ist hier die Frage. |
|
BID = 335662
Humus Aus Forum ausgetreten
|
|
Die Seite kenn ich ja, finde sie aber nicht so umfangreich wie diese Seite:
http://www.avr-asm-tutorial.net
Irgendwie bin ich gerade schon wieder am verzweifeln...
Versuche mir eine einfache IF schleife zu bauen. Aber so irgendwie will das noch nicht ganz so, na ja mal gleich wieder dran gehen! =) Geht nicht gibts nicht!
|
|
BID = 335745
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Zitat :
|
Zitat :
|
3. Hast du den Stackpointer initialisiert, der die Sprungadresse speichert, bevor er ein Unterprogramm ausführt?
|
Siehe Source code, alles gemacht!
|
Geil. Am besten postet du das nächste mal das ganze Programm. Das Klugscheißern kannste dir auch schenken!
_________________
|
BID = 335748
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Naja, war ein bischen harsch formuliert...
Wie meinst du das mit "IF-Schleife"?
Es gibt doch diverse Instruktionen, die vergleichen und dann z.b. den nächsten Befehl überspringen.
Um ein einfaches Vergleichen zwischen z.b. 2 Registern durchzuführen, solltest du dir den Befehl "cpse register1, register2" ansehen.
Wenn der Vergleich positiv ausfällt (Register1 = Register2), dann wird der Programmzähler um 2/3 inkrementiert -> nächster Befehl wird übersprungen.
Es gibt aber noch andere Sachen, z.b. diverse Statusflags die man mit den ganzen Branch if...-Befehlen abfragen kann.
Du musst außerdem etwas anders denken als bei Hochsprachen. Assembler findet auf anderen Ebenen statt. Sozusagen
_________________
|
BID = 335798
clembra Inventar
Beiträge: 5404 Wohnort: Weeze / Niederrhein
|
@DonComi
Er hat das ganze Programm gepostet, und zwar im gleichen Thread, wie den, den du zitiert hast.
_________________
Reboot oder be root, das ist hier die Frage.
|
BID = 335878
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Ja, Clembra, hast du fein gemerkt...
Aber woher soll ich wissen, dass er den Stakc initialisiert, wenn er mir nur Codeschnipsel gibt, anhand derer ich den Fehler finden soll...
Kann man vielleicht gleich den kompletten source posten, dann kann man solche Fehler von vornerein klären.
Edit:
_________________
|
BID = 335891
Humus Aus Forum ausgetreten
|
Sorry, wenn dasvon meiner Seite aus vielleicht ei bisschen Falsch rüber gekommen ist!
Ich dachte halt das der fehler in meinem "loop" liegt.
Deswegen wollte ich nicht mehr als nötig posten...
@Don
Ich wollte sicherlich auch nicht klug sch****n, hast du falsch aufgefast... Will doch was lernen und weiß ganz genau das ihr es besser könnt, wollte damit nur sagen das ich an das alles gedacht habe! =)
Zum Thema IF-schleife, muss ich jetzt mal weiter dran Arbeiten. So ganz will des noch nicht! Bei Hochsprachen ist das ja ruck zuck gemacht mit ner IF schleife! =) Aber bei Assembler muss man einiges beachten, das man nichts vergisst! =)
|
BID = 335924
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Ja, sry auch von mir, habe da ein wenig überreagiert.
Zurück zum Thema:
Also, wie sieht denn konkret dein Wunsch aus?
Also welche Bedingungen müssen erfüllt werden? Sollen Register verglichen werden oder sogar Variablen (, die man dann vorher aus dem RAM holen muss)?
Soll es auch sowas wie "else" dabei geben?
Du kannst das z.b. so machen:
;Taste hängt an portd, 3 und ist high-aktiv
loop: sbis pind, 3
rjmp loop
Klartext: Solange das Bit 3 nicht gesetzt ist, wird die Schleife loop - rjmp loop ausgeführt.
Es gibt natürlich kompliziertere Angelegenheiten, das muss dann Fall-abhängih programmiert werden, nicht allgemein.
_________________
|
BID = 335973
clembra Inventar
Beiträge: 5404 Wohnort: Weeze / Niederrhein
|
Also von einer "If-Schleife" hab ich noch *nie* gehört. Ich kenne zwar If-Bedingungen und For- bzw. Repeat-Until oder While-Schleifen, aber keine If...
Wenn man zwei Register miteinander vergleicht geht auch folgendes:
cp reg1, reg2 ; alternativ: cpi reg_high, 0x15
br?? sprungmarke ;max. +/- 127 Zeilen/Zähler
z.B. bei Register >= 64:
cpi r18, 0x40 ; =decimal 64
brsh groesser_gleich
Wenn man mit einem Branch-Befehl nur den nächsten Befehl überspringen möchte (z.B. RCALL), kann man sich auch die Sprungmarke sparen und "PC+2" schreiben
_________________
Reboot oder be root, das ist hier die Frage.
|
BID = 337845
Humus Aus Forum ausgetreten
|
Moin,
sorry hatte die kam die ganze Zeit nicht dazu mich zu melden!
@clembra ich meinte natürlich eine IF-Bedingung und keine IF schleife!
Also, den Source von mir hab ich ja schon gepostet, da will ich dann bei den LED einschalten immer überprüfen ob LEDs schon an sind, dass ich dann nur die Eine LED noch dazu schalte von der LED wo ich den Taster betätige...
Also so richtung IF/Else
aber irgendwie funktioniert das nicht so wie ich das gerne hätte... Irgendwie kam ich nicht so auf den grünen Zweig.
wäre cool wenn ihr mir vielleicht ein paar denk anstöße geben könntet... =)
|
BID = 337859
Jornbyte Moderator
Beiträge: 7178
|
Link
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 337924
Humus Aus Forum ausgetreten
|
@Don
hatte das schon mal mit diesem Befehl ausprobiert, weil er für mich in diesem moment recht logisch schien, aber irgendwie hat der nicht wirklich funktioniert. Weiß aber nich woran es lag...
Ich werde mich aber Später mal hinsetzen und mal schauen woran es liegt.
Danke für eure hilfe... Werde mich da mal irgendwie durcharbeiten
Mein Problem ist immer die Umsetzung meiner Ideen... Ich habe immer so viele Ideen und wie man es logisch lösen kann, bzw. lösen könnte aber mir fehlt immer der konkrete ansatz an befehlen in ASM.
|
BID = 337966
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Also, wenn man (anfängt) in ASM zu programmieren, muss man sich mit der Hardware auseinandersetzen. anders wird es nichts werden.
Mit Basic und anderem Dödelkram ist das was anderes: Da compiliert das Programm deinen Code und setzt in in hunderte ASM-Befehle um. Hier muss man das selber machen.
Konkret zu deinem Problem:
Angenommen, deine LED hängt an portd4. Du willst prüfen, ob sie an ist. (Gesetzt, dass eine log. 0 sie anschaltet):
...
sbic portd, 4 ;wenn das bit 4 in portd gelöscht ist, dann nächsten Befehl überspringen
rjmp istaus ;Springe zum Label istaus
rjmp istan ;springe zum label istan
istaus:
...
rjmp ende
istan:
...
ende:
...
So, das war einfach. Am besten, man baut nicht so viele Sprungbefehle ein, weil diese jeweils 2 Taktzyklen brauchen, aber so geht das auch. Man kann auch gleich an dem Sprungbefehl seinen Code schreiben, wenn dieser ein Befehl groß ist oder die Sprungmarke gleich einen Befehl später kommt. Aber das ist erstmal unwichtig, um zu verstehen, wie der Prozessor arbeitet.
Nun kannst du beim Label istan: oder istaus: deinen beliebigen Code schreiben.
Wenn du weitere Fragen hast, her damit. Ich finde es gut, dass Assembler gelernt wird!
_________________
|
BID = 338443
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Nur so aus Interesse an dem Fall. Funktionierts?
_________________
|