Forum: Mikrocontroller und Digitale Elektronik uint32_t problem


von subguru (Gast)


Lesenswert?

Hallo,

ich versuche jetzt schon seit geraumer Zeit auf einem atmega168 einer 
uint32_t Vari einen Wert zuzuweisen. Ich habe auch alle relevanten 
Beiträge durchforstet und alle Möglichkeiten durch. Die Zuweisung 
geschieht jetzt momentan so:
1
current_time = ((uint32_t)b0<<24) + ((uint32_t)b1<<16) + ((uint32_t)b2<<8) + (uint32_t)b3;

Die Art der Zuweisung spielt jetzt weniger eine Rolle, weil egal wie 
ichs mache, ich habe immer folgendes Verhalten: Es läßt durchaus ein 
Wert zuweisen, allerdings nur wenn keins der Bytes "0" enthält.

b0 b1 b2 b3    Ergebnis
01 02 03 04 -> 01 02 03 04
01 02 00 04 -> 00 00 00 04
01 02 03 00 -> 01 02 03 00
00 01 02 03 -> 00 01 02 03
01 00 03 04 -> 00 00 03 04

Hat hier jemand vielleicht einen Tipp wie man das korrekt umsetzen kann?
Danke!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wo kommen b1, b2, b3 und b4 her - eventuell aus einer Interruptroutine?

Kann es sein, dass im Moment der Zuweisung gepufferte Werte benutzt 
werden, weil der C-Compiler meint, die Werte zu kennen. In dem Fall 
müsstest du mit volatile arbeiten.

von Peter D. (peda)


Lesenswert?

Warscheinlich benutzt Du irgendwo Stringfunktionen, bei denen ist die 
'\0' das Endezeichen.

An dem gezeigten Code liegt es jedenfalls nicht.


Peter

von subguru (Gast)


Lesenswert?

Die Bytes kommen über die serielle Schnittstelle.
Die Zuweisung sieht so aus:

1
void set_time(uint8_t b0, uint8_t b1, uint8_t b2, uint8_t b3)
2
{
3
  volatile uint32_t current_time;
4
  
5
  current_time = ((uint32_t)b0<<24) + ((uint32_t)b1<<16) + ((uint32_t)b2<<8) + (uint32_t)b3;
6
      
7
  unixtime = current_time;  
8
  
9
}

unixtime ist so wie current_time deklariert und wird über den timer 
sekündlich dekrementiert.

von subguru (Gast)


Lesenswert?

Ich meinte Inkrementieren :-)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

b0 bis b3 liegen in set_time() also als Kopie der seriellen Daten auf 
dem Stack oder in Registern. Das volatile bei current_time ist 
überflüssig, stört aber nicht. Der gezeigte Code verursacht den Fehler 
nicht.

Wie sieht die Stelle aus, bei der set_time() gefüttert wird? Stimmen da 
b0 bis b3?

Wie sieht die Stelle aus, bei der current_time kontrolliert wird? Die 
Kontrolle darf nur innerhalb set_time() stattfinden, da der 
Gültigkeitsbereich von current_time auf die Funktion set_time() begrenzt 
ist.

von subguru (Gast)


Lesenswert?

> Wie sieht die Stelle aus, bei der set_time() gefüttert wird? Stimmen da
>b0 bis b3?


Oh ja, hier liegt der Hund begraben. Sobald ich über das Terminal eine 
'0' sende, kommen falsche Werte für b0-b3 an.

Danke, das hilft mir schon mal weiter.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

subguru schrieb:

> void set_time(uint8_t b0, uint8_t b1, uint8_t b2, uint8_t b3)
> {
>   volatile uint32_t current_time;

current_time verdeckt wohl eine gleichnamige globale Variable?

von subguru (Gast)


Lesenswert?

>current_time verdeckt wohl eine gleichnamige globale Variable?

Nein, volatile habe ich nur verwendet, weil ich mir nicht sicher war ob 
hier der Fehler liegt.

von subguru (Gast)


Lesenswert?

Ich hab jetzt den Fehler gefunden.
Traurig aber wahr, der Code ist Ok.

Ich habe das GtkTerm benutzt, das war entweder falsch eingestellt oder 
interpretiert die Zeichen falsch. Mit HTerm klappt es auf Anhieb.

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.