swRTC

Bellissimo :smiley:

Stasera modifico la mia tastiera e ci metto questo, al posto del tastino con le finestre:

3635770970_5cf96c282e.jpg

leo72:
Bellissimo :smiley:

Stasera modifico la mia tastiera e ci metto questo, al posto del tastino con le finestre:

io stasera devo fare un operazione difficile,devo operare il mio vecchio mac per metterci linux,speriamo che il trapianto vada bene :grin:
estetica mac,sistema linux cosa vuoi di più :grin:

Ciao

Le librerie <swRTC.h> <IRremote.h> non possono coesistere l'orologio non avanza quando viene aggiunta la lib IR, forse perchè usano lo stesso timer?
A parte non avanzare, quando interrogo il server NTP ottengo l'aggiornamento correttamente, ma IRemote si inchioda e smette di ricevere, restartando la libreria IR dopo l'aggiornamento la stessa tornava a funzionare, ma l'orologio resta piantato all'ultimo aggiornamento.
Come posso risolvere?

Grazie

bye

Mi pare che nella SwRtc il timer sia selezionabile. Ma devi attendere Leo per info più precise. :stuck_out_tongue:

Non conosco la IRremote, però la swRTC usa un timer prefissato, che non è cambiabile. Quale timer dipende dal tipo di chip, sull'Atmega328 è il timer2.

OK. Ho dato un'occhiata alla IRremote.

Di default usa il timer 2 ma ho visto da un suo file di configurazione che questa scelta può essere cambiata. Basta editare il file IRremoteInt.h
Per l'Arduino UNO (quindi Atmega328), si devono invertire i commenti alle linee 66/67:

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  //#define IR_USE_TIMER1   // tx = pin 9
  #define IR_USE_TIMER2     // tx = pin 3
#endif

Per l'Arduino MEGA (quindi Atmega2560) si sceglie il timer alle righe 33/37:

// Arduino Mega
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  //#define IR_USE_TIMER1   // tx = pin 11
  #define IR_USE_TIMER2     // tx = pin 9
  //#define IR_USE_TIMER3   // tx = pin 5
  //#define IR_USE_TIMER4   // tx = pin 6
  //#define IR_USE_TIMER5   // tx = pin 46

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

pablos:
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.

la swrtc usa il timer 2, se usasse il timer 1 andrebbe in conflitto con il delay

Testato:
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.

scusa errore di sbaglio, thanks :slight_smile:

Capito

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

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

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 :slight_smile:

ciao

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

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 :slight_smile:

il Maestro mi ha anticipato :slight_smile:

Testato:
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.

Testato:
il Maestro mi ha anticipato :slight_smile:

ma va'.... :smiley:

@Leo

Nel tuo sito metti questo esempio

if (millis() - tempo_precedente > intervallo) {
    tempo_precedente = millis();
    ....
}

dicendo :

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

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 :slight_smile: :slight_smile: o devo provare :smiley:

ciao