Pages: 1 2 [3]   Go Down
Author Topic: Timer 1 usato due volte in modi diversi  (Read 2062 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai un pin a cui hai collegato un interrupt.
Mettiamo che questo interrupt sia di tipo CHANGE, così che scatti sia se il pin passa da 0 a 1 che viceversa.
Quando passa da 0 ad 1, tu azzeri il contatore del timer 1.
Quando passa da 1 a 0, leggi il contatore del timer 1, ed hai la durata del tuo impulso.
Fin qui è corretto, come ho impostato il problema?

E' giusto ma che valore devo mettere al timer1 per far in modo che non vada in overflow prima di aver finito di contare? sempre FFFF?


Bene. Adesso tu, sempre all'interno della ISR, metti ad 1 il pin 4 e poi carichi il timer 1 come ti ho detto in precedenza, con il valore che tu hai estratto dall'array in base alla precedente lettura. Quando il timer 1 va in overflow, ti mette a 0 il pin 4.


Devo fare il contrario, cioè mettere a 1 il pin 4 solo quando va in overflow, prima è basso...poi dovrò tirarlo giù di nuovo ma questo non è un problema..
Logged

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

Hai un pin a cui hai collegato un interrupt.
Mettiamo che questo interrupt sia di tipo CHANGE, così che scatti sia se il pin passa da 0 a 1 che viceversa.
Quando passa da 0 ad 1, tu azzeri il contatore del timer 1.
Quando passa da 1 a 0, leggi il contatore del timer 1, ed hai la durata del tuo impulso.
Fin qui è corretto, come ho impostato il problema?

E' giusto ma che valore devo mettere al timer1 per far in modo che non vada in overflow prima di aver finito di contare? sempre FFFF?
Questo dipende dalla durata massima dell'ampiezza dell'impulso. Immagino che questo motore avrà un regime minimo di rotazione. Sapendo che il max valore del contatore del timer 1 è appunto 65535, se con il prescaler ad 1 (quindi clock a 16 MHz) non ti basta l'intervallo del contatore per misurare l'ampiezza dell'impulso, proverai ad usare un fattore di prescaler superiore.
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dai proverò oggi....puoi solamente scrivermi le impostazioni per il timer1 (WG21 ecc) in modo che conti fino all'overflow? per i CS ci penso io.

Grazie
Logged

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

Basta impostarlo in modalità 0 (normale). WGM13..0 a 0000.
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non ho ancora provato perché sono fuori per lavoro..appena torno ci provo smiley-mr-green
Grazie di tutto
Logged

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

OK.
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Leo una altra cosa...come faccio a staccare il timer 1 dal pin al quale normalmente è collegato?

Logged

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

Leo una altra cosa...come faccio a staccare il timer 1 dal pin al quale normalmente è collegato?


Mi pareva di avertelo detto... comunque hai 2 strade:
1) imposti il pin in input:
pinMode(PIN, INPUT);
e poi lo reimposti in output quando vuoi riagganciarlo:
pinMode(PIN, OUTPUT);

2) modifichi i bit COM1Ax e COM1Bx (a seconda del pin) nel registro TCCR1A (vedi pag. 132 del datasheet)
Logged


Pages: 1 2 [3]   Go Up
Jump to: