Hallo, hierbei wird der Wert 250 in den Registern R16 und R17 geladen. Was bedeutet low und high? Was passiert hier genau? Ist unter Low die Null gemeint? ldi R16, low(250) ldi R17, High(250) VG
Das Register besteht aus 16 Bit, die in jeweils 8 Bit LOW und 8 Bit HIGH unterteilt sind. Die ersten 8 HIGH, die zweiten 8 LOW
high und low werden benutz um z.B. 16 Bit-Werte in getrennte Register zu laden. Dein Beispiel ist mittelprächtig, da low (250) = FA ist und high (250) = 0. Erst oberhalb von 255 wird es interessant. low (800) = 20 high (800) = 3 Wohl gemerkt es geht um konstante Zahlen
Lass Dir vom Assembler das LST-file herstellen, in dem siehst Du es. In die Klammer hat man eine Dezimalzahl geschrieben, die wohl auch größes als 255 sein darf und für die also nur eine 16 bit binärzahl reicht. Da sie nur 250dez ist, ist das hibyte Null und das lowbyte 11111010 oder: in der Klammer darf eine 16-bit-Konstante stehen, die aus zwei 8-bit-Zahlen besteht, eben hibyte und lobyte. 511 würde also geschrieben werden: ldi r16,low(511) ldi r17, high(511) in r16 würde dann ffh und in r17 01h stehen
Amateur schrieb: > high und low werden benutz um z.B. 16 Bit-Werte in getrennte > Register zu > laden. Was meinst du mit FA? 250 ist ein ADC-Wert. > Dein Beispiel ist mittelprächtig, da > low (250) = FA ist und > high (250) = 0. Wie hast du 20 und 3 ausgerechnet? > Erst oberhalb von 255 wird es interessant. > low (800) = 20 > high (800) = 3 > > Wohl gemerkt es geht um konstante Zahlen
Du weißt, das du für Assembler das Binär - und Hexadezimalsystem beherrschen mußt, oder? https://de.wikipedia.org/wiki/Hexadezimalsystem
:
Bearbeitet durch User
Markus schrieb: > Wie hast du 20 und 3 ausgerechnet? Ich hab einen Taschenrechner, der dezimal in hex umrechnet, mit einem einzigen Tastendruck (Ätsch!). ansonsten, zu Fuß: 3h = 3 x 256d = 768d (ist das hibyte) 20h = 32dez (ist das lobyte) 800dez also = 320h, das man als 3 im hibyte und als 20 im lobyte schreibt. Rechenfolge im einfachen Taschenrechner: 800 div 256 = 3,125 3h als hibyte merken, 3 von 3,125 abziehn, ergibt ,125 als Rest. ,125 mal 256 (vorherige Division aufheben) = 32 32 in hex umwandeln : 20h , das lobyte
:
Bearbeitet durch User
@ Markus Du solltest Dich mal mit Binär- und Sedezimalzahlen beschäftigen. 800 dezimal entspricht 0320 sedezimal. Trennst Du diese 16-Bit Zahl in ihre zwei 8-Bit Teile auf, so kommst Du auf (high) 03 und (low) 20. Natürlich kannst Du auch: ldi R16, 32 ldi R17, 3 schreiben. Mir klappt’s bei dieser Schreibweise die Zehennägel hoch. Oder ldi R16, 0x20 ldi R17, 0x3 Wenn Du am Fenster sitzt, wirf mal den Rechner an und stell ihn in den Programmiermodus um. Da kannst Du Dezimalzahlen in Sedezimalzahlen umwandeln und umgekehrt.
Ah oki danke 800 entspricht 320 -> High 3 -> low und 250 entspricht FA Warum ist high 0 ? Peter R. schrieb: > Lass Dir vom Assembler das LST-file herstellen, in dem siehst Du > es. > > In die Klammer hat man eine Dezimalzahl geschrieben, die wohl auch > größes als 255 sein darf und für die also nur eine 16 bit binärzahl > reicht. Da sie nur 250dez ist, ist das hibyte Null und das lowbyte > 11111010 Muss die Zahl größer als 255 sein? Was ist wenn die Dezimalzahl beispielsweise 185 ist? Danke
Markus schrieb: > Muss die Zahl größer als 255 sein? Was ist wenn die Dezimalzahl > beispielsweise 185 ist? > > Danke Die Zahlen 0d bis 255d passen in die 8 bit des lobyte, und im hibyte steht dann Null. Die größeren Zahlen belegen auch das hibyte. so ist 256 dann 0x00 in lobyte und 0x01 im hibyte (so schreibt man in C-syntax hex-Zahlen: 0x.. ) oder 0x0100 185 ist im lobyte 0xb9 (oder 0b10111001) und im hibyte Null, als 16bit,hex geschrieben: 0x00b9 davon käme b9 in das r16 und 00 in das r17
:
Bearbeitet durch User
@ Markus So wie 99 in zwei Dezimalstellen passt, so entwickeln sich Sedezimalzahlen auf ihre eigene Art: Dez. Hex. High Low 0254 00FE 00 FE 0255 00FF 00 FF 0256 0100 01 00 0257 0101 01 01 Also passt 255 in 2 Sedezimalstellen 256 braucht 3 Stellen (üblicherweise 4) so wie 99 in zwei Stellen passt und 100 drei Stellen benötigt.
Sorry in der Tabelle fehlt noch die Zehnägelhochklappspalte Dez. Hex. High Low High Low 0254 00FE 00 FE 0 254 0255 00FF 00 FF 0 255 0256 0100 01 00 1 0 0257 0101 01 01 1 1 Sedezimalzahlen entwickeln sich nicht auf der Basis 10 sondern auf der Basis von 16. Die Platzhalter hierfür sind: 0 1 2 3 4 5 6 7 8 9 A B C D E F Also: Dez. Hex. 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 A 11 B 12 C 13 D 14 E 15 F 16 10 17 11 ... ... 31 1F 32 20 33 21
Peter R. schrieb: > Markus schrieb: >> Muss die Zahl größer als 255 sein? Was ist wenn die Dezimalzahl >> beispielsweise 185 ist? >> >> Danke > > Die Zahlen 0d bis 255d passen in die 8 bit des lobyte, und im hibyte > steht dann Null. Die größeren Zahlen belegen auch das hibyte. > Da die Zahl 250 in ein 8 Bit Register passt bräuchte ich keinen zweiten Register d.h. anstatt ldi R16, low(250) ldi R17, High(250) kann ich auch ldi R16, 250 schreiben.Oder? Ich habe noch im Internet gelesen, dass bei einem 16 Bit- Wert, nur die Register ab R26 verwendet werden sollen ( anstatt R16,R17 sollen R26, R27)....
Markus schrieb: > Da die Zahl 250 in ein 8 Bit Register passt bräuchte ich keinen zweiten > Register d.h. anstatt > > ldi R16, low(250) > ldi R17, High(250) > > kann ich auch > > ldi R16, 250 > > schreiben.Oder? und ldi R17, 0 (oder eor R17, R17) weil Du ja nicht weist welcher Wert noch in dem Register enthalten ist ;-)
Markus schrieb: > Was meinst du mit FA? 250 ist ein ADC-Wert. Mit "FA" war natürlich "0xFA", "FAh" oder welche Schreibweise auch immer gemeint, also die zur Dezimalzahl 250 äquivalente Hexadezimalzahl gemeint.
Amateur schrieb: > Dein Beispiel ist mittelprächtig, da > low (250) = FA ist und > high (250) = 0. Ne das Beispiel passt genau, auch eine 0 muss geladen werden, da ja sonstwas im Register stehen kann.
> Ich habe noch im Internet gelesen, dass bei einem 16 Bit- Wert, nur die > Register ab R26 verwendet werden sollen ( anstatt R16,R17 sollen R26, > R27).... Ist das so richtig? Eine Frage noch zum Vergleich von Werten.. Wenn man die Inhalte zwei Register miteinander vergleicht, dann gibt es den Befehl cp z.b. cp R17, R18 und dann folgt in den mesiten Beispielen cpc ( wie cp aber mit Carry Flag). Ich habe nirgendswo eine ausführliche Erklärung (Carry Flag) gefunden. Kann mir jemand sagen was bei cpc gemacht wird? cp R17, R18 cpc R19, R20 Danke
Ja interessant wird es eben erst ab 256 Ich verwende z.B. in einer Division 3600 und dann schreibe ich eben ldi R16, low(3600) ldi R17, High(3600) als es erst mit dem Win-Taschenrachner auf 0000 1110 0001 0000 zu zerlegen und dann die Register mit ldi R16, 0b00010000 ldi R17, 0b00001110 Im ersten Fall erledigt das der Assembler für mich.
Ich habe gerade eine interessante Seite gefunden: http://www.avr-asm-tutorial.net/avr_de/index.html Da wirst du sicher fündig. Oder auch hier: http://www.atmel.com/Images/doc1022.pdf Im Studio kommst du über die Hilfe sicher auch dort hin. In der Annahme, es ist ein AVR.
Markus schrieb: >> Ich habe noch im Internet gelesen, dass bei einem 16 Bit- Wert, nur die >> Register ab R26 verwendet werden sollen ( anstatt R16,R17 sollen R26, >> R27).... Ist das so richtig? kommt darauf an was du machen willst, obersten 6 Register haben auch einen Namen mit dem die 16-Bit auf einmal angesprochen werden (X, Y und Z). Wenn du mit dem geladenen Wert im Anschluss auf eine Adresse des Speichers vom AVR zugreifen willst (lpm - Flash, ld / st - SRAM) dann musst du diese Register verwenden. Es gibt auch 2 16-Bit Befehle adiw und sbiw die nur mit den oberen 3 Registerpaaren funktionieren. > Eine Frage noch zum Vergleich von Wertsen.. Wenn man die Inhalte zwei > Register miteinander vergleicht, dann gibt s den Befehl cp > z.b. cp R17, R18 Ok > und dann folgt in den mesiten Beispielen cpc ( wie cp aber mit Carry > Flag). Ich habe nirgendswo eine ausführliche Erklärung (Carry Flag) > gefunden. Kann mir jemand sagen was bei cpc gemacht wird? > > cp R17, R18 > cpc R19, R20 da der AVR hier keine 16-Bit Befehle hat müssen Berechnugen (auch ein Vergleich ist eine Berechnung - nur das das Ergebnis nicht gespeichert wird) in zwei 8-Bit Operationen aufgeteilt werden. Liefert jetzt die 8-Bit Operation einen Übertrag (passiert wenn das Ergebnis >255 oder <0 wird) so muss dieser bei der Berechnung der zweiten 8-Bit berücksichtigt werden. Dazu wird durch die erste Operation das C-Flag (Carry) gesetzt und mit dem passenden Befehl (cpc, sbc, adc) der zweiten Operation berücksichtigt. Sascha
Das Ergebnis des ersten Vergleichs wird im Carrybit gespeichert und beim 2ten Vergleich mit einbezogen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.