mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik uint32_t problem


Autor: subguru (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

An dem gezeigten Code liegt es jedenfalls nicht.


Peter

Autor: subguru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Bytes kommen über die serielle Schnittstelle.
Die Zuweisung sieht so aus:

void set_time(uint8_t b0, uint8_t b1, uint8_t b2, uint8_t b3)
{
  volatile uint32_t current_time;
  
  current_time = ((uint32_t)b0<<24) + ((uint32_t)b1<<16) + ((uint32_t)b2<<8) + (uint32_t)b3;
      
  unixtime = current_time;  
  
}

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

Autor: subguru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meinte Inkrementieren :-)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: subguru (Gast)
Datum:

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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

Autor: subguru (Gast)
Datum:

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

Autor: subguru (Gast)
Datum:

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

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.