AVR Assembler "Verzweigungen"

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 29 11 2024  10:57:19      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 | 3 Nächste Seite )      


Autor
AVR Assembler "Verzweigungen"

    







BID = 335655

clembra

Inventar



Beiträge: 5404
Wohnort: Weeze / Niederrhein
ICQ Status  
 

  



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
ICQ Status  


@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
ICQ Status  


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?

_________________


      Nächste Seite
Gehe zu Seite ( 1 | 2 | 3 Nächste Seite )
Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag       heute wurden bisher 5 Beiträge verfasst
© x sparkkelsputz        Besucher : 182422467   Heute : 1507    Gestern : 5459    Online : 258        29.11.2024    10:57
5 Besucher in den letzten 60 Sekunden        alle 12.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0419430732727