Easyelectronics.ru

Электроника для всех
Текущее время: 24 апр 2018, 11:34

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: вопрос по Di Halt Rtos.
СообщениеДобавлено: 19 мар 2016, 00:02 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 695
Откуда: Вольгинский, 33
проц.: atmega8a
os: DiHalt Rtos
проблема: незапускается.
инициализация проходит и начинается тупить в while(1) не доходя до TaskManager;
проект прикладываю.


Вложения:
Clock_1Drive_board_v2.7z [39.27 Кб]
Скачиваний: 117


Последний раз редактировалось Arcanum 24 мар 2016, 12:41, всего редактировалось 1 раз.
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Di Halt Rtos. не запускается
СообщениеДобавлено: 19 мар 2016, 00:09 
Только пришел
Аватара пользователя

Зарегистрирован: 23 дек 2011, 13:37
Сообщения: 27
Откуда: Kuznetsovsk, UA
может таймер не работает?

я у себя использовал http://we.easyelectronics.ru/Soft/dispe ... tcher.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Di Halt Rtos. не запускается
СообщениеДобавлено: 19 мар 2016, 00:55 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 695
Откуда: Вольгинский, 33
shilow писал(а):
может таймер не работает?


пашет однако...
Цитата:
я у себя использовал http://we.easyelectronics.ru/Soft/dispe ... tcher.html

не... то что я сейчас использую прекрасно работет в пяти железках и всё ок.
на атмеге8 только первый раз запустил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Di Halt Rtos. не запускается
СообщениеДобавлено: 19 мар 2016, 01:03 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1798
Откуда: Новокузнецк
Код:
// Инициализируем ядро
InitRTOS;                  // в  файле <EERTOS.c>
// Инициализируем внутреннюю периферию контроллера
InitAll;                  // в файле <HAL.c>
// Старт ядра.
RunRTOS;   

При вызове функций после имени функции нужно обязательно скобки (), иначе это просто указатель.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Di Halt Rtos. не запускается
СообщениеДобавлено: 19 мар 2016, 01:04 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 695
Откуда: Вольгинский, 33
ларчик просто открывался.
функции надо вызывать со скобками

InitRTOS();
InitAll();
RunRTOS();
InitLeds();

а не без.

InitRTOS;
InitAll;
RunRTOS;
InitLeds;

где угодно. особенно в прерываниях.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Di Halt Rtos. не запускается
СообщениеДобавлено: 19 мар 2016, 01:05 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 695
Откуда: Вольгинский, 33
elisey писал(а):
Код:
// Инициализируем ядро
InitRTOS;                  // в  файле <EERTOS.c>
// Инициализируем внутреннюю периферию контроллера
InitAll;                  // в файле <HAL.c>
// Старт ядра.
RunRTOS;   

При вызове функций после имени функции нужно обязательно скобки (), иначе это просто указатель.

на полминуты опередили)

спасибо!)

+1 к экспе


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по Di Halt Rtos.
СообщениеДобавлено: 24 мар 2016, 13:01 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 695
Откуда: Вольгинский, 33
есть шаговый двигатель. управляется через L293 напрямую с контроллера. то есть каждый вывод контроллера подключён к базе транзистора.

в Di Halt Rtos написал четыре вот таких процедуры:

Код:


void QuoterStep_1(void)
{
   SetBit(DRIVE_PORTD,DRIVE_PIN_0);
   ClearBit(DRIVE_PORTD,DRIVE_PIN_1);
   ClearBit(DRIVE_PORTB,DRIVE_PIN_2);      // <-- порт B
   ClearBit(DRIVE_PORTD,DRIVE_PIN_3);
   SetTimerTask(QuoterStep_2, MECH_STEP_TIME);
}

void QuoterStep_2(void)
{
   ClearBit(DRIVE_PORTD,DRIVE_PIN_0);
   SetBit(DRIVE_PORTD,DRIVE_PIN_1);
   ClearBit(DRIVE_PORTB,DRIVE_PIN_2);      // <-- порт B
   ClearBit(DRIVE_PORTD,DRIVE_PIN_3);
   SetTimerTask(QuoterStep_3, MECH_STEP_TIME);
}

void QuoterStep_3(void)
{
   ClearBit(DRIVE_PORTD,DRIVE_PIN_0);
   ClearBit(DRIVE_PORTD,DRIVE_PIN_1);
   SetBit(DRIVE_PORTB,DRIVE_PIN_2);         // <-- порт B
   ClearBit(DRIVE_PORTD,DRIVE_PIN_3);
   SetTimerTask(QuoterStep_4, MECH_STEP_TIME);
}

void QuoterStep_4(void)
{
   ClearBit(DRIVE_PORTD,DRIVE_PIN_0);
   ClearBit(DRIVE_PORTD,DRIVE_PIN_1);
   ClearBit(DRIVE_PORTB,DRIVE_PIN_2);      // <-- порт B
   SetBit(DRIVE_PORTD,DRIVE_PIN_3);
   SetTask(MechSet1200);
}


для управления шаговым двигателем.

сейчас у меня эти процедуры вызываются несколько другими процедурами. нужно сделать так чтобы в конце QuoterStep_4 в строке SetTask(MechSet1200); на месте MechSet1200 была та самая процедура что вызвала начальную процедуру QuoterStep_1 этой цепочки.
через переменную и затем switch-case в конце считаю неспортивным.

я попытался разобраться в механизме SetTask и TaskManager. первая функция сохраняет в массиве указатель (как значение пееменой) на пользовательскую функцию, а вторая уже достаёт из массива сей указатель и выполняет кусок кода.

typedef void (*TPTR)(void); // я так думаю что это та самая переменная объявлена. точно также надо объявить свою(?)
а как вызывать такую весчь? у Ди токль
(GoToTask)(); // Переходим к задаче
и всё.

то есть для того чтобы реализовать задуманное мне надо объявить некую переменную(?какой тип?) затем до вызова QuoterStep_1 присвоить ей значение указателя процедуры/функции.
а затем в QuoterStep_4 на месте строки SetTask(MechSet1200) сделать SetTask(nasha_perennaya)

кто может подсказать как это сделать?
или какие разделы по Си и Си++ читать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по Di Halt Rtos.
СообщениеДобавлено: 25 мар 2016, 12:34 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 695
Откуда: Вольгинский, 33
разобрался.
в хидере объявил
typedef void (*DPDR)(void);

в коде сделал глобальную переменную с пустышкой по умолчанию
DPDR GoToTaskAfter = Idle;

и вызываем цепочку процедур (1->2, 2->3,3->4) через диспетчер задач с присвоением переменной GoToTaskAfter = OurProcedure ;
получется (OurProcedure->1, 1->2, 2->3, 3->4 ,4->GoToTaskAfter )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по Di Halt Rtos.
СообщениеДобавлено: 25 мар 2016, 13:09 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1798
Откуда: Новокузнецк
2Arcanum. Мне кажется, у вас изначально путь решения задачи не верный. Отсюда выходит эта акробатика с указателями. Но чтоб сказать как это сделать лучше, нужно знать всю задачу.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по Di Halt Rtos.
СообщениеДобавлено: 26 мар 2016, 23:22 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 695
Откуда: Вольгинский, 33
elisey писал(а):
2Arcanum. Мне кажется, у вас изначально путь решения задачи не верный. Отсюда выходит эта акробатика с указателями. Но чтоб сказать как это сделать лучше, нужно знать всю задачу.

файл ...\Clock_1Drive_board_v2\Clock_1Drive_board_v2\Clock_Mechanism\Clock_Mechanism.c
ВНИМАНИЕ! Возможны рвотные позывы при просмотре этого кода.
суть - двигателем могут щёлкать разные задачи. чтобы не плодить строк кода и стали нужни все эти прыжки и ужимки.


Вложения:
Clock_1Drive_board_v2.7z [69.39 Кб]
Скачиваний: 109
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB