Dmm... das mit der Niederspannung hab ich irgendwie verpennt...
Der MOC302x ist ebenso wie der MOC304x ein OptoTRIAC (also ein Optokoppler mit TRIAC-Ausgang). Die 4er-Serie hat zusätzlich 'ne integrierte Nulldurchgangsdetektion. Wieviel Spannung diese nun benötigt, hab ich nicht durchgesehen. Die letzte Ziffer (x) stellt AFAIK die unterschiedlichen Vorwärtsspannungen der internen LEDs dar.
Hmm... gabs nicht auch irgendsowas wie "photovoltaische" Koppler?
Egal - das Problem mit der Nulldurchgangsdetektion via Optokoppler sollte bei den geringeren Amplituden aber ähnlich wie bei den MOCs der 4er-Serie sein - auch hier muß ja erst die Vorwärtsspannung der LEDs erreicht werden...
Methode der Wahl sollte also irgend'ne Komperatorschaltung (wie bei meinem Dimmer) sein.
Für die Wellenpaketsteuerung blieben weiterhin 2 Möglichkeiten:
Entweder:
man verzichtet auf die Detektion, steuert die also Knallhart mit PWM an (und nimmt alle 500ms beim Anschalten den eventuellen RUMS im Scheitel in kauf), oder:
man nutzt den Timer wie beschrieben als Counter (Komperator->T0 aber irgendwie mit beiden Flanken, zB mit vorheriger Gleichrichtung) - dann ist jedes Inkrement des Timers dicht am Nulldurchgang, also insbesondere auch jedes Compare-Match (bzw auch die Timer-Takte danach), also kippt der Ausgang auch immer dicht am Durchgang...
Nachtrag:
Im Datenblatt der 4er-MOCs sind für die Nulldurchgangsdetektion typisch 5V angegeben - max allerdings bis zu 20V
Hab' leider gerade wenig Zeit und komme nur sporadisch zum avr-hacken ;-)
Hier hänge ich schon wieder fest. Ich dachte das Problem gestern verstanden und gelöst zu haben... War aber nix....
Folgender Versuch:
Impuls auf PB1 schaltet PB0 für 1000 ms auf high und danach sicher für 2000 ms auf Null- egal was in dieser Zeit sich
am PB1 und in Folge dessen an int0 so tut.
Doch was tut sich?
Bei dem Wechsel von 0 auf 1 am PB1 schaltet PB0 blinkt zweimal.
Das passiert auch wenn die Flanke fällt.
Verstehe ich beides nicht.
Denn, lasse ich die Stelle "_delay_ms(2000);" weg, dann blinkt es nicht.
Für ein einmaliges Triggern ist _delay_ms(2000) überflüssig, das PB0
ohnehin gelöscht wird und bleibt. Das bedeutete dann PB0 für 1000 ms auf high und für
2000 ms + unendlich auf Null.
Wo ist da mein Gedankenfehler?
Code:
void main()
{
/*
ISC01 ISC00
0 0 The low level of INT0 generates an interrupt request.
0 1 Any logical change on INT0 generates an interrupt request.
1 0 The falling edge of INT0 generates an interrupt request.
1 1 The rising edge of INT0 generates an interrupt request.
*/
GIMSK |= (1<<INT0); //External Interrupt Request 0 Enable
MCUCR |= ((1<<ISC01) | (1<<ISC00)); // Interrupt auslösen wenn INT0 = GND
}
ISR(INT0_vect)
{
PORTB |= (1<<PB0);
_delay_ms(1000);
PORTB &= ~(1<<PB0);
_delay_ms(2000);
}