eccolo:
volatile int i=0, y=0; // variabili contatore...
volatile boolean zero_cross1=0, zero_cross2=0; // booleane per lo zero crossing
int out1 = 0, out2 = 1; // Output >> ai moc...
int pot1 = 3, pot2=4; // ingressi trimmer
int bright1 = 0, bright2 = 0; // livello di luminosità (0-128) 0 = on, 128 = 0ff
//int freqStep = 78; // ritardo del timer in microsecondi
void setup() {
cli();//fermo gli interrupt
TCCR0A &= ~((1<<COM0A0) | (1<<COM0A1)); //disattivi gli interrupt del timer
//modalità contatore fino all'overflow
TCCR0A &= ~((1<<WGM01) | (1<<WGM00));
TCCR0B &= ~(1<<WGM02);
//prescaler a /8
TCCR0B &= ~((1<<CS02) | (1<<CS00));
TCCR0B |= (1<<CS01);
TCNT0 = 178; //valore iniziale
TIMSK |= (1<<TOIE0); //attivo un interrutp all'overflow
sei(); //riattivo gli interrupt
pinMode(out1, OUTPUT);
pinMode(out2, OUTPUT);
attachInterrupt(0, zero_cross_detect, RISING); //zero crossing detection con interrupt esterno
}
void zero_cross_detect() {
zero_cross1 = true;
zero_cross2 = true;
i=0;
y=0;
digitalWrite(out1, LOW);
digitalWrite(out2, LOW);
}
ISR (TIMER0_OVF_vect) {
TCNT0 = 178;
if(zero_cross1 == true) {
if(i>=bright1) {
digitalWrite(out1, HIGH);
i=0;
zero_cross1 = false;
}
else {
i++;
}
}
if(zero_cross2 == true) {
if(y>=bright2) {
digitalWrite(out2, HIGH);
y=0;
zero_cross2 = false;
}
else {
y++;
}
}
}
void loop() {
bright1 = analogRead(pot1) / 8;
bright2 = analogRead(pot2) / 8;
}