system
January 10, 2013, 7:33pm
1
Ciao a tutti!
Dovrei misurare un impulso di circa 500 micros e visualizzarlo su un display, pensavo di usare l'interrupt, ho fatto così:
void loop()
{
attachInterrupt(0, provainterrupt, RISING);
}
void provainterrupt(){
time = micros();
lcd.print("us:");
lcd.print(time);
buttonState = digitalRead(buttonPin); //legge lo stato del pin 2
if (buttonState == LOW) {
detachInterrupt(0);
}
Però c'è un accorgimento e cioè che devo misurare un solo impulso e ignorare quelli successivi, non so, c'è un comando con cui bloccare il programma?
Grazie!
Ti basta un contatore.
cont=0
quando nel loop hai ottenuto quello che volevi porti il count a 1
if count == 0
misura durata
count=1;
al prossimo passaggio sarà 1 quindi non farà la misura, dovrai con qualcosa tipo pulsante azzerare count prelevando nuovamente la misura
oppure usa i boolean true/false
ciao
system
January 10, 2013, 8:17pm
3
Forse ho capito male! ho fatto:
void loop()
{
if (cont == 0) {
attachInterrupt(0, provainterrupt, RISING);
cont == 1;
}
}
void provainterrupt(){
time = micros();
lcd.print("us:");
lcd.print(time);
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
detachInterrupt(0);
}
}
per quello che vuoi fare usa la pulseIn(), un interrupt non è adattissimo se non hai un motivo più che valido
leo72
January 10, 2013, 10:10pm
5
Quoto lesto. La pulseIn misura impulsi da 10 us in su, quindi 500 us sono 50 volte il minimo che può misurare.
system
January 10, 2013, 10:37pm
6
pulseIn è la funzione perfetta che cercavo!
Ho provato ma non ci riesco, dovrei misurare non il primo impulso ma il secondo
pulsein blocca l'esecuzione del codice finchè non ottiene un nuovo impulso, se è quello che ti serve allora va bene così
ciao
system
January 10, 2013, 11:26pm
8
Bene! Grazie dell'aiuto
Ho anche l'esigenza di dover misurare il secondo o il terzo impulso,eccetera.
Ho fatto :
void loop()
{
if (cont == 0) {
duration = pulseIn(pin, HIGH, 2000000);
lcd.print("us:");
lcd.print(duration);
cont = 1;
if (cont == 1) {
duration2 = pulseIn(pin, HIGH, 2000000);
lcd.print("us:");
lcd.print(duration2);
cont = 2;
}
}
}
Togli il secondo if e il suo codice, poi al posto del primo if fai cont++ e cont la dichiari globale inizializzare a 0
system
January 11, 2013, 12:19am
10
Ottimo! Ho imparato qualcosa di nuovo e fatto un passo avanti!
Grazie a tutti!