0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« on: August 06, 2011, 06:57:41 am » |
sulla sezione Sensori stiamo sviscerando un problema da me riscontrato sui 18B20 se c'e' qualcuno interessato a contribuire questo e' il post, e' la seconda pagina, nella prima non era ancora chiaro il problema, http://arduino.cc/forum/index.php/topic,68302.15.htmlgrazie
|
|
|
|
« Last Edit: August 17, 2011, 04:06:29 pm by Testato »
|
Logged
|
|
|
|
|
Monselice PD Italy
Offline
Faraday Member
Karma: 15
Posts: 4912
фон Крыса
|
 |
« Reply #1 on: August 06, 2011, 09:27:47 am » |
non ne ho nemmeno uno per provare....
|
|
|
|
|
Logged
|
Se corri veloce come un fulmine, ti schianterai come un tuono.
|
|
|
|
Deep south of Italy
Offline
Faraday Member
Karma: 6
Posts: 2954
The quieter you become, the more you can hear
|
 |
« Reply #2 on: August 07, 2011, 03:02:15 am » |
quale libreria usi per controllarlo?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #3 on: August 10, 2011, 05:17:25 am » |
la Dallas di Miles Burton ho praticamente messo in evidenza che l'uso di questo sensore, fra i piu' famosi ed usati su arduino, in un progetto di lettura continua della temperatura, quindi non ogni secondo ma continua, in real time, crea problemi di visualizzazione, il display si spegne durante la conversione del dato. nel mio caso come display uso le nixie  ho postato un codice di test che si puo' usare con il monitor seriale, guardando il led TX di arduino si vede leggermemnto lo spegnimento guardando il led.
|
|
|
|
|
Logged
|
|
|
|
|
Deep south of Italy
Offline
Faraday Member
Karma: 6
Posts: 2954
The quieter you become, the more you can hear
|
 |
« Reply #4 on: August 10, 2011, 06:37:08 am » |
nella libreria ci sono punti in cui si usano delay anche di 750ms a seconda della precisione della lettura richiesta, non sarà per quello?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #5 on: August 10, 2011, 07:17:25 am » |
il motivo e' quello, in base alla risoluzione la gestione "normale" del sensore usa delay di 750ms per i 12bit
ma gia' dalla penultima versione della libreria e' stata inserita la modalita' asincrona. che serve appunto ad eliminare questo problema.
Purtroppo appunto come evidenziato la modalita' asincrona ha cmq blocchi di 28ms, 28ms sono apprezzabili dall'occhio umano, e quindi danno fastidio.
si sta tentando di ridurre ancora di piu' questo tempo.
All'inizio ho rpovato a far lavorare il codice su una seconda variabile in cui copiare il dato letto dal sensore, ma purtroppo sembra che quei 28ms bloccano proprio tutto il micro, quindi non se ne esce con soluzioni sw.
A questo punto mi domando, non solo non e' possibile usare il 18B20 per letture continue, ma se sullo stesso progetto si usano piu' sensori anche diversi, tipo umidificatori ed altro, se e' vero che i 28ms bloccano tutto il micro, tutti i dati di tutti i tipi di sensori vengono anch'essi bloccati.
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 74
Posts: 7373
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #6 on: August 10, 2011, 08:41:12 am » |
A questo punto mi domando, non solo non e' possibile usare il 18B20 per letture continue, ma se sullo stesso progetto si usano piu' sensori anche diversi, tipo umidificatori ed altro, se e' vero che i 28ms bloccano tutto il micro, tutti i dati di tutti i tipi di sensori vengono anch'essi bloccati.
Ma assolutamente no, basta scrivere bene il software di gestione della onewire e usare gli interrupt onchange piuttosto che un polling software. Certo che con all'interno della libreria cose come questa: "preso dall'ultima relase 3.71"if (parasite) delay(10); // 10ms delay
Hai voglia a blocchi del funzionamento di tutto il resto.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16495
Don't know what I do
|
 |
« Reply #7 on: August 10, 2011, 03:28:13 pm » |
if (parasite) delay(10); // 10ms delay
Hai voglia a blocchi del funzionamento di tutto il resto. Quindi in presenza di insetti parassiti in casa il sensore si blocca nel tentativo di identificare la famiglia e la specie degli stessi.. 
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #8 on: August 10, 2011, 04:02:08 pm » |
aspita, interessante, non sono andato a guardare nelle librerie aivoglia di usare il blinking without delay se poi nella libreria ci sono i delay normali.
se cambio tutti i delay della libreria con la tecnica del blink without delay potrei risolvere ?
se ho capito durante il comando Delay il micro smette di fare qualsiasi cosa ci sia nel void loop ? resta li' fermo a contare giusto ? l'unica attivita' e' il conteggio del tempo ?
|
|
|
|
|
Logged
|
|
|
|
|
Deep south of Italy
Offline
Faraday Member
Karma: 6
Posts: 2954
The quieter you become, the more you can hear
|
 |
« Reply #9 on: August 11, 2011, 02:54:11 am » |
anche gli interrupt continuano a funzionare ed i valori di eventuali pwm vengono mantenuti.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #10 on: August 11, 2011, 03:11:50 am » |
capisco, e secondo te c'e' un modo per bypassare il problema via sw, senza dover usare un latch hw ? posto il codice con commenti in italiano, magari di passaggio serve a qualcuno. con questo codice di test il problema lo si nota guardando il led TX di arduino che invece di restare fisso a trasmettere sempre il dato, ogni 28ms si spegne per un attimo #include <OneWire.h> #include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 16
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire);
// variabili temp float temp; long previousMillis = 0;
void setup(void) { sensors.begin(); sensors.setResolution(12); sensors.setWaitForConversion(false); // makes it async asincrono=non blocca il programma durante la lettur Serial.begin(9600); }
void loop(void) {
if (millis() - previousMillis > 750) // mette la temperatura nella variabile temp dopo 750ms { temp=sensors.getTempCByIndex(0); //COMANDO CHE CREA IL PROBLEMA Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); // Serial.println("DONE"); previousMillis = millis(); // riparte il temporizzatore } Serial.println(temp); }
|
|
|
|
« Last Edit: August 11, 2011, 03:13:35 am by Testato »
|
Logged
|
|
|
|
|
Deep south of Italy
Offline
Faraday Member
Karma: 6
Posts: 2954
The quieter you become, the more you can hear
|
 |
« Reply #11 on: August 11, 2011, 03:27:21 am » |
è vero che la modalità asincrona non impone delay programmati, ma comunque devi aspettare la fine della lettura/conversione/calcolo crc ecc... vedo che comunque effettui la lettura ogni 750ms, quindi presumo che il ds sia collegato in modalità parassita. cambia modalità di alimentazione, dovresti riuscire a strizzare qualche millisecondo in più.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #12 on: August 11, 2011, 06:18:30 am » |
ho gia' provato senza esito, ma ora mi viene un dubbio, dovevo forse dichiararlo anche nello sketch ? oppure c'e' un riconoscimento automatico del parasite mode ?
mi ricontrollero' questa cosa, nel frattempo approfitto, per 2 richieste di chiarimenti e per un'idea.
1) la variabile "temp" che uso per memorizzare il dato e per passare il dato stesso alla sezione di visualizzazione durante questi benedetti 28ms non e' accessibile ? cioe' il valore presente in una variabile,nel momento in cui questa e' in attesa di ricevere il nuovo, non e' disponibile ? sono domande basi ma io vengo dal mondo elettronico, devo vedere la variabile come una cella di memoria che puo' fare una cosa alla volta, quindi se e' stata chiamata in causa per memoprizzare un valore, e questo valore arriva dopo 10 secondi, per 10 secondi il suo vecchio valore non e' a disposizione ? viene cancellato nel momento della richiesta del nuovo ?
2) perche' non riesco a bypassare il problema semplicemente copiando dopo 1 ms dalla fine della lettura Temp in Temp2 e quindi lavorare su temp2 per la visualizzazionhe del dato ? cioe' aspetto 750ms per la lettura, copio temp in temp2 visualizzo temp2 per 750ms, ricopio ecc ?
3) l'idea invece che mi e' venuta prendendo spunto dal forum e' questa: volendo passare ad una soluzione HW, posso usare la eeprom dell'atmega per memorizzare il valore e quindi far lavorare la parte di visualizzazione su questa cosi' come farei con uno shift register hw esterno ?
|
|
|
|
« Last Edit: August 11, 2011, 06:21:05 am by Testato »
|
Logged
|
|
|
|
|
Deep south of Italy
Offline
Faraday Member
Karma: 6
Posts: 2954
The quieter you become, the more you can hear
|
 |
« Reply #13 on: August 11, 2011, 06:25:14 am » |
si , puoi scrivere in eeprom e dichiararla come volatile
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3925
Arduino rocks
|
 |
« Reply #14 on: August 13, 2011, 05:09:48 am » |
nessuno ha voglia di chiarirmi le prime due domande ? lo so che sono domande base di programmazione, ma mi aiuterebbe molto avere queste due basi su cui ragionare.
x brain: leggendo in giro da un lato ho letto che la EEprom interna non gestisce Float, mentre in un topic sembra di si. Come e' la situazione ? a me serve solo una cifra decimale
|
|
|
|
|
Logged
|
|
|
|
|
|