Italy
Offline
Jr. Member
Karma: 0
Posts: 60
ATMOLab
|
 |
« on: January 16, 2013, 08:03:43 am » |
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
|
|
|
|
|
Italy
Offline
Jr. Member
Karma: 0
Posts: 60
ATMOLab
|
 |
« Reply #1 on: January 16, 2013, 08:11:29 am » |
ah dimenticavo Arduino UNO
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16547
Don't know what I do
|
 |
« Reply #2 on: January 16, 2013, 09:24:31 am » |
Pubblica lo sketch, per favore, che altrimenti non si capisce il problema.
|
|
|
|
|
Logged
|
|
|
|
|
Italy
Offline
Jr. Member
Karma: 0
Posts: 60
ATMOLab
|
 |
« Reply #3 on: January 16, 2013, 02:37:17 pm » |
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
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16547
Don't know what I do
|
 |
« Reply #4 on: January 16, 2013, 02:49:48 pm » |
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
Jr. Member
Karma: 0
Posts: 60
ATMOLab
|
 |
« Reply #5 on: January 16, 2013, 02:56:53 pm » |
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
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16547
Don't know what I do
|
 |
« Reply #6 on: January 16, 2013, 03:32:43 pm » |
Ma sei sicuro che si inchiodi all'analogRead e non alla comunicazione col GPS che c'è subito prima? Potresti provare così: 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
Jr. Member
Karma: 0
Posts: 60
ATMOLab
|
 |
« Reply #7 on: January 16, 2013, 03:37:38 pm » |
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
|
|
|
|
|
Italy
Offline
Jr. Member
Karma: 0
Posts: 60
ATMOLab
|
 |
« Reply #8 on: January 16, 2013, 03:48:39 pm » |
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
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16547
Don't know what I do
|
 |
« Reply #9 on: January 16, 2013, 04:04:03 pm » |
Il problema sembra risiedere in readline(). A me non esce da lì: ecco l'ouput: 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
Jr. Member
Karma: 0
Posts: 60
ATMOLab
|
 |
« Reply #10 on: January 16, 2013, 04:06:12 pm » |
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
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16547
Don't know what I do
|
 |
« Reply #11 on: January 16, 2013, 04:10:08 pm » |
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
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16547
Don't know what I do
|
 |
« Reply #12 on: January 16, 2013, 04:12:46 pm » |
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
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16547
Don't know what I do
|
 |
« Reply #13 on: January 16, 2013, 04:38:03 pm » |
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. cli(); batt = analogRead(A0); sei();
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16547
Don't know what I do
|
 |
« Reply #14 on: January 16, 2013, 04:47:37 pm » |
PS2: una domanda... http://atmolab.wordpress.com/hai per caso intenzione di lanciare un pallone sonda con l'Arduino? 
|
|
|
|
|
Logged
|
|
|
|
|
|