www.mikrocontroller.net

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


Autor: Kurt S. (ksch)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kurt S. (ksch)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

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.