Пт мар 09, 2018 12:42:11
tytar писал(а):Вы поменяли значения
TCCR0A = 0x81;
TCCR0B = 0x03;
На какую частоту они сейчас настроены?
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 18,750 kHz
// Mode: Phase correct PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
// Timer Period: 27,2 ms
// Output Pulse(s):
// OC0A Period: 27,2 ms Width: 0 us
Пт мар 09, 2018 12:58:13
Пт мар 09, 2018 13:50:16
Пт мар 09, 2018 15:00:43
Пт мар 09, 2018 18:24:01
#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(); // активация режима сна
}
}