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
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.
> 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
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.
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
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
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.