Forum: Compiler & IDEs Char und Int bei WinAVR; Resgisternamen


von Peter Z. (peter2)


Lesenswert?

Hallo,
ich habe 2 Fragen:

Was passiert wenn ich folgende sachen schreibe:

int i;
char c;
1.
i = c;

schreibt er hier das Char in die unteren 8 Bit des int?
2.
c = i;

nimmter er hier wieder die unteren 8 Bit des int?
3.
c |= i;

Was macht er hier? Nach welchen regeln läuft des denn insgesamt ab?

2. Frage
Wo kann ich die ganzen Registerdefinitionen nachlesen die nicht im DB 
stehen. z.B. das ADCH und ADCL = ADCW ist.

Gruß
Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter Z. wrote:

> Was passiert wenn ich folgende sachen schreibe:

Kannst du in jeder ordentlichen Abhandlung über C nachlesen.

> int i;
> char c;
> 1.
> i = c;
>
> schreibt er hier das Char in die unteren 8 Bit des int?

Ja, sofern du die Aussage für die unteren 8 Bits haben willst.
Für die oberen 8 Bits wurde keine Aussage getroffen. ;-)

Diese werden mit 0 gefüllt, sofern c >= 0 && c <= 0x7F ist,
mit 1 andernfalls.  Das ist übrigens unabhängig davon, ob der
Typ `char' vorzeichenbehaftet implementiert ist oder nicht.

> 2.
> c = i;
>
> nimmter er hier wieder die unteren 8 Bit des int?

Ja, was sonst?

> 3.
> c |= i;
>
> Was macht er hier? Nach welchen regeln läuft des denn insgesamt ab?

Du solltest dich ernsthaft mit dem Thema `integer promotion rules'
in C befassen.  Ist garantiert in diversen Tutorials erklärt.

In diesem Falle ist es aber unspektakulär, da nur die unteren 8 Bit
von i eine Rolle spielen.  Diese werden mit dem existierenden Inhalt
von c ver-oder-t.

> 2. Frage
> Wo kann ich die ganzen Registerdefinitionen nachlesen die nicht im DB
> stehen. z.B. das ADCH und ADCL = ADCW ist.

Wenn zwei aufeinanderfolgende Register ein 16-Bit-Register bilden,
haben sie zusätzlich zu den Einzelregistern eine entsprechende
Definition erhalten.  Dabei wird normalerweise einfach nur der Suffix
`L' und `H' weggelassen.  Der sich dabei aus ADCH und ADCL ergebende
Namen ADC ist jedoch zugleich ein gültiger Assemblerbefehl.  Da die
Datei <avr/io.h> auch für Assemblerprogrammierung nutzbar sein soll,
wird der Name ADC im Assembler-Kontext nicht definiert, und sowohl
im Assembler- als auch C-Kontext gibt es zusätzlich den Namen ADCW.

Beachte, dass nicht alle Register, bei denen man dergestalt einen
16-Bit-Namen bilden könnte, auch wirklich als 16-Bit-Register
implementierbar sind.  So liegt das UART-Baudratenregister UBRRxL
und UBRRxH manchmal hintereinander im Adressraum und kann als UBRRx
angesprochen werden, während die beiden Teile bei anderen AVRs auf
nicht aneinandergrenzenden Adressen liegen.
grenzende

von Peter Z. (peter2)


Lesenswert?

Hallo,
vielen Dank für deine Antwort. Werden mal nach den von dir genannen 
Schlagwörtern googlen.
Gruß
Peter

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.