Forum: Mikrocontroller und Digitale Elektronik Assembler Probleme mit Sprungbefehl


von Christoph (Gast)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

stack nicht initialisiert??

von Christoph (Gast)


Lesenswert?

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

von Christoph (Gast)


Lesenswert?

Ist denn die Anlage eines Stacks dazu notwendig?

von Christoph (Gast)


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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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.

von Johannes M. (johnny-m)


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?

von Spess53 (Gast)


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

von Christoph (Gast)


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.


...???

von Christoph (Gast)


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

von Johannes M. (johnny-m)


Lesenswert?

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

von Christoph (Gast)


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...

von Christoph (Gast)


Lesenswert?

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

von Hannes L. (hannes)


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.

...

von Läubi .. (laeubi) Benutzerseite


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.

von Hannes L. (hannes)


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"

...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

ja keine Ahnung ein 15 Seiten ASM Programm ohne Interupts und ohne 
Stack...
Mir fällt sonst nix ein, auser vieleicht mal ein:
1
ldi lowbyte, 0x00
2
cpi lowbyte,0b01010111
3
brlo Schleife1  ; wenn lowbyte kleiner als 0b01010111 springe zu
4
Schleife1
5
6
ldi z3,0xFF
7
8
Testende1:
9
        ldi r16,0b11111111
10
        out PortB, r16
11
        rjmp Testende1

  

von Christoph (Gast)


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!

von Hannes L. (hannes)


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.

...

von yalu (Gast)


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?

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
Noch kein Account? Hier anmelden.