Segnalazione e richiesta informazione Timer Attiny85

Ciao a tutti,in questi giorni sto implementando nel mio sistema di automazione casalinga(domotico è troppo commerciale)un sistema di led ir che simulano dei Virtual Wall per il mio Roomba per pianificare la pulizia delle aree della casa in modo più razionale.
Il Virtual Wall emette un segnale ir a 38khz ad intervam,mi on/off di 1 ms,quindi molto semplice da implementare.Visto che avevo dei Tiny85 che riposavano inutilizzati nel cassetto ho deciso di connetterli al mio Arduino tramite I2C,demandandano poi a loro il compito della generazione della portante e del segnale tramite un Timer interno.
E fin qua tutto ok:allora decido di configurare il Timer 1,perché lo 0 notoriamente è utilizzato dalla millis(),però nulla non c'è verso di farlo andare...mah....vado a spulciare nel Tiny Core e cosa mi trovo??..per tutti i modelli di ATTIny è utilizzato il Timer 0 per la millis(),tranne che per il più piccolo della famiglia dove è utilizzato proprio il timer 1!!...beh,poco male,utilizzo io lo 0 e tutto funziona regolarmente,ma mi chiedo,perché venga utilizzato il Timer 1 per la millis() solo su questa famiglia di processori,ad esempio per il Tiny2313 è regolarmente utilizzato il Timer 0.
Secondo me questo potrebbe portare a incomprensioni e mal funzionamento di librerie generiche per gli Attiny e ciò che più non comprendo è il perché non sia spiegato da nessuna parte se non andando a spulciare nel tiny_core...

Il timer usato per la millis può essere cambiato modificando una riga nel core Tiny.
Usi il core Tiny, vero? Quello scaricabile da qui:
https://code.google.com/p/arduino-tiny/

Bene, edita il file /tiny/cores/tiny/core_build_options.h e modifica la riga 112 da così:

#define TIMER_TO_USE_FOR_MILLIS                   1

a così:

#define TIMER_TO_USE_FOR_MILLIS                   0

La ragione esatta della scelta non la so, l’autore del core Tiny nei commenti immediatamente prima di questa riga di codice dice solo che “per vari motivi, il timer 1 è una scelta migliore per millis sul controllore '85” ma non spiega esattamente perché.

leo72:
Il timer usato per la millis può essere cambiato modificando una riga nel core Tiny.
Usi il core Tiny, vero? Quello scaricabile da qui:
https://code.google.com/p/arduino-tiny/

Bene, edita il file /tiny/cores/tiny/core_build_options.h e modifica la riga 112 da così:

#define TIMER_TO_USE_FOR_MILLIS                   1

a così:

#define TIMER_TO_USE_FOR_MILLIS                   0

La ragione esatta della scelta non la so, l’autore del core Tiny nei commenti immediatamente prima di questa riga di codice dice solo che “per vari motivi, il timer 1 è una scelta migliore per millis sul controllore '85” ma non spiega esattamente perché.

Ciao Leo,si mi era chiaro come cambiare il timer utilizzato e se per questo neanche un grande problema visto che ne resta un’altro da utilizzare se capaci.
E’ il perché che non mi è chiaro e neanche pensandoci su riesco a capire perché sia una scelta migliore solo per questo tipo di micro…mah,più che altro lo scopo del post era segnalarlo,visto che non essendo scritto da nessuna parte ci si può sbattere la testa per un po’,come è capitato a me ieri!!!

Questo è l'ultimo datasheet del micro --> http://www.atmel.com/Images/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf
A pagina 48 dice che l'overflow del Timer 1 ha priorità su quello del Timer 0.
Il Timer 0 controlla i PWM, il Timer 1 no.
Sono entrambi a 8-bit, ma il Timer 1 ha un prescaler a 14 bit, mentre il Timer 0 a soli 10 bit quindi il Timer 1 ha una migliore gestione.
Poi ci sono altre piccole differenze... :grin:

PaoloP:
Questo è l'ultimo datasheet del micro --> http://www.atmel.com/Images/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf
A pagina 48 dice che l'overflow del Timer 1 ha priorità su quello del Timer 0.
Il Timer 0 controlla i PWM, il Timer 1 no.
Sono entrambi a 8-bit, ma il Timer 1 ha un prescaler a 14 bit, mentre il Timer 0 a soli 10 bit quindi il Timer 1 ha una migliore gestione.
Poi ci sono altre piccole differenze... :grin:

Ah ecco,questo possono essere buone motivazioni...principalemte si salva il timer 1 per poter avere ancora funzionalità Pwm su alcuni Pin....ora la faccenda mi è più convincente...grazie per la delucidazione

Il Timer 0 controlla i PWM, il Timer 1 no.

Errato. Il timer 1 ha la funzionalità PWM come il timer 0. Difatti i pin PB0, PB1, PB3 e PB4 sono agganciabili al PWM del timer 1.

Io mi sono riferito all'indice del datasheet che riporta:
Counter/Timer0 with PWM ....... pag. 65
Counter/Timer1 ............................... pag. 83

:frowning:

In effetti Atmel non è molto precisa nei suoi datasheet, però già dalla piedinatura si vedono i canali PWM del chip :wink: