Wie kommen die Zahlen bei C/C++ Befehlen zustande?

Ich habe demnächst die Mikroprozessor Klausur und muss wahrscheinlich auch einige Sequenzen mit C/C++ schreiben. Nun meine Frage ist die, wie kommen die einzelnen Zahlen nach einem Befehl zustande?!? Ich bin absolut nicht sehr fit in der Materie und für jede Hilfe dankbar.

Als Beispiel:
WriteByte(PORT_C,0x06) <- Wo kommt die 0x06 her bzw. wie kann ich diese ermitteln?
oder als weiteres Bsp:
value_up = value & 0x10 <- 0x10 woher und wie?!?

Danke für die Mühen.

Howdy,

WriteByte(PORT_C,0x06) Der Subprozessor gibt über den Port N das Folgende zurück:

Bit 0,1,2,3: Index in Tabelle X
Bit 4: 0=Tabelle A, 1=Tabelle B
Bit 5,6,7: error code 

ReadPort(N,&value);
indexInTab = value & 0x0F; // bit 0-3
isTabB = value & 0x10; // nur bit 4
errCode = value & 0xE0; // nur bit 5-7

Dann würde man mit obigem Code den Index herausfinden können, ob Tabelle A oder B in Benutzung ist und den error code.

Gruß
S.

hallo.

Als Beispiel:
WriteByte(PORT_C,0x06) <- Wo kommt die 0x06 her bzw. wie
kann ich diese ermitteln?

ganz grob: ein port besteht aus mehreren pins, die du „ein- und ausschalten“ kannst. „einschalten“ heißt, du schreibst eine 1, „ausschalten“ heißt, du schreibst eine 0. entsprechend kannst du am jeweiligen pin versorgungsspannung oder 0 volt messen.

in deinem beispiel besteht der port vermutlich aus 8 pins (nennen wir die mal Port_C.0 bis Port_C.7), da er über einen 8bit-wert (0x06 = 00000110b) angesprochen wird.
die reihenfolge der binärziffern entspricht der reihenfolge der portpins.
Port_C.0 ist üblicherweise das LSB, also das rechteste bit, Port_C.7 das MSB, also das linkeste bit.
in deinem beispiel würden also Port_C.1 und Port_C.2 eingeschaltet.
daran könnten z.b. transistoren angeschlossen sein, die LEDs zum leuchten bringen, oder motoren laufen lassen, oder oder oder…
wären die an anderen pins, würde aus der 0x06 ein entsprechend anderer wert.

oder als weiteres Bsp:
value_up = value & 0x10 <- 0x10 woher und wie?!?

das ist eine bitweise UND-verknüpfung. welches bitmuster mit welchem wert verknüpft wird, hängt davon ab, was dein programm machen soll.
beispiel:
ein portpin (z.b. Port_C.4) ist als eingang konfiguriert, man will nur diesen pin (an dem z.b. ein schalter „up“ angeschlossen ist, während am nachbarpin der schalter „down“ hängt) lesen.
jetzt hat man aber nur eine funktion zum lesen des gesamten ports.
die befehle zum lesen des pins könnten lauten:
value = ReadByte(Port_C);
value_up = value & 0x10;

value ist 8bit groß und beinhaltet nach dem funktionsaufruf z.b. 00011100. dieser wert spiegelt den aktuellen zustand aller portpins wider.
nach der UND-verknüpfung mit 00010000 bleibt davon 00010000 übrig, weil nur diese bitposition in beiden werten auf 1 steht.
hätte diese bitposition in value den wert 0, wäre das ergebnis 0.
in value_up steht also entweder 00010000 (wenn an Port_C.4 versorgungsspannung anliegt) oder 00000000 (wenn Port_C.4 auf massepotential liegt).

man könnte dann im weiteren verlauf sagen
if (value_up != 0)
{
/* reagiere auf schalter „up“ */
}
ein if (value != 0) würde den zweck verfehlen, weil da ja noch weitere 1en stehen.

ich hoffe, das stiftet nicht noch mehr verwirrung…? :smile:

gruß

michael

Hallo

Als Beispiel:
WriteByte(PORT_C,0x06) <- Wo kommt die 0x06 her bzw. wie

Hallo ,

Als Beispiel:
WriteByte(PORT_C,0x06) ,

schreibe byte für port C mit wert 0x06

www.dewassoc.com/support/msdos/decimal_hexadecimal.htm

diese Tabelle Zeigt wie es in HEX (also mit 0x davor)
wie es Dezimal
und wie es Binar ist.

Dezimal ist nach dem 10er System
Hex ist im 16er System
Binar ist im 2er System

demzufolge gibt es bei HEX für mehr als 1 Stelle (0-9) die buchstaben a-f um die werte (bei dezimal 2 stellig) rauf bis 15 (von 0-15 = 16 Werte) zu bilden .

also ist Dezmal 10 in Hex ein a , 11 ein b , … dem stellen wir noch die 0 voran 0a und dann die Zeichen für Hex wert(0x) , macht 0x0a ,0x0b,…

in binare ist es dann

ach ja wie geht das nochmal also jeden 2ten werte gibt es ,wie bei einer Uhr , wo der kleiner Zeiger die 12 überquert , eine Bewegung des großer Zeigers um 1 und der kleine Zeiger startet wieder bei 0 .

so geht das auch bei den Zahlensystemen .

also bei Dezimal 16 ist es HEX 0x10 (f geht ja nur bis 15)

bei binare und
damit das auch mal in eine formel gegossen wird (wir programmieren ja variable)
sind es 2 werte .

1 = 2^0 = 1
1 = 2^1 = 2
1 = 2^2 = 4
1 = 2^3 = 8
1 = 2^4 = 16
1 = 2^5 = 32
1 = 2^6 = 64

wenn also alle Bits links gesetzt sind also 1 (0 oder 1 sind die möglichen Zustände)
dann addiert man links die entsprechenden werte und erhält den dezimal wert .
1+2+4+8+16 + 32+64 = 127

und wenn ich nur das 1 und das 3 bit habe

1 = 2^0 = 1
0 = 2^1 = 2
1 = 2^2 = 4
0 = 2^3 = 8
0 = 2^4 = 16
0 = 2^5 = 32
0 = 2^6 = 64

rechne ich 1+4 = 5

so und nun kommen binareoperatoren oder bitoperatoren

diese UND ODER arbeiten anders als angenommen wird

eine UND verknüpfung heisst, beide bit an der selben wertstelle sind gesetzt nur dann hat wird an derselben wertstelle das bit gesetzt .

wenn ich also dezimal 8 und dezimal 40 mit UND verknüpfe werden nur die bits gesetzt im ergebnis die bei beiden eine 1 haben .

0 = 2^0 = 1
0 = 2^1 = 2
0 = 2^2 = 4
1 = 2^3 = 8
0 = 2^4 = 16
0 = 2^5 = 32
0 = 2^6 = 64

0 = 2^0 = 1
0 = 2^1 = 2
0 = 2^2 = 4
1 = 2^3 = 8
0 = 2^4 = 16
1 = 2^5 = 32
0 = 2^6 = 64

besser zum vergleich übereinander
0001000
0001010

0001000

machen wir ein OR heist es wenn mindestens 1 bit gesetzt ist wird die gleiche wertestelle auch auf 1 gesetzt . das heist bei 0 und 1 => 1 , bei 1 und 1 => 1 und bei 1 und 0 => 1 , 0 und 0 ist 0. oder anders gesagt wenn kein bit gesetzt dann 0 .

0001000
0001010

0001010

Wo kommt die 0x06 her bzw. wie
kann ich diese ermitteln?
oder als weiteres Bsp:
value_up = value & 0x10 <- 0x10 woher und wie?!?

Danke für die Mühen.

Wie und was der Wert 0x06 nun wirklich bedeutet (könnte ein befehl sein ) oder warum
das 0x10 ist, muss entsprechenden Befehlssätzen oder Bitbelegungen entnommen werden .

Die anderen haben es ja schon ausführlich erklärt .

Für die die etwas Üben wollen , wäre jetzt eine Umrechnungsformel von
DEZ HEX
BIN HEX

als Hausaufgabe übrig geblieben .