Rafael S. schrieb:
> Desweiteren habe ich das Problem, dass sich die beiden PWM- Ausgänge nur
> nach einander ein bzw. auschalten lassen. Woran es liegt weiß ich, aber
> ich weiß nicht welche Möglichkeiten ich noch habe, da ich ein ziemlicher
> neuling im programmieren bin.
Das liegt an deinem Programmaufbau bzw. daran das du noch zu sequentiell
denkst und nicht in Ereignissen. Wenn du beim Kochen neben dem Herd
stehen bleibst und darauf wartest, bis das Gulasch fertig ist ...
1 | while (a<max) {OCR1A=a; wait(50); a++; }
|
... dann kannst du eben nicht nebenher staubsaugen.
Du musst dein Denkweise umstellen. Nicht: das Programm soll darauf
warten, dass eine Endbedingung erreicht ist, sondern bei jedem Durchlauf
durch die Hauptschleife "Ist die Endbedingung erreicht, dann mach
nichts, andernfalls bewege dich einen Schritt auf die Endbedingung zu".
Vergleichbar damit eben nicht neben dem Herd stehen zu bleiben sondern
immer abwechselnd nach dem Gulasch schauen und staubsaugen bis eines
davon erledigt ist.
1 | int main()
|
2 | {
|
3 | uint16_t Licht1Vorgabe ;
|
4 | uint8_t Taste1Jetzt, Taste1Vorher;
|
5 |
|
6 | .....
|
7 |
|
8 | Licht1Vorgabe = 0;
|
9 | OCR1A = 0;
|
10 |
|
11 | Taste1Vorher = PIND & ( 1 << PD2 );
|
12 |
|
13 | while( 1 ) {
|
14 |
|
15 | // Taste1 auswerten
|
16 | // wird die Taste gedrückt, dann soll die Vorgabe für die Beleuchtung 1
|
17 | // in die jeweils andere Position springen. Aus Maximum wird Minimum
|
18 | // und umgekehrt
|
19 |
|
20 | Taste1Jetzt = PIND & ( 1 << PD2 );
|
21 |
|
22 | if( Taste1Jetzt != Taste1Vorher ) { // Die Taste hat sich veraendert?
|
23 | Taste1Vorher = Taste1Jetzt;
|
24 | if( !Taste1Jetzt ) { // interessant ist nur: sie wurde
|
25 | // niedergedrueckt,
|
26 | // d.h. die Frage "Wie steht sie jetzt?"
|
27 |
|
28 | // Die Taste wurde also niedergedrückt
|
29 | if( Licht1Vorgabe == 0 ) // -> Die Vorgabe für LED 1 von Minimum
|
30 | Licht1Vorgabe = 1023; // auf Maximum umstellen und umgekehrt
|
31 | else
|
32 | Licht1Vorgabe = 0;
|
33 | }
|
34 | }
|
35 |
|
36 | ... selbiges fuer die andere Taste bzw. die Vorgabe fuer Licht 2
|
37 |
|
38 | // Auswertung der Vorgaben für die Beleuchtung
|
39 | // Ist die tatsächliche Einstellung kleiner als die Vorgabe dann
|
40 | // das Licht etwas heller machen. Ist sie grösser dann eben etwas dunkler
|
41 |
|
42 | if( OCR1A < Licht1Vorgabe )
|
43 | OCR1A++;
|
44 | else if( OCR1A > Licht1Vorgabe )
|
45 | OCR1A--;
|
46 |
|
47 | .... selbiges fuer das andere Licht und OCR1B
|
48 |
|
49 | _delay_ms( 50 ); // und etwas warten. Das beeinflusst dann wie schnell
|
50 | // das Licht auf die jeweilige Vorgabe dimmt, bzw. ist
|
51 | // notwendig, damit Tastenprellen nicht durchschlägt.
|
52 | }
|
53 | }
|