Странная проблема с таймером на attiny13. Хочу включать и выключать пин по таймеру. Вот такой код:
Код: Выделить всё
#include <arduino.h>
#include <avr/interrupt.h>
volatile uint16_t tmr_cnt = 0;
volatile uint8_t pwm_width = 0;
ISR(TIM0_COMPA_vect)
{
tmr_cnt++;
pin_toggle(PIN_D0);
}
void
main(void)
{
DDRB |= 1;
DDRB |= 2;
DDRB |= 4;
TCCR0B &= ~(1 << WGM02);
TCCR0A &= ~((1 << WGM01) | (1 << WGM00));
TCCR0A |= 2 << WGM00;
TCCR0A &= ~((1 << COM0A1) | (1 << COM0A0));
TCCR0A |= 0 << COM0A0;
TCCR0B &= ~(3 << CS00);
TCCR0B |= 2 << CS00;
TIMSK0 &= ~(3 << TOIE0);
TIMSK0 |= 2 << TOIE0;
// ~100us
OCR0A = 15;
sei();
while (1) {
if (pwm_width > 11)
pin_write(PIN_D2, 1);
else if (pwm_width < 8)
pin_write(PIN_D2, 0);
}
}
Но как только я заменяю 11 и 8 на переменные:
Код: Выделить всё
#include <arduino.h>
#include <avr/interrupt.h>
volatile uint16_t tmr_cnt = 0;
volatile uint8_t pwm_width = 0;
uint8_t pwm_width_on = 11, pwm_width_off = 8;
ISR(TIM0_COMPA_vect)
{
tmr_cnt++;
pin_toggle(PIN_D0);
}
void
main(void)
{
DDRB |= 1;
DDRB |= 2;
DDRB |= 4;
TCCR0B &= ~(1 << WGM02);
TCCR0A &= ~((1 << WGM01) | (1 << WGM00));
TCCR0A |= 2 << WGM00;
TCCR0A &= ~((1 << COM0A1) | (1 << COM0A0));
TCCR0A |= 0 << COM0A0;
TCCR0B &= ~(3 << CS00);
TCCR0B |= 2 << CS00;
TIMSK0 &= ~(3 << TOIE0);
TIMSK0 |= 2 << TOIE0;
// ~100us
OCR0A = 15;
sei();
while (1) {
if (pwm_width > pwm_width_on)
pin_write(PIN_D2, 1);
else if (pwm_width < pwm_width_off)
pin_write(PIN_D2, 0);
}
}
Картинка сигнала для первого кода -
Картинка сигнала для второго кода -
Размер флеш-памяти не превышен. Размер данных тоже( 55 и 53 байт). Пины разные. Как одно влияет на другое не понятно. Может кто в курсе, что за фигня?
Добавлено after 6 minutes 12 seconds:
При этом, если во втором варианте заменить в while:
Код: Выделить всё
pin_write(PIN_D2, 1);Код: Выделить всё
PORTB |= 4;

