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
Werte sind in 2 Registern zwischengespeichert (einmal low und einmal highbyte); vor dem Vergleich wurden die Werte ins SRAM geschrieben
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
> Testende1: > ldi r16,0b11111111 > out PortB, r16 > rjmp Testende1 ...Und diese Endlosschleife ist auch Absicht?
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" ...
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 |
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.