Pages: [1]   Go Down
Author Topic: Alternativa alla PULSEIN??  (Read 825 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 1
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 1
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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..
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7112
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
// 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.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 1
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per l'aiuto!
Logged

Pages: [1]   Go Up
Jump to: