low(-1) und ldi temp1, '0'-1?

OP #1261413
Lesenswert?

Hallo zusammen

Ich habe vor kurzem damit begonnen mit AVR's herumzuspielen und habe 
dazu ein STK500 und Atmega8 gekauft. Atmega8 einfach da sie im tutorial 
meistens auch benutzt werden.

Nun stehe ich im Tutorial beim ADC und verstehe vorallem zwei spezielle 
Befehle nicht, zu denen ich auch sonst nichts gefunden habe.

ldi ztausend, '0'-1

Dabei geht es mir um "'0'-1", das ich nicht verstehe. Wofür steht das, 
was macht das?

Das zweite:
subi temp3, low(-1)

Hier geht es mir um "low(-1)". Wofür das low und das high stehen ist mir 
klar, aber mit einem -1?
Gebe ich das, mit "ldi temp1, low(-1)", auf meinem display aus ergibt 
das 255, das heisst alle Bits sind gesetzt. Laut dem tutorial wird aber 
so 1 Addiert, das hab ich gesehen, verstehe es aber nicht.

Zum Schluss doch noch Danke für das wirklich gute Tutorial :)

Danke für eure Hilfe und Grüsse
Kurt
Moderator Persönliche Seite #1261427
Lesenswert?

Kurt S. schrieb:

> Dabei geht es mir um "'0'-1", das ich nicht verstehe. Wofür steht das,
> was macht das?

Eins weniger als der (ASCII-)Wert der Ziffer 0.  Wenn du zu dieser
Zahl wieder eine 1 addierst, hast du wieder eine Ziffer 0, addierst
du eine 2, hast du eine Ziffer 1 usw.  (Aufsteigende Reihenfolge
der Ziffern von 0 bis 9 ist eine Grundforderung an jeden vernünftigen
Zeichensatz.)

> Hier geht es mir um "low(-1)". Wofür das low und das high stehen ist mir
> klar, aber mit einem -1?
> Gebe ich das, mit "ldi temp1, low(-1)", auf meinem display aus ergibt
> das 255, das heisst alle Bits sind gesetzt.

Ja.  Es ist gewissermaßen der Bytewert der Zahl -1.  Eigentlich kann
man den low-Operator auch weglassen, denn wenn das Ziel sowieso nur
8 bits breit ist, kommt genau das raus: 8 gesetzte Bits.
Moderator (Firma: Titel) Persönliche Seite #1261429
Lesenswert?

> Laut dem tutorial wird aber
> so 1 Addiert, das hab ich gesehen, verstehe es aber nicht.
dort steht wohl eher sowas
subi r16,low(-1)

Es gibt nämlich beim AVR (leider) keinen
Add Immediate addi Befehl
deshalb muß die Konstante, die addiert werden soll, erst negiert und 
dann subtrahiert werden.

> ldi ztausend, '0'-1
Vom Binär-Wert einer ASCII-'0' wird eins abgezogen.
Sieh dir mal eine ASCII-Tabelle an, dort ist angegeben, dass '0' = 48 
ist. Nach der Operation steht also im Register ztausend der Wert 47
#1261431
Lesenswert?

Kurt S. schrieb:
> ldi ztausend, '0'-1
>
> Dabei geht es mir um "'0'-1", das ich nicht verstehe. Wofür steht das,
> was macht das?

'0' ist eine Char-Konstante, entspricht also dem numerischen Wert des 
ASCII-Zeichens "0" (0x30). Siehe ASCII-Tabelle. Und davon wird dann halt 
noch 1 abgezogen.

> Das zweite:
> subi temp3, low(-1)
>
> Hier geht es mir um "low(-1)". Wofür das low und das high stehen ist mir
> klar, aber mit einem -1?
> Gebe ich das, mit "ldi temp1, low(-1)", auf meinem display aus ergibt
> das 255, das heisst alle Bits sind gesetzt. Laut dem tutorial wird aber
> so 1 Addiert, das hab ich gesehen, verstehe es aber nicht.

Ja, das ist eine "Eigenart" des Controllers. Der kennt nur subi 
(Subtract immediate from register), aber kein addi, da man das eine vom 
anderen ableiten kann. Kannst du dir so vorstellen:
x + 1 = x - (-1)
Das low() kann man auch weglassen, der Wert wird ohnehin auf 8 Bit 
gekürzt.
OP #1261502
Lesenswert?

Das ging ja schnell. Vielen Dank erstmal für die Antworten.

Die Rechnung "subi temp3, -1" hab ich jetzt verstanden, wird ja auch bei 
der Arithmetik im tutorial beschrieben. Habs aber erst jetzt 
begriffen...

Sieht man, bei der 0, dass es ASCII ist an den einfachen 
Anführungszeichen (')? Mache ich das ganze ohne diese Wird es normal als 
Dezimalzahl angesehen.

@ Lothar Miller
Da steht schon temp3 aber zeigt auf r18 mit .def.

Danke nochmals

Gruss
Kurt

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren