Hi Leute,
ich habe vor über meinen Atmega8 230 Volt zu dimmen. Die
Nulldurchgangserkennung wird mit einem Optokoppler (4N33) + Widerstand
direkt am Netz angeschlossen. Somit sollte ich am Ausgang ein
Rechtecksignal erhalten. Das erzeugte Signal geht dann in den AVR an den
Interrupt-Pin 1.
Hier wird ein Zähler zurückgesetzt. Der Timer löst nach 39µs aus, somit
wird dieser aufruf ca. 256 mal pro Halbwelle ausgelöst. Wenn der Timer
also ausgelöst wird, wird geguckt, ob der aktuelle Zählerstand dem vorgegeben
Wert entspricht.
Ist das hier von der Idee her richtig?
Oder ist das komplett der falsche Ansatz?
Somit sollte für val=255 die Lampe aus und für 0 an sein.Code:#define F_CPU 16000000 #include <avr/io.h> #include <avr/interrupt.h> uint8_t counter, val1, val2; #define timerpreload_1 178 #define Tri1_OUT DDRD |= (1<<PD7); #define Tri2_OUT DDRD |= (1<<PD6); #define Tri1_ON PORTD |= (1<<PD7); #define Tri1_OFF PORTD &= ~(1<<PD7); #define Tri2_ON PORTD |= (1<<PD6); #define Tri2_OFF PORTD &= ~(1<<PD6); ISR(TIMER2_OVF_vect) { TCNT2 = timerpreload_1; if (counter < 254) { counter++; } if(counter==val1) { Tri1_ON } else { Tri1_OFF } if(counter==val2) { Tri2_ON } else { Tri2_OFF } } / ISR (INT1_vect) { Tri1_OFF Tri2_OFF TCNT2 = timerpreload_1; counter = 0; if (val1 == 0) { Tri1_ON } if (val2 == 0) { Tri2_ON } } int main(void) { //Timer für die Phasenanschnittberechnung ( alle 39usec ) TCNT2 = timerpreload_1; TCCR2 |= (1<<CS21); TIMSK |= (1<<TOIE2); //Timer Ende //INT1 ON PHASE SYNC MCUCR |= (1<<ISC10); //Fallend / Steigend GICR |= (1<<INT1); //Interrupt aktivieren //Int1 Ende sei(); while(1) { } }
MfG Niclas







Zitieren
Ich bin keine Signatur, ich putz hier nur ....


Lesezeichen