Go Down

Topic: Digital Read molto lento nel rilevare il cambio di stato (Read 1 time) previous topic - next topic

nienteposta

Buona sera a tutti.
Utilizzo un Arduino mega R3.

questo è il codice in questione

Code: [Select]

// testing motors
//
int motor1Pin;    // H-bridge leg 1 (pin 2, 1A)
int motor2Pin;    // H-bridge leg 2 (pin 7, 2A)
int enablePin;    // H-bridge enable pin
int fineCorsa;    // Fine Corsa

void setup() {
  Serial.begin(9600); // open serial port to receive data
}

//Nome: attivaPin
//ToDo: Attiva i pin relativi al cassetto selezionato
void attivaPin(){
      digitalWrite(enablePin, HIGH);  // accende il motore
      digitalWrite(motor1Pin, HIGH);   // set leg 1 of the H-bridge low
      delay(4000);
      digitalWrite(enablePin, LOW);
      digitalWrite(motor1Pin, LOW);     
         
}

void setPin (int pin){
if (pin == 1){
  motor1Pin = pin;
  motor2Pin = pin + 1;
  enablePin = pin + 2;
  fineCorsa = pin + 3;
  pinMode(motor1Pin, OUTPUT);
  pinMode(motor2Pin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  pinMode(fineCorsa, INPUT);
}
else{
   motor1Pin = (pin * 4) - 3;
   motor2Pin = (pin * 4) - 2;
   enablePin = (pin * 4) - 1;
   fineCorsa = (pin * 4);
   pinMode(motor1Pin, OUTPUT);
   pinMode(motor2Pin, OUTPUT);
   pinMode(enablePin, OUTPUT);
   pinMode(fineCorsa, INPUT);
}
}

int verificaFineCorsa(int inputPin){
    delay(1300);
    int val;
    val = digitalRead(inputPin);
    if (val == HIGH){
      Serial.println("Tutti i fine corsa sono chiusi");
      return 0;
    }
    else{
      Serial.println("FineCorsa Aperto");
      return 1;
    }
}


void gestioneElettropermanente(int incomingByte){
  setPin(incomingByte);
  if (verificaFineCorsa(fineCorsa) == 0)
      attivaPin();
   
}


void loop() {
  // see if there's incoming serial data:
  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    int incomingByte = Serial.read() - '0';
    gestioneElettropermanente(incomingByte);
    // if it's a capital H (ASCII 72), turn on the LED:
  }
}



Il problema è che il digitalRead(pin) è veramente lento, impiega anche più di 8 secondi a rilevare il cambio di stato, come mai??? come posso risolvere?
avete suggerimenti?

Grazie a tutti in anticipo


Michele Menniti

Non ho analizzato il codice, ci sono persone molto più preparate di me che lo faranno meglio.
Voglio solo dirti che il modo migliore, a mio modesto parere, per intercettare in tempo reale il cambio di stato di un pin sia quello di usare un interrupt.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

nienteposta

Oddio mi apri un mondo nuovo...
Un interrupt fisico (quindi un interruttore, ipotesi da scartare) o un interrupt software?
Arduino permette di utilizzare la logica degli interrupt?? :O

flz47655

Il comando digitalRead di suo è velocissimo (es. quasi 100KHz), nel codice hai dei delay() che fermano il micro per molto tempo..
usa gli interrupt (software) o rivedi il codice

Ciao

Michele Menniti


Oddio mi apri un mondo nuovo...
Un interrupt fisico (quindi un interruttore, ipotesi da scartare) o un interrupt software?
Arduino permette di utilizzare la logica degli interrupt?? :O

Certamente, esistono alcuni pin preposti direttamente dal micro; la libreria pinChangeInt ti permette di scegliere qualsiasi altro pin ed assegnargli questa funzione. Poi puoi intercettare eventi come il change, il falling ed il rising
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Go Up