Go Down

Topic: <Risolto> spiegazione di istruzioni (Read 242 times) previous topic - next topic

rslogix52

Mar 29, 2019, 04:44 pm Last Edit: Mar 29, 2019, 05:13 pm by rslogix52
Ciao a tutti.
Volendo scrivere un programma di lettura di un encoder incrementale ho trovato in rete questo programma
Code: [Select]

// Wiring connections for my encoder:
// Red : VCC = 5V
// Black: 0V = GND
// White: OUTA = Digital pin 2
// Green: OUTB = Digital pin 3
// With these OUTA/OUTB connections and the interrupt code below,
// clockwise rotation gives positive encoder counts.

const int outA = 2;
const int outB = 3;
volatile long encoder = 0; // declare volatile since modified by interrupt routines
long encoder_save = 0;
byte contatore = 0;
int oldcontatore = 0;

void setup() {
  // set encoder pins
  pinMode(outA, INPUT_PULLUP);
  pinMode(outB, INPUT_PULLUP);
  pinMode(10, OUTPUT);
  // attach interrupts to pins
  // call digitalPinToInterrupt(pin) to be compatible with different Arduino boards
  attachInterrupt(digitalPinToInterrupt(outA), outAChange, CHANGE);
  attachInterrupt(digitalPinToInterrupt(outB), outBChange, CHANGE);

  // initialize serial
  Serial.begin(9600);
  Serial.println("");
  Serial.println("Rotary encoder test.");
}

void loop() {
  if (encoder_save != encoder) { // only print if new value
    encoder_save = encoder;
    contatore = (encoder/10);
     if((contatore) ==255){
    contatore =254;
  }
  if((contatore) == 0){
    contatore = 1;
    }
    Serial.print(" asse X   ");
    Serial.println(contatore);
    analogWrite(10, contatore);
  }
  //delay(100);
}

// interrupt routines
void outAChange() {
  // when outA changes, outA==outB means negative direction
  encoder += digitalRead(outA) == digitalRead(outB) ? -1 : 1;
}

void outBChange() {
  // when outB changes, outA==outB means positive direction
  encoder += digitalRead(outA) == digitalRead(outB) ? 1 : -1;
}


io in parte l' ho modificata per comandare in pwm un led e vedere la variazione di luminosita , il programma funziona ma io non sono riuscito a capire certe istruzioni  ? 1 : -1 messe in questa riga:
Code: [Select]
void outBChange() {
  // when outB changes, outA==outB means positive direction
  encoder += digitalRead(outA) == digitalRead(outB) ? 1 : -1;
}

 rslogix52

gpb01

#1
Mar 29, 2019, 05:02 pm Last Edit: Mar 29, 2019, 05:04 pm by gpb01
E' un "operatore ternario" applicato ad un operatore di somma ed assegnazione ...

Cominciamo con la parte dell'operatore ternario ...

Code: [Select]
digitalRead(outA) == digitalRead(outB) ? 1 : -1;
... si chiede "se la lettura da outA è uguale a quella da outB", se è uguale ritorna 1 altrimenti -1

A questo punto l'assegnazione con somma

Code: [Select]
encoder +=
somma al valore di encoder quanto ritornato dall'operatore ternario.

Se esso ha ritornato 1 allora sarà:

Code: [Select]
encoder += 1;
... se invece ha ritornato -1 allora sarà:

Code: [Select]
encoder += -1;
Tutto chiaro ?

Guglielmo
Search is Your friend ... or I am Your enemy !

rslogix52

quindi l'operatore ? è una interrogazione che in base alla risposta che può essere 1 o -1 si incrementa la variabile encoder. Grazie
rslogix52

gpb01

quindi l'operatore ? è una interrogazione ...
Si chiama operatore ternario e lo trovi tranquillamente su google ... ;)

Code: [Select]
(condizione) ? valore se vero : valore se falso;
Guglielmo
Search is Your friend ... or I am Your enemy !

rslogix52

Grazie della spiegazione.
rslogix52

Go Up