Pages: [1]   Go Down
Author Topic: TIMER ed interrupt  (Read 490 times)
0 Members and 1 Guest are viewing this topic.
Pisa - Italy
Offline Offline
Jr. Member
**
Karma: 0
Posts: 60
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21657
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Pisa - Italy
Offline Offline
Jr. Member
**
Karma: 0
Posts: 60
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21657
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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]
Logged


Pisa - Italy
Offline Offline
Jr. Member
**
Karma: 0
Posts: 60
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21657
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Pages: [1]   Go Up
Jump to: