Code: Select all
#include <io.h>
#include <delay.h>
#define PWM OCR0A //Регистр для задания скважности ШИМ
#define CLR_TIMER TCNT1H=0;TCNT1L=0 //Сбрасываем таймер
#define LEN 22 // Длина мелодии
#define TOP 255 // Верхний предел ШИМ
void initdev(){ // Ининциализация портов МК
DDRB=0xff;
TIMSK=0x40;
//******************************
//Таймер прерывания // Настраиваем прерывания по таймеру
TCCR1B=0x02;
// 800Hz // ТОн колокольчика
//OCR1AH=0x01;
//OCR1AL=0x38;
// 650Hz
//OCR1AH=0x01;
//OCR1AL=0x80;
// 550Hz
OCR1AH=0x01;
OCR1AL=0xC2;
//******************************
//******************************
//ШИМ 32kHz
TCCR0A=0x83;
TCCR0B=0x01;
//******************************
}
void sin(char delt){ //Функция синуса, точнее пила
//delt max=TOP/2 (128)
static char
cnt;
switch(cnt){
case 0:
PWM=delt;
break;
case 1:
PWM=TOP/2;
break;
case 2:
PWM=TOP-delt;
break;
case 3:
PWM=TOP/2;
break;
default:break;
}
cnt++;
if(cnt==4) cnt=0;
}
char time(){ //функция для расчета затухания мелодии
static char
tmp,de;
tmp++;
if(de==128){
de=0;
delay_ms(700);
}
if(tmp==LEN){
tmp=0;
de++;
}
return de;
}
void main(){
initdev();
#asm("sei")
while(1)
{
}
}
interrupt [TIM1_COMPA] void compa_isr(){
CLR_TIMER;
sin(time());
}