So, jetzt machen wir das mal vernünftig.
Als erster fasst du mal alles was es zu einem Relais zu sagen gibt in
einer Struktur zusammen, damit du da nicht dauernd mit 100-tausend
Werten hantieren musst.
1 | struct Relais {
|
2 | uint8_t bitToSet;
|
3 | uint8_t bitToClear;
|
4 | uint16_t setCycles; // Zaehlt die 0-Durchgänge bis zum Abschalten
|
5 | };
|
damit ist ein Relais prinzipiell mal grundsätzlich in seiner vollen
Pracht beschrieben.
Dann hast du 3 Relais
1 | struct Relais MotorEin = { 0, 1, 0 };
|
2 | struct Relais RolloHoch = { 3, 4, 0 };
|
3 | struct Relais TuerAuf = { 6, 7, 0 };
|
da sind sie. Komplett mit der Definition, welche Bits zu bedienen sind
und jedes Relais hat seinen eigenen 0-Durchgangszähler.
Weiters brauchst du eine Funktion, die 1 Relais bei mehrmaligem Aufruf
bedienen kann. Die Funktion funktioniert so wie deine, wobei der
springende Punkt darin besteht, dass die Funktion alles Wissenswerte
über das zu bedienende Relais aus der Strukturbeschreibung erfährt, und
zwar von dem Relais auf das es einen Pointer bekommt. Die Funktion
liefert true oder false zurück, je nachdem ob die Relaiszeit abgelaufen
ist oder nicht. Dies brauchst du in der Hauptschleife, damit du dort die
Anforderung für das Relais-Schalten wieder zurück setzen kannst.
1 | uint8_t RelaisSchalten( struct Relais* theRelais )
|
2 | {
|
3 | if (Nulldurchgang)
|
4 | theRelais->setCycles++;
|
5 |
|
6 | AusgangSetBit( theRelais->bitToSet );
|
7 | AusgangUnsetBit( theRelais->bitToClear );
|
8 | AusgangOut();
|
9 |
|
10 | if (theRelais->setCycles >= 50)
|
11 | {
|
12 | AusgangUnsetBit( theRelais->bitToSet );
|
13 | AusgangUnsetBit( theRelais->bitToClear );
|
14 | AusgangOut();
|
15 |
|
16 | theRelais->setCycles = 0;
|
17 | return true;
|
18 | }
|
19 |
|
20 | return false;
|
21 | }
|
und die Funktion rufst du jetzt auf
1 | int main()
|
2 | {
|
3 | ....
|
4 |
|
5 |
|
6 | while( 1 ) {
|
7 |
|
8 | ....
|
9 |
|
10 | if (RelaisSchaltenStart[0])
|
11 | {
|
12 | if (RelaisSchalten( &MotorEin ))
|
13 | RelaisSchaltenStart[0] = false;
|
14 | }
|
15 |
|
16 | if (RelaisSchaltenStart[1])
|
17 | {
|
18 | if (RelaisSchalten( &RolloHoch ))
|
19 | RelaisSchaltenStart[1] = false;
|
20 | }
|
21 |
|
22 | if (RelaisSchaltenStart[2])
|
23 | {
|
24 | if (RelaisSchalten( &TuerAuf ))
|
25 | RelaisSchaltenStart[2] = false;
|
26 | }
|
27 | }
|
und wenn die Funktion zurückliefert, dass es das jeweilige Relais wieder
abgeschaltet hat, dann nimmst du hier auch wieder die Anforderung zurück
(und nicht in der Funktion, das ist nicht ihre Aufgabe sich darum zu
kümmern).