Pages: [1] 2 3 4   Go Down
Author Topic: Nuova libreria secTimer  (Read 3106 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho notato che ultimamente molti si lamentano del fatto che la funzione millis() vada in overflow dopo 49,7 giorni, creando non pochi problemi nel calcolo di intervalli temporali maggiori di tale periodo.
Riprendendo il lavoro fatto per la mia libreria swRTC ho deciso di creare una nuova libreria che ho, molto semplicemente, rinominato secTimer. (nome cambiato dal precedente Timer).

Questa libreria altro non fa che attivare un timer interno dell'Arduino (o del micro nel caso si voglia usare su progetti in standalone) per gestire un contatore di secondi. Quindi il tempo minimo che può gestire questa libreria è il SECONDO, non può gestire intervalli inferiori. Ma questo intervallo va più che bene per operazioni che devono essere eseguite molto tempo l'una dall'altra, come ad esempio attivare dispositivi (relé per accensione luci, LED ecc...) oppure per leggere ogni tanto un sensore (temperatura, ecc...).

Qual è il vantaggio di secTimer rispetto all'uso di millis()? Che millis(), come detto, va in overflow dopo 49,7 giorni. secTimer, invece, va in overflow dopo 136 ANNI! Questo significa che il vostro dispositivo cesserà di funzionare ben prima che la libreria riparta da zero!  smiley-wink

La libreria si scompatta nella propria cartella delle librerie. Consiglio l'uso della cartella /libraries all'interno della propria cartella degli sketch (/home/utente/sketchbook per Linux o /Documenti/Arduino per Windows). Una volta installata, basta includerla nel proprio progetto, crearne un'instanza, far partire il contatore e poi leggere i secondi al momento del bisogno. Tutto è ben capibile aprendo lo sketch secTimerLed incluso con la libreria.

Ho scelto di dotare la libreria delle funzioni di avvio e arresto del contatore perché, visto che va ad utilizzare un timer hardware del microcontrollore, potrebbe capitare la necessità di usare temporaneamente quel timer per altri compiti per cui si può arrestare la libreria, prendere il controllo del timer, eseguire i propri compiti e poi riavviare la libreria.

L'impatto sulla dimensione del codice è limitato, circa 350 byte (compilando per Arduino): BlinkWithoutDelay genera sul mio sistema uno sketch di 992 byte mentre secTimerLed genera uno sketch di 1342 byte.

La libreria è alla prima versione. La base (swRTC) è buona per cui ho compilato senza problemi per Attiny84/85, Arduino MEGA e UNO, Atmega1284. Può esserci ancora qualche errore, nel caso segnalateli.

La licenza è, ovviamente, GNU GPL versione 3.0 o successive.

Buon divertimento!  smiley-wink

* secTimer-0_2.zip (23.43 KB - downloaded 68 times.)
« Last Edit: April 18, 2012, 12:15:44 pm by leo72 » Logged


0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2295
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ottimo lavoro, come sempre, Leo!  smiley-mr-green

Per gestire eventi "schedulati" era molto interessante anche la libreria Metro (cmq diversa nell'utilizzo e nelle funzionalità dalla tua):
http://arduino.cc/playground/Code/Metro
Logged

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

Sono 2 cose diverse.
La Metro esegue dei compiti ogni tot, la mia è un semplice contatore di secondi, per l'uso che uno ne vuol fare.
Logged


BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'è già una library chiamata Time
http://www.arduino.cc/playground/Code/time
non è che poi crei confusione?

Comunque ottimo lavoro
Logged

Offline Offline
Sr. Member
****
Karma: 4
Posts: 408
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bravo comunque quoto anche io di cambiare il nome
Logged

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 26
Posts: 5495
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grande Leo, come il solito  smiley
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Leo ma se fra un secondo e l'altro usassi millis o micros per interpolare il tempo dove servisse per poi resettarlo?
si potrebbe ottenere la precisione di millies/micros e l'inoverflowabilità di Timer insieme.
« Last Edit: April 18, 2012, 12:09:45 pm by BrainBooster » Logged

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

@amario e ilmandorlone:
nome cambiato in secTimer (sec da seconds).
Ho anche corretto il file keywords per l'evidenziatura del codice nell'IDE, che mi ero dimenticato di sistemare.

@brain:
secTimer non altera le normali funzioni millis dell'Arduino o del micro per cui puoi usare entrambe le funzioni in abbinamento.
Logged


Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ottimo smiley-wink
Logged

BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Contra factum non datur argomentum   smiley-wink
Logged

Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie perche' fai sempre cose che mi tornano utili come il tuo swrtc smiley-wink
Logged

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

grazie perche' fai sempre cose che mi tornano utili come il tuo swrtc smiley-wink
Beh, alla fine sono le cose più ricorrenti di richieste di aiuto. La questione dell'overflow di millis viene fuori con una frequenza molto elevata.
Logged


Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3282
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ottimo, quindi a tutte le domande "cosa succede quando il millis va in overflow" e che abbiamo sempre risposto "NULLA riparte da zero ......" abbiamo detto delle fregnacce? smiley


ciao
Logged

no comment

0
Online Online
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ottimo, quindi a tutte le domande "cosa succede quando il millis va in overflow" e che abbiamo sempre risposto "NULLA riparte da zero ......" abbiamo detto delle fregnacce? smiley


ciao

no è giusto, riparte da 0, proprio perchè va in overflow

leo, non esiste un modo per fare questa libreria SENZA perdere un timer? per esempio agganciarsi all'overflow della millis?? ho una mezza idea.
Se intercettiamo l'overflow della millis, e per trovare i valori "in mezzo" chiamiamo millis() quando l'utente chiama getSecond, perdi la possibilità di creare allarmi come la libreria Metro, ma guadagni un timer
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

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

leo, non esiste un modo per fare questa libreria SENZA perdere un timer?
Forse sì, forse no. Considera però che la secTimer è una cosa fatta in poco tempo: avendo usato il core della swRTC ho preparato questa libreria in circa mezz'ora, documentazione compresa  smiley-wink

Quote
per esempio agganciarsi all'overflow della millis?? ho una mezza idea.
Se intercettiamo l'overflow della millis, e per trovare i valori "in mezzo" chiamiamo millis() quando l'utente chiama getSecond, perdi la possibilità di creare allarmi come la libreria Metro, ma guadagni un timer
[/quote]
Ma non risolvi il problema della gestione dell'overflow di millis(), che l'utente deve comunque sempre considerare. Perché se lui mette un if con un check su millis e questa riparte da zero prima che l'if sia vero, siamo punto e a capo.

Logged


Pages: [1] 2 3 4   Go Up
Jump to: