Pages: [1] 2   Go Down
Author Topic: AnalogRead e ritardi  (Read 1294 times)
0 Members and 1 Guest are viewing this topic.
Italy
Offline Offline
Jr. Member
**
Karma: 1
Posts: 67
ATMOLab
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

un aiuto
Ho un problema dal quale non riesco ad uscire
Ho un programmino che legge da SoftwareSerial dei dati da un GPS , il problema che se nel frattempo vado a monitorare un livello di tensione su analogico (A0) con un AnalogRead (a0) mi si blocca lo schetch e non sembra andare oltre.

Se al posto di una AnalogRead inserisco (per testare) una DigitalRead (su ovviamente una porta differente) tutto funziona normalmente.

Vi è già mai capitato? se si come avete risolto?

Lo schetch deve solo leggere Velocità dal GPS e verificare di tanto in tanto lo stato di carica della batteria tramite un partitore di Tenisione.

grazie mille
Logged

Il mio BLOG : PALLONE SONDA
http://roborover.wordpress.com

Italy
Offline Offline
Jr. Member
**
Karma: 1
Posts: 67
ATMOLab
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ah dimenticavo Arduino UNO
Logged

Il mio BLOG : PALLONE SONDA
http://roborover.wordpress.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22715
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pubblica lo sketch, per favore, che altrimenti non si capisce il problema.
Logged


Italy
Offline Offline
Jr. Member
**
Karma: 1
Posts: 67
ATMOLab
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ECCOLO

//#include <SdFatUtil.h>
#include <SoftwareSerial.h>
#include "sms.h"



#define BUFFSIZ 70// se troppo grosso 70
#define LED 6
#define DC 5   
SoftwareSerial gps(4,5); //Seriale Software Vs GPS(RX,TX)


SMSGSM sms;
boolean lettura=false;
boolean GPRMC=true;
boolean GPGGA=true;
// PArsing GPS variabili Globali
char buffer[BUFFSIZ];        // Buffer dei dati G
char *parseptr;              // un puntatore Char per il Parsing
char buffidx;                // Indice del Parsing
boolean startup=true;
boolean stato=false;              //0 atterrato 1 Volo
char TEXT_SMS[30];




//  time, date, location data, etc.
//uint8_t  day;
uint32_t day,time,latitude, longitude;
uint8_t groundspeed, trackangle,altitude;
uint8_t latdir, longdir,quality;
int status;
String STR_SMS;         //Variabile String per concatenare la stringa SMS
int batt;


void setup()
{
  pinMode(LED,OUTPUT);
  pinMode(DC,INPUT);
  Serial.begin(9600);   //Seriale del PC   
 
     
  gps.begin(38400); //Velocità seriale GPS
  digitalWrite(LED,LOW);
 

}

uint32_t parsedecimal(char *str) {
  uint32_t d = 0; 
  while (str[0] != 0) {
    if ((str[0] > '9') || (str[0] < '0'))
      return d;
    d *= 10;
    d += str[0] - '0';
    str++;
  }
  return d;
}


void readline(void) {
  char c; 
  buffidx = 0; // start at begninning
 
  Serial.print(batt);
  while (1) {
    c=gps.read();
    if (c == -1)     
      continue;
      //Serial.print(" ");
      delay(1);
    if (c == '\n')
      continue;
    if ((buffidx == BUFFSIZ-1) || (c == '\r')) {         
      buffer[buffidx] = 0;
      return;
    }     
    buffer[buffidx++]= c;
      }
}

void loop()
{
  uint32_t tmp;
 
  readline();   //legge dati da GPS 
  // se disponibile $GPRMC
  batt = analogRead (A0);  //QUESTO FA INCHIODARE LO SCHETCH DOPO 2/3 letture

 

 
  if (startup) {                                                   // si attiva solo alla prima accensione  del dispositivo
    if (groundspeed == 0)Serial.println("DISPOSITIVO ACCESO ");
    if (groundspeed == 0) tone (9,700,1000);
    if (groundspeed > 0) Serial.println("WARNING WARNING");

    //Serial.println(FreeRam()); 
    startup=false;
  }
   

                 
}

________________________
GRAZIE SPERIAMO
Logged

Il mio BLOG : PALLONE SONDA
http://roborover.wordpress.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22715
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Parlavi di "blocco".... ma non è che hai esaurito la memoria?
Vorrei provare a compilare lo sketch, da dove hai prelevato le librerie SdFatUtil.h e sms.h (così da usare quelle che hai tu)?
Logged


Italy
Offline Offline
Jr. Member
**
Karma: 1
Posts: 67
ATMOLab
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

veramente puoi anche eliminare i riferimenti alle librerie, non vengono usate...vai tranquillo

no, la memoria non è esaurita....considera che poi fa molto altro ancora che ho dovuto togliere dallo schetch altrimenti non si capiva nulla...

Ma fa sempre lo stesso problema, questa è la zona problematica. Se metti una Serial.print dopo la AnalogRad ti rendi conto che si inchioda...


....molto gentile....
Logged

Il mio BLOG : PALLONE SONDA
http://roborover.wordpress.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22715
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma sei sicuro che si inchiodi all'analogRead e non alla comunicazione col GPS che c'è subito prima?
Potresti provare così:

Code:
Serial.println("Sono alla readline...");
readline();   //legge dati da GPS
Serial.println("Adesso leggo il pin A0...");
  // se disponibile $GPRMC
  batt = analogRead (A0);
Serial.println("Lettura fatta. Proseguo...");
Logged


Italy
Offline Offline
Jr. Member
**
Karma: 1
Posts: 67
ATMOLab
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

e la risposta è questa
______________
Sono alla readline...
0Adesso leggo il pin A0...
Lettura fatta. Proseguo...
DISPOSITIVO ACCESO
Sono alla readline...

____
quindi si ferma dopo la Read...è come se il GPS non passando l'endline ogni tanto prende e si inchioda...che dici?
Logged

Il mio BLOG : PALLONE SONDA
http://roborover.wordpress.com

Italy
Offline Offline
Jr. Member
**
Karma: 1
Posts: 67
ATMOLab
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

praticamente si blocca alla readline ma solo se attivi l'analogread....prova a commentare analog read e tutto cammina....(tranne le letture sull'analogico).....
Logged

Il mio BLOG : PALLONE SONDA
http://roborover.wordpress.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22715
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il problema sembra risiedere in readline().
A me non esce da lì:
ecco l'ouput:

Code:
Sono alla readline...
0

Nel senso che se non c'è nulla in arrivo dal gps, il codice ti resta bloccato lì dentro.
Logged


Italy
Offline Offline
Jr. Member
**
Karma: 1
Posts: 67
ATMOLab
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

si è vero,....ma che c'entra con la AnalogRead....prova a commentare l'analog e vedrai che tutto torna...
metto delle Serial.println nella funzione
Logged

Il mio BLOG : PALLONE SONDA
http://roborover.wordpress.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22715
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
void readline(void) {
  char c;
  buffidx = 0; // start at begninning
  unsigned long tempMillis = millis();
 
  Serial.print(batt);
  while (millis() - tempMillis < 5000) {
    c=gps.read();
    if (c == -1)     
      continue;
      //Serial.print(" ");
      delay(1);
    if (c == '\n')
      continue;
    if ((buffidx == BUFFSIZ-1) || (c == '\r')) {         
      buffer[buffidx] = 0;
      return;
    }     
    buffer[buffidx++]= c;
      }
}
Con questo funziona perfettamente.
E' un timeout di 5 secondi, se non riceve nulla sulla seriale software, esce.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22715
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

si è vero,....ma che c'entra con la AnalogRead....prova a commentare l'analog e vedrai che tutto torna...
metto delle Serial.println nella funzione
Sarà stato un caso. Anche a te non è uscito dalla funzione readline.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22715
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

PS:
siccome la SoftwareSerial usa gli interrupt, potresti provare a rendere "atomica" la lettura analogica di A0. Per "atomico" si intende un blocco di codice che non è interrompibile da un interrupt. In questo modo evitiamo che interferenze esterne della libreria diano noia alla funzione di lettura del pin analogico.

Code:
cli();
batt = analogRead(A0);
sei();
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22715
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

PS2:
una domanda...
http://atmolab.wordpress.com/
hai per caso intenzione di lanciare un pallone sonda con l'Arduino?  smiley-twist
Logged


Pages: [1] 2   Go Up
Jump to: