Hallo,
ich habe wie im Anhang zu sehen eine Phasenanschnittsteurung nachgebaut.
Hardwaremäßig funktioniert jetzt alles und daher bin ich jetzt an der
Software dran.
Da die Sache über Timer und Interrupts gemacht werden müssen bin ich
folgendermaßen angefangen indem ich eine Variable jede 0,016ms hochzähle
nachdem sie bei der postiiven Flanke vom Nulldurchgang gelöscht wurde.
Hat diese Variable dann einen vorgegeben Wert erreicht schalte ich den
TRIAC ein. So sieht der Code aus:
1 | DimmWert_Lampe1 = 100;
|
2 |
|
3 | //===============================================================
|
4 | //Timerinterrupt bei Überlauf
|
5 | //===============================================================
|
6 |
|
7 | // Aufruf alle 0,016ms
|
8 |
|
9 | ISR (TIMER0_COMPA_vect)
|
10 | {
|
11 |
|
12 | CountTimer++;
|
13 |
|
14 | if (CountTimer == DimmWert_Lampe1)
|
15 | {
|
16 | //Setzen
|
17 | PORTD |= (1<<PD3);
|
18 | }
|
19 |
|
20 | }
|
21 |
|
22 | //============================================================
|
23 | //Interrupt 0 Nulldurchgangerkennung steigende Flanke
|
24 | //============================================================
|
25 |
|
26 | ISR(INT0_vect)
|
27 | {
|
28 | // Löschen
|
29 | PORTD &= ~(1<<PD3);
|
30 | CountTimer =0;
|
31 |
|
32 | }
|
Das Ganze gefällt mir aber nicht. Ich kannmir nicht vorstellen das
dieses der eleganteste Weg ist, funktionieren tut es zwar. Wie würdet
Ihr das lösen?
So sind die Interrupts/Timer gesetzt:
1 |
|
2 | /////////////////////////////////////////////////
|
3 | //INTerrupt konfigurieren
|
4 |
|
5 | EIMSK |= (1<<INT0); // External Interrupt 0 Enable PIN PD2
|
6 | EICRA |= (1<<ISC00) | (1<<ISC01); // Int auslösen bei steigender Flanke
|
7 |
|
8 |
|
9 | //////////////
|
10 | // Timer 0 (8-bit) konfigurieren
|
11 |
|
12 | TCCR0B |= (1<<CS00); // Prescaler 0
|
13 |
|
14 | TIMSK0 |= (1<<OCIE0A);
|
15 |
|
16 | //Globale Interrupts einschalten
|
17 | sei();
|
Benutzen tu ich einen Atmega644