Pages: [1]   Go Down
Author Topic: Misurare durata impulso! uso interrupt  (Read 728 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Faraday Member
**
Karma: 17
Posts: 2755
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Forse ho capito male! ho fatto:

Code:
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 Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

per quello che vuoi fare usa la pulseIn(), un interrupt non è adattissimo se non hai un motivo più che valido
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quoto lesto. La pulseIn misura impulsi da 10 us in su, quindi 500 us sono 50 volte il minimo che può misurare.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Faraday Member
**
Karma: 17
Posts: 2755
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ottimo! Ho imparato qualcosa di nuovo e fatto un passo avanti!
Grazie a tutti!
Logged

Pages: [1]   Go Up
Jump to: