Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Управление серводвигателем под FreeRTOS
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
robototechnik
Всем привет!
Совсем недавно перешел на FreeRTOS до этого немного работал с С под AVR микроконтроллеры. Сейчас стоит задача подключить 3 серводвигателя к ATmega32 из под FreeRTOS. У меня имеется код который работает без ОС, но при внедрении его в ОС ничего не пашет, точнее ШИМ вроде генерируется но не по параметрам. Я подключил выход к осциллографу и на выходе если я все правильно понимаю у меня через каждую миллисекунду появляется высокий уровень....хотя я задавал период как бы в 20 мс. Короче непонятки какие то...пожалуйста, если у кого либо есть какая либо информация,мысли или наработки поделитесь плз!!!))) и к Курницу не посылать...он мне не отвечает... Если что надо выложить, коды или фотки с осцилла то говорите.
Заранее большое спасибо)
_Pasha
Такие вещи решаются с помощью протеусовского симулятора в течение часа.
robototechnik
всмысле?каким образом?конкретнее пожалуйста)
_Артём_
Цитата(robototechnik @ Jan 16 2013, 21:17) *
Совсем недавно перешел на FreeRTOS до этого немного работал с С под AVR микроконтроллеры. Сейчас стоит задача подключить 3 серводвигателя к ATmega32 из под FreeRTOS.

Скорости хватит?

Цитата(robototechnik @ Jan 16 2013, 21:17) *
У меня имеется код который работает без ОС, но при внедрении его в ОС ничего не пашет, точнее ШИМ вроде генерируется но не по параметрам.


Попробуйте теперь по другому:
Вариант 1. Перенести ШИМ на другой таймер.
Вариант 2. Отключить запуск Оси.

Цитата(robototechnik @ Jan 16 2013, 21:17) *
у меня через каждую миллисекунду появляется высокий уровень....хотя я задавал период как бы в 20 мс.

Такой период наводит на мысль, что Ось использует тот же таймер что и ваш ШИМ.
Либо настройте системный таймер Оси на другой таймер, или поменяйте период системного таймера Оси (в каком-то config-е)

Цитата(robototechnik @ Jan 16 2013, 21:17) *
Если что надо выложить, коды или фотки с осцилла то говорите.

Проект выкладывайте, иначе можно долго гадать.

Цитата(_Pasha @ Jan 16 2013, 21:29) *
Такие вещи решаются с помощью протеусовского симулятора в течение часа.

Или в AVRStudio за 5 минут.
А если кто раньше с FreeRtos работал, то можно и без симуляторов по исходнику за те же минуты.
robototechnik
скорости пардон чего?)если что у меня кварц на 16 МГц и в Configе стоит период Тика 1000 Гц
я заранее извиняюсь я не профи, а любитель)
как я могу перенести ШИМ на другой таймер если использую аппаратный ШИМ с помощью Timer1...а аппаратный Timer0 для ШИМ мне так и не удалось запустить...
я тоже сразу подумал что этот таймер используется для тиков ОС....но он мне нужен....получается нужно создавать программный...а каким образом???понятия не имею....если есть у кого возможность скиньте пожалуйста конкретный пример полного кода с созданиями всех тасков который генерирует ШИМ на определенной ноге МК с периодом 20 мс и высоким уровнем промежутком от 600мкс до 2400мкс.....буду оооочень благодарен....мне так проще в коде разобраться будет)
вот код самой программы а потом за ним конфигурационный файл.....вот это то что я пока что пробовал)








#include "FreeRTOS.h"
#include "task.h"
#include <avr/io.h>
///////////////////////////////////////////////////////////////////////////////////////
void vServo( void *pvParameters )
{
for (;;)
{
OCR1A=180;
OCR1B=180;
vTaskDelay( 5000 / portTICK_RATE_MS);

OCR1A=262;
OCR1B=262;
vTaskDelay( 5000 / portTICK_RATE_MS);

OCR1A=375;
OCR1B=375;
vTaskDelay( 5000 / portTICK_RATE_MS);

OCR1A=487;
OCR1B=487;
vTaskDelay( 5000 / portTICK_RATE_MS);

OCR1A=570;
OCR1B=570;
vTaskDelay( 5000 / portTICK_RATE_MS);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
int main( void )
{
TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10);
ICR1=4999;
DDRD = 0b00110000;
xTaskCreate( vServo,
(signed char * ) "Servo",
configMINIMAL_STACK_SIZE,
NULL,
1,
NULL );
vTaskStartScheduler();
return 0;
}















#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

#include <avr/io.h>

/*-----------------------------------------------------------
* Application specific definitions.
*
* These definitions should be adjusted for your particular hardware and
* application requirements.
*
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
*
* See http://www.freertos.org/a00110.html.
*----------------------------------------------------------*/

#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( ( unsigned long ) 16000000 )
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 4 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 500 )
#define configTOTAL_HEAP_SIZE ( (size_t ) ( 1500 ) )
#define configMAX_TASK_NAME_LEN ( 10 )
#define configUSE_TRACE_FACILITY 0
#define configUSE_16_BIT_TICKS 1
#define configIDLE_SHOULD_YIELD 1
#define configQUEUE_REGISTRY_SIZE 1

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 1
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */

#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskCleanUpResources 1
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1


#endif /* FREERTOS_CONFIG_H */

_Артём_
Цитата(robototechnik @ Jan 16 2013, 21:51) *
скорости пардон чего?)


Скорости света надо полагать...


Цитата(robototechnik @ Jan 16 2013, 21:51) *
если что у меня кварц на 16 МГц и в Configе стоит период Тика 1000 Гц


Не так уж много...



Цитата(robototechnik @ Jan 16 2013, 21:51) *
как я могу перенести ШИМ на другой таймер если использую аппаратный ШИМ с помощью Timer1...а аппаратный Timer0 для ШИМ мне так и не удалось запустить...


Перенесите Шим на T2 или перенесите системный таймер Оси на T0 и задайте другой период (1 миллисекунда не выйдет)

Цитата(robototechnik @ Jan 16 2013, 21:51) *
я тоже сразу подумал что этот таймер используется для тиков ОС


Как бы они 1мс получили на другом таймере...

Цитата(robototechnik @ Jan 16 2013, 21:51) *
....но он мне нужен....получается нужно создавать программный...а каким образом???


перенесите прерывание системного таймера на другой вектор. Ессли возможно. Или вам строго 1 мс нужна от системного таймера? Затраты на Ось при этом будут высьма немалыми.

Цитата(robototechnik @ Jan 16 2013, 21:51) *
вот код самой программы а потом за ним конфигурационный файл.....вот это то что я пока что пробовал)


Проект целиком лучше заархивируйте
robototechnik
Артём, я могу вас попросить мне разжевать все что я должен сделать пожалуйста...я не понимаю что именно не так...(
_Pasha
1. Лезете в port.c для авровского порта, находите там
Код
void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal, naked ) );

И переназначаете его на что-нить другое.

2. Не забываем про инициализацию
это находится в static void prvSetupTimerInterrupt( void )
robototechnik
окай я нашел эту строку...но как переназначить?
инициализацию чего и где вообще?)
я извиняюсь еще раз)сильно не бейте)
_Артём_
Цитата(_Pasha @ Jan 16 2013, 22:14) *
1. Лезете в port.c для авровского порта, находите там
Код
void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal, naked ) );

И переназначаете его на что-нить другое.

2. Не забываем про инициализацию
это находится в static void prvSetupTimerInterrupt( void )

Тип того.
а 1000 Hz при том как? (проекта под авр под рукой у меня нет).
robototechnik
Артем я вас не понимаю(
что тип того?и при чем 1000Гц?
_Артём_
Цитата(robototechnik @ Jan 16 2013, 22:23) *
Артем я вас не понимаю(
что тип того?и при чем 1000Гц?


Вам какfя частота системного таймера нужна(она будет определять точность с которой выполняются задержки в частности)?
robototechnik
я точно не знаю...знаю что мне нужна неплохая точность угла поворота серводвигателя...а так же хорошее быстродействие системы для одновременного опроса сенсоров....вот)
_Pasha
Цитата(robototechnik @ Jan 16 2013, 23:18) *
окай я нашел эту строку...но как переназначить?
инициализацию чего и где вообще?)
я извиняюсь еще раз)сильно не бейте)

Ежели Вы уже писали под АВРки, то, надо полагать, в потрохах оных Вы уже разбираетесь? Тама три строчки в шесть рядов sm.gif Не морочьте людям голову на ночь sm.gif
Что у Вас свободно? Timer0? Отлично, на него и вешайте прерывание, даже output compare можно не использовать из любви к искусству, типа такого
Код
#include <avr/interrupt.h>
void SIG_OUTPUT_COMPARE0( void ) __attribute__ ( ( signal,naked ) );
    void SIG_OUTPUT_COMPARE0( void )
    {
        vTaskIncrementTick();
                asm volatile("reti");
    }


static void prvSetupTimerInterrupt( void ) - тут устанавливаете все что касается срабатывания таймера 0 с 1мс тиком
Я сейчас не пишу под авры, лазать по макабукам - долго. Уж будьте любезны - сами.
Если заметили, там функция целиком посвящена именно настройке таймера, и больше ничего. можно смело написать своё, как угодно криво/прямо, лишь бы у Вас пошли прерывания на OCR0 1мс, и отразить это в configTICK_RATE_HZ

ЗЫ там подправил чуток, у Вас же preemption будет?
robototechnik
не то что бы много писал....так попробовал но думал что хоть немного разбираюсь(
забыл уточнить мне 15 лет)так что...пардон иногда недоезжаю)
теперь более менее понятно...то есть если я перекину тики на таймер0 то таймер1 освободится и смогу рулить сервами с моим кодом?верно?
_Pasha
Совершенно ага!
Но я Вам дело говорю: для авров протеус - самое то, сразу все можно выставить и проверить правильность настройки периферии. Не то, что в 15 лет, а даже в 14.5 sm.gif
robototechnik
отлично))большое спасибо)завтра попробую если не получится, я напишу)
можно?)хах

не получается((((решил сейчас попробовать...заменил часть которую вы прислали вместо той которая стояла в порт.с....теперь такое ощущение что ОС не тикает вообще)на осциллографе на выходе просто просто одно значение ШИМ генерируется и не обновляется на другое(при чем период так и не изменился(я безнадежен(
помогите плз!)
_Pasha
Ну, я не проверял, мало ли, мож чего пропустил...
configCPU_CLOCK_HZ у Вас правильно выставлен?
ЗЫ ага, точно пропустил, циферку не ту поставил. Updated/
Нажмите для просмотра прикрепленного файла
robototechnik
теперь компилятор ругается)
не компилирует и говорит что 16 ошибок нашел...
вот что выдал:

../../../../Source/portable/GCC/ATMega323/port.c:3:16: error: too many decimal points in number
../../../../Source/portable/GCC/ATMega323/port.c:28: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'can'
../../../../Source/portable/GCC/ATMega323/port.c:35: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'even'
../../../../Source/portable/GCC/ATMega323/port.c:38: error: expected identifier or '(' before 'if'
../../../../Source/portable/GCC/ATMega323/port.c:47:55: warning: missing terminating " character
../../../../Source/portable/GCC/ATMega323/port.c:47: error: missing terminating " character
In file included from ../../../../Source/portable/GCC/ATMega323/port.c:83:
d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:143: error: expected declaration specifiers or '...' before 'size_t'
d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:144: error: expected declaration specifiers or '...' before 'size_t'
d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:175: error: expected declaration specifiers or '...' before 'size_t'
d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:175: error: expected declaration specifiers or '...' before 'size_t'
d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:290: error: expected ')' before '__size'
d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:302: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__malloc_margin'
d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:319: error: expected ')' before '__nele'
d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:338: error: expected declaration specifiers or '...' before 'size_t'
In file included from D:\Install\FreeRTOSV7.3.0\FreeRTOS\Projects\SUMO\FreeRTOSmain\..\..\..\Source\include/FreeRTOS.h:91,
from ../../../../Source/portable/GCC/ATMega323/port.c:86:
D:\Install\FreeRTOSV7.3.0\FreeRTOS\Projects\SUMO\FreeRTOSmain\..\..\..\Source\include/portable.h:370: error: expected ')' before 'xSize'
D:\Install\FreeRTOSV7.3.0\FreeRTOS\Projects\SUMO\FreeRTOSmain\..\..\..\Source\include/portable.h:373: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'xPortGetFreeHeapSize'
../../../../Source/portable/GCC/ATMega323/port.c: In function 'prvSetupTimerInterrupt':
../../../../Source/portable/GCC/ATMega323/port.c:410: warning: unused variable 'temp'
make: *** [port.o] Error 1
Build failed with 16 errors and 4 warnings...
_Pasha
уберите комментарии, х его з
robototechnik
какие комментарии?где?
robototechnik
ага я понял)хах)
я удалил все комментарии в port.c и код скомпилировался)))ура)
но всплыли новые проблемы(теперь программа не обновляется...ну не тикает я имею ввиду...ну по крайней мере я так думаю...ШИМ генерируется только с периодом который задан в самом первом значении...и так продолжается бесконечно...хотя по программе значение изменяется каждые 500 мс или сколько там...вот...в чем может быть проблема????????????
robototechnik
ребята помогите плиз!!!)
_Pasha
Придется таким образом:
выкладывайте здесь ПОЛНОСТЬЮ всё, что относится к проекту, также, в чём Вы его делаете. Не иначе, либо чего-то в путях нету, либо в настройках, либо среди исходников.
robototechnik
окай,значит компилирую я в AVRStudio V4.18
скидываю проект, который у меня лежит в папке с проектами ОС
если то еще нужно скажите все сделаю)
_Pasha
Мда.. у меня нету ни винды ни АВРстудии. Доберусь до виндового ноута, к утру разберёмся. Code::Blocks и прочие лишние сущности не предлагаю.
robototechnik
тогда утром ждать ответа?)
_Pasha
Я отпишусь.
robototechnik
окай)жду)
спасибо)
Volldemar
Цитата(robototechnik @ Jan 20 2013, 22:26) *
ребята помогите плиз!!!)

Изучите инфу по:
http://cxemotexnika.org/2010/06/%D0%BF%D1%...BB%D0%BB%D0%B5/
там есть продожение...
_Pasha
Не добрался я до студии, но есть такое:
Нажмите для просмотра прикрепленного файла
Там из сабжа только то, что надо, прикручен довольно традиционный для winAVR makefile. Всё собирается без проблем.
Команда make в каталоге проекта собирает, make clean - чистит.

Поизучайте в плане, какие исходники откуда взяты и сделайте то же самое, но в своей студии
robototechnik
Volldemar,спасибо,почитаю)

_Pasha,так проблема же с компиляцией уже решена!!!и код заработал,только он не обновляется(ну не тикает в смысле(
в том коде который я вам скинул он загружает только первое значение OCR а если дописать второе то он до него не доходит(
я эту проблему имел ввиду
_Pasha
Все там переключается. Т.е. таскопереключалка работает, соответственно прерывания работают верно. Дальше - выкладывайте проблемный main.c, будем смотреть. У меня уже и протеус готов и мейкфайл sm.gif
robototechnik
вот вам целый проект с новым сишным файлом)
я вот думаю....может я что то с этой самой таскоперелючалкой натворил?)хах только как?
если у вас заработает с моим сишным файлом,то проблема именно в этом)

а еще стоит уточнить что при самой первой компиляции сишного файла появляются три ошибки что то про прерывания....я так понимаю это может быть проблемой?но потом все нормально....
_Pasha
по vTaskDelay задача приостанавливается, но по истечении нужного кол-ва тиков "в строй" не становится. Что-то с конфигурацией, но что - пока не разобрался
robototechnik
может я когда комменты в port.c удалял,что то еще не заметив удалил?)
_Артём_
Цитата(robototechnik @ Jan 23 2013, 18:04) *
может я когда комменты в port.c удалял,что то еще не заметив удалил?)

Может и так, но это только телепаты и вы можете знать.

ЗЫ. Вам же писали - выкладывайте проект целиком.
_Pasha
Цитата(_Артём_ @ Jan 23 2013, 19:45) *
Может и так, но это только телепаты и вы можете знать.

ЗЫ. Вам же писали - выкладывайте проект целиком.

Там такая штука, что после первого vTaskDelay() таск нормально переходит в список задержанных, а почему нет обратного процесса - еще неясно.
robototechnik
_Артём_, ну а я что выложил?)
_Pasha, буду оооочень признателен если поможете)
_Pasha
Цитата(robototechnik @ Jan 23 2013, 20:21) *
_Артём_, ну а я что выложил?)
_Pasha, буду оооочень признателен если поможете)

Еще раз повторяю. Берёте симулятор австудии той же. Вот только не помню, там глюк с таймером 0 есть или нет. В любом случае, в протеусе его нет, однозначно. Там другие глюки sm.gif
Жмете F10/F11 до выяснения причины. Заодно и научитесь с симулем работать, а именно - как ставить точки останова и понимать информацию, которая предоставляется симулем.Заодно и ознакомитесь как работают внутренности freeRTOSа. И не забываем о том, что этот гемор - исключительно Ваш, и с ним надо что-то делать исключительно Вам.
TSerg
"Мда.., а мы пахали в чистом асме, отладка по шагам кнопкой и наши корабли плавали и плавают" (С)
robototechnik
"...этот гемор - исключительно Ваш, и с ним надо что - то делать исключительно Вам..."
Форум разработчиков электроники???
что ж...спасибо и на этом)))
_Pasha
Цитата(robototechnik @ Jan 24 2013, 00:23) *
"...этот гемор - исключительно Ваш, и с ним надо что - то делать исключительно Вам..."
Форум разработчиков электроники???
что ж...спасибо и на этом)))

Там у Вас памяти-то уже и нету, ОЗУ. Попытался запустить второй экземпляр той же задачи - выкидывает менеждер динамической памяти. sad.gif
И это когда еще ничего нет. А надо 5...
---
Насчет "мук творчества" - дык так и должно быть. Природа laughing.gif
robototechnik
Что за ОЗУ?памяти под что?Какой задачи?Что за менеджер?Нет чего?Надо 5 чего?
согласен)

и вообще как можно в протеусе наблюдать ошибки кода???
robototechnik
аууу есть кто нибудь на форуме?)))
robototechnik
ребята!!! все кто хочет сэкономить время и силы обращайтесь на форумы https://sourceforge.net/projects/freertos/f...ms/forum/382005 или http://www.avrfreaks.net/
или на какие нибудь подобные)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.