реклама на сайте
подробности

 
 
> ATmega 128 Timer2, Пытаюсь запустить таймер Т2...
home2010
сообщение Mar 30 2010, 05:09
Сообщение #1





Группа: Участник
Сообщений: 4
Регистрация: 8-02-10
Пользователь №: 55 370



Пытаюсь запустить таймер Т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);}

}

Буду очень благодарен за помощь
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
AHTOXA
сообщение Mar 30 2010, 05:31
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



У вас переменные Ticks и del создаются всякий раз при входе в прерывание. Чтобы их значение сохранялось между вызовами обработчика прерывания, используйте слово static:
Код
__interrupt void TIMER2_COMP_interrupt(void)
{
static uint Ticks = 0;
static uint del = 0;
...


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 30 2010, 06:28
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



home2010, дублирование тем нарушает правила форума. Дубль удалил.
Модератор.
Go to the top of the page
 
+Quote Post
DVF
сообщение Mar 30 2010, 06:44
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 630
Регистрация: 26-07-06
Из: Саратов
Пользователь №: 19 097



Код
//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
}


Сообщение отредактировал DVF - Mar 30 2010, 06:52
Go to the top of the page
 
+Quote Post
home2010
сообщение Mar 30 2010, 08:04
Сообщение #5





Группа: Участник
Сообщений: 4
Регистрация: 8-02-10
Пользователь №: 55 370



Таймер зароботал 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);}

}
Go to the top of the page
 
+Quote Post
МП41
сообщение Mar 30 2010, 08:38
Сообщение #6


4 синих кубика
****

Группа: Участник
Сообщений: 526
Регистрация: 19-09-08
Из: полупроводника, металла и стекла
Пользователь №: 40 326



И на казусе эта тема есть...


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01731 секунд с 7
ELECTRONIX ©2004-2016