[RISOLTO] Problema Interrupt per la lettura dell'assorbimento di un motore

Buongiorno,
Avrei bisogno di una mano riguardante l'uso del metodo interrupt, nel mio progetto devo pilotare un motore DC tramite la motor shield e leggere l'assorbimento del motore ogni 2/3 millisecondi, cercando su internet ho trovato che per poterlo fare devo utilizzare gli interrupt ma nel mio programma la lettura non avviene quando il motore inizia a funzionare, allego al post anche il programma, vorrei sapere anche se il metodo interrupt può essere usato via software.
Se qualcuno riesce a dirmi dove sbaglio e come poter fare per poter migliorare il programma ne saro grato.
Grazie

Prototipo1.ino (4.92 KB)

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Per chi volesse il programma aggiornato con il conteggio dell'assorbimento

#include <TimerOne.h>

#define bH 6//interrutore velocità massima
#define bM 7//interrutore velocità media
#define bL 8//interrutore velocità minima
#define TIMER_US 100000                         // 100mS set timer duration in microseconds 
#define TICK_COUNTS 20                          // 2S worth of timer ticks

#include <LiquidCrystal.h>

int buH = LOW;
int buM = LOW;
int buL=LOW;
volatile long tick_count = TICK_COUNTS;         // Counter for 2S
volatile bool in_long_isr = false;              // True if in long interrupt

// Viene inzializzata la libreria del Display con i relativi PIN a cui è connesso il Display
LiquidCrystal lcd(13, 11, 5, 4,10, 2);

void setup() {
 Serial.begin(9600);
 Timer1.initialize(TIMER_US);                  // Initialise timer 1
 Timer1.attachInterrupt( interruptAssorbimento );           // attach the ISR routine here
 //INTERRUTORI
 pinMode(bH, INPUT);
 pinMode(bM, INPUT);
 pinMode(bL,INPUT);
 //LCD  
 // set up the LCD's number of columns and rows: 
 lcd.begin(16, 2);
 // Stampa a video la parola "hello, world!"
 lcd.print(" CHIUSURA:");
  // MOTOR SHIELD Impostazione canale A 
 pinMode(A0, INPUT); 
 pinMode(12, OUTPUT); // Inizializzazione del pin direzione del motore collegato al canale A  
 pinMode(9, OUTPUT);  // Inizializzazione del pin brake del motore collegato al canale A   
}

void loop() {
 
 buH = digitalRead( bH);
 buM = digitalRead( bM);
 buL = digitalRead( bL);
 // Imposta il cursore alla colonna 0, riga 1
 // (nota: line 1 è la seconda riga, dal momento che il conteggio inizia dallo 0):
 lcd.setCursor(0, 1);
 //lcd.print(millis()/1000);

 // direzione in avanti alla massima velocità  
  
 if (buH == HIGH ){
 
 digitalWrite(12, HIGH);  // Impostazione della direzione “avanti” del motore collegato al canale A  
 digitalWrite(9, LOW);    // Disattivazione del brake del motore per il canale A  
 analogWrite(3, 255);     // Massima velocità del motore collegato al canale A
 delay(3000);// tempo di rotazione in avanti  

 digitalWrite(9, HIGH);   // Attivazione del brake del motore per il canale A  
 delay(1000);// tempo di stop del motore  
 
 // direzione indietro con velocità metà della velocità massima  

 digitalWrite(12, LOW);  // Impostazione della direzione “indietro” del motore collegato al canale A  
 digitalWrite(9, LOW);    // Disattivazione del brake del motore per il canale A  
 analogWrite(3, 127);     // Metà della velocità massima del motore collegato al canale A  
 delay(3000);// tempo di rotazione in avanti
 
 digitalWrite(9, HIGH);   // Attivazione del brake del motore per il canale A  
 delay(1000);                  // tempo di stop del motore
 
 lcd.print("FORZA 3000N");//stampa valore della forza
 }
 
// direzione in avanti alla velocità media

 if (buH == LOW and buM == HIGH and buL==LOW )
 {
 digitalWrite(12, HIGH);  // Impostazione della direzione “avanti” del motore collegato al canale A  
 
 digitalWrite(9, LOW);    // Disattivazione del brake del motore per il canale A  
 analogWrite(3, 127);     // Media velocità del motore collegato al canale A  
 delay(3000);                  // tempo di rotazione in avanti  
 digitalWrite(9, HIGH);   // Attivazione del brake del motore per il canale A  
 delay(1000);                  // tempo di stop del motore  
 
 // direzione indietro con velocità metà della velocità massima  
 
 digitalWrite(12, LOW);  // Impostazione della direzione “indietro” del motore collegato al canale A  
 digitalWrite(9, LOW);    // Disattivazione del brake del motore per il canale A  
 analogWrite(3, 127);     // Metà della velocità massima del motore collegato al canale A  
 delay(3000);                  // tempo di rotazione in avanti  
 digitalWrite(9, HIGH);   // Attivazione del brake del motore per il canale A  
 delay(1000);                  // tempo di stop del motore

 lcd.print("FORZA 2000N");//stampa valore della forza
 }

 // direzione in avanti alla minima velocità

 if (buH== LOW and buM == LOW and buL==HIGH )
 {
 digitalWrite(12, HIGH);  // Impostazione della direzione “avanti” del motore collegato al canale A  
 digitalWrite(9, LOW);    // Disattivazione del brake del motore per il canale A  
 analogWrite(3, 127);     // Minima velocità del motore collegato al canale A  
 delay(3000);                  // tempo di rotazione in avanti  
 digitalWrite(9, HIGH);   // Attivazione del brake del motore per il canale A  
 delay(1000);                  // tempo di stop del motore  
 
 // direzione indietro con velocità metà della velocità massima  
 
 digitalWrite(12, LOW);  // Impostazione della direzione “indietro” del motore collegato al canale A  
 digitalWrite(9, LOW);    // Disattivazione del brake del motore per il canale A  
 analogWrite(3, 127);     // Metà della velocità massima del motore collegato al canale A  
 delay(3000);                  // tempo di rotazione in avanti  
 digitalWrite(9, HIGH);   // Attivazione del brake del motore per il canale A  
 delay(1000);                  // tempo di stop del motore

 lcd.print("FORZA 1000N");// stampa valore della forza
 }

}

void interruptAssorbimento()
{
 // 5 V / 1024 ADC counts = 4.88 mV per count
 // 3.3 V = 2.0 A; 3.3 V / 4.88 mv per count = 676 counts
 // 2.0 A / 676 counts = 2.96 mA per count
 double assorbimento= analogRead(A0) * 2.96;
 Serial.println(assorbimento);
}

dolphkin: ... e si che mi ero pure raccomandato di leggere con MOLTA attenzione il REGOLAMENTO ... cosa che evidentemente NON hai fatto !

Pertanto, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo.

Guglielmo

Ha ragione, mi scuso la prossima volta starò più attento