Pages: 1 ... 63 64 [65] 66 67 ... 72   Go Down
Author Topic: swRTC  (Read 79994 times)
0 Members and 1 Guest are viewing this topic.
Genova
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3472
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per l'interessamento, l'ho messo sul timer 3 e sembra ok

Tu usi il timer 1 no? mi sembra di capire dalla linea #define TIMER_TO_USE_FOR_MILLIS  1 dal file core_build_option.h
mentre la IR usava il timer 2, come potevano disturbarsi?

ciao
Logged

no comment

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 335
Posts: 23122
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per l'interessamento, l'ho messo sul timer 3 e sembra ok

Tu usi il timer 1 no? mi sembra di capire dalla linea #define TIMER_TO_USE_FOR_MILLIS  1 dal file core_build_option.h
mentre la IR usava il timer 2, come potevano disturbarsi?

ciao
Ma di che scheda stiamo parlando? Della MEGA?
No, sull'Atmega2560 e Atmega328 uso il timer 2. Perché è un timer ad 8 bit e riesco a configurarlo in modo più semplice e preciso per i miei scopi. Il file core_build_options.h serve per il core Tiny, è scritto nel file readme.txt.
Logged


0
Offline Offline
Faraday Member
**
Karma: 49
Posts: 6016
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la swrtc usa il timer 2, se usasse il timer 1 andrebbe in conflitto con il delay
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
Online Online
Brattain Member
*****
Karma: 335
Posts: 23122
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

la swrtc usa il timer 2, se usasse il timer 1 andrebbe in conflitto con il delay
Sull'Arduino la funzione delay è sul timer 0, sia sul 328 che sul 2560.
Logged


0
Offline Offline
Faraday Member
**
Karma: 49
Posts: 6016
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusa errore di sbaglio, thanks  smiley
Logged

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

Genova
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3472
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Capito

Quindi i pin che utilizzano i timer per altri scopi non possono essere usati per i pwm è corretto?
Logged

no comment

0
Offline Offline
Faraday Member
**
Karma: 49
Posts: 6016
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non capisco la domanda. i timer sono interni, non e' che usano dei pin. puoi usare la swrtc senza che questa infici nessun pin.
i pin pwm saranno legati si' ai timer, e quindi se per qualche motivo viene alterata la normale funzione dei timer ci possono essere conseguenze su pwm
Logged

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

Genova
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3472
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la domanda sarebbe ...sto usando:

timer 2 sulla swrtc abbinato al pin 9
timer 3 per la trasmissione IR abbinato al pin 5

su questi 2 pin posso usare il PWM, quindi variare il  duty cycle senza compromettere il normale funzionamento delle librerie?
Ma forse questo faccio prima a provarlo, piuttosto un problema che mi da preoccupazioni del timer è il suo overflow, ho un massimo di 800 timer programmabili nell'arco di un anno, 400 ON e 400 OFF distribuiti su 50 pin, ciascun pin reagisce con altre programmazioni impulsive da 1 a 250 secondi ciascuno, se questi timer mi cadono nel 41 esimo giorno succede un casino a tutti gli apparati collegati ai relays.

Pensavo di creare un overflow di 4 anni usando 2 long (41ggx41gg = 1681gg/365 circa 4 anni) ma non mi viene in mente nulla per registrare i valori così lunghi e leggerli.
Non so, la butto lì, ma in qualche modo devo evitarlo smiley



ciao
« Last Edit: December 27, 2012, 04:13:10 pm by pablos » Logged

no comment

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 335
Posts: 23122
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La swRTC imposta il timer 2 in modalità di funzionamento normale: con questa modalità viene disattivata la generazione del segnale PWM perché non c'è cambio di stato dei pin OC2A e/o OC2B.

Tornando ai tuoi timer... da dove li hai tirati fuori 800 timer scusa??
Comunque nessuno ti impedisce di usare un tipo "unsigned long long", se vuoi. E' un tipo di dati a 64 bit, che va in overflow dopo 500 e passa anni! Paghi però il fatto che per gestire dati a 64 bit aumenti considerevolmente il quantitativo di Flash occupata dal tuo programma.
In alternativa devi cambiare modo di gestire il controllo dello scorrere del tempo. In questo modo puoi continuare ad usare millis() e variabili a 32 bit e non avere più problemi di overflow:
http://www.leonardomiliani.com/?p=576
Logged


0
Offline Offline
Faraday Member
**
Karma: 49
Posts: 6016
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io credo che sbagli approccio sul concetto dei pin. se ad esempio colleghi il pin 6 ad un led e gli vari la luminosita', non e' che alteri il delay di arduino (il pin 6 fa capo al timer 0, cosi' come il delay)

quindi dire "timer 2 sulla swrtc abbinato al pin 9" e' fuorviante

per il discorso dell'overflow qui sul forum c'e' uno scienziato, un certo leo, non so se lo conosci, lui ha anche un suo sito sul quale viene spiegato come evitare il problema con una semplice operazione  smiley
Logged

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

0
Offline Offline
Faraday Member
**
Karma: 49
Posts: 6016
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il Maestro mi ha anticipato  smiley
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
Online Online
Brattain Member
*****
Karma: 335
Posts: 23122
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

io credo che sbagli approccio sul concetto dei pin. se ad esempio colleghi il pin 6 ad un led e gli vari la luminosita', non e' che alteri il delay di arduino (il pin 6 fa capo al timer 0, cosi' come il delay)
Il motivo è presto detto. Il core di Arduino imposta i timer per funzionare in una determinata maniera all'avvio dello sketch.
Il timer 0, nello specifico, viene regolato in modalità Fast PWM. Grazie alla modalità Fast PWM può anche generare appunto un segnale PWM sui pin collegati. Viene inoltre impostato per generare una frequenza di 976 Hz. Questo valore non è casuale: è quello più prossimo a 1000 Hz che possiamo ottenere senza andare ad alterare manualmente il funzionamento del timer, sfruttandolo cioè per la sua interezza: il contatore del timer 0 parte da 0 ed arriva a 255, per poi ripartire da 0 ecc...
Per variare il duty cicle si sfruttano i registri OCR0A/B. Basta mettere in essi il valore del duty cicle (da 0 a 255) che, senza alterare né la frequenza del segnale né altro del timer si ottiene sul corrispondente pin il segnale PWM voluto.

Oltre a questo, si aggancia anche un interrupt all'overflow del contatore. In questo modo, tramite dei piccoli accorgimenti software che illustrai tempo fa, si va ad ottenere un incremento del contatore interno millis pari a 1000 volte al secondo.
Logged


Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 335
Posts: 23122
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

il Maestro mi ha anticipato  smiley

ma va'....  smiley-grin
Logged


Genova
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3472
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Leo

Nel tuo sito metti questo esempio
Code:
if (millis() - tempo_precedente > intervallo) {
    tempo_precedente = millis();
    ....
}
 

dicendo :
Quote
Ammettiamo che tempo_precedente valga  4.294.967.000 e che intervallo valga 1000. Ad un certo punto millis() va in overflow e riparte da zero.


il confronto diventa 0 - 4294967000 > 1000
Si tenderebbe a pensare che il confronto diventi: -4294967000 > 1000

ma usando interi di tipo unsigned la sottrazione in realtà restituisce come valore 296.

ma tu qui
if (millis() - tempo_precedente > intervallo) {

nel millis() non usi l'unsigned è sott'inteso da qualche parte?



comunque io ho sempre usato questa

Code:
unsigned long Millis_corrente = millis();   
    if(Millis_corrente - Millis_Precedente > intervallo)
    {   
      Millis_Precedente = Millis_corrente;
      ...
      ... 
    }

che direi sia la stessa, ma ovviamente non ho mai taroccato i valori per vedere che succede, quindi così anche trovandomi vicino al punto 0 non mi salta l'opearzione? parola di lupetto smiley smiley o devo provare  smiley-grin

ciao


Logged

no comment

0
Offline Offline
Faraday Member
**
Karma: 49
Posts: 6016
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Leo mi sorge un dubbio, ma se questo semplice trucco che pablos sta gia' usando e che tu hai descritto sul blog, cioe'
Code:
millis() - tempo_precedente > intervallo
elimina il problema overflow di millis, a che serve la tua 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

Pages: 1 ... 63 64 [65] 66 67 ... 72   Go Up
Jump to: