Wühlhase schrieb:
> Kann mir irgendwer auf die Sprünge helfen?
> typedef struct{
> int time_dark;
> int time_bright;
> struct GPIO_InitTypeDef *Port;
> uint16_t GPIO_Pin;
> }light;
Ob dir jemand wirklich auf die Sprünge helfen kann? Hmm..
Also, du gehst es von der falschen Seite an, so daß du selbst in höheren
Ebenen immer wieder dich mit Lowlevel-Angelegenheiten herumschlagen
mußt. Zum Schluß landet das Gefummel mit *Port vermutlich sogar in
main().
Mein Rat: trenne dein Zeitschema komplett von den tatsächlichen
Aktionen.
Ich skizziere das mal so aus dem Handgelenk:
1. bau dir eine Systemuhr. Intervall im Bereich 1..10 ms, beachte dabei
das Rücksetzen aller Soft-Timer um Mitternacht.
2. rufe aus der Systemuhr deinen Zeitschema-Handler auf. Laß diesen
passende Events generieren, die dann in der Grundschleife behandelt
werden
3. bau dir für jede Lampe einen separaten Handler, jaja der wird kurz
und knapp sein, mach ihn dennoch separat von allem Anderen.
So, nun zu den Strukturen:
1 | #define evLampe1 1
|
2 | #define evLampe2 2
|
3 | ..usw.
|
4 |
|
5 | #define to_off (1<<16)
|
6 |
|
7 | struct MyElement
|
8 | { long Zyklus;
|
9 | long OffDelay;
|
10 | long aEvent;
|
11 | }
|
12 |
|
13 | /* für 1 ms Systemzeitintervall und 100 Lampen */
|
14 | const struct MyElement MeineListe[100] =
|
15 | { /* Zyklus */ 10000,
|
16 | /* Off nach */ 3000,
|
17 | /* event */ Lampe1,
|
18 | ... usw.
|
19 | }
|
20 |
|
21 | /* Liste der letzten Aktualisier-Zeiten für 100 Lampen */
|
22 | long Zuletzt[100];
|
Dein Zeitschema-Handler ( z.B. void LampenBonze(void) ) macht dann
sinngemäß folgendes:
Für jede Lampe do:
( if aktuelle Zeit >= Zuletzt+Zyklus
then (Zuletzt = Zuletzt+Zyklus; Add_Event(evLampeN)
else ( if aktuelle Zeit >= Zuletzt + OffDelay
then Add_Event(evLampeN or to_off) )
)
Und in der Grundschleife nimmst du dir in aller Ruhe die eventuell in
der Event-Liste stehenden Events vor und rufst die jeweiligen Handler
auf. Das hat den Vorteil, daß du nicht angewiesen bist darauf, WIE denn
nun deine LampeX an oder ausgeschaltet werden muß - kann ja auch was
anderes als ein Portbein sein. Kann übrigens auch was anderes als ne
Lampe sein. Das ist Sache des Lowlevel-Handlers und darum solltest du
dich in main() nicht kümmern müssen.
So, das war aus dem Handgelenk, wie es gemeint ist, siehst du ja.
W.S.