Forum: Mikrocontroller und Digitale Elektronik Array einlesen in C (AVR Studio)


von Luke (Gast)


Lesenswert?

Hallo!

Ich habe in einem  "uint8_t rxbuffer[100]" Daten liegen.
Ich möchte diese Daten in einem normalen Byte wie folgt definiert " 
uint8_t data1" einlesen.

z.B. steht bei rxbuffer[10]: decimal 30. ( Ich sehe im Debug Modus im 
AVR Studio das ich diese Daten tatsächlich drinnen hab im rxbuffer)
Ich habe versucht über "byte1 = rxbuffer[10];" sowohl auch mit "byte1 = 
*(rxbuffer+10);" die Daten einzulesen.
Kein Erfolg.

Was mache ich denn falsch?
PS:Ich bekomme keine Fehlermeldung beim compilieren im AVR Studio

Danke

von Georg G. (df2au)


Lesenswert?

Luke schrieb:
> "byte1 = rxbuffer[10];"
das ist richtig so. Wenn dennoch ein nicht erwartetes Ergebnis kommt, 
liegt der Fehler an anderer Stelle.

> sowohl auch mit "byte1 = *(rxbuffer+10);"
Wenn das dein Compiler ohne Warnungen frisst, solltest du die entweder 
die Einstellungen ansehen oder einen anderen Compiler aussuchen. Nicht 
alles, was syntaktisch akzeptabel ist, ergibt das gewünschte Ergebnis.

von Rainer V. (rudi994)


Lesenswert?

Luke schrieb:
> in einem normalen Byte wie folgt definiert "uint8_t data1" einlesen.
> versucht über "byte1 = rxbuffer[10];"

Was denn nun?

von Stefan S. (chiefeinherjar)


Lesenswert?

Einfach mal ganz doof und nur der Vollständigkeit halber:
Du schreibst, dass dein Datenbyte wie folgt heißt: uint8_t data1

Nachher schreibst du allerdings "byte1 = rxbuffer[10];" ist das 
richtig?! Habe es so verstanden, dass es wie folgt heißen soll: data1 = 
rxbuffer[10];

Will nicht deine Intelligenz in Frage stellen, aber manchmal hat man ein 
extrem großes Brett vorm Kopf ;)

EDIT: Bin anscheinend nicht der einzige dem das aufgefallen ist ^^

von dummy (Gast)


Lesenswert?

>Was mache ich denn falsch?

Setz den Breakpoint eine Zeile unter

byte1 = rxbuffer[10];
>hier hin

von Luke (Gast)


Lesenswert?

Stefan Schmidt schrieb:
> Einfach mal ganz doof und nur der Vollständigkeit halber:
> Du schreibst, dass dein Datenbyte wie folgt heißt: uint8_t data1
>
> Nachher schreibst du allerdings "byte1 = rxbuffer[10];" ist das
> richtig?! Habe es so verstanden, dass es wie folgt heißen soll: data1 =
> rxbuffer[10];
>
> Will nicht deine Intelligenz in Frage stellen, aber manchmal hat man ein
> extrem großes Brett vorm Kopf ;)

Sorry war mein Fehler! Ich meinte natürlich: uint8_t byte1,
und byte1 = rxbuffer[10];

dummy schrieb:
> Setz den Breakpoint eine Zeile unter
>
> byte1 = rxbuffer[10];

Habe ich gemacht. Bekomme keinen Wert in byte1 obwohl im AVR Studio 
Debug Modus ich die Daten drinnen stehen habe.

von npn (Gast)


Lesenswert?

Veränderst du an anderer Stelle vielleicht die Variable "byte1", so daß 
sie überschrieben wird? Evtl. in einer ISR?

Oder vielleicht hast du bei einem Vergleich "=" geschrieben statt "==", 
das wäre dann eine Zuweisung statt einem Vergleich. Ein gern gemachter 
Fehler :-)

von Gerald G. (gerald_g)


Lesenswert?

Woher weißt du, dass das byte dort nicht ist? Display, SPI...? 
Kommunikationsfehler?

von Luke (Gast)


Lesenswert?

npn schrieb:
> Veränderst du an anderer Stelle vielleicht die Variable "byte1", so daß
> sie überschrieben wird? Evtl. in einer ISR?
>
> Oder vielleicht hast du bei einem Vergleich "=" geschrieben statt "==",
> das wäre dann eine Zuweisung statt einem Vergleich. Ein gern gemachter
> Fehler :-)

Zu beidem Nein.

von Luke (Gast)


Angehängte Dateien:

Lesenswert?

Hier ein Screenshot

von npn (Gast)


Lesenswert?

Luke schrieb:
> npn schrieb:
>> Veränderst du an anderer Stelle vielleicht die Variable "byte1", so daß
>> sie überschrieben wird? Evtl. in einer ISR?
>>
>> Oder vielleicht hast du bei einem Vergleich "=" geschrieben statt "==",
>> das wäre dann eine Zuweisung statt einem Vergleich. Ein gern gemachter
>> Fehler :-)
>
> Zu beidem Nein.

Dann wiederhole ich nochmal die Frage von Gerald. Woher weißt du, daß 
der Wert nicht übernommen wird?

Luke schrieb:
> Bekomme keinen Wert in byte1 obwohl im AVR Studio
> Debug Modus ich die Daten drinnen stehen habe.

Wie stellst du das fest, daß du keinen Wert "bekommst"?

von Peter II (Gast)


Lesenswert?

Luke schrieb:
> Hier ein Screenshot

mit oder ohne Optimierung?

Wenn die Variablen nicht verwendet werden, optimiert er es weg. mache 
mal ein printf einfach rein.

von npn (Gast)


Lesenswert?

Wenn das alles ist, was in deiner While-Schleife drin steht, könnte es 
sein, daß der Compiler die Zuweisung wegoptimiert. Denn die Variablen 
werden nicht weiterverwendet. Müßte auch eine Warnung vom Compiler 
kommen.
Alternativ schalte mal die Optimierung ganz aus und debugge nochmal.

von Daniel V. (danvet)


Lesenswert?

In solchen Fällen hilft ein AssemblerListing oder der Disassembler von 
AVR Studio, um zu sehen, ob deine C-Anweisungen überhaupt abgearbeitet 
werden.
Wie schon geschrieben wurde: Da du die Variablen nicht weiterverwendest, 
könnten sie wegoptimiert worden sein.

von Michael (Gast)


Lesenswert?

Eventuell hat der Compiler byte1 wegoptimiert...

von Luke (Gast)


Lesenswert?

Tatsächlich der Compiler optimiert es einfach weg.
Hab die Optimierung ausgeschaltet und dann bekomme ich die Werte 
angezeigt.

Vielen vielen Dank !!

von Amateur (Gast)


Lesenswert?

Kann es sein, dass Byte? eine lokale Variable ist und Du eine andere, 
gleichnamige beobachtest?

Eine weitere Möglichkeit wäre, beim letzten Kompilieren ist was in die 
Hose gegangen und der hinter der Anzeige liegende Code differiert.

Also: Lösch' beide Beobachtungsfenster (nicht nur schließen); kompiliere 
den Code neu und behalte das Ausgabefenster im Auge; bau' die 
Beobachtungsfenster neu auf und versuch den Code erneut.

Zum Code selbst: Manchmal haut die Optimierung ganze Codesequenzen raus, 
wenn Du die Zuweisung XXX = YYY zur ersten Variablen später nicht 
benutzt. Gelegentlich hilft eine Abfrage wie: if (XXX)oder die 
Optimierung ganz abschalten.

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.