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
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
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.
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?
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
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.
...???
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
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...
gibt es noch andere Sprunganweisungen mit Bedingungen (ähnlich wie rjmp,
die der Prozessor unbedingt ausführen muss wenn eine Bedingung erfüllt
ist...?)
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.
...
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.
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"
...
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!
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.
...
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?