mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 6 einfache Assembler Zeilen gehen nicht.


Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte von einem Register, R17, die konstante 100 abziehen. Ist das 
Ergebnis kleiner Null, soll es Null sein:
  ldi r17 , 156
    subi r17, 100

    in r16, sreg
    sbrc r16,0
    clr r17
    nop

Wieso funktioniert das so nicht?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann nichts Fehlerhaftes daran finden. Vielleicht glaubst du 
irrtümlich, das es nicht funktioniert?

Du kannst es aber einen Tick einfacher machen:
    ldi  r17 , 156
    subi r17, 100
    brcc _IsGreaterZero
    clr  r17
_IsGreaterZero:
    nop

Autor: peterhoppe59 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst r17 testen, testest aber das r16 (Statusregister) auf 0.
Du testest auf 0, nicht auf <0.

ldi r17,..
subi r17,..
brlo blah   ;Ohne Vorzeichen!
.
.
blah:
clr r17

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@peterhoppe59: Er hat zwar den Trick mit den bedingten Sprüngen abhängig 
von den Flags noch nicht kapiert, aber es ist durchaus möglich, einzelne 
Bits vom Statusregister explizit zu testen. Exakt das macht er hier mit 
R16.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>...testest aber das r16 (Statusregister) auf 0.

Nein, er testet das Bit Nr. 0 des SREG. Das ist das Carry-Bit.

Autor: Volker G. (voga2073)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@peterhoppe59: ...und er testet nicht r16, sondern die letzte Operation, 
die das Carry-Flag gesetzt hat und das war subi (siehe AVR-Datenblatt).

Autor: Michael Fr. (nestandart)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi r17,156
subi r17,100 ; Subtract 100 from r17
brpl R17_IS_POSITIVE ; Branch if r17 positive
clr r17
R17_IS_POSITIVE:

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Fr. wrote:
>
> brpl R17_IS_POSITIVE ; Branch if r17 positive
> 

Nein. Das ist falsch: 10-200 ist zB positiv in 8-Bit Arithmetik (da 
66.7=0)

Der richtige Vergleich geht auf's Carry, also BRCC oder BRCS bzw. BRLO 
oder BRSH. Wobei die beiden letzteren nur Alias für die beiden ersteren 
sind.

Johann

Autor: Peter Hoppe (peterhoppe59)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
>>...testest aber das r16 (Statusregister) auf 0.
>
> Nein, er testet das Bit Nr. 0 des SREG. Das ist das Carry-Bit.

Ja, Ihr habt Recht. Sorry für die Verwirrung.

MFG Peter

Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wollte keinen Sprung Befehl benutzen, da ich diese Zeilen 4 mal 
nacheinander ausführen muss. Ich müsste dann also 4 Sprungmarken 
definieren und das wollte ich vermeiden. Aber Egal: Als ich gemerkt 
habe, dass es nicht funktioniert, HABE ich schon die Variante mit 
Sprungmarke getestet, das hat aber auch nicht funktioniert.

Stelle ich die Zeilen am Anfang des Programms, funktionieren sie (mit 
dem Debugger in Einzelschritt) prächtig!

An der Richtigen Stelle, wird das "CLR R17" IMMER ausgeführt. R17 ist 
nach den Anweisungen also immer 0.

Das einzige, was ich mir jetzt vorstellen könnte, ist dass nach dem SUBI 
das Programm von einem Interrupt unterbrochen wird und dass die 
Interrupt-Routine das C-Flag setzt. Jedoch sichere ich eigentlich in der 
Interrupt-Routine die Status Flags....

Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, habe den Fehler gefunden.

Die Zahl in R17 war ursprünglich eine 2 Byte Zahl. Nachdem ich aber 100 
subtrahiere, wurde sie zur 1 Byte Zahl. Also wurde bei SUBI R17,100 Das 
Carry Flag IMMER gesetzt. Deshalb dachte ich fälschlicherweise, es wäre 
ein Fehler in den paar Zeilen.

Die Lösung: ich ziehe von der 2 Byte Zahl in R17 UND R18 100 ab. R18 
muss danach 0 sein, ist es 255, fand ein Überlauf statt...

Klappt Wunderbar.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann die Sprungbefehle (br**, rjmp) auch ohne Sprungmarken 
verwenden:
    ldi  r17, 156
    subi r17, 100

    brcc PC+2         ; PC = program counter
    clr  r17

    nop

>Die Lösung: ich ziehe von der 2 Byte Zahl in R17 UND R18 100 ab. R18
>muss danach 0 sein, ist es 255, fand ein Überlauf statt...

Hoffentlich machst Du das ordentlich, sonst liegt der nächste 
"unerklärliche" Fehler schon auf der Lauer.

Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem PC + 2 ist gut, gefällt mir... ist fast wie früher ;-)

Denke schon dass ich das Ordentlich mache, bisher funktioniert zumindest 
alles. Naja fast alles. Das nächste Problem lauert schon in der Ecke und 
wartet nur darauf losgelassen zu werden. ;-) Hat aber nichts hiermit zu 
tun...

Vielen Dank für Eure Hilfe!!!

Autor: Kachel - Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das mit dem PC + 2 ist gut, gefällt mir... ist fast wie früher ;-)

Stimmt, das ist gut, besonders für Macros. Achte aber darauf, welche 
Befehle Du damit überspringst. Denn nicht jeder Befehl passt in ein 
Word. Wenn man das nicht berücksichtigt, dann hat man sich schnell mal 
verzählt.

Was hast Du eigentlich für eine Motivation, Labels einsparen zu wollen? 
Labels fressen doch keine Ressourcen im AVR, und im PC verriecht sich 
deren Ressourcenverbrauch.

KH

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Stimmt, das ist gut, besonders für Macros.

In Macros kannst du ganz normal Labels einsetzen.

MfG Spess

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.