uint32_t problem

Gast #1352045
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!
Gast #1352072
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.
Persönliche Seite #1352092
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.
Gast #1352131
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.
Gast #1352517
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren