79 lines
No EOL
1.8 KiB
C
79 lines
No EOL
1.8 KiB
C
/*
|
|
* timerinterrupt.c
|
|
*
|
|
* Created: 17/05/2021 12:58:50
|
|
* Author: yboujon1
|
|
*/
|
|
|
|
#include "main.h"
|
|
#include "timerinterrupt.h"
|
|
volatile unsigned char etat = 0;
|
|
volatile unsigned char speed = 1;
|
|
volatile unsigned char frequency = 1;
|
|
|
|
void start_timer0(void){
|
|
DDRB |= (1<<PB3); //PB3 est défini comme sortie
|
|
TCCR0 |= (3<<CS00)|(1<<WGM01)|(1<<COM00); //prediv à 64, mode CTC, change l'état d'OC0
|
|
OCR0 = 64*frequency; //valeur de OCR0 pour avoir 440Hz multiplié par frequency
|
|
}
|
|
|
|
void stop_timer0(void){
|
|
TCCR0 &= ~(3<<CS00); //prediv à 0
|
|
}
|
|
|
|
void init_interruption(void){
|
|
DDRD &= ~(1<<PD2); //INT0 en entrée
|
|
DDRD &= ~(1<<PD3); //INT1 en entrée
|
|
DDRB &= ~(1<<PB2); //INT2 en entrée
|
|
MCUCR |= (3<<ISC00)|(3<<ISC10); //Interruption sur front montant pour INT0 et 1
|
|
GICR |= (1<<INT0)|(1<<INT1)|(1<<INT2); //on autorise toutes les interruptions
|
|
sei(); //validation globale des interruptions
|
|
}
|
|
|
|
ISR (INT0_vect){
|
|
etat = 1 - etat;
|
|
}
|
|
|
|
ISR (INT1_vect){
|
|
switch(speed)
|
|
{
|
|
case 4:
|
|
speed=1;
|
|
break;
|
|
default:
|
|
speed++;
|
|
};
|
|
}
|
|
|
|
ISR (INT2_vect){
|
|
switch(frequency)
|
|
{
|
|
case 3:
|
|
frequency=1;
|
|
break;
|
|
default:
|
|
frequency++;
|
|
};
|
|
}
|
|
|
|
void start_timer1(unsigned short int ocr1a){
|
|
OCR1A=ocr1a; //valeur de OCR1A pour avoir 100ms
|
|
TCCR1A |= (1<<COM1A0); //change l'état d'OC1A et OC1B
|
|
TCCR1B |= (1<<WGM12)|(1<<CS12); //mode CTC, prediv 256
|
|
}
|
|
|
|
void stop_timer1(void){
|
|
TCCR1B &= ~(1<<CS12); //prediv non défini, arrête le timer
|
|
OCR1A=0; //remet la valeur OCR1A à 0
|
|
}
|
|
|
|
void resume_timer1(void){
|
|
TCCR1B |= (1<<CS12); //on relance le prediv à 256
|
|
}
|
|
|
|
void wait_ocf1a_timer1(void){
|
|
do{
|
|
status=TIFR;
|
|
}while((status & (1<<OCF1A))==0); //tant que OCF1A = 0, nous attendons
|
|
TIFR = TIFR | (1<<OCF1A); //on remet OCF1A a 0
|
|
} |