mikrocontroller.net

Forum: Compiler & IDEs Frage zu C-Code


Autor: André Wippich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.

Ich habe gerade etwas Schwierigkeiten wieder in C reinzukommen (2 Jahre
Pause, zwischendurch Assembler, PHP, Java und SQL g). Ich programmiere
jetzt einen ATmega162 in WinAVR mit der AVR-LIBC (vorher nur Assembler)
in C. Vielleicht kann mir jemand mit meinem Code helfen:

Also ich lese ein 8-bit-Register an RAM Adresse aus und speichere es in
einer Variable. Von diesem Byte einige Informationen:

Ist das erste Bit gesetzt?
Was ergeben die letzten vier Bits?
Beispiel: 1101 1010
-> Erstes Byte gesetzt; Die letzten vier ergeben 10

Das Register wurde bereits mit define als REG benannt.

Geht das so (?):
**************************************
CHAR temp = REG;

if ( (temp>>7) == 1)
{
    panic();
}

temp = REG;
char anz = (temp & 0x0F);
**************************************

Und anschließend muss ich die nächsten anz Bytes hinter der Adresse von
RAM auch auslesen (aber nicht mehr prüfen). Gibt es da eine einfache
Möglichkeit für? Wäre ziemlich umständlich, wenn ich das so machen
müsste:
if (anz >= 1) {var1 = REG1;}
if (anz >= 2) {var1 = REG2;}
.
.
.
if (anz >= 8) {var1 = REG8;}


Danke für Eure Hilfe!

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um anz zu testen geht deine if-Konstruktion nicht. Wenn z. B. anz 4 ist,
dann würden die ersten 4 Bedingungen zutreffen. Besser:

switch (anz)
{
 case 1: ...
 break;

 case 2: ...
 break;

 default:   // wenn kein Treffer
 break;
}

MW

Autor: André Wippich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.

Uops, das hab ich nicht ganz verständlich erklärt. Es sollen in dem
Fall die nächsten 4 Byte übernommen werden.

Es ist so, dass sich die erste RAM Zelle (REG) in einem externen Gerät
befindet und das erste Byte eine Botschfat darstellt. Die Botschaften
können aber unterschiedlich lang sein und das erste Byte enthält unter
anderem die Botschafts-Länge. Durch meine Abfrage will ich rauskriegen,
wieviele Byte ich noch einlesen muss.

Gruß, André

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.

  if ( (temp>>7) == 1)
  {
    panic();
  }

geht auch so:

  if (temp & 0x80)
    panic();

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim avr-gcc ist IIRC char per default unsigned, aber das ist vom
C-Standard nicht vorgeschrieben, daher:

Bitfummeleien bitte nur bei unsigned Datentypen!

Gerade das Shiften nach rechts ist so eine Sache, denn ob das oberste
Bit (das auch das Vorzeichen kodiert) mitgeschoben werden soll oder
nicht, hängt davon ab, ob der Datentyp vorzeichenbehaftet ist, oder
nicht. Konkret sagt der Standard:

6.5.7 Bitwise shift operators
...
5 The result of E1 >> E2 is E1 right-shifted E2 bit positions.
  If E1 has an unsigned type or if E1 has a signed type and a
  nonnegative value, the value of the result is the integral
  part of the quotient of E1 / 2^E2. If E1 has a signed type and a
  negative value, the resulting value is implementation-defined.

Also auf Verständlich: shiftet man einen vorzeichenbehafteten Wert mit
gesetztem höchsten Bit nach rechts, ist das Ergebnis
implementierungsabhängig. Kann also bereits beim nächsten
Compiler-Release anders sein, sowas will man in der Regel nicht.

Ob der char jetzt per default signed oder unsigned ist, ist ebenfalls
implementierungsabhängig, bei allen anderen Ganzzahltypen ist signed
der default!

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.