Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Требуется помощь с JacOS
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
altlogic
Здравствуйте!

Следуя примерам из документации на ОС не смог воспользоваться сервисом 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. До этого с таймерами и прерываниями не работал вообще.

С уважением, Вячеслав.
Pat
Цитата(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;
altlogic
Спасибо за ответ Pat! Как только появится время обязательно проверю Ваши рекомендации.
alux
Цитата(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

Тоже разбираюсь с этой Осью. Чем больше вникаю, тем больше она нравится. Все так логично устроено. И совсем не сложно, как мне казалось на первый взгляд.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.