//per far funzionare il programma scegliere solo f desiderata e il fattorepresc
#define clockarduino 16E6 //Sarebbe il clock di arduino a 16 MHZ
int fattorepresc = 1024;
#define prescaler (clockarduino / fattorepresc)
#define fdesiderata 4000.0
#define numstep (prescaler) / (2*fdesiderata)
#define precarico 65536-numstep
// piu si aumenta la frequanza desiderata e piu bisogna diminuire il
//fattore di prescala
void setup() {
pinMode(8,OUTPUT);
Serial.begin(9600);
Serial.print("numstep:\t");Serial.println(numstep);
Serial.print("Prescaler:\t");Serial.println(prescaler);
Serial.print("Prcarico:\t");Serial.println(precarico);
cli(); //Disabilita interrupt
TCCR1A = 0;
TCCR1B = 0;
switch(fattorepresc) {
case 1:
TCCR1B = _BV(CS10);
break;
case 8:
TCCR1B = _BV(CS11);
break;
case 64:
TCCR1B = _BV(CS11)| _BV(CS10);
break;
case 256:
TCCR1B = _BV(CS12);
break;
case 1024:
//TCCR1B = _BV(0) | _BV(2);
//bitSet(TCCR1B, 0) | bitSet(TCCR1B, 2);// altro modo per scrivere nei registri
TCCR1B = _BV(CS10) | _BV(CS12);
break;
default:
return;
}
//TCCR1B = _BV(CS11); // Faccio il prescaler a 8
//TCCR1B = _BV(CS11)|_BV(CS10); //prescaler a 64 250 KHz
//TCCR1B = _BV(CS12); // Faccio il prescaler a 256 62.5kHz
//TCCR1B = _BV(0) | _BV(2); // Faccio il prescaler a 1024 15 KHz
//cioè scrivo nel reg TCCR1B 00000101 E OTTENGO 16000000/1024=15KHz
TCNT1 = precarico; //questo è il precarico
//TIMSK1 |= (1 << TOIE1);// devo scrivere 1 in questo registro alla
//pos TOIE1 che corrisponde al bit di pos 0 vedi datasheet
//per attivare l interrupt
bitSet(TIMSK1, TOIE1); // altro modo per scrivere nei registri
sei(); //Abilita interrupt
}
void loop() {//nel loop non ci va niente
}
ISR(TIMER1_OVF_vect) { //funzione per attivare interrup quanto il
//contatore arriva T1 arriva al top.
TCNT1 = precarico;// quando il contatore arrivaal massimo cioe 2^16 cioè
// 65525 cioè FFFF viene riprecaricato di nuovo il valore cioe 0x8AB0
digitalWrite(8, !digitalRead(8));
}