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

 
 
> Требуется помощь с JacOS, Не могу запустить таймеры
altlogic
сообщение Jan 29 2008, 21:49
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Здравствуйте!

Следуя примерам из документации на ОС не смог воспользоваться сервисом OS_Delay(). Проект пишу под AVRStudio4. Код у меня примерно следующий:

...
__task void T_1(void)
{
while (1)
{
LCDClear();
LCDPutSR("Привет МИР");
OS_Delay(1000);
}
}
...
int main(void)
{
OS_Init();
OS_Task_Create(T_1, &task1);
OS_Task_Create(T_2, &task2);
TCCR0 = (1 << CS01); // timer tick = 2000 instruction cycles
TIMSK |= (1 << TOIE0);
OS_Ena_Int(); // enable interrupts
DDRC=0xff;
DDRA = 0x00;
LCDInit();
LCDClear();

while (1) {
OS_Scheduler();
}
}

SIGNAL(SIG_OVERFLOW0)
{
OS_Timer_Tick_Set();
OS_Timer();
}

Визуально переключение задач происходит быстрее, чем за 1000мс. Вернее ГОРАЗДО быстрее.
Не могу понять в чём ошибка. Пока принялся за изучение таймеров в WinAVR. До этого с таймерами и прерываниями не работал вообще.

С уважением, Вячеслав.


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Pat
сообщение Jan 31 2008, 21:32
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 27-05-05
Из: Энергодар
Пользователь №: 5 480



Цитата(altlogic @ Jan 29 2008, 23:49) *
SIGNAL(SIG_OVERFLOW0)
{
OS_Timer_Tick_Set();
OS_Timer();
}


Откуда вызывается функция SIGNAL.

Чтобы получить 1000 мС необходимо задать срабатывание системного таймера с периодом 1 мС.
Например выбран таймер 0 и задана частота 8 МГц, а нам надо получить на выходе частоту 1000Гц. Выбираем коэффициент предделителя равным 64 и получаем
8000000/64 = 125000 -> 125000/1000 = 125 это значение которое всегда необходимо устанавливать в регистре TCNT0. В jacOS это реализовано при помощи макроса
#ifndef OS_Timer_Tick_Set
#define OS_Timer_Tick_Set() {TCNT0 -= OS_TMR_TICK;}
#endif
который, находится в файле prt_avr.h или prt_gavr.h (для WinAVR)

1) Настраиваем предделитель
TCCR0 = 0x03;
2) Прерывание по переполнению TIMSK |= (1 << TOIE0);
3) В файле jacnfg.h устанавливаем
#define OS_TMR_TICK 125 (см выше)
4) Устанавливаем обработчик прерываний

#pragma vector=TIMER0_OVF_vect
__interrupt void intr_timer0(void)
{
OS_Timer_Tick_Set();
OS_Timer();
}
Должно все случится.
Если нет, то внимательно читаем jacos.doc и проверяем все строки в jacnfg.h на соответствие выбранной вами библиотеки.
Не забываем, что для задержек необходимо выбирать библиотеки с поддержкой тайм аутов, а так же задачи определять как OST_TASK_T task1;
Go to the top of the page
 
+Quote Post
alux
сообщение Feb 29 2008, 09:58
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(Pat @ Feb 1 2008, 01:32) *
В jacOS это реализовано при помощи макроса
#ifndef OS_Timer_Tick_Set
#define OS_Timer_Tick_Set() {TCNT0 -= OS_TMR_TICK;}
#endif
который, находится в файле prt_avr.h или prt_gavr.h (для WinAVR)

В prt_avr.h тик таймера делится на 4
Код
#ifndef OS_Timer_Tick_Set
  #define OS_Timer_Tick_Set() {TCNT0 -= OS_TMR_TICK/4;}
#endif

Тоже разбираюсь с этой Осью. Чем больше вникаю, тем больше она нравится. Все так логично устроено. И совсем не сложно, как мне казалось на первый взгляд.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:26
Рейтинг@Mail.ru


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