structs in globalem struct

Gast #3168840
Lesenswert?

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 #3168988
Lesenswert?

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.
#3169021
Lesenswert?

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 #3169024
Lesenswert?

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.
#3169046
Lesenswert?

> 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 #3169067
Lesenswert?

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 ;)
#3169078
Lesenswert?

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 #3169400
Lesenswert?

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

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