Проверил - именно на команды, связанные с таймером
Добавлено after 33 minutes 11 seconds:
В ходе последних мучений выяснил, что проблема именно в передаче значения как входного параметра - даже с volatile не хочет считывать так, как мне это нужно
чудеса, да и только!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);
}
Код: Выделить всё
#define F_CPU 8000000UL //obyavleniye chastoty CPU mk
#include <avr/io.h> //podklucheniye biblioteki mk
#include <avr/interrupt.h> //podklucheniye biblioteki zaderjek
#include <util/delay.h> //podklucheniye zaderjek
#include <stdio.h>
unsigned int Sch;
static void ti_in(void)
{
TCCR1A|=0; //регистр управления таймером/счетчиком
TCNT1|=0; //Регистр таймера/счетчика
OCR1A=Sch; //значение сравнения, до 16 бит
TIMSK|=(1<<OCIE1A);
TCCR1B|=(1<<CS12)|(1<<WGM12); //установка делителя, режима работы таймера
}
ISR(TIMER1_COMPA_vect) //функция, выполняемая автоматически, при совпадении числел - счетчика и установленного значения
{
PORTC=~PORTC;
}
static void TI_Write(unsigned int Sch)
{
unsigned int sreg = SREG;
cli();
OCR1A=Sch;
SREG=sreg;
}
int main(void)
{
cli();
DDRC=0xFF;
Sch=100; //в реале период / 2
ti_in();
sei();
while (1)
{
if (!(PINE &= (1<<PE1)))
TI_Write(300);
if (!(PINE &= (1<<PE0)))
TI_Write(1000);
}
}
An-SU писал(а):static void TI_Write(unsigned int Sch)
{
unsigned int sreg = SREG;
cli();
OCR1A=Sch;
SREG=sreg;
}