Автор Тема: Микроконтроллер - как перспектива примочкостроения  (Прочитано 25203 раз)

0 Пользователей и 1 Гость просматривают эту тему.

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Значит, все ещё хуже, чем я предполагал  ::) Придется думать и считать самому  ;D (это я про подсчет максимального требуемого ОЗУ и что компилятор тут совсем не помощник :) )
« Последнее редактирование: Ноября 05, 2011, 12:45:49 pm от Ivana »

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Ну я Вам могу вот что посоветовать. Т.к. регистр SP доступен без особых проблем (без использования ASM'а), то в самой объемной по стеку процедуре обработки прерывания сделайте такое
volatile unsigned int min_stack=0xFFFF; //Глобальная переменная

.....

процедура прерывания:
...
{
  unsigned int sp=SP;
  if (sp<min_stack) min_stack=sp;
}
...

А потом попечатайте в отладке min_stack.

Я только не помню, в инклудах у GCC SP описан как двухбайтовая переменная, или как однобайтовая. Если второе, то sp надо будет скомбинировать из SPL и SPH (младшего и старшего байта указателя стека).
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Интересно... Нагрузить максимально задачами МК и засекать куда максимально заходит стек, ибо его поинтер всегда доступен? А вне процедуры обработки прерывания? Хотя, я могу от таймера прерывания инициализировать и именно для этой задачи - контроля SP  ::) Действительно, интересный вариант. Надо будет его обдумать и попробовать реализовать.

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
А вне процедуры обработки прерывания?

А смысл? Интересно же максимальное значение, а оно суть макс. глубина стека по обычным функциям плюс самое жирное прерывание (ну если Вы там конечно с вложенными не бодаетесь).

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

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Хоть в одном меня радует что этот проект на AVR - что аппаратно невозможны вложенные прерывания  ::) И самое жирное всё определяет :)
А насчет такого контроля в начале каждой функции - действительно классная идея - код маленький, ресурсов требует мало, выполняется быстро, польза есть :) Круто, блин!  ::) Спасибо.

ЗЫ я не могу гарантировать, что самое жирное прерывание у меня придет когда я своими функциями максимально забью стек, но искусственно создав самую жадную до стека ситуацию со своими функциями и посчитав максимальное положение стека, я могу потом просто плюсануть к нему заранее посчитанное количество на максимально прожорливое прерывание  ::)
« Последнее редактирование: Ноября 05, 2011, 01:17:34 pm от Ivana »

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Только одна тонкость есть. Например, IAR в начале любой функции сразу отъедает от стека столько, сколько понадобится в функции. Так ли делает GCC - сказать не могу.  Посматривайте в код на всякий случай.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Хоть в одном меня радует что этот проект на AVR - что аппаратно невозможны вложенные прерывания

Но их можно организовывать руками, разрешая прерывания в обработчике прерываний ;)
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Можно, но я в своем блоке по крайней мере так не буду делать :) Насчет отъедания стека в начале или по ходу - действительно, надо будет проверить, спасибо.

Только что вернулся от командира с тяжелой головой :) Воткнули мой блок в шаблон проекта, с диспетчером задач, библиотеками ввода-вывода и т.п. и залили в железо - уже готовая плата с GPS модулем, с выходом на комп по USB. Попробовали слать команды и читать через терминал отладочную печать :) Нихрена как надо не работает, но зато теперь буду пытаться сам уже все это дело в железе ковырять, а не просто в симуляторе AVR  ::)

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Работает! Мой драйвер GPS модуля на С - работает!  :) Цветы, подарки - кладите уже куда нибудь и проходите, буду хвастаться!  ;D

ЗЫ отладочная печать - капризная штука, именно она мешала моей программе работать!  ;)

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Ну а теперь рекомендую попробовать потыкать пинцетом в линию, по которой идут данные от модуля в Ваш проц и посмотреть устойчивость к ошибкам.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Эээээ...... в буквальном смысле?  ::) Чтобы "навести помехи на линию" и посмотреть как мой алгоритм разборки входящего буфера справится с корявыми посылками? ;)
Пока страшно что-то тыкать, там же от одной ноги МК на него питание подается когда надо (кстати - не работало ТОЛЬКО из-за того, что забыл раскоментарить инициализацию этой ножки как выхода - и на модуль просто не поступало питание  ::). А, ну и ещё коды enter и return  перепутал, или их порядок что за чем идет обычно - я их до сих пор путаю, просто переставил местами прямо в #define  ::)) Сейчас пока помучаю его разными вариантами вызова - частотой и интервалом выдачи данных :) Но потом конечно надо потыкать и пинцетом и вообще - чтобы проверить код на устойчивость.
« Последнее редактирование: Ноября 06, 2011, 09:32:09 pm от Ivana »

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Эээээ...... в буквальном смысле?

В буквальном. Пинцетом покорить линию на землю, например. Только осторожно со статикой и обычной историей с незаземленными компами и прочими устройствами с импульсными источниками питания.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Тыкание наверное отложу до командира - вместе с ним будем тыкать. Хотя, я более менее спокоен за алгоритм разбора - уж его-то я в симуляторе как только не проверял с разными тестовыми входными данными, плюс ещё контрольную сумму посылки проверяю :) Но посмотрим...

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Вы будете смеяться - но после GPS модуля, командир параллельно с драйвером GSM модуля выдал мне ТЗ на следующее :)

Цитировать
Сервопривод шагового двигателя
техническое задание
Функциональные возможности программы:
1. Автоматический выбор программой режима работа: полношаговый, полушаговый или микрошаговый (дробление шага).
2. Максимальная скорость вращения — не менее 5000 шагов в секунду.
3. Максимальное количество шагов на оборот — 255.
4. Количество микрошагов в шаге — 128. Допустимо снижение кол-ва микрошагов до 64 или 32 в случае, если это будет обусловлено требованиями регулировки тока в обмотках.
5. Частота ШИМ режима микрошага или регулировки тока - за пределами звуковых частот, дабы избежать режущих слух высокочастотных составляющих.
6. Возможность работы как в режиме установки требуемого углового положения (значение берется из входного канала IN0 — угловое положение), так и в режиме "вращение" без контроля углового положения. Выбор режима "вращение" осуществляется с помощью подачи на вход канала IN0 (угловое положение) служебного сигнала "Канал дезактивирован".
7. Контроль тока через катушки двигателя с помощью обратной связи (датчика тока на резисторе) и регулировка данного тока с помощью ШИМ для удержания тока текущего режима (разгон, поддержание скорости, торможение, удержание) в заданном пределе. Точность задания тока не хуже 5% от максимально допустимого (при максимуме в 2А — 100мА).
8. Индикация технического состояния сервопривода с помощью светодиода. Режимы работы светодиода:
·      горит непрерывно – работоспособное состояние;
·      мигает – обрыв в цепи обмотки ШД либо неисправны силовые узлы на плате сервопривода, иными словами - отсутствие тока в одной или нескольких обмотках ШД;
·      не горит – нет питания либо неисправен (неработоспособный) сервопривод.
9. Измерение и выдача температуры платы сервопривода с периодичностью не реже раз в 5 сек.

Входные каналы:
- (IN0) задание углового положения, обороты (знак определяет направление);
- (IN1) задание скорости вращения шпинделя, обороты в секунду (знак определяет направление);
- (IN2) задание ускорения (разгонная/тормозная характеристика для выхода на заданную скорость), обороты/секунду2;
- (IN3) количество полюсов (шагов) на оборот;
- (IN4) задание тока вращения, амперы;
- (IN5) задание тока разгона и торможения, амперы;
- (IN6) задание тока удержания, амперы;
- (IN7) значение, загружаемое в качестве значения текущего углового положения шпинделя при подаче бинарного сигнала "УСТАНОВ"
- (SET) бинарный сигнал "УСТАНОВ", активный уровень — низкий.

Выходные каналы:
- (OUT0) текущее угловое положение (*) (размерность соответствует IN0);
- (OUT1) текущая скорость вращения шпинделя (размерность соответствует IN1);
- (OUT2) текущее ускорение (размерность соответствует IN2);
- (OUT3) текущий ток потребления, амперы;
- (OUT4) температура платы, градусы Цельсия;

(*) – Во всех режимах выдавать текущее положение вала. При работе в режиме "вращение" при достижении конца разрядной сетки представления числа следует выводить служебный код "Авария на канале". В случае начала обратного вращения (возврат к рабочему диапазону представления чисел) продолжить работу канала в нормальном режиме.

Причем, написать это надо обязательно именно на ассемблере (с контролем количества тактов на все операции :) ) на Atmega48P(A).
Применяться это будет в системах промышленной автоматики. Так что все-таки я решу сабжевую задачу топика, без Ардуины на asm, хоть и далек от идеи применять это в качестве "песпективы примочкостроения"  ::)

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Причем, написать это надо обязательно именно на ассемблере (с контролем количества тактов на все операции  ) на Atmega48P(A).

А смысл писать это на асме? У меня товарищ делает на таких процах частотник для асинхронных двигателей с обратной связью через энкодеры, причем, на входе он получает чуть ли не G-код, т.е. сам занимается интерполяцией и прочим. И ничего, никаким асмом там особо и не пахнет, все успевает.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
Не, разумеется можно написать на С, откомпилировать и сказать что писал на асме :) Просто я на асме постоянно сталкивался с задачей контроля количества тактов - например, чтобы каждый проход цикла, независимо от выполнения различных ветвистых внутренних условий и действий по ним, выполнялся всегда за строго определенное количество тактов, и т.п. И подобные вещи конечно придется писать на асме или редактировать полученный после компилятора код - а мне кажется, что первое проще :) Хотя, может люди умеют такие вещи и на С через компиляторы делать :)

ЗЫ меня тут обрадовало недавнее "открытие" - я пишу
Цитировать
а = в;
где а и в - переменные одного типа, и всё выполняется!  ::) Казалось бы, что тут удивительного? Да, но это вроде как (насколько смог проверить) выполняется и в случае, если а и в - структуры, многие поля которых являются массивами! ::) Просто с массивами такое пока не пробовал проделывать, но мне кажется, просто присвоится указатель на 0-й элемент или компилятор заругается, но весь массив врядли скопируется. Значит будем создавать для красоты записи искусственные структуры, даже если нужен только массив :) Или я где-то ошибся? Но алгоритм в желез работает и данные в структуре-приемнике обновляются!  ::)

ЗЗЫ что скажет компилятор на такое
// было первый раз правильно - что-то перестраховался
// и переписал ещё в 2-х вариантах :)

unsigned int global_i;
...............................


void f(void)
{
unsigned int i = global_i;
if (i != global_i) i = global_i;
........
}

void f(void)
{
unsigned int i_1;
unsigned int i_2;

do
{
i_1 = global_i;
i_2 = global_i;
} until (i_1 == i_2)

// используем любую переменную - i_1 или i_2
// может можно реализовать и с одной внутренней
// переменной - пока не придумал

........
}

// или ещё вариант
void f(void)
{
unsigned int i_1 = global_i;
unsigned int i_2 = global_i;

if (i_1 != i_2) i_1 = global_i;

// используем любую переменную - i_1

........
}
Надо написать "volatile" при объявлении глобальной переменной, чтобы компилятор оставил "все как есть"? Смысл этих строк - гарантированно получить корректное значение глобальной переменной, если есть шанс что она изменится в прерывании - а отключать прерывания неохота, ибо некоторые из них могут быть без флагов своего появления - и не подождут чтобы возникнуть потом, а потеряются навсегда  ::)
« Последнее редактирование: Ноября 11, 2011, 02:51:04 pm от Ivana »

Rst7

  • Сообщений: 1619
  • Мимо проходил...
    • Просмотр профиля
    • E-mail
Цитировать
Да, но это вроде как (насколько смог проверить) выполняется и в случае, если а и в - структуры, многие поля которых являются массивами!

Да, структуры уже давно копируются (означено в стандарте языка). Массивы - нет (так как на самом деле это просто указатели).
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредствен

ivana

  • Сообщений: 3
  • GtLab.Net forever!
    • Просмотр профиля
    • E-mail
И структуры массивов структур массивов массивов ...... и т.д.?  ::) Супер! А то я думал что С это не умеет и написал для копирования структуры отдельную функцию с пробеганием всех её вложенных полей и массивов поэлементно, а мне командир сказал - что ты делаешь, напиши просто! :) Я говорю - так поля же не только простые типы, но и массивы! Он сказал попробовать и проверить  ::)

ЗЫ теперь буду все массивы засовывать единственным элементов с структуры! :) И копировать/присваивать их туда-сюда, и в качестве результата выполнения функций возвращать! Вот, блин, прикол - массивы не копируются и не возвращаются, а более сложные объекты, их содержащие в своем составе - запросто!  ::)

Rus

  • Сообщений: 1017
    • ICQ клиент - 305702633
    • Просмотр профиля
    • E-mail
Помогите с LPC1758. Нужно записать в его ROM массив данных из wav файла для дальнейших манипуляций с этим массивом. Как это сделать?

research

  • Гость
Поискать директиву подключения бинарников наподобие include-incbin, либо дамп преобразовать в директивы асма.
Обычно пишется небольшая програмка, которая 1,129,241 преобразует в текст DB 1,129,241 и все.