Для начала написал это:
Код
#include <avr/io.h>
#include <avr/interrupt.h>
#define Frq 20 //Частота импульсов Гц
// Конфигурирование Timer1
void Timer1_init(void)
{
TCCR1B |= 0x04; //Частота счета таймера Sclk/256
TCCR1B |= 0x08; //Вкл CTC
TCCR1A |= 0x40; //Активировать выход OC1A
OCR1A = F_CPU/(256*Frq); //Определяем соответствующее значение для Frq
}
void Inter_init(void)
{
TIMSK = 0x00; //Запрещаем все прерывания
GIMSK = 0x00; //Запрет внешних прерываний
cli(); //Общее запрещение прерываний;
}
// Конфигурирование портов В/В
void Ports_init(void)
{
DDRB = 0x0F; // PB1 Выход
}
int main (void)
{
Ports_init();
Timer1_init();
Inter_init();
while(1) {}
return 1;
}
#include <avr/interrupt.h>
#define Frq 20 //Частота импульсов Гц
// Конфигурирование Timer1
void Timer1_init(void)
{
TCCR1B |= 0x04; //Частота счета таймера Sclk/256
TCCR1B |= 0x08; //Вкл CTC
TCCR1A |= 0x40; //Активировать выход OC1A
OCR1A = F_CPU/(256*Frq); //Определяем соответствующее значение для Frq
}
void Inter_init(void)
{
TIMSK = 0x00; //Запрещаем все прерывания
GIMSK = 0x00; //Запрет внешних прерываний
cli(); //Общее запрещение прерываний;
}
// Конфигурирование портов В/В
void Ports_init(void)
{
DDRB = 0x0F; // PB1 Выход
}
int main (void)
{
Ports_init();
Timer1_init();
Inter_init();
while(1) {}
return 1;
}
Это работает нормально.
Теперь хочу плавно регулировать частоту:
Код
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define Frq 20 //Частота импульсов Гц
//Функция задания частоты
void SetSpeed(const unsigned int w)
{
OCR1A = (F_CPU/w)>>8;
}
// Конфигурирование Timer1
void Timer1_init(void)
{
TCCR1B |= 0x04; //Частота счета таймера Sclk/256
TCCR1B |= 0x08; //Вкл CTC
TCCR1A |= 0x40; //Активировать выход OC1A
OCR1A = F_CPU/(256*Frq); //Определяем соответствующее значение для Frq
}
void Inter_init(void)
{
TIMSK = 0x00; //Запрещаем все прерывания
GIMSK = 0x00; //Запрет внешних прерываний
cli(); //Общее запрещение прерываний;
}
// Конфигурирование портов В/В
void Ports_init(void)
{
DDRB = 0x0F; // PB1 Выход
}
int main (void)
{
unsigned int i;
Ports_init();
Timer1_init();
Inter_init();
while(1)
{
while (i<5000)
{
SetSpeed(i); i++;
_delay_ms(10);
}
_delay_ms(1000);
while (i>2)
{
SetSpeed(i); i--;
_delay_ms(10);
}
}
return 1;
}
#include <util/delay.h>
#include <avr/interrupt.h>
#define Frq 20 //Частота импульсов Гц
//Функция задания частоты
void SetSpeed(const unsigned int w)
{
OCR1A = (F_CPU/w)>>8;
}
// Конфигурирование Timer1
void Timer1_init(void)
{
TCCR1B |= 0x04; //Частота счета таймера Sclk/256
TCCR1B |= 0x08; //Вкл CTC
TCCR1A |= 0x40; //Активировать выход OC1A
OCR1A = F_CPU/(256*Frq); //Определяем соответствующее значение для Frq
}
void Inter_init(void)
{
TIMSK = 0x00; //Запрещаем все прерывания
GIMSK = 0x00; //Запрет внешних прерываний
cli(); //Общее запрещение прерываний;
}
// Конфигурирование портов В/В
void Ports_init(void)
{
DDRB = 0x0F; // PB1 Выход
}
int main (void)
{
unsigned int i;
Ports_init();
Timer1_init();
Inter_init();
while(1)
{
while (i<5000)
{
SetSpeed(i); i++;
_delay_ms(10);
}
_delay_ms(1000);
while (i>2)
{
SetSpeed(i); i--;
_delay_ms(10);
}
}
return 1;
}
Это работает весьма странно... Иногда нормально, а иногда импульсы прекращаются и на ноге OC1A устанавливается 0 или 1.
