Нужен период импульса в 20миллисекунд.
В моем примере Timer Period: 27,2 ms.
Может вообще не работать, у Attiny13 нет 16 битного таймера, нет регистров ICR, что бы выдержать четко период импульса в 20миллисекунд.
Можно попробовать только программный ШИМ использовать.
Добавлено after 1 hour 37 minutes 33 seconds:Держи, я тебе замутил программный ШИМ, 20миллисекунд, для Frequency 1.2MHz.
Спойлер
Код:
#include <avr/io.h> // инициализация портов ввода-вывода МК
#include <avr/sleep.h> // здесь описаны режимы сна
#include <avr/interrupt.h> // работа с прерываниями
#include <util/delay.h> // описание программных задержек
#define F_CPU 1200000UL
#define SERVO PB0
volatile unsigned char counter=0;
volatile unsigned char lev_ch1 =1; //длительности ШИМ;
volatile unsigned char buf_lev_ch1;
volatile unsigned char start =0;
ISR (TIM0_OVF_vect) //обработка прерывания по переполнению таймера
{
TCNT0=0xB6;
if (++counter==0) //счетчик перехода таймера через ноль
{
buf_lev_ch1=lev_ch1; //значения длительности ШИМ
PORTB |=(1<<PB0); //подаем 1 на все каналы
}
if (counter==buf_lev_ch1) PORTB&=~(1<<PB0); //подаем 0 на канал
}
// Обработчик прерываний
ISR(INT0_vect) // Прерывание по низкому уровню на PB1
{
while ((PINB & (1 << PB1)) == 0) {}
start=1;
}
int main(void) {
PORTB = 0b11101111; // Выставить на PB4 - "0"
DDRB = 0b00010000; // Указатель пина
DDRB |= (1 << SERVO);// выходы = 1
PORTB &= ~(1 << SERVO); // по умолчанию отключены = 0
// Инициализация прерываний по INT0
GIMSK = 0b01000000; // Разрешение прерываний INT0 на входе PB1
MCUCR = 0b00000000; // при перепаде низком уровне на PB1
sei(); // Общее разрешение прерываний
// Инициализация режима сна
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
while(1)
{
if (start) {
TIMSK0 = 0b00000010; // включить прерывание по переполнению таймера
TCCR0B = 0b00000001; // настройка таймера, делитель выкл
TCNT0=0xB6;
PORTB |= (1<<PB4); // Выставить на PB4 - "1"
_delay_ms(50);
do // Нарастание яркости
{
lev_ch1++;
_delay_ms(100);
}
while(lev_ch1!=30);
do // Затухание
{
lev_ch1--;
_delay_ms(100);
}
while(lev_ch1!=1);
_delay_ms(50);
TIMSK0 = 0b00000000; // выключить прерывание по переполнению таймера
TCCR0B = 0b00000000; //
PORTB &= ~(1<<PB4); // Выставить на PB4 - "0"
start=0;
}
sleep_enable(); // разрешение режима сна
sleep_cpu(); // активация режима сна
}
}