Go Down

Topic: Timer 1 usato due volte in modi diversi (Read 3340 times) previous topic - next topic

ekjk


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

leo72



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.

ekjk

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

leo72

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

ekjk

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

leo72


ekjk

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


leo72


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)

Go Up