Temporizzatore ritardato alla diseccitazione

Buongiorno a tutti, scusate se questo tipo di richiesta sembra un pochetto banale ma, purtoppo sono un neofita di questo tipo di programmazione e mi trovo decisamente "impacciato". Il mio scopo è quello di ottenere un preciso segnale di uscita (pin 13) dopo aver incontrato un fronta di discesa (monitorato usl pin 2)... In teoria dovrei riuscire a costruire un programma che, non appena uncontra un fronte di discesa sul PIN2, mi manda alto il PIN13 per circa 100 ms e poi lo riabbassa. Questo ogni qualvolta incontro un fronte di discesa sul PIN2

Dopo aver letto vari post ho provato a buttare giù un paio di righe di programma (considerando la funzione) attachinterrupt(); il codice, che ho steso (chiedo scusa in anticipo x eventuali obbrobri) è:

//Temporizzatore digitale ritardato ala diseccitazione

int pin = 13;

void setup() { pinMode(pin, OUTPUT);

}

void loop() { attachInterrupt(0, ciclo, FALLING); }

void ciclo() { digitalWrite(pin, HIGH); delay (100); digitalWrite(pin, LOW); }

Secondo i miei calcoli avrebbe dovuto andare; in pratica :-((

Ho provato una seconda versione con un doppio ciclo IF ma, purtroppo è andata ancora peggio... Quancuno di voi ha qualche idea? Secondo voi sono sulla strada giusta?

Ringrazio tutti in anticipo

In che senso non va? Che problemi ti da?

Ti ricordo che l'INT0 che stai usando è mappato sul pin 2 di Arduino e che all'interno di una routine di intercettazione di un interrupt non funzionano gli altri interrupt.

Quindi, se il fronte in discesa non è monitorato da quel pin, non lo vedrai. Inoltre non puoi usare delay all'interno della funzione ciclo. Delay è agganciato al timer 0, gestito dall'interrupt 0.... capisci che non può funzionare. Viene disattivato l'int0 che incrementa il contatore usato da delay per cui lo sketch muore in attesa di un passaggio del tempo che non avverrà mai.

Potresti semplicemente variare lo stato di una variabile globale all'interno di ciclo, variabile che poi potresti leggere dal loop principale.

#define LED_PIN 13
boolean discesa=false;

void setup() {
    pinMode(LED_PIN, OUTPUT);
    attachInterrupt(0, ciclo, FALLING);
}


void loop() {
    if (discesa) {
        digitalWrite(pin, HIGH);
        delay (100);
        digitalWrite(pin, LOW);
        discesa=false;
    }
}


void ciclo() {
    discesa=true;
}

In che senso non va? Che problemi ti da?

Ciao Leo72, grazie per la velocità di risposta, semplicemente... Non andava...Ovvero provocando un fronte sul pin 2 non mi accadeva niente (adesso ho capito il perchè ^_^)

Ovviamente ho preso il tuo "spunto" e devo dire che funziona benissimo, non mi rimane chiaro il motivo per cui mi genera un signale sia per un fronte di salita che per quello di discesa (a adesso ci penso io a spaccargli i bit)... :-)

Una domanda: quando all'epoca "programmavo" in c++, il compilatore aveva la funzione di debug, mi permetteva di eseguire una istruzione per volta in modo da "capire" cosa stesse facendo il programma. Che tu sappia esiste qualche software del genere? Per me sarebbe utilissimo