Offline
Newbie
Karma: 0
Posts: 14
|
 |
« on: January 10, 2013, 02:33:26 pm » |
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!
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2446
|
 |
« Reply #1 on: January 10, 2013, 02:39:29 pm » |
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
|
|
|
|
« Last Edit: January 10, 2013, 03:30:21 pm by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 14
|
 |
« Reply #2 on: January 10, 2013, 03:17:20 pm » |
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); } }
|
|
|
|
« Last Edit: January 10, 2013, 06:25:33 pm by UweFederer »
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 82
Posts: 8232
:(){:|:&};:
|
 |
« Reply #3 on: January 10, 2013, 04:56:49 pm » |
per quello che vuoi fare usa la pulseIn(), un interrupt non è adattissimo se non hai un motivo più che valido
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16470
Don't know what I do
|
 |
« Reply #4 on: January 10, 2013, 05:10:25 pm » |
Quoto lesto. La pulseIn misura impulsi da 10 us in su, quindi 500 us sono 50 volte il minimo che può misurare.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 14
|
 |
« Reply #5 on: January 10, 2013, 05:37:13 pm » |
pulseIn è la funzione perfetta che cercavo! Ho provato ma non ci riesco, dovrei misurare non il primo impulso ma il secondo
|
|
|
|
« Last Edit: January 10, 2013, 05:47:58 pm by drinu »
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2446
|
 |
« Reply #6 on: January 10, 2013, 05:46:27 pm » |
pulsein blocca l'esecuzione del codice finchè non ottiene un nuovo impulso, se è quello che ti serve allora va bene così
ciao
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 14
|
 |
« Reply #7 on: January 10, 2013, 06:26:52 pm » |
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; } } }
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 82
Posts: 8232
:(){:|:&};:
|
 |
« Reply #8 on: January 10, 2013, 06:36:45 pm » |
Togli il secondo if e il suo codice, poi al posto del primo if fai cont++ e cont la dichiari globale inizializzare a 0
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 14
|
 |
« Reply #9 on: January 10, 2013, 07:19:48 pm » |
Ottimo! Ho imparato qualcosa di nuovo e fatto un passo avanti! Grazie a tutti!
|
|
|
|
|
Logged
|
|
|
|
|
|