Go Down

Topic: Datalogger per impulsi in tensione (Read 1 time) previous topic - next topic

QuercusPetraea

#15
May 11, 2011, 05:30 pm Last Edit: May 11, 2011, 05:59 pm by QuercusPetraea Reason: 1
A dire il vero la funzione millis() può funzionare correttamente all'interno di un interrupt, purchè gi interrupt siano ri-abilitati nella funzione che gestisce l'interrupt con l'utilizzo della funzione interrupts().

int pin = 2; //pin corrispondente all'interrupt 0

void setup()
{
  //eventuale codice di setup per seriale o lcd
  attachInterrupt(0, interpt, FALLING); // è stato posto un pulsante sul pin 2 collegato a massa da una parte ed in pull-up con una resistenza
                                                       // dall'altra
}

void loop() {
  ...
  lcd.print(millis()/1000);
  ...
}

void interpt()
{
  interrupts();
  while (digitalRead(pin) == LOW);
}

Premendo il pulsante si entra nella routine di servizio interpt() dove vengono riabilitati gli interrupts e si resta in attesa che il pulsante venga rilasciato.
La funzione millis() avrà fatto il suo lavoro correttamente e l'output sulla seriale o lcd ne darà conferma.

Ciao a tutti
Giovanni

MauroTec

Quote
A dire il vero la funzione millis() può funzionare correttamente all'interno di un interrupt, purchè gi interrupt siano ri-abilitati nella funzione che gestisce l'interrupt con l'utilizzo della funzione interrupts().


Se c'è necessità di mantenere gli interrupt abilitati durante l'esecuzione della funzione la cosa più corretta è staccare la funzione dall'interrupt abilitare globalmente gli interrupt ed all'uscita meglio dopo un ciclo del loop riattaccare la funzione all'interrupt. Diversamente abilitare gli interrupt globalmente dentro la funzione si rischia che un'altro interrupt esegua la funzione che si sta già eseguendo e prima di ritornale ad eseguire il loop ci sono di mezzo più di un return.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

lesto

non vedo il problema di più di un return prima di riatornare al codice. E' il sistema usato dai PC normali in cui la recursività degli interrupt è cosa normale.. Il vero problema è se l'interrupt viene lanciato più spesso di quanto il suo codice venga eseguito.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

supercolli

#18
May 11, 2011, 10:49 pm Last Edit: May 12, 2011, 09:20 am by supercolli Reason: 1

non vedo il problema di più di un return prima di riatornare al codice. E' il sistema usato dai PC normali in cui la recursività degli interrupt è cosa normale.. Il vero problema è se l'interrupt viene lanciato più spesso di quanto il suo codice venga eseguito.


L'interrupt nel mio caso serve semplicemente per dire al controllore di scrivere su una memoria non volatile il tempo dell'evento e risolvere due o tre espressioni algebriche. Sicuramente nella peggiore delle ipotesi il successivo interrupt non può arrivare prima di tre secondi.
Scusatemi, non ho esperienza sulla programmazione delle funzioni di interrupt, mi potete consigliare una guida o una discussione che spieghi ciò che mi serve? Ho ordinato l'arduino ed il shield con microsd e RTS, ci siamo quasi :-)

supercolli

#19
Jun 01, 2011, 06:24 pm Last Edit: Jun 01, 2011, 06:33 pm by supercolli Reason: 1
Buongiorno a tutti, sono riuscito con successo a fare un programma in grado di soddisfare i requisiti illustrati ad inizio topic. Vi scrivo perchè è sorto un problema di diversa natura, riguardante lo stesso sketch, ma mi sembrava comunque il caso di postarlo in questo stesso topic anzichè aprirne uno nuovo.
Ho integrato la scheda arduino uno con l'adafruit data logger shield, per la gestione dell'ora e per la scrittura dei dati in una scheda sd. Fin qua tutto bene, riesco a gestire il tutto.
Il problema sorge quando vado ad inserire nel mio sketch principale delle righe di codice riguardanti l'acquisizione di alcuni parametri da file (input.txt).
Specifico che questa acquisizione di parametri è verificata funzionare bene tramite un codice che ho fatto girare da solo sul mio arduino e che riporto di seguito.
Anche il programma "madre" è verificato lavorare bene da solo prima dell'inserimento del codice di lettura dei parametri da file (in questo caso i parametri li inizializzo ad un valore fissato in fase dichiarativa)

Riporto di seguito il mio  codice della lettura da file dei tre parametri di tipo float (i_ref, res, tol):

Code: [Select]

#include <SD.h>
#include <stdio.h>
 char intensity[4];
 char resolution[4];
 char tollerance[4];
 float i_ref, res, tol;
 int j;
 char EndFile;

File myFile;

void setup()
{
 Serial.begin(9600);
 Serial.print("Initializing SD card...");

  pinMode(10, OUTPUT);
 
 if (!SD.begin(10)) {
   Serial.println("initialization failed!");
   return;
 }
 Serial.println("initialization done.");
    SD.open("input.txt");

 wptread();

}

void loop()
{
}

void wptread()
{
     j = 0;
     intensity[j] = myFile.read();
     while (intensity[j] != '\r' && j <=5)
       {
         j++;
         intensity[j] = myFile.read();
       }
     j = 0;
     resolution[j] = myFile.read();
     while (resolution[j] != '\r' && j <=5)
       {
         j++;
         resolution[j] = myFile.read();
       }
     j = 0;
     tollerance[j] = myFile.read();
     while (tollerance[j] != '\r' && j <=5)
       {
         j++;
         tollerance[j] = myFile.read();
       }
     i_ref = atof(&intensity[0]);
     res = atof(&resolution[0]);
     tol = atof(&tollerance[0]);
     Serial.println(i_ref,1);
     Serial.println(res,1);
     Serial.println(tol,1);
}


Il problema sorge quando inserisco il codice quotato nel programma madre (e lo faccio senza errori, la compilazione da esito positivo). Nonostante la classe di setup del programma completo lavori bene come atteso, il void loop mi da dei risultati sbagliati, nella sostanza mi restituisce dei risultati di alcune equazioni nulli quando invece dovrebbe venire un numero non nullo (come verificato dall'esecuzione senza il codice quotato).

Ora la mia domanda è:  non è che allungando il programma princiale sto caricando troppe variabili e l'arduino non riesce a gestirle per limitazioni fisiche di memoria?

lesto


Il problema sorge quando inserisco il codice quotato nel programma madre (e lo faccio senza errori, la compilazione da esito positivo).

ciò vuol dire che non ci sono errori sintattici, ma ci possono essere errori logici.


Nonostante la classe di setup del programma completo lavori bene come atteso, il void loop mi da dei risultati sbagliati, nella sostanza mi restituisce dei risultati di alcune equazioni nulli quando invece dovrebbe venire un numero non nullo (come verificato dall'esecuzione senza il codice quotato).

codice?


Ora la mia domanda è:  non è che allungando il programma princiale sto caricando troppe variabili e l'arduino non riesce a gestirle per limitazioni fisiche di memoria?

possibile, esistono metodi per vedere la ram disponibile, però inizia a postare il codice completo e vediamo come conviene agire
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up