mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assembler Probleme mit Sprungbefehl


Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich führe eine AD Wandlung durch von PA0, diese funktioniert auch, habe 
ich bereits getestet.
nun vergleiche ich das lowbyte mit einem bestimmten Wert; wenn der Wert 
kleiner ist, dann soll das Programm in Schleife1 springen ohne z3 zu 
laden (ldi z3,0xFF).
Im AVRStudio ist das auch so, nur sobald das Programm auf dem ATmega16 
läuft, funktionierts nicht mehr und er macht die Lamperl an, die ich zu 
testzwecken eingefügt habe. Weiß hier jemand Hilfe???
...
cpi lowbyte,0b01010111
brlo Schleife1  ; wenn lowbyte kleiner als 0b01010111 springe zu 
Schleife1

ldi z3,0xFF

Testende1:
        ldi r16,0b11111111
        out PortB, r16
        rjmp Testende1



Schleife1:.....hier gehts dann weiter

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stack nicht initialisiert??

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werte sind in 2 Registern zwischengespeichert (einmal low und einmal 
highbyte); vor dem Vergleich wurden die Werte ins SRAM geschrieben

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist denn die Anlage eines Stacks dazu notwendig?

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist prinzipiell egal, wann ich die Werte vergleiche, kanns auch 
direkt nachdem ich das lowbyte abgeholt habe vergleichen und es ändert 
nichts daran, dass der yC den Sprungbefehl ignoriert

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Controller den Sprungbefehl ignoriert, dann ist die 
Sprungbedingung nicht erfüllt!
Alternative: der Controller ignoriert den Sprung gar nicht und der 
Fehler tritt an anderer Stelle im Programm auf. Man müßte schon den 
gesamten Code sehen.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann Travel Rec. nur zustimmen. Mit dem Stack hat es sicher nichts zu 
tun, da keine Stack-relevanten Anweisungen vorhanden sind (nur 
Sprungbefehle, keine calls). Wie wäre es denn mal mit nem kompletteren 
Code?

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Fall du vor der Messung den Multiplexer schaltest, solltest du erst mal 
eine Messung machen und das Ergebnis verwerfen.
Ansonsten würde ich in Testende1 die Leds kurz einschalten und dann im 
Programm weitermachen.

MfG Spess

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstens:

Der Multiplexerbetrieb ist aus, ich kucke mir definitiv nur einen Kanal 
an.

Zweitens:

Das seltsame ist - bezüglich der Erfüllung der Sprungbedingung - :
Das AVR4Studio führt die Sprungbedingung aus, mal so, mal so, je nachdem 
- wie ich zu testzwecken - den lowbytewert z.B. lade ohne ans 
Entwicklerboard zu gehen.

Das Problem tritt nur auf wenn der yC es selbst macht und nicht das 
AVRSTudio.


...???

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der gesamte Code beinhaltet ca. 15 Seiten, die restlilchen Seiten sind 
jedoch unrelevant, die sind bereits gecheckt, nur diese eine Bedingung 
funktioniert eben nicht, der gesamte code würde nur total verwirren

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Testende1:
>        ldi r16,0b11111111
>        out PortB, r16
>        rjmp Testende1
...Und diese Endlosschleife ist auch Absicht?

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Totschleife ist nur als Test da, um festzustellen, in welche 
"Routine" er reinfällt...

Wenn sich jemand den wirklich ganzen Code antun mag, kann ich schon 
schicken, aber es wird ein weilchen dauern da durchzublicken...

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibt es noch andere Sprunganweisungen mit Bedingungen (ähnlich wie rjmp, 
die der Prozessor unbedingt ausführen muss wenn eine Bedingung erfüllt 
ist...?)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph wrote:
> gibt es noch andere Sprunganweisungen mit Bedingungen (ähnlich wie rjmp,
> die der Prozessor unbedingt ausführen muss wenn eine Bedingung erfüllt
> ist...?)

Ja, gibt es. Als bedingte Sprünge kommen alle BRanches (BRxx) in Frage, 
aber auch die Skips (SBxx). Eine sehr übersichtliche Zusammenfassung 
findest Du (ziemlich weit hinten) im Datenblatt.

...

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur sone IDEE:
Sicherst du im Interupt das SREG??
Das kann dir nämlich sosnt deine eben erst getestete Bedingung verhauen 
wenn der Interupt dazwischenfunkt.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läubi Mail@laeubi.de wrote:
> Nur sone IDEE:
> Sicherst du im Interupt das SREG??
> Das kann dir nämlich sosnt deine eben erst getestete Bedingung verhauen
> wenn der Interupt dazwischenfunkt.

In welchem Interrupt?? Er hat nichtmal einen Stack:
Beitrag "Re: Assembler Probleme mit Sprungbefehl"

...

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja keine Ahnung ein 15 Seiten ASM Programm ohne Interupts und ohne 
Stack...
Mir fällt sonst nix ein, auser vieleicht mal ein:
ldi lowbyte, 0x00
cpi lowbyte,0b01010111
brlo Schleife1  ; wenn lowbyte kleiner als 0b01010111 springe zu
Schleife1

ldi z3,0xFF

Testende1:
        ldi r16,0b11111111
        out PortB, r16
        rjmp Testende1

  

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Stack ist nicht notwendig da Daten direkt in einen externen SRAM 
gelesen werden und später auf eine SD Karte, aber das ist nebensächlich, 
hat mit der Sache nichts zu tun...

Ich kuck mal bzgl. des Interrupt-Tipps! Vielen Dank erstmal, das ist ein 
erster Ansatz!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph wrote:
> Ein Stack ist nicht notwendig

Ein Stack ist fast immer notwendig, da kaum ein ernstzunehmendes 
Programm ohne Unterprogrammaufrufe oder Interrupts auskommt.

> da Daten direkt in einen externen SRAM
> gelesen werden und später auf eine SD Karte,

Aha, SD-Card, vermutlich mit FAT, aber ohne Stack... - Wieder was 
gelernt...

> aber das ist nebensächlich,
> hat mit der Sache nichts zu tun...

Das denkst Du, das heißt aber noch lange nicht, dass es so ist.

>
> Ich kuck mal bzgl. des Interrupt-Tipps!

Vergiss die Interrupts, die gehen nur mit Stack. Aber Du willst und 
brauchst ja kein Stack.

> Vielen Dank erstmal, das ist ein
> erster Ansatz!

Wenn Dir jemand wirklich helfen soll (mir ist inzwischen die Lust dazu 
vergangen), dann lege Dein komplettes Programm in den Anhang. Und zwar 
so, wie Du es ohne Fehlermeldungen assemblieren konntest. Alles Andere 
wäre Unfug.

...

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woher weißt du überhaupt, welcher Wert bei der Ausführung des
cpi-Befehls in lowbyte steht? Der ist wahrscheinlich größer als
0b01010111, somit muss auch nicht gesprungen werden. Kannst du ihn zu
Testzwecken an die Lamperl ausgeben? Oder, wie Läubi vorschlägt, vor
dem cpi-Befehl auf einen definierten Wert in lowbyte laden?

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.