Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

ATmega 128 . Пытаюсь запустить таймер Т2...

Непрочитано 30.03.2010, 09:34  
home2010
Прохожий
 
Регистрация: 30.03.2010
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
home2010 на пути к лучшему
По умолчанию ATmega 128 . Пытаюсь запустить таймер Т2...

Пытаюсь запустить таймер Т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‹‹CS0 0)); //режим СТС, прескалер - 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);}

}

Буду очень благодарен за помощь
Реклама:
home2010 вне форума  
Непрочитано 30.03.2010, 10:04  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию Re: ATmega 128 . Пытаюсь запустить таймер Т2...

Сообщение от home2010 Посмотреть сообщение
TCCR2 = ((0‹‹WGM21)|(0‹‹WGM20)|(1‹‹CS02)|(0‹‹CS01)|(1‹‹CS0 0)); //режим СТС, прескалер - 1024
Для режима CTC по совпадению OCR2 надо ((1‹‹WGM21)|(0‹‹WGM20)
ilya_sh вне форума  
Непрочитано 30.03.2010, 10:13  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию Re: ATmega 128 . Пытаюсь запустить таймер Т2...

Да, и точность будет не 1мс, а (1024*/7372000, где то 1,1112...мс
ilya_sh вне форума  
Непрочитано 30.03.2010, 10:35  
mrKirill
Вид на жительство
 
Аватар для mrKirill
 
Регистрация: 12.04.2007
Сообщений: 339
Сказал спасибо: 2
Сказали Спасибо 34 раз(а) в 30 сообщении(ях)
mrKirill на пути к лучшему
По умолчанию Re: ATmega 128 . Пытаюсь запустить таймер Т2...

Сообщение от ilya_sh Посмотреть сообщение
Да, и точность будет не 1мс, а (1024*/7372000, где то 1,1112...мс
Вот чего умничаете, написано же
Цитата:
...//прерывания каждые ~ 1 мс...
mrKirill вне форума  
Непрочитано 30.03.2010, 12:06  
home2010
Прохожий
 
Регистрация: 30.03.2010
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
home2010 на пути к лучшему
По умолчанию Re: ATmega 128 . Пытаюсь запустить таймер Т2...

Таймер зароботал
Нужно было ...
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);}

}
home2010 вне форума  
Непрочитано 30.03.2010, 14:49  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию Re: ATmega 128 . Пытаюсь запустить таймер Т2...

Сообщение от home2010 Посмотреть сообщение
Нужно было ...
static uint Ticks = 0;
Эту переменную ваще нуно было не в процедуре прерывания описывать, чтобы значения сохранялись (дабы не писать "статик" - приводит к путанице).
А куда делась "del" ?
ilya_sh вне форума  
Непрочитано 30.03.2010, 17:26  
home2010
Прохожий
 
Регистрация: 30.03.2010
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
home2010 на пути к лучшему
По умолчанию Re: ATmega 128 . Пытаюсь запустить таймер Т2...

Сообщение от ilya_sh Посмотреть сообщение
Эту переменную ваще нуно было не в процедуре прерывания описывать, чтобы значения сохранялись (дабы не писать "статик" - приводит к путанице).
А куда делась "del" ?
Ну тогда


uint Ticks = 0; // инициализация за пределами прирывания

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


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

}
home2010 вне форума  
Непрочитано 31.03.2010, 07:47  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию Re: ATmega 128 . Пытаюсь запустить таймер Т2...

Сообщение от home2010 Посмотреть сообщение
uint Ticks = 0; // инициализация за пределами прирывания
Вот это более предпочтительный стиль написания кода.
ilya_sh вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 22:48.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.