Forum: Mikrocontroller und Digitale Elektronik C166 Einfache Speicherung


von Stumpf (Gast)


Lesenswert?

Hi,
ich hab 1-2 kleine Fragen zum c166

Wenn ich nun z.B.
1
Werte DB -20,6,1111B,'A'
Initialisier wie entsteht der Adressen Inhalt wenn ich nun z.B. in 100H, 
101H usw speichere

Bei dem Bsp. würde nun in 100H = EC, 101H = 06, 102H = 0F, 103H = 41 
stehen

EC ist mir noch klar per umrechnen also "-20" ->(2erKompliment = 12) -> 
"C" und ein E für das minus, aber den Rest verstehe ich nicht so ganz.

Dann noch eine Frage und zwar was passiert wenn ich z.B.
1
INDEX EQU 4
2
V1 DW 9,99,10,13,5
3
V2 DW 0xbebe, 0xade
4
MOV R0, #INDEX
5
MOV R1,#V2 + 2 ;?1
6
MOV R2,[R0 + #V1] ;?2
7
MOV R3,[R1] ;?3
8
MOV RH3,RL3 ;?4

durchlaufen bzw. wie kommen dann die genauen Werte von
R0 : 4
R1 : 0x10C
R2: A
R3: 0xDEDE

zustande also R0 ist mir auch klar aber bei R1 versteh ich den ablauf 
nicht mehr so ganz dieses "," sorgt für verwirrung bei mir.


Und dann noch eine Frage wenn ich z.B. einen Delay mit einen Timer 
erstellen möchte muss ich ja zuerst per Tabelle etc den Delay wert 
errechnen
1
  T3CON |=0x284;
2
  T3 = 39062;
3
  T2CON |= 0x27;
4
  T2 = 39062;
Bei diesem Beispiel ist der wert nun 39062 aber wozu benötige ich bzw 
wie komme ich auf die T3/T2CON werte?

Vielen Dank schon mal falls mir jmd helfen kann :)

von Stumpf (Gast)


Lesenswert?

Oder wird bei der ersten Frage einfach 1+1+1+1+11 = 15 bzw 0F gerechnet 
und 'A' hat den Char code 42?

von Stumpf (Gast)


Lesenswert?

41*

von Karl H. (kbuchegg)


Lesenswert?

Stumpf schrieb:
> Oder wird bei der ersten Frage einfach 1+1+1+1+11 = 15 bzw 0F gerechnet
> und 'A' hat den Char code 42?

2-er komplement
um -20 zu erhalten, geht man von +20 aus.
Binär ist die Bitdarstellung von 20 gleich 00010100
das jetzt einem 2-er Komplement unterziehen

   00010100
   11101011     alle Bits invertieren
   11101100     und noch 1 dazu addieren

als HexZahl ausgedrückt ist das: EC

Binär nach Hex (bzw. umgekehrt) ist simpel. Fass einfach jeweils 4 Bit 
zusammen und dann nach Schema:

    Binär  Dezimal  Hex        Binär  Dezimal  Hex
    0000      0      0         1000     8       8
    0001      1      1         1001     9       9
    0010      2      2         1010    10       A
    0011      3      3         1011    11       B
    0100      4      4         1100    12       C
    0101      5      5         1101    13       D
    0110      6      6         1110    14       E
    0111      7      7         1111    15       F

Das Bitmuster 01101001 ist also 0110 1001
                                  |    |
                                  v    v
                                  6    9

binär 01101001 ist also dasselbe wie hexadezimal 69
(Aber Vorsicht: Bei der Umrechnung auf dezimal geht das nicht so 
einfach. Das Bitmuster 01101001 wäre dezimal 6 * 16 + 9 -> 105. Deswegen 
benutzt man unter anderem gerne Hex, weil man damit Bitmuster leicht in 
Form einer Zahl darstellen kann, ohne dass das Bitmuster verschleiert 
wird)

jetzt nimmst du dein fragliches Bitmuster her: 1111B, ergänzt mit 
führenden 0-en auf die üblichen 8 Bit: 00001111 und kriegst 0F als 
korrespondierende Hex-Zahl.

> und 'A' hat den Char code 41?
Einfach mal in eine ASCII Tabelle schauen. :-)

von Stumpf (Gast)


Lesenswert?

Macht sinn ^^ vielen dank schonmal :D und wie sieht es mit dem Rest aus? 
Also da hab ich wirklich keine Ahnung

von Guido B. (guido-b)


Lesenswert?

1
INDEX EQU 4
2
V1 DW 9,99,10,13,5
3
V2 DW 0xbebe, 0xade
4
MOV R0, #INDEX
5
MOV R1,#V2 + 2 ;?1
6
MOV R2,[R0 + #V1] ;?2
7
MOV R3,[R1] ;?3
8
MOV RH3,RL3 ;?4

Macht folgendes (Obacht: V1 und V2 sind als Words deklariert,
belegen also 2 Bytes):

Lade den Wert von Index nach R0: R0 := 4
Lade den Wert von V1 nach R1 und addiere 2 dazu: die Adresse auf
der V1 liegt + 2;

Lade den Wert der Speicherzelle von V1 + R0 (=4) nach R1, das ist die
10 in der Liste V1 = 0x0Ah;

Lade den Wert der Speicherzelle auf die R1 zeigt nach R3, R1 ist V2 + 2,
also R3 := 0x0ADE;

Kopiere das LowByte von R3 in das HighByte von R3: R3 := 0xDEDE;

von Stumpf (Gast)


Lesenswert?

Guido B. schrieb:
> Lade den Wert von V1 nach R1 und addiere 2 dazu: die Adresse auf
> der V1 liegt + 2;
>
> Lade den Wert der Speicherzelle von V1 + R0 (=4) nach R1, das ist die
> 10 in der Liste V1 = 0x0Ah;
>
> Lade den Wert der Speicherzelle auf die R1 zeigt nach R3, R1 ist V2 + 2,
> also R3 := 0x0ADE;

Sorry aber ich hab das nun nicht ganz so Verstanden bei dem Ersten muss 
ja der V2 Wert + 2 in R1 was aber ist hier genau der Wert von V2? Da 
sind ja 2 Werte drinne oder wie wird das komma gedeutet.

Beim 2ten V1 + 4 wie genau kommt man nun auf die 10? 4-1 = 3 und dann 
den 3ten Wert von V1 nehmen? D:

von Guido B. (guido-b)


Lesenswert?

Stumpf schrieb:
> bei dem Ersten muss
> ja der V2 Wert + 2 in R1 was aber ist hier genau der Wert von V2?

V2 ist ein Label und sein Wert (aufgerufen durch das "#") ist seine
Adresse. Die kennt nur der Assembler, wir kennen sie nicht.

Stumpf schrieb:
> Beim 2ten V1 + 4 wie genau kommt man nun auf die 10? 4-1 = 3 und dann
> den 3ten Wert von V1 nehmen? D:

V1 zeigt auf die 9, (V1 + 2) auf die 99 und (V1 + 4) auf die 10. Dass
der Zeiger gemeint ist, wird wieder mit dem "#" angegeben.

von Stumpf (Gast)


Lesenswert?

Uff warum genau 10? wenn es nun +3 gewesen wär hät ich es nun ja 
nachvollziehen können =/

von Guido B. (guido-b)


Lesenswert?

Guido B. schrieb:
> (Obacht: V1 und V2 sind als Words deklariert,
> belegen also 2 Bytes):

#V1 + 4 bedeutet das dritte Word der Liste und das ist 10.

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.