Go Down

Topic: Alternativa alla PULSEIN?? (Read 935 times) previous topic - next topic

Ciao a tutti,

per decodificare una trasmissione seriale sto utilizzando la PULSEIN per misurare le durate della trasmissione dei bit. La PULSEIN però mi consente di misurare la durata dell'impulso HIGH o LOW singolarmente mentre mi farebbe comodo misurare le durate dei due impulsi in serie dato che sembrano variare anche le durate degli impulsi LOW.
La mia domanda in pratica è: posso usare la PULSEIN o una funzione equivalente per avere in serie le durate degli impulsi on/off?
Spero di essere stato abbastanza chiaro nell'esporre la mia questione, sono niubbo, abbiate pietà  :smiley-roll-sweat:
grazie fin da ora per l'aiuto

lesto

devi scrivere una funzione da te. attraverso i registri sei in grado di leggere fino a 8 ingressi alla volta, quindi procedi più o meno così:
1. salvi lo stato degli 8 registri e per ognuso di essi i micros attuali;
2. ti metti in loop a far niente finchè almeno uno dei registri non cambia;
3. per i registri cambiati calcoli la durata (micros() - micros ultimo cambiamento), e aggiorni il tempo di ultimo cambiamento
4. ricominci dal punto 2.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Che mazzata che mi hai tirato! I registri non li ho mai neanche sentiti nominare...  :)
Intanto che vado a studiarmeli potresti mica linkare un esempio di sketch che legge i registri se ce l'hai sotto mano? Grazie ancora

lesto

bhe diciamo che senza un pò di teoria lo sketch non serve a nulla, e con un pò di teoria diventa abbastanza banale scrivere qualcosa... trovi tutto quì http://www.arduino.cc/playground/Learning/PortManipulation
se hai qualche dubbio chiedi pure!
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Vediamo se comincio a capirci qualcosa: dal momento che utilizzo il pin 7 per leggere i miei impulsi devo andare a vedere il valore della variabile PIND (PIND is the input register variable ? it will read all of the digital input pins at the same time. ) looppo fino a quando cambia il valore del pin 7 nella PIND e misuro quanto tempo ci mette tra una variazione e l'altra.
Dico bene?

lesto

esatto, devi leggere il variare dell'8 bit del registro PIND. però se vuoi leggere un solo pin usa digitalRead, oppure due pulseIn (una low e una High), ho letto male il tuo post e pensavo volessi leggere più pin contemporaneamente..
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

PaoloP

Ciao,
questo è un programmino che avevo fatto partendo dal BlinkWhitoutDelay.
Permette di conoscere il tempo dell'impulso e l'intervallo con l'impulso successivo.

Code: [Select]
// this constant won't change:
const int  buttonPin = 3;    // the pin that the pushbutton is attached to
const int ledPin = 9;       // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
unsigned long t1, t2 = 0;
int durata = 0;
int intervallo=0;

void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);
}


void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      t2=millis();
      durata=t2 - t1;
      Serial.print(durata);
    }
    else {
      t1 = millis();
      intervallo= t1 - t2;
      Serial.print(" : ");
      Serial.println(intervallo);
      digitalWrite(ledPin, HIGH);
      delay(10);
      digitalWrite(ledPin, LOW);
    }
  }
  // save the current state as the last state,
  //for next time through the loop
  lastButtonState = buttonState;
}


Spero possa essere utile.


Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy