void setup()
{//Serial.begin(9600);
// initialize Timer1
cli(); // disable global interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0; // same for TCCR1B
// set compare match register to desired timer count:
// turn on CTC mode:
TCCR1B |= (1 << WGM12);
TCCR1B &= ~(1 << WGM10);
TCCR1B &= ~(1 << WGM11);
// Set for prescaler 8:
TCCR1B |= (1 << CS11);
TCCR1B &= ~(1 << CS12);
TCCR1B &= ~(1 << CS10);
// enable timer compare interrupt:
TIMSK1 |= (1 << OCIE1A);
// enable global interrupts:
sei();
attachInterrupt(counterInterrupt, counterISR, RISING);
pinMode(PUIN,INPUT); // ingresso segnale pick-up
pinMode(PUOUT,OUTPUT); // uscita segnale pick-up ritardato
pinMode(ledRun,OUTPUT); // led indicazione modalità configurazione (lampeggio) e modalità run (fisso)
pinMode(SWITCH1,INPUT);
pinMode(SWITCH2,INPUT);
pinMode(SWITCH3,INPUT);
pinMode(SWITCH4,INPUT);
digitalWrite(ledRun, LOW);
digitalWrite(SWITCH1, HIGH);
digitalWrite(SWITCH2, HIGH);
digitalWrite(SWITCH3, HIGH);
digitalWrite(SWITCH4, HIGH);
digitalWrite(PUIN, LOW);
digitalWrite(PUOUT, LOW);
s[0]=digitalRead(SWITCH1); // 10
s[1]=digitalRead(SWITCH2); // 11
s[2]=digitalRead(SWITCH3); // 12
s[3]=digitalRead(SWITCH4); // 13
void loop()
{
//////////////////////////////////////////////////////////////////////////////////
// Modalità RUN
// controllo se durante la fase run è stata cambiata la configurazione e se si allora riavvio per poterla caricare
if(i==0) {if(digitalRead(SWITCH1)!=s[0]) Riavvia();
else i++;}
if(i==1) {if(digitalRead(SWITCH2)!=s[1]) Riavvia();
else i++;}
if(i==2) {if(digitalRead(SWITCH3)!=s[2]) Riavvia();
else i=0;}
// se nessuna configurazione è selezionata non fa partire il motore e il led run lampeggia lentamente
if(s[0]==HIGH && s[1]==HIGH && s[2]==HIGH )
{
NotRun=HIGH; digitalWrite(ledRun, HIGH); delay(500); digitalWrite(ledRun, LOW); delay(500); digitalWrite(PUOUT, 0);
}
// Se la configurazione non è presente, il motore parte comunque (senza applicare ritardi) e il led run lampeggia velocemente.
if(freq_max[5]==0)
{
if((millis()-last>=250) && RUN)
{
digitalWrite(ledRun, 1);
last=millis();
RUN=0;
}
if((millis()-last>=250) && !RUN)
{
digitalWrite(ledRun, 0);
last=millis();
RUN=1;
}
}
if(counter.ready()) // leggo i valori dall'array delta_t_tab
{
if(counter.hertz()<0 || counter.hertz()>250) freq=50;
else freq=counter.hertz();
dt=(int)(delta_t_tab[freq]/tick);
switch (var)
{
case 1:
var=2;
last=millis();
break;
case 2:
digitalWrite(ledRun, HIGH);
if(millis()-last>=500) {var=3; last=millis();}
break;
case 3:
digitalWrite(ledRun, LOW);
if(millis()-last>=500) {var=2; last=millis();}
break;
}
}
//if(freq_max[5]!=0) {digitalWrite(ledRun, 1);}
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////// Regolazione durata impulso PUOUT
if(flag)
{
if(micros()-width>=pulse_width) {digitalWrite(PUOUT, LOW); flag=LOW; val=HIGH;}
}
////////////////////////////////////////////////////////////
}
void counterISR()
{
if(NotRun==HIGH) val=LOW;
if(val&&!flag)
{
counter.poll();
if(dt>24)
{
OCR1A = dt-24;
TCCR1B |= (1 << WGM12);
TCCR1B &= ~(1 << WGM10);
TCCR1B &= ~(1 << WGM11);
TCCR1B |= (1 << CS11);
TCCR1B &= ~(1 << CS12);
TCCR1B &= ~(1 << CS10);
}
else {digitalWrite(PUOUT, HIGH); flag=HIGH; width=micros();}
}
}
ISR(TIMER1_COMPA_vect)
{
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0;
if(NotRun==HIGH) val=LOW;
digitalWrite(PUOUT, val);
flag=HIGH;
width=micros();
}
ho tralasciato la definizione delle variabili e qualche calcolo, comunque funziona e l'ho già testato diverse volte.
Appena posso metto lo schema