structs in globalem struct

Gast #3168840
Hallo,

ich nutze für mein Projekt eine globale struct in der alle Statusdaten 
gespeichert werden. Um das ganze besser zu strukturieren befinden sich 
in dieser struct wieder structs. Die Daten lese ich per Funk aus. Leider 
habe ich das Problem, das die inneren structs keine Daten enthalten. 
Muss ich die besonders deklarieren? Zur Zeit sieht meine globale struct 
so aus:
1
typedef struct StatusStruct
2
{
3
  volatile temp boardTemp;          //temperature on the board
4
  volatile RTC rtcData;          //data of the RTC
5
  uint8_t  outsideTemp;      //temperature outside
6
  uint8_t outsideHum;        //outside humidity
7
  uint8_t insideTemp;        //inside temperature
8
  uint8_t  insideHum;        //inside humidity
9
  uint8_t currentCapHigh;      //current cap high in cm
10
  uint8_t windSpeed;        //current wind speed in m/s
11
  uint16_t solarCurrent;      //actual current of the solar panel
12
  uint16_t voltage;        //actual voltage
13
  uint8_t error;          //error code
14
}Status;

es geht um die ersten beiden Variablen die vom struct Typ temp und RTC 
sind. In der Klasse habe ich eine globale Statusvariable deklariert:
1
extern volatile Status globalStatus;        //the current status of all sensors and actors

Wie schon gesagt, das Problem besteht darin, dass nach dem Auslesen des 
globalen Status per Funk in boardTemp und rtcData keine Daten enthalten 
sind. Ich nehme mal an, das Problem liegt an der Deklaration der inneren 
structs, oder?

Gruß
Paul
Gast
Daten werden folgendermaßen befüllt:
1
readBoardTemp(&globalStatus.temp);

und
1
/*RTC readRTCData();*/
2
globalStatus.rtcData=readRTCData();

Den erzeugten Assemblercode schaue ich mir bei Gelegenheit mal an.
Paul schrieb:
> Daten werden folgendermaßen befüllt:

Na dann musst du eben mal nachsehen, was diese Funktionen so treiben und 
warum sie nichts liefern.

> Ich nehme mal an, das Problem liegt an der Deklaration der
> inneren structs, oder?

Nö. Das Problem liegt irgendwo in deinem Code. Wo genau, das weiß kein 
Mensch. Denn den Code zeigst du ja nicht.

Wenn etwas passiert oder nicht passiert, dann liegt das am Code und 
nicht in der Deklaration irgendwelcher Datenstrukturen. Datenstrukturen 
sind passiv. Der Code ist es, der etwas macht oder nicht macht.
Gast
Karl Heinz Buchegger schrieb:
> Na dann musst du eben mal nachsehen, was diese Funktionen so treiben und
> warum sie nichts liefern.

Schon geschehen. Wenn ich die Funktionen kurz vor dem Senden zum 
befüllen der structs nutze werden auch tatsächlich Daten 
hineingeschrieben. Aber eigentlich möchte ich die in regelmäßigen 
Zeitabständen aktualisieren, wofür ich den Interrupt des DS2417 nutze. 
Ich rufe also in einer ISR aller 64s die entsprechenden Funktionen auf, 
die den globalen Status aktualisieren.
> Ich rufe also in einer ISR aller 64s die entsprechenden Funktionen auf,
> die den globalen Status aktualisieren.
Eine ISR so kurz wie möglich halten. Ruf dort nicht die Funktionen auf 
sondern setze nur ein Flag, das in Main ausgewertet wird und dann dort 
die Funktionen aufruft.

Es kann sein, das dir ein anderer Interrupt dazwischen funkt.

Grüsse
Gast
Markus M. schrieb:
> Es kann sein, das dir ein anderer Interrupt dazwischen funkt.

Mmmh...eine Minute müsste eigentlich ausreichen um die ganzen Funktionen 
auszuführen. Es werden ja nur Sensoren abgefragt. Aber wäre wohl 
trotzdem besser alles außerhalb der ISR zu machen. Ich versuchs mal ;)
Du kennst dein Gesamtsystem. Als Aussenstehender muss man eine Menge 
Annahmen treffen.

Hast Du alle selbst Implementiert?
Welchen MC nutzt Du?
Irgendwelche fertigen Libraries?

Zu Interrupt:
In der ISR solltest Du noch ermitteln ob es der richtige Interrupt ist 
und nur dann das Flag setzen.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts
http://www.mikrocontroller.net/articles/Interrupt

Grüsse
Gast
Ich glaube ich habe den Fehler gefunden: Um die Sensoren anzusprechen, 
habe ich eine Pin/Port-struct verwendet in der Datenregister, Port und 
Pin vom jeweiligen Sensor gespeichert werden. Jedenfalls habe ich die 
jeweiligen Variablen nicht als "volatile" deklariert und damit war es 
wohl Glückssache, ob der Sensor richtig angesprochen wurde oder nicht. 
Jetzt geht es jedenfalls einwandfrei ;) Danke euch :)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.