www.mikrocontroller.net

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


Autor: Peter Z. (peter2)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Z. (peter2)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.