was bedeutet low... bzw. high? gibt es in dem avr-tutorial, wo diese beiden sachen erklärt werden? manchmal steht auch in der klammer high(ramed), es wäre toll zu wissen, was das bedeutet. subi adlow, low(-1000) ; nach Unterlauf wieder einmal addieren sbci adhigh, high(-1000)
1000 ist eine Wordkonstante, die Register aber nur 8 Bit, also liefert high das Highbyte und low das Lowbyte der Konstanten.
HIGHLOWFRage schrieb: > was bedeutet low... bzw. high? gibt es in dem avr-tutorial, wo diese > beiden sachen erklärt werden? manchmal steht auch in der klammer > high(ramed), es wäre toll zu wissen, was das bedeutet. low(zahl) nimmt das Low-Byte von zahl high(zahl) nimmt das Highbyte von zahl
Andreas W. schrieb: > low(zahl) nimmt das Low-Byte von zahl Aber was ist denn das Low-Byte von Zahl? Angenommen Zahl ist 0b00001111 - was wäre davon lowbyte?
highlowfrage schrieb: > Angenommen Zahl ist 0b00001111 - was wäre davon lowbyte? Das Ganze. 0000 oberes Nibble, 1111 unteres Nibble, ist ja ein Byte. Zu lowbyte/highbyte braucht es schon ein Wort aus zwei Bytes.
Hi
>Angenommen Zahl ist 0b00001111 - was wäre davon lowbyte?
Da du anscheinend nicht mit der Hilfe zurecht kommst:
LOW(expression) returns the low byte of an expression
HIGH(expression) returns the second byte of an expression
BYTE2(expression) is the same function as HIGH
BYTE3(expression) returns the third byte of an expression
BYTE4(expression) returns the fourth byte of an expression
LWRD(expression) returns bits 0-15 of an expression
HWRD(expression) returns bits 16-31 of an expression
PAGE(expression) returns bits 16-21 of an expression
Also ist 0b00001111 das Lowbyte. Das Highbyte wäre dann $00.
MfG Spess
Hmm,kompliziert. Ich dachte, die Register sind alleimmer 8bit groß und wenn ich ein 16.bit.Register haben will, dann muss ich es mir selber basteln, z.B. Bit1 = r16; bit2 = r17; und dann bilden bit1bit2 ein 16bit-Register. Oder kann ich mir auch selber ein 16bit-Register kreieren, dass ich dann mit nur einer Variablen ansprechen kann? also wären in dem 16-bit-register low(...) die bits 0-7 und high 8-15???
Hi >Hmm,kompliziert. Ich dachte, die Register sind alleimmer 8bit groß und >wenn ich ein 16.bit.Register haben will, dann muss ich es mir selber >basteln, z.B... Du bringst hier einiges durcheinander. Ein Ausdruck (Expression) kann größer als 8Bit sein. Low, High und Konsorten picken einen 8Bit-Wert für ein Register heraus. >Oder kann ich mir auch selber ein 16bit-Register kreieren, dass ich dann >mit nur einer Variablen ansprechen kann? Du bist auf Assemblerebene. Da gibt es keine Variablen im Sinn von höheren Programmiersprachen. Ein paar Assemblerbefehle können mit die mit Doppelregistern (16Bit) umgehen. Aber je nach Befehl nur mit bestimmten Registerkombinationen. Es gibt aber Definitionen für Pseudo-16-Bit-Register, nämlich X,Y und Z. Und dafür gibt es auch Assemblerbefehle, die damit umgehen können. MfG Spess
lowhighfragen schrieb: > Hmm,kompliziert. Ich dachte, die Register sind alle immer 8bit groß und > wenn ich ein 16.bit.Register haben will, dann muss ich es mir selber > basteln, z.B. > > Bit1 = r16; > > bit2 = r17; > > und dann bilden bit1bit2 ein 16bit-Register Genau so ist es ja auch, also, es bleiben 2 8bit Reg. aber für Dich ist ein 16bit Wert - den kannst aber nicht mit nur einem Befehl verarbeiten. Wenn Du also dieses 'Registerpaar' mit einer 16bit Zahl (0-65535) belegen willst, zb. dez. 12345, dann kannst Du es in Hexadezimal umrechnen -> dez. 12345 -> (hex. $3039) und schreiben: ldi R16,$30 ldi R17,$39 oder in Binaer umrechnen 0b00110000_00111001 und schreiben: ldi R16,0b00110000 ldi R17,0b00111001 oder gar nicht selbst rechnen, sondern den Assembler rechnen lassen: ldi R16,high(12345) ldi R17, low(12345) was dann der Assembler ausrechnet und durch die Wert $30 bzw. $39 ersetzt. Alle 3 Versionen ergeben den gleichen Code. Das ist das Gleiche wie zB. ldi R16,3*8 und der Ass. macht daraus ldi R16,24 oder addi R16,'A' und der Ass. macht daraus addi R16,$41 ;(ASCII von 'A') ... Falls Du nun zu so einem Registerpaar was addieren willst, geht das nicht mit nur einem Befehl, sondern Du must erst zu R17 und dann mit Übertrag zu R16 addieren. Wie Spess schon schrieb: >Such mal in der AVR-Assembler Hilfe (vom AVR-Studio) unter >Users Guide->Expressions und dann war da noch: RAMEND, das ist die höchste RAM Adresse, die der jeweilige µC hat und die ist in der .include Datei als RAMEND definiert. Bei grösseren Controllern kann der Wert >256 (1Byte) sein, deshalb teilt man ihn mit Low/High auf 2 Register auf, wenn man damit rechnen will. Auch das Wort RAMEND wird vom Assembler durch den dort angegebenen Wert ersetzt. gruss herrmueller
Hallo Leute, interessant, was hier zu lesen ist. Habe mir auch oft schon Gedanken gemacht, was sich nur hinter den Begriff (RAMEND) verbirgt. Nun habe ich mal ein einfaches Programm (LED=EIN/AUS) über den Debugger laufen lassen, und stellte fest, daß im Stack der Wert 9F abgelegt wurde ;AVR: Tiny 13 .INCLUDE "tn13def.inc" .EQU takt = 1000000 .DEF akku = r16 #define test PINB,PB3 rjmp start start: ldi akku,LOW(RAMEND) out SPL,akku ldi akku,0b00000001 out DDRB,akku ldi akku,0b00001000 out PORTB,akku ;PULLUP wie muß ich das verstehen mit den 9F? Außerdem habe ich den PC abgesucht nach solch einer "Include" Datei...und nichts gefunden, merkwürdig! Grüße Rolf
Hi >wie muß ich das verstehen mit den 9F? Das ist einfach die höchste Adresse im RAM. Befehle wie rcall, call und push legen dort Adressen bzw. Registerinhalte ab. Und befehle wie ret oder pop holen sich die Werte von dort. >Außerdem habe ich den PC abgesucht nach solch einer "Include" >Datei...und nichts gefunden, merkwürdig! Brauchst du eigentlich nicht suchen. Beim 4er Studio findest du die Datei nach dem Assemblieren in der Projektverwaltung (Anhang). Die Include-Dateien befinden sich im AVR-Studio-Verzeichnis unter AVRASSEMBLER(2)->APPNOTES bzw. AVRASSEMBLER->INCLUDE (5er Studio). MfG Spess
Rolf Hegewald schrieb: > wie muß ich das verstehen mit den 9F? > Bitte auch immer mal wieder einen Blick in das Datenblatt (='Bedienungsanleitung') des µC werfen. Da ist zB. auf S.14 eine Darstellung des RAM Bereichs, woraus man erkennen kann, dass der freie Ram Bereich beim Tiny13 von $60-$9F geht. > Außerdem habe ich den PC abgesucht nach solch einer "Include" > > Datei...und nichts gefunden, merkwürdig! '.include' ist die Anweisung für den Assembler, den Inhalt der Datei in den Quelltext einzufügen. Die Datei heisst in Deinem Fall, wie in der ersten Zeile Deines Programms, 'tn13def.inc' und befindet sich da, wo Spess es geschrieben hat. Dort sind die leichter zu merkenden Bezeichnungen von wichtigen Speicherstellen oder Bitpositionen definiert. Deshalb kannst Du zum Beispiel 'PORTB' schreiben: ldi akku,0b00001000 out PORTB,akku und musst nicht diesen allerseits ungeliebten Blick ins Datenblatt werfen, um dort die Speicheradresse des PORTB rauszufinden ($18), um dann ldi akku,0b00001000 out $18,akku zu schreiben, was wiederum keiner versteht. Damit das nicht jeder selbst definieren muss, war Atmel so nett. Die Datei kannst Du mit einem Editor anschauen. gruss herrmueller
danke für Eure Antworten! Ich speichere es in den Favoriten ab, um es dann geistich zu verarbeiten. Viele Grüße und ein gesundes NEUES JAHR wünscht Euch Rolf
Hallo Herrmueller, habe mir soeben mal die .inc Datei vom Tiny13 angeschaut. Sehr interessant, wie viele Befehle man als Anfänger doch schon kennt. Ich setze den größeren Tiny2313 in einer Modelleisenbahn Spur H0 ein, also vorwiegend im Steuerungsbereich. Ein Container-Laufkran mit 2 Motoren (AUF/AB...RECHTS/LINKS) ist im alten Jahr noch in Betrieb gegangen. Hat mich aber auch Nerven gekostet. Der kleine Tiny13 wird für Modellsegler als Ortungspieper vorbereitet. Grüße Rolf
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.