0
Offline
Tesla Member
Karma: 83
Posts: 8233
:(){:|:&};:
|
 |
« Reply #45 on: May 03, 2012, 05:00:29 am » |
s', usi un millis, ma non vedo la necessità del while dato che hai già il loop
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16479
Don't know what I do
|
 |
« Reply #46 on: May 03, 2012, 05:01:38 am » |
Perché hai noInterrupts() nel tuo sketch?
|
|
|
|
|
Logged
|
|
|
|
|
Padova
Offline
Full Member
Karma: 0
Posts: 197
|
 |
« Reply #47 on: May 03, 2012, 05:08:45 am » |
Perché hai noInterrupts() nel tuo sketch? Perchè stavo provando a gestire anche un risparmio energetico sull'LCD che spegnesse l'LCD ogni X secondi. Tale spegnimento però non volevo interferisse con il logging. Poi l'ho eliminato perchè non riuscivo a gestirlo in maniera corretta, ma mi son dimenticato di eliminare anche i noInterrupts()  grazie leo per la disponibilità a lettere il mio programma naif s', usi un millis, ma non vedo la necessità del while dato che hai già il loop Allora mi sa che non ci ho capito molto...  In teoria il void loop non ripete le istruzioni ogni ciclo-macchina? Se io metto dentro il loop la "stampa a video" del mio valore cosi com'è mi sfarfalla. Per non sfarfallare vorrei che la videata cambiasse con 0,5 secondi tipo... per far questo come posso fare se non con un ciclo?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16479
Don't know what I do
|
 |
« Reply #48 on: May 03, 2012, 05:17:28 am » |
Ti dico come farei.
Ti crei una matrice delle dimensioni del tuo display. Mettiamo che usi un 16x4, allora ti fai un bufferVideo[16][4]. Nella matrice scrivi tutte le modifiche che vuoi. Puoi anche farti delle semplici funzioni per cancellare il "video" (basta un ciclo che metta a 32 [codice Ascii dello spazio] tutte le celle, ad esempio) e poi, ogni tot, spedisci la matrice al display.
unsigned long pianificazione=millis()+50; void loop() { ... ... ... if (millis()>pianificazione) { visualizza(); pianificazione=millis()+50; } }
|
|
|
|
|
Logged
|
|
|
|
|
Padova
Offline
Full Member
Karma: 0
Posts: 197
|
 |
« Reply #49 on: May 03, 2012, 05:26:03 am » |
Grazie mille leo, mi metto subito all'opera. Ho guardato sulla sezione reference per il comando bufferVideo ma non c'è, hai un link per vedere la sintassi e qualche esempio?
|
|
|
|
|
Logged
|
|
|
|
|
Padova
Offline
Full Member
Karma: 0
Posts: 197
|
 |
« Reply #50 on: May 03, 2012, 06:04:22 am » |
void loop() { readButtons(); //I splitted button reading and navigation in two procedures because navigateMenus(); //in some situations I want to use the button for other purpose (eg. to change some settings) if(abilitazioneLog != 0) { lastSaveLoop (); } if (millis()>pianificazione) { letturaph(); pianificazione=millis()+50; } } //loop()... Provato cosi ma niente da fare, premendo i pulsanti non entra nel menu però tiene conto della cosa perchè se premo enter per 3 volte mi fa partire il logging  Non ne vengo fuori! Come posso fare?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 83
Posts: 8233
:(){:|:&};:
|
 |
« Reply #51 on: May 03, 2012, 06:14:18 am » |
perchè hai messo anche letturaph(); nell'if.
la lettura pulsanti e sensori falla pure sempre (in realtà la lettura sensori dovresti farla alla velocità del sensore, o meno)
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2446
|
 |
« Reply #52 on: May 03, 2012, 06:29:51 am » |
ma l'ho postato 2 pag fa l'esempio millis per aggiornare un display ... bha non capisco.
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Padova
Offline
Full Member
Karma: 0
Posts: 197
|
 |
« Reply #53 on: May 03, 2012, 07:32:08 am » |
ma l'ho postato 2 pag fa l'esempio millis per aggiornare un display ... bha non capisco. Pablos hai ragione scusa, non l'avevo proprio visto! Allora, l'ho riadattato al mio sketch come segue: void loop() { unsigned long currentMillis_a = millis(); if(currentMillis_a - previousMillis_a > interval_a) { previousMillis_a = currentMillis_a; phvalue = letturaph(); lcd.setCursor(0,0); lcd.print("pH : "); lcd.print(phvalue); } readButtons(); //I splitted button reading and navigation in two procedures because navigateMenus(); //in some situations I want to use the button for other purpose (eg. to change some settings) if(abilitazioneLog != 0) { lastSaveLoop (); } } //loop()...
con questa funzione di lettura int letturaph() { phdigit = analogRead(phin); phvalue = (((float)phdigit*14.00)/1023.00); //Serial.println (phvalue); return phvalue; } Ora sembra andare meglio, ma purtroppo la videata a sempre la priorità su tutto. In pratica se io entro nel menu questo si interrompe per mostrarmi la videata di lettura e poi rimane sulla videata di lettura. Ora ci smanetto un pò credo di aver capito l'inghippo. Grazie per l'aiuto!
|
|
|
|
|
Logged
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 836
ƎR like no other.
|
 |
« Reply #54 on: May 10, 2012, 03:39:00 pm » |
scusate se sono OT  ma mi trovo a lavorare con un PIC in questo momento... sapete se sui PIC c'è una funzione tipo millis() o qualcosa di simile? ormai mi sono affezionato a questa funzione  grazie 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16479
Don't know what I do
|
 |
« Reply #55 on: May 10, 2012, 04:20:09 pm » |
scusate se sono OT  ma mi trovo a lavorare con un PIC in questo momento... sapete se sui PIC c'è una funzione tipo millis() o qualcosa di simile? ormai mi sono affezionato a questa funzione  grazie  La funzione millis() è una funzione in C. Puoi aprire il core di Arduino, prendere il codice e riadattarlo all'uso sui PIC, che hanno anch'essi i timer come l'Arduino.
|
|
|
|
|
Logged
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 836
ƎR like no other.
|
 |
« Reply #56 on: May 10, 2012, 04:25:52 pm » |
infatti... stavo pensando anch'io di usare i timer e di crearmi qualcosa, perchè ho visto che in giro fanno così, adesso vado a guardarmi millis di arduino... grazie 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16479
Don't know what I do
|
 |
« Reply #57 on: May 10, 2012, 04:31:57 pm » |
infatti... stavo pensando anch'io di usare i timer e di crearmi qualcosa, perchè ho visto che in giro fanno così, adesso vado a guardarmi millis di arduino... grazie  No potrebbe essere altrimenti. Per avere un riferimento temporale che abbia un minimo di precisione devi delegare il compito di aggiornare il contatore ad un qualcosa che soffra il minimo le influenze esterne. Quale miglior "posto" di una routine di interrupt chiamata dall'overflow di un contatore interno, ossia di un timer hardware la cui scansione temporale è gestita direttamente dal clock del micro?  Se hai bisogno, chiamami che ormai coi timer mi sono fatto una cultura 
|
|
|
|
|
Logged
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 836
ƎR like no other.
|
 |
« Reply #58 on: May 10, 2012, 04:37:49 pm » |
ok grazie dove la trovo la funzione millis dell'arduino? 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16479
Don't know what I do
|
 |
« Reply #59 on: May 10, 2012, 04:47:35 pm » |
Più che la funzione millis, devi guardare tutto. Da come viene impostato il timer 0 a come vengono recuperati i valori. Trovi tutto in hardware/arduino/cores/arduino/wiring.c
Ti consiglio di leggere anche il codice della mia libreria swRTC. Lì imposto il timer 2, ma è lo stesso identico principio e gli stessi valori (cambiano solo i nomi dei registri) perché sia il timer 0 che il timer 2 sono ad 8 bit.
|
|
|
|
|
Logged
|
|
|
|
|
|