Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATmega 128 Timer2
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
home2010
Пытаюсь запустить таймер Т2...

ATmega 128,кварц 7.372Мhz,AVreal

D:\Timers\avreal32.exe +MEGA128 -p378 -ab -n -o1000Khz -%% -fCKSEL=E,BOOTRST=0,BLB0=3,BLB1=3,M103C=1,JTAGEN=1 -e -w -c D:\Timers\Timers.hex
PAUSE

void InitTimers (void)
{
//инициализация таймера т2
TIMSK = (1<<OCIE2); //разрешаем прерывание таймера т2 при событии совпадение
TCCR2 = ((0<<WGM21)|(0<<WGM20)|(1<<CS02)|(0<<CS01)|(1<<CS00)); //режим СТС, прескалер - 1024
TCNT2 = 0; //обнуляем счетный регистр
OCR2 = 0x07; //прерывания каждые ~ 1 мс
}

//-------------------------------------------------------------------------------------------
// Прерывание от T2 1 милисекунда
#pragma vector = TIMER2_COMP_vect
__interrupt void TIMER2_COMP_interrupt(void)
{
uint Ticks = 0;
uint del = 0;

// Обработка 1 мс интервалов
Ticks++;
if(Ticks & 0x0080) {on(LED1);} else {off(LED1);}

// Обработка 1 с интервалов
if(++ del >= 1000) {on(LED2);} else {off(LED2);}

}

Буду очень благодарен за помощь
AHTOXA
У вас переменные Ticks и del создаются всякий раз при входе в прерывание. Чтобы их значение сохранялось между вызовами обработчика прерывания, используйте слово static:
Код
__interrupt void TIMER2_COMP_interrupt(void)
{
static uint Ticks = 0;
static uint del = 0;
...
IgorKossak
home2010, дублирование тем нарушает правила форума. Дубль удалил.
Модератор.
DVF
Код
//TIMER2 initialize - prescale:1024
// WGM: CTC
// desired value: 1mSec
// actual value:  1,250mSec (25,0%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
TCNT2 = 0x00; //setup
OCR2  = 0x03;
TCCR2 = 0x0D; //start
}
home2010
Таймер зароботал smile.gif
Нужно было ...
static uint Ticks = 0;
Для режима CTC по совпадению OCR2 надо ((1<<WGM21)|(0<<WGM20)

void InitTimers (void)
{
//инициализация таймера т2
TIMSK = (1<<OCIE2); //разрешаем прерывание таймера т2 при событии совпадение
TCCR2 = ((1<<WGM21)|(0<<WGM20)|(1<<CS02)|(0<<CS01)|(1<<CS0 0)); //режим СТС, прескалер - 1024
TCNT2 = 0; //обнуляем счетный регистр
OCR2 = 0x07; //прерывания каждые ~ 1 мс
}

//-------------------------------------------------------------------------------------------
// Прерывание от T2 1 милисекунда
#pragma vector = TIMER2_COMP_vect
__interrupt void TIMER2_COMP_interrupt(void)
{
static uint Ticks = 0;

Ticks++;
if(Ticks & 0x0080) {on(LED1);} else {off(LED1);}

}
МП41
И на казусе эта тема есть...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.