Go Down

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

edmond_dantes

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

edmond_dantes

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

edmond_dantes

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