codice usato per interrupt timer1

/*

  • contatore impulsi con overflow
  • ingresso di conteggio pin 5
  • per prova vengono utilizzzati impulsi a frequenza molto bassa
    */
    #include <TimerOne.h>

const int hardwareCounterPin =5; //ingresso impulsi per conteggio con timer 1
const int input9 = 9; //ingresso per monitor impulsi in ingresso
const int ledPin10 =10; // led per monitor avvenuto overflow ed esecuzione routinr interrupt
const int ledPin13 =13; //led monitor impulsi ingresso 9

int input9State = 0;
int byteLedPinState = 0;

int ledOn;
int ledState10 = LOW;
const int cycleLedOn=100; //costante per numero cicli in cui il ledPin10 rimane
//acceso dopo accensione da interrupt overflow timer 1
unsigned int costSincro=65526; //costante da caricare nei registri del timer 1 per contare 10 impulsi

void setup(){

pinMode(ledPin10,OUTPUT);
pinMode(ledPin13,OUTPUT);
pinMode(input9,INPUT_PULLUP);
pinMode(hardwareCounterPin,INPUT_PULLUP);

ledOn=cycleLedOn;
TCCR1A=0; //azzera valore timer 1

bitSet (TCCR1B,ICNC1); //abilita filtro ingresso durata 4 cicli di clock interni
bitSet (TCCR1B,ICES1); //abilita fronte di salita per conteggio
bitSet (TCCR1B,CS12); //abilita modalita ingresso clock esterno
bitSet (TCCR1B,CS11); //abilita modalita ingresso clock esterno
bitSet (TCCR1B,CS10); //abilita modalita ingresso clock esterno
bitSet (TIMSK1,ICIE1); //abilita interrupt timer 1
bitSet (TIMSK1,TOIE1); //abilita interrupt timer 1
bitSet (TIFR1,TOV1); //abilita interrupt overflow timer 1

TCNT1==costSincro;

Timer1.attachInterrupt( TIMER1_OVF_vect ); // abilita l'interrupt di overflow di timer 1
}

void loop(){
led1();
led2();

}

void led1(){
if (ledState10 == 1){
ledOn-=1;

}
}
void led2(){
if (ledOn == 0){
ledOn=cycleLedOn;
digitalWrite(ledPin10, LOW);
}
input9State = digitalRead(input9);
if (input9State == HIGH) {
digitalWrite(13, HIGH);
}
if (input9State == LOW){
digitalWrite(13, LOW);
}

}
//}
/// ----------------------------------------
/// Routine di servizio interrupt di timer 1
/// ----------------------------------------

void TIMER1_OVF_vect()
{
Timer1.detachInterrupt(); // disabilita interrupt overflow timer 1
TCNT1 == costSincro;
digitalWrite(ledPin10, HIGH);
ledState10 = HIGH;
Timer1.attachInterrupt( TIMER1_OVF_vect ); // riabilita interrupt overflow timer 1
}

Buona sera,
prima di tutto, essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Grazie,

Guglielmo

uran2016:

void TIMER1_OVF_vect()

{
  Timer1.detachInterrupt();                  // disabilita interrupt overflow timer 1
    TCNT1 == costSincro;
    digitalWrite(ledPin10, HIGH);
    ledState10 = HIGH;
  Timer1.attachInterrupt( TIMER1_OVF_vect ); // riabilita interrupt overflow timer 1
}

Quel TCNT1 == costSincro; non mi sembra affatto una assegnazione, quindi non è utile una comparazione in quel senso.
Ad ogni modo, l' uso di timerOne per avere dei periodi prefissati, non serve operare sui singoli registri. Come si può notare l' esempio, si genera una routine ad intervalli regolari.
Per periodi variabili, meglio capire com'è l' intento.

buonasera

cerco di spiegare meglio quanto intendevo fare
lo scopo e' di contare un certo numero di impulsi provenienti da un encoder che mi portino il timer 1 in overflow permettendo cosi di esegure la relativa ruotine di interrupt la quale deve settare un uscita e ricaricare in timer 1 la variabile constSincro e riattivare l' interrupt .
l'uscita settata verra' poi resettata dopo un numero di cicli impostati nella variabile cycleLedOn. (il numero di impulsi dell'encoder da contare e' sufficientemente alto da permettere al processore di eseguire un numero di cicli molto piu' grande della variabile cycleLedOn)
spero di essere stato un po' piu' chiaro.

allego listato ripulito

/*

  • contatore impulsi con overflow
  • ingresso di conteggio pin 5
  • uscita di monitor esecuzione interrupt pin 10
  • per prova vengono utilizzzati impulsi a frequenza molto bassa
    */
    #include <TimerOne.h>

const int hardwareCounterPin =5; //ingresso impulsi per conteggio con timer 1
const int ledPin10 =10; // led per monitor avvenuto overflow ed esecuzione routinr interrupt

int input9State = 0;
int byteLedPinState = 0;

int ledOn;
int ledState10 = LOW;
const int cycleLedOn=10; //costante per numero cicli in cui il ledPin10 rimane
//acceso dopo accensione da interrupt overflow timer 1
unsigned int costSincro=65526; //costante da caricare nei registri del timer 1 per contare 10 impulsi

void setup(){

pinMode(ledPin10,OUTPUT);
pinMode(hardwareCounterPin,INPUT_PULLUP);

ledOn=cycleLedOn;
TCCR1A=0; //azzera valore timer 1

bitSet (TCCR1B,ICNC1); //abilita filtro ingresso durata 4 cicli di clock interni
bitSet (TCCR1B,ICES1); //abilita fronte di salita per conteggio
bitSet (TCCR1B,CS12); //abilita modalita ingresso clock esterno
bitSet (TCCR1B,CS11); //abilita modalita ingresso clock esterno
bitSet (TCCR1B,CS10); //abilita modalita ingresso clock esterno
bitSet (TIMSK1,ICIE1); //abilita interrupt timer 1
bitSet (TIMSK1,TOIE1); //abilita interrupt timer 1
bitSet (TIFR1,TOV1); //abilita interrupt overflow timer 1

TCNT1==costSincro;

Timer1.attachInterrupt( TIMER1_OVF_vect ); // abilita l'interrupt di overflow di timer 1
}

void loop(){
led1();
led2();
}

void led1(){
if (ledState10 == 1){
ledOn-=1;
}
}
void led2(){
if (ledOn == 0){
ledOn=cycleLedOn;
digitalWrite(ledPin10, LOW);
}
}
//}
/// ----------------------------------------
/// Routine di servizio interrupt di timer 1
/// ----------------------------------------

void TIMER1_OVF_vect()
{
Timer1.detachInterrupt(); // disabilita interrupt overflow timer 1
TCNT1 == costSincro;
digitalWrite(ledPin10, HIGH);
ledState10 = HIGH;
Timer1.attachInterrupt( TIMER1_OVF_vect ); // riabilita interrupt overflow timer 1
}

saluti

... ma hai letto quanto ti ho chiesto di fare al post #1 ? :o ... in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Attendo di vedere le correzioni !

Guglielmo