Перейти к содержанию
    

Nikkola

Участник
  • Постов

    11
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. IAR 5.11 ARM kickstart

    Здравствуйте форумчане. У меня Вопрос. А будет ли у этой версии работать дебаггер, может ли ИАР сгенерить нех файл? Возникают проблемы освоения оценочной платы ADuC7061MKZ с данной версией. С кейлом 3 тоже проблемы. Драйвера поставлены (там FTDI на плате) Даже не понял, есть там JTAG или нет.
  2. ЦАП 10вольт 10бит

    Уважаемые форумчане! Посоветуйте пож-ста простенький ЦАП не менее 10бит с размахом выхода 0 - 10 Вольт, можно с SPI интерфейсом.
  3. Как же быть? Сколько выделить в SYSTEM под CSTACK RSTACK? Сколько выделить в IDLE и в пользовательских процессах, чтоб все работало, а так две мои глобальные переменные типа word забиваются единицами. Есть ли общие рекомендации, какие - нибудь итерации к расчету оптимальных стеков, методы научного тыка и т.п. А диагностические сообщения я и прежде на рабочих проектах видел, а вот теперь попал.
  4. Получилось, что неправильно распределены ресурсы Мк. Есть ли инструкция как расчитывать RSTACK CSTACK? Дебаггер пишет, что указатели стэков OUT of range. Что именно значат настройки проекта в GENERAL->System? Какая там арифметика в ИАР АВР? Заранее благодарен.
  5. А что, можно одну функцию класса использовать другую функцию? В самом простом случае мой процесс будеть выглядеть просто process(){ if ( where()!= target) {go(target); } } а в сетевом (uart) использовать where() для ответ на запрос текущего угла?
  6. Еще раз спасибо. Я так понимаю, что функция void process() отвечает за получение новых целей , что -то вроде { TCrit Cect cs1; if(....) Target = (// полученные данные с uart); } и соответственно вызывается в первом процессе? Буду пробовать!
  7. Спасибо большущее! Значит чтение глобальной переменной можно не опасаясь, а модификацию -в критической секции. Я привел пример в общем виде, на самом деле у меня крутятся два асинхронных двигателя (~тока) в двух направляниях, у каждого на валу по энкодеру. Самый приоритетный процесс- это уарт- так требуют программисты верхнего уровня (связь с компом), да и чтоб на команду стоп мгновенно реагировал, хотя приоритеты можно пересмотреть. Видимо для считывания угла мне надо устроить внепроцессную функцию типа void с критической секцией , а значение считанного c энкодера угла передавать по ссылке (в параметре ф_ции) типа Get_Angle(word&). функции с возвращаемым значением вроде как то не советовали в процессе использовать. Тогда эту функцию мог бы я в обоих процессах использовать?
  8. Значит , я не могу выставить флаг в высокоприоритетном процессе (у меня это enable_move в Usart-овском процессе при получении команды движения в заданный сектор), а сбросить в низкоприоритетном (когда текущее значение энкодера совпало с заданным сектором). Именно при совпадении происходит завис. Тогда можно вопрос? Какой тогда механизм задействовать для обмена данными между процессами? EVENT_Flag ксожалению сразу сбрасывает значение. Как бы вы , например, разбили по процессам и сервисам , скажем терморегулятор, опрашиваемый по УСАРту, причем значение задаваемой температуры должно изменяться по команде с УСАРта в любой момент, а инерционность системы малая. Получается есть заданная температура, кот надо обеспечить (пусть там нагреть-охладить ) текущая- по измерению, с кажем с термопары. И еще надо давать ответ на запрос с УСАРТа о текущей температуре? Спасибо большое за участие! Вот теперь флагом управляю в самом приоритетном процессе. Выставляю при получении команды с УСАРТа, а сбрасываю при помощи EVENT FLAG WAIT(10). А в менее приоритетном делаю Signal(). Вроде правильно должно отрабатывать?
  9. Заменил глобальные переменные на закрытые члены класса. Не помогло. Может дело в размере стеков, как их настраивать в ИАР и в csmRTOS?
  10. размер стеков в ИАР?

    Уважаемые форумчане! Как правильно рассчитать размер стеков в EWAVR 4.20 и какие должны быть настройки линкера? Можно ли где ликбез по сему поводу прочитать?
  11. Контроллер МЕГА16, IAR EWAVR 4.20, scmRTOS v 3.00-beta фрагмент кода OS_PROCESS void TProcess::Exec() { while(true) { __watchdog_reset(); Sleep(100); PORTA &= ~(1<<PA5); PORTA &= ~(1<<PA7);//вниз 0 __delay_cycles(10); //t1 > 0.45 мкс word hGray, vGray; //код грея от энкодера __watchdog_reset(); for(int i = 0; i < 10; i++) { hGray <<= 1; vGray <<= 1; PORTA |= (1<<5)|(1<<7);//вверх 1 __delay_cycles(10); if(PINA&0x40) hGray |=(1<<0); if(PINA&0x10) vGray |=(1<<0); PORTA &= ~(1<<PA5); PORTA &= ~(1<<PA7);//вниз 0 __delay_cycles(10); } __delay_cycles(30); PORTA |= (1<<5)|(1<<7);//вверх 1 __watchdog_reset(); hGray &= 0x3FF; vGray &= 0x3FF; __watchdog_reset(); *phA = GrayToBin(hGray); *pvA = GrayToBin(vGray); byte dir=0; __watchdog_reset(); byte vvA = HIGHBYTE(vAngle<<6); byte hhA = HIGHBYTE(hAngle<<6); byte TvA = HIGHBYTE(vTargetAngle<<6); byte ThA = HIGHBYTE(hTargetAngle<<6); if ((vvA>TvA)&&enable_move) dir |=(1<<3); if ((vvA<TvA)&&enable_move) dir |=(1<<2); if (vvA == TvA) dir &= ~((1<<2)|(1<<3)); if ((hhA>ThA)&&enable_move) dir |=(1<<1); if ((hhA<ThA)&&enable_move) dir |=(1<<0); if (hhA == ThA) dir &= ~((1<<0)|(1<<1)); if ((vvA == TvA)&&(hhA == ThA)) { enable_move = 0; //EFlag.Clear(); } PORTA = 0xF0|dir; //move = 0xFF; //задание направления движения //__watchdog_reset(); __watchdog_reset(); } } Виснет в момент совпадения (== по if) . Испол зую глобальные переменные, здесь vAngle - текущее значение угла, vTarget -заданное значение. Когда движок доезжает до заданного места (совпадает значение энкодера и заданное), происходит перезапуск по ватчдогу.
×
×
  • Создать...