Forum: Mikrocontroller und Digitale Elektronik high(ramed), was ist das?


von HIGHLOWFRage (Gast)


Lesenswert?

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)

von MWS (Gast)


Lesenswert?

1000 ist eine Wordkonstante, die Register aber nur 8 Bit, also liefert 
high das Highbyte und low das Lowbyte der Konstanten.

von Andreas W. (geier99)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Such mal in der AVR-Assembler Hilfe (vom AVR-Studio) unter

Users Guide->Expressions

MfG Spess

von highlowfrage (Gast)


Lesenswert?

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?

von Rudof (Gast)


Lesenswert?

> 0b00001111
Da gibt es kein Low-Byte! Das ist ein Byte, sonst nix.

von watn dat? (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von lowhighfragen (Gast)


Lesenswert?

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???

von spess53 (Gast)


Lesenswert?

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

von Herr M. (herrmueller)


Lesenswert?

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

von Rolf H. (flash01)


Lesenswert?

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

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

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

von Herr M. (herrmueller)


Angehängte Dateien:

Lesenswert?

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

von Rolf H. (flash01)


Lesenswert?

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

von Rolf H. (flash01)


Lesenswert?

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
Noch kein Account? Hier anmelden.