Paso 8: Interrumpir, interrumpir...
Utilizar la información de frecuencia para crear una interrupción de software en, o cerca, de la frecuencia deseada.
La interrupción puede no siempre ser definir precisamente, pero es suficiente. La frecuencia de leer desde el archivo se pasa a la subrutina setintrupt.
void setintrupt(float freq) {}
Float bitval = 8; 8 temporizadores de 8 bits 0 y 2, 1024 para temporizador 1 byte
setocroa=(16000000/(FREQ*bitval)) - 0,5;
El valor de setocroa requiere una sustracción de -1. Sin embargo agregar 0,5 se redondea a 0.5 más cercano
La resolución del temporizador se limita
En última instancia determinada por la magnitud de bitval
CLI(); deshabilitar interrupciones
interrupción de sistema timer2
TCCR2A = 0; todo registro de TCCR2A se establece en 0
TCCR2B = 0; para TCCR2B
TCNT2 = 0; inicializar el valor del contador a 0
compara Set match registrarse incrementos de frecuencia (hz)
OCR2A = setocroa; = (16 * 10 ^ 6) / (frecuencia * 8) - 1 (debe ser < 256)
Activar modo de CTC
TCCR2A | = (1 << WGM21); Establezca el bit CS21 para 8 prescaler
TCCR2B | = (1 << CS21); habilitar interrupción de timer en comparación
TIMSK2 | = (1 << OCIE2A); Esto funciona, la siguiente línea
SBI(TIMSK2,OCIE2A); habilitar interrupción del temporizador 2
SEI(); habilitar interrupciones
.
Los más exigentes lectores habrá visto sbi(TIMSK2,OCIE2A)
Configurar un par de funciones (internet adquirido) para establecer y borrar bits de registro:
Define para borrar registro de bits
#ifndef cbi
#define cbi (sfr, bits) (_SFR_BYTE(sfr) & = ~_BV(bit))
#endif
Define para los bits de registro de configuración
#ifndef OSE
#define OSE (sfr, bits) (_SFR_BYTE(sfr) | = _BV(bit))
#endif
Estas funciones proporcionan un fácil llamar para establecer o borrar la interrupción.
.
¿Por lo que la interrupción se está ejecutando, lo podemos hacerla hacer?