Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16457
Don't know what I do
|
 |
« Reply #960 on: December 27, 2012, 09:56:20 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2441
|
 |
« Reply #961 on: December 27, 2012, 10:44:42 am » |
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
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16457
Don't know what I do
|
 |
« Reply #962 on: December 27, 2012, 11:43:13 am » |
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
Faraday Member
Karma: 17
Posts: 3918
Arduino rocks
|
 |
« Reply #963 on: December 27, 2012, 11:43:25 am » |
la swrtc usa il timer 2, se usasse il timer 1 andrebbe in conflitto con il delay
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16457
Don't know what I do
|
 |
« Reply #964 on: December 27, 2012, 11:56:54 am » |
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
Faraday Member
Karma: 17
Posts: 3918
Arduino rocks
|
 |
« Reply #965 on: December 27, 2012, 12:11:42 pm » |
scusa errore di sbaglio, thanks 
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2441
|
 |
« Reply #966 on: December 27, 2012, 01:15:00 pm » |
Capito
Quindi i pin che utilizzano i timer per altri scopi non possono essere usati per i pwm è corretto?
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3918
Arduino rocks
|
 |
« Reply #967 on: December 27, 2012, 03:13:15 pm » |
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
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2441
|
 |
« Reply #968 on: December 27, 2012, 04:00:53 pm » |
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 ciao
|
|
|
|
« Last Edit: December 27, 2012, 04:13:10 pm by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16457
Don't know what I do
|
 |
« Reply #969 on: December 27, 2012, 04:49:31 pm » |
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
Faraday Member
Karma: 17
Posts: 3918
Arduino rocks
|
 |
« Reply #970 on: December 27, 2012, 04:52:41 pm » |
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 
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3918
Arduino rocks
|
 |
« Reply #971 on: December 27, 2012, 04:54:16 pm » |
il Maestro mi ha anticipato 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16457
Don't know what I do
|
 |
« Reply #972 on: December 27, 2012, 05:02:03 pm » |
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
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16457
Don't know what I do
|
 |
« Reply #973 on: December 27, 2012, 05:02:34 pm » |
il Maestro mi ha anticipato  ma va'.... 
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2441
|
 |
« Reply #974 on: December 27, 2012, 06:05:42 pm » |
@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  o devo provare  ciao
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
|