Forum: Mikrocontroller und Digitale Elektronik low(-1) und ldi temp1, '0'-1?


von Kurt S. (ksch)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Philipp B. (philipp_burch)


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.

von Kurt S. (ksch)


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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
> Es gibt nämlich beim AVR (leider) keinen
> Add Immediate addi Befehl

Wozu sollte der addi denn gut sein? Würde doch nur Platz aufm Silizium 
verschwenden...

http://de.wikipedia.org/wiki/Atmel_AVR#Befehlssatz

Johann

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.