Go Down

Topic: TIMER ed interrupt (Read 564 times) previous topic - next topic

edge

Salve,
qualcuno saprebbe darmi delle dritte sull'impostazione del Timer a 16 bit che vi è nell'Arduino Uno.
In particolare vorrei realizzare una funzione che a partire dai secondi passati come parametro
faccia partire un Timer che raggiunta la soglia invii un'interrupt!
Il problema maggiore è che non posso usare l'IDE e neanche le librerie varie di avr-libc,
devo fare tutto a manina.
Grazie

leo72

Devi prendere il datasheet, lì ci sono spiegati tutti i parametri per configurare i timer interni, compreso il timer 1.
Prendi come riferimento la libreria swRTC che sto sviluppando insieme a lesto, lì c'è come impostare il timer 0 ma tu devi solo cambiare i nomi dei registri (che prenderai dal datasheet) ed i valori del prescaler (anche quelli li ricavi dal datasheet).

Imposti questi parametri per avere il numero di secondi e poi attivi un interrupt all'overflow del contatore. L'overflow lo intercetti con una routine che scriverai per far fare al micro quello che vuoi, poi resetti il contatore e tutto riparte.

edge

Ma guarda chi mi ha risposto (strano).

Allora,al solito la discussione sarà producente.
Vorrei usare il timer a 16 bit per avere maggiore possibilità di latenza.
Sto leggendo il Data Sheet che però è abbastanza dispersivo,tuttavia sto capendo qualcosa.

In particolare avevo pensato di usare il metodo CTC, che mi azzera da sè il Timer e usare OCR1A come registro di comparazione.

Per far si che funzioni l'OverFlow dovrei settare il counter ad un numero,generalmente, diverso da 0.
E poi far incrementare.

Settare l'Interrupt è complesso?
Grazie Ciao

leo72


Ma guarda chi mi ha risposto (strano).

D'altronde... sugli interrupt ed i timer ci sto studiando da 2 mesi  :smiley-sweat:

Quote

Allora,al solito la discussione sarà producente.
Vorrei usare il timer a 16 bit per avere maggiore possibilità di latenza.

Sì, è l'unico a 16 bit, e con un prescaler a 1024 puoi arrivare fino ad 1 overflow ogni 2 decimi di secondo.

Quote

Sto leggendo il Data Sheet che però è abbastanza dispersivo,tuttavia sto capendo qualcosa.

Assolutamente no. I capitoli da leggere sono 15.9.1 e 15.11.

Quote

In particolare avevo pensato di usare il metodo CTC, che mi azzera da sè il Timer e usare OCR1A come registro di comparazione.

Sbagliato. Devi usare il timer in modalità NORMALE: va in overflow da solo al raggiungimento del massimo valore che può contenere, $FFFF/65535.

Quote

Per far si che funzioni l'OverFlow dovrei settare il counter ad un numero,generalmente, diverso da 0.

No, il valore iniziale del contatore serve per ottenere, combinato con il prescale, particolari valori dell'intervallo fra un overflow e l'altro.

Quote

E poi far incrementare.

Questo viene fatto in automatico, esatto.

Quote

Settare l'Interrupt è complesso?

Apri la libreria swRTC e guarda. Devi impostare alcune cose:
1) la fonte del clock per il prescaler: si usa quello interno, di solito
2) il prescaler, ossia il fattore di divisone per ridurre il clock che aggiornerà il timer interno
3) la modalità (usa la NORMAL)
4) l'interrupt che vuoi venga sollevato (interrupt sull'overflow del contatore)
5) il valore iniziale del contatore
[/quote]

edge

A tuo modo di vedere qualè il vantaggio ad usare l'interrupt da OverFlow con modalità normale,
rispetto a CTC mode con comparazione con il registro OCR1A ?

Sicuramente va bene per la tua libreria.
Ma io vorrei fare una cosa del genere:

/*Corpo processo A */
_my_delay(numero_millisecondi);

A questo punto cambio di processo,poi quando il timer scatta e lancia l'interrupt la routine che viene generata rimette in esecuzione il processo A.

Grazie Ciao

leo72

Normalmente la comparazione si usa fare con le modalità PWM. La modalità solitamente usata è la Normal, più semplice da gestire e che incrementa solo il contatore.

Go Up