morse_code_transcoder/transcodeur/timerinterrupt.c
2021-03-20 19:29:19 +01:00

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
}