Interrupt....dove sbaglio?

ho appuna scoperto che il mega non ha un debug....dho! troverò un modo per testare...comunque, vi porgo il codice

int encoderPinA =  20;
int encoderPinB =  21;
int LED_DX = 26;
int LED_SX = 30;
int LED_STOP = 34;


void setup() {
pinMode(LED_BUILTIN, OUTPUT); //può sempre tornare utile
pinMode(encoderPinA, INPUT_PULLUP);
pinMode(encoderPinB, INPUT_PULLUP);
pinMode(LED_DX, OUTPUT);
pinMode(LED_SX, OUTPUT);
pinMode(LED_STOP, OUTPUT);

  // encoder pin on interrupt 0 (pin 20)
attachInterrupt(digitalPinToInterrupt(encoderPinA), doEncoderA, CHANGE);
  // encoder pin on interrupt 1 (pin 21)
attachInterrupt(digitalPinToInterrupt(encoderPinB), doEncoderB, CHANGE);

}


void loop() {
  digitalWrite(LED_STOP, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(LED_STOP, LOW);   // turn the LED off by making the voltage LOW
  delay(1000); 

}

void doEncoderA() {
   digitalWrite(LED_DX, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(LED_DX, LOW);   // turn the LED off by making the voltage LOW
  delay(1000); 
}

void doEncoderB() {
   digitalWrite(LED_SX, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(LED_SX, LOW);   // turn the LED off by making the voltage LOW
  delay(1000); 
}

per simulare il segnale di interrupt cortocircuito una 5v cin il pin 20; non succede niente lampeggia solo il LED_STOP, dove sbaglio?

Di sbagli ne vedo tre, uno banale e l'altro grave, ma quest'ultimo potrebbe essere un test e quindi sai come funzionano gli interrupt.

Il primo errore banale è cortocircuitare +5 con il pin 20 che è configurato con pinMode() per abilitare la resistenza interna di pull-up. Quindi questo pin è già alto, la funzione doEncoderA() collegata al pin encorderPinA viene chiamata quando il segnale cambia (CHANGE). Nello specifico caso viene eseguita la funzione collegata quando da HIGH passa a LOW e da LOW passa ad HIGH.

L'altro errore è quello di pensare di collegare un pulsante o provvisoriamente un pin con un cavetto da cortocircuitare. In genere tutti i contatti elettromeccanici soffrono di rimbalzi nei primi 20ms.

Mentre l'errore grave è inserire un delay in una funzione agganciata ad una interruzione. Il risultato è che la funzione doEncoderA() impegna la CPU in modo esclusivo per 2 secondi durante i quali nessuna istruzione presente all'intero della funzione loop() verrà eseguita. Stessa sorte per altre funzioni agganciate ad un interruzione. Monopolizzare la CPU non è cosa buona.
A queste funzioni agganciate ci si rifferisce con l'abbreviazione ISR (interrupt service request), da ora in poi userò ISR.

Osservazione:
Ma con tutto quello che si può sperimentare con arduino proprio dagli interrupt dovevi cominciare? :grinning:

Invece lo ha, ma serve hardware esterno per farlo funzionare, ma arduino IDE 1.8.19 non integra questa funzione. Serve un ambiente IDE più professionale tipo MPLAB

Ciao.

Il primo errore di concetto sta nel far lampeggiare un LED usando delay e poi voler fare altro usando l'interrupt per interromperlo, per giunta con un altro delay! La soluzione, molto più semplice, è fare tutto usando millis(), facendo scorrere liberamente il programma alla massima velocità.

Il primo errore banale è cortocircuitare +5 con il pin 20 che è configurato con pinMode() per abilitare la resistenza interna di pull-up. Quindi questo pin è già alto, la funzione doEncoderA() collegata al pin encorderPinA viene chiamata quando il segnale cambia (CHANGE). Nello specifico caso viene eseguita la funzione collegata quando da HIGH passa a LOW e da LOW passa ad HIGH.

Ok, allora devo ripassare il concetto di resistenza di pull-up / pull-down....inizialmente la resistenza era esterna....poi per comodità l'ho resa interna

L'altro errore è quello di pensare di collegare un pulsante o provvisoriamente un pin con un cavetto da cortocircuitare. In genere tutti i contatti elettromeccanici soffrono di rimbalzi nei primi 20ms.

È solo una piattaforma di test per capire visivamente se il codice fa quello che voglio che faccia, attualmente il suo scopo è solo fare accendere i led e capire se esegue le funzioni. Al posto del led che si accende ovviamente non ci sarà quel codice.....

Domanda 1: la dichiarazione delle porte isr è corretta? I PIN sul mega sono anche 2/3 20/21?

Domanda 2: nessuna domanda 2, mi sono autocensurato

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.