Niggle
11.05.2016, 15:22
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?
#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)
{
}
}
Somit sollte für val=255 die Lampe aus und für 0 an sein.
MfG Niclas
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?
#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)
{
}
}
Somit sollte für val=255 die Lampe aus und für 0 an sein.
MfG Niclas