Pages: 1 2 [3] 4   Go Down
Author Topic: Nuova libreria secTimer  (Read 3243 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma tu intercetti l'overflow del timer 1....
Code:
ISR(TIMER1_OVF_vect){
  secondsBecauseOverflow += SECONDS_PER_TIMER0_OVERFLOW;
}
sì, ho sbagliato, ci va un 0 non un uno.  smiley-mr-green
Inoltre ho notato anch'io la variabile timer0_overflow_count, ma non è come dici. Se noti è contenuta nella routine di intercettazione dell'overflow del timer 0 e che viene aggiornato con la stessa frequenza con cui viene aggiornato il contatore dei millisecondi. Quella variabile la riusano per estrarre il numero di microsecondi.
sì, vengono aggiornate insieme, però timer0_millis viene incrementato di "MILLIS_INC" (che è l'equivalente della mia SECONDS_PER_TIMER0_OVERFLOW), mentre timer0_overflow_count viene incrementata di 1.
Noto con piacere che però loro anno salvato anche la parte decimale in timer0_fract.. questo è un punto a cui non avevo pensato, e bisogna farlo. ion pratica bisogna diplicare il codice della millis()
« Last Edit: April 20, 2012, 10:00:30 am by lesto » Logged

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

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

sì, vengono aggiornate insieme, però timer0_millis viene incrementato di "MILLIS_INC" (che è l'equivalente della mia SECONDS_PER_TIMER0_OVERFLOW), mentre timer0_overflow_count viene incrementata di 1.
guarda se MILLIS_INC vale 1, proprio come l'incremento di timer0_overflow_count  smiley-wink
Se risolvi tutte le define che generano MILLIS_INC, vedrai appunto il risultato che ti ho detto: 1.

Quote
Noto con piacere che però loro anno salvato anche la parte decimale in timer0_fract.. questo è un punto a cui non avevo pensato, e bisogna farlo. ion pratica bisogna diplicare il codice della millis()
Lo hanno dovuto fare perché, come ti ho spiegato, non usano un modo diverso di gestire la cosa.
Nella swRTC io difatti impostavo il contatore in modalità "contatore" appunto, con prescaler e valore iniziale del registro calcolati per ottenere esattamente 1000 overflow al secondo, mentre loro impostano il timer per funzionare in modalità "phase correct PWM", ottenendo una frequenza di 976,5625 Hz sui pin esterni e poco più di 1000 overflow al secondo. Di questa differenza loro tengono conto per riallineare i millis all'effettivo scorrere del tempo. Quindi della parte decimale non so che farmene  smiley-wink
Casomai si può pensare di incrementare il contatore separato dei millisecondi ad ogni incremento di millis, così da sapere quando sono passati 1000 ms senza fare i conteggi a 976. Però non facendo il confronto diretto con millis perché questa va in overflow... ora butto giù 2 righe...

@pablos:
gli darò un'occhiata
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

leo scusami se torno a romperti le scatole smiley-lol questa libreria va anche lei in conflitto con la libreria irRemote per via del famoso timer?
Logged

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

leo scusami se torno a romperti le scatole smiley-lol questa libreria va anche lei in conflitto con la libreria irRemote per via del famoso timer?
Non lo so. Che timer usa la irRemote?
Cmq c'è la versione "ridotta" di cui stiamo parlando ora che è un mod del core Arduino che usa solo il timer 0.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la irRemote usa il timer 2, e comunque la libreria ridotta che usa il timer0  dove la si puo' trovare? e l'ulitizzo e' uguale alla Swrtc?
Logged

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

la irRemote usa il timer 2, e comunque la libreria ridotta che usa il timer0  dove la si puo' trovare? e l'ulitizzo e' uguale alla Swrtc?
La secTimer usa il timer 2. La modifica al core Arduino la trovi invece qualche post sopra, devi farti una copia di backup dei file originali. Questa libreria non è la swRTC, è un semplice contasecondi con overflow a 136 anni, non hai le funzioni temporali.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

((6==rtc.getHours()) && (50==rtc.getMinutes()) && (00==rtc.getSeconds()))

quindi il comando scritto sopra non c'e'?
Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

k, millis_inc vale normalmente 1 (normalmente, che succede se cambio f_cpu o prescaler? sbagli i calcoli di un overflow ma poi si auto-adatta!)
in oltre il PWM rimane operativo senza problemi.
Logged

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

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

((6==rtc.getHours()) && (50==rtc.getMinutes()) && (00==rtc.getSeconds()))

quindi il comando scritto sopra non c'e'?
Nessuno di queste funzioni. Hai solo seconds() che ti restituisce il numero di secondi dall'avvio dell'Arduino.

k, millis_inc vale normalmente 1 (normalmente, che succede se cambio f_cpu o prescaler? sbagli i calcoli di un overflow ma poi si auto-adatta!)
in oltre il PWM rimane operativo senza problemi.
Comunque ho replicato il codice che c'è nella funzione originale, poi l'ho caricato e messo accanto ad una Luigino con la delay. La Luigino ha il quarzo esterno, quindi dovrebbe dare un riferimento preciso. Ebbene, la mia versione col conteggio ogni 976 overflow è allineata al ll'Arduino, mentre quella col codice replicato no. Ergo, lascio la mia versione  smiley-wink
Logged


0
Offline Offline
Faraday Member
**
Karma: 46
Posts: 5881
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

complimenti per il lavoro,
illuminami su questo discorso:
usare il delay e' comodissimo, intendo come scrittura, delay xx e via, pero' questo blocca il tutto ecc ecc.
quindi si usa millis, cosi' come fa il blink without delay, che e' piu' complesso di come si usa la funzione delay, in piu' si deve tenere in considerazxione questo discorso dell'overflow.

Ora quindi cosa sarebbe utile per gli umani ? una delay2.0

che si usi come il delay normale, scrivendo solo:
delay2(1000);
sotto il cofano la delay2 dovrebbe usare il millis e tenere conto dell'overflow.

si puo' fare ?
non sarebbe molto meglio e comodo ?
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

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

Delay non è propriamente un blocco, dice all'Arduino di infilarsi in un loop per un tot periodo di tempo. Non è giusto dire che "blocca" l'Arduino perché l'Arduino non è bloccato, sta solo eseguendo questo ciclo.

Secondo il mio punto di vista non vedo necessario un delay2: se devi fare un blocco molto lungo puoi usare seconds(). E non è un grosso problema.
Code:
tempo=seconds()+100;
while(seconds()<tempo){}; //attende 100 secondi

Oppure crearti tu una semplice funzione accessoria:
void delay(unsigned long intervallo) {
  unsigned long tempo=seconds()+intervallo;
  while(seconds()<tempo){};
}

Poi forse non ho capito le tue necessità. smiley-sweat
Logged


0
Offline Offline
Faraday Member
**
Karma: 46
Posts: 5881
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io non ho necessita', mi faccio portavioce delle necessita' terrestri  smiley

sarebbe utile avere oltre al delay normale, che e' giusto sia fatto cosi', un delay2, il quale invece di essere "bloccante" (passami questo termine, poco tecnico ma che fa capire) utilizzi non solo millis, ma anche il tuo metodo per arrivare ai 136 anni di overflow.

io la userei in tutti i progetti, capisco che gia' ora la tua secTimer fa questo, ma poter dire ad una persona che cerca aiuto, magari non esperta:
Quote
invece di delay(1000); usa delay2(1000);
e' molto piu' veloce, utile, pratico, di spiegargli il millis standard o la secTimer
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

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

Concettualmente non è fatta bene. Ti spiego.
delay è un comando che serve ad introdurre un ritardo, ossia infilare il micro in un ciclo dal quale uscire solo dopo un certo lasso di tempo.

Se non si vuole introdurre un ritardo che impedisce di eseguire altri compiti, allora il delay non è il comando che serve. Si deve usare qualcos'altro, come la funzione metro che programma l'esecuzione di compiti a predeterminati intervalli.

Mettere delay2(1000) e poi dopo qualcos'altro non ha senso perché allora non lo metto neanche il delay, se il micro continua ad eseguire il comando seguente. Spero di essermi spiegato bene.  smiley-sweat
Logged


0
Offline Offline
Faraday Member
**
Karma: 46
Posts: 5881
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

certo, tu ti spieghi sempre benissimo,
ma se cambiassimo nome ? tipo usa millisVer2(1000);
l'utilita' resta, cioe' avere un ritardo su un'operazione, senza andare a dichiarare la variabile per poi usare millis sulla stessa, e senza pèreoccuparsi di doverla resettare prima dell'overflow

cioe' se anche arduino cambiasse la funzione millis al fine di gestire l'overflow, la millisVer2 continuerebbe ad avere utilita' in quanto immediata.
Non e' proprio questo l'obiettivo di arduino stesso ?
« Last Edit: April 21, 2012, 03:23:21 am by Testato » Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

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

Ma per questo c'è la libreria Metro:
http://www.pjrc.com/teensy/td_libs_Metro.html

Programmi l'esecuzione di un evento ad intervalli regolari. Quale sarebbe la differenza rispetto al metodo da te proposto?
Oppure tu intendi l'esecuzione una tantum di una funzione al posto di metro che invece scadenza per esecuzioni periodiche?
Logged


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