akl, Вы имеете в виду обнуление остальных регистров в TCCR1B?
prinv, да, он
Добавлено after 28 minutes 53 seconds:
Как и думал, уточнение прочих CSn1 результатов не дало.
чудеса, да и только!An-SU писал(а):проблема именно в передаче значения как входного параметра - даже с volatile не хочет считывать так, как мне это нужно
чевой-чевой?!An-SU писал(а):отечественный аналог 128
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
uint16_t Sch = 10000;
ISR(TIMER1_COMPA_vect) /* Timer/Counter1 Compare Match A */
{
PORTB ^= _BV(PB3);
/* Не забываем обнулить счётчик!!! */
TCNT1 = 0;
};
void ti_ini(uint16_t temp)
{
// Инициализация Timer1 16bit
TCCR1B = 0; // Остановили таймер
TCCR1A = 0; // Обычный режим
TCNT1 = 0; // Начальное значение счётчика таймера
OCR1A = temp; // Значение сравнения
TIMSK = _BV(OCIE1A);// Разрешаем прерывание при совпадении с А
TCCR1B = _BV(CS11) | _BV(CS10); // Запуск таймера, предделитель CLK/64
}
int main(void)
{
/* Светодиоды */
DDRB = _BV(PB3);
DDRD = _BV(PD7);
/* Подтяжка вверх для кнопок */
PORTC = _BV(PC1) | _BV(PC0);
ti_ini(Sch);
sei();
while (1)
{
if (!(PINC & _BV(PC0))) // нажата кнопка PC0
{
PORTD ^= _BV(PD7);
Sch /= 2;
ti_ini(Sch);
_delay_ms(100);
}
if (!(PINC & _BV(PC1))) // нажата кнопка PC1
{
PORTD ^= _BV(PD7);
Sch *= 2;
ti_ini(Sch);
_delay_ms(100);
}
}
}
так вроде ж шла речь про режим СТС, или я опять все перепутал?prinv писал(а):Не работало, пока я не сообразил, что в прерывании нужно обнулить счётчик
Код: Выделить всё
ISR(TIMER1_COMPA_vect) /* Timer/Counter1 Compare Match A */
{
PORTB ^= _BV(PB3);
};
void ti_ini(uint16_t temp)
{
// Инициализация Timer1 16bit
TCCR1B = 0; // Остановили таймер
TCCR1A = 0;
TCNT1 = 0; // Начальное значение счётчика таймера
OCR1A = temp; // Значение сравнения
TIMSK = _BV(OCIE1A);// Разрешаем прерывание при совпадении с А
TCCR1B = _BV(WGM12) | _BV(CS11) | _BV(CS10); // Запуск таймера в режиме CTC, предделитель CLK/64
}Код: Выделить всё
if (!(PINC & _BV(PC0))) // нажата кнопка PC0
{
PORTD ^= _BV(PD7);
Sch /= 2;
OCR1A = Sch;
// ti_ini(Sch);
_delay_ms(100);
}
if (!(PINC & _BV(PC1))) // нажата кнопка PC1
{
PORTD ^= _BV(PD7);
Sch *= 2;
OCR1A = Sch;
// ti_ini(Sch);
_delay_ms(100);
}