Jump to content
Sign in to follow this  
vd_

Где Правильно Делать Математику - В Обработчике Или Основном Цикле?

Recommended Posts

Подскажите пожалуйста как можно замерить время выполнения сабрутин? Есть ли такие средства в AVRStudio или ещё где? Обдумываю как правильно построить програмку тахометра - сначала делал расчеты в обработчике прерывания таймера, потом в основном цикле, а теперь запутался. Это из Ревича Практическое програмирование основной код и динамическая индикация отсюда http://smartep.ru/index.php?category=electronics&group=project&id=2

Если я правильно понимаю - из прерывания нужно выходить быстро, и делать там по возможности мало. Или к микроконтроллерам это не относится?

Ещё такой вопрос - там на входе будет сигнал с индуктивного датчика 24в - его можно просто через резистор понизить (до 5?) и на входной транзистор? Или нужно как-то развязывать?

И последний вопрос - почему в протеусе семисегментный индикатор так медленно обновляется когда стробы через транзисторы подключены? Пока было напрямую от атмеги обновлялось нормально, как только добавил транзисторы - перестали прорисовываться цифры. Если нажать паузу и в дебагере прошагать - всё прорисовывается как надо, а если просто выполняется - пусто. Я добавил задержку - в строке 353 поменял 5 на 190 - вроде стало прорисовываться, но обновляется очень медленно. Это в протеусе проблема или я чего-то не так делаю?

Заранее спасибо за ответ

tacho.zip

Share this post


Link to post
Share on other sites

Если я правильно понимаю - из прерывания нужно выходить быстро, и делать там по возможности мало. Или к микроконтроллерам это не относится?

Это относится в первую очередь к микроконтроллерам, в силу отсутствия у них многопоточности.

Share this post


Link to post
Share on other sites

Если я правильно понимаю - из прерывания нужно выходить быстро, и делать там по возможности мало. Или к микроконтроллерам это не относится?

Именно так. Если вычисления объемные (в смысле, занимают много времени) то лучше вынести в главный цикл, чтобы не мешать другим прерываниям. Если короткие - то можно и в прерываниях.

Но в любом случае, естественно, они должны успевать укладываться в интервал между прерываниями.

К МК, особенно если это AVR, это относится в большей мере, чем к компам, по причине гораздо меньшей вычислительной мощности. С STM32 это не так актуально.

Вообще, в МК избегают арифметики с плавающей точкой, заменяя ее арифметикой с фиксированной точкой, а функции вычисляют не разложением в ряд Тейлора, а таблично с кусочно-линейной интерполяцией. Основной принцип - как можно меньше вычислений.

Теперь как замерить время выполнения процедур. Если есть свободный таймер, используешь его. В процедуру вначале вставляешь сброс этого таймера, а в конце запоминаешь то значение, которое он успел насчитать. Это и будет время в "тиках". Его можно преобразовать к единицам времени и вывести на индикацию. Или на терминал через UART.

Edited by Rafiq

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

Если тахометр, то почему "шесть дырок на оборот"? Какие дырки и оборот чего? У Вас какой-то особенный датчик?

Share this post


Link to post
Share on other sites

А можно в родном отладчике посмотреть время выполнения.

Насчет протеуса - возможно, он обрабатывает транзисторы как аналоговые устройства. Если они нужны только для изменения полярности сигнала (с точки зрения эмулятора, а не реальной схемы, разумеется), можно заменить на логические инверторы и, разумеется, убрать ограничительные резисторы - программа не перегорает.

Share this post


Link to post
Share on other sites
                     

Построение оптимального преобразователя мощности

Управляющие контроллеры, драйверы и МОП-транзисторы являются важнейшими элементами для инверторов и импульсных источников питания. Проектирование современных импульсных преобразователей, таких как импульсные источники питания (SMPS), DC/DC-преобразователи, приводы промышленных двигателей и инверторы солнечных батарей, необходимо выполнять с учетом целого ряда факторов. Существуют коммерческие, законодательные и экологические требования, направленные на повышение эффективности, снижение потерь, уменьшение эксплуатационных расходов, минимизацию потребления энергии. Кроме того, пользователи хотят видеть постоянное повышение эффективности без какого-либо увеличения габаритов и необходимости принятия дополнительных мер для защиты как элементов схемы, так и самих пользователей.

Подробнее...

Если я правильно понимаю - из прерывания нужно выходить быстро, и делать там по возможности мало. Или к микроконтроллерам это не относится?

Именно так. Если вычисления объемные (в смысле, занимают много времени) то лучше вынести в главный цикл, чтобы не мешать другим прерываниям. Если короткие - то можно и в прерываниях.

Но в любом случае, естественно, они должны успевать укладываться в интервал между прерываниями.

К МК, особенно если это AVR, это относится в большей мере, чем к компам, по причине гораздо меньшей вычислительной мощности. С STM32 это не так актуально.

Вообще, в МК избегают арифметики с плавающей точкой, заменяя ее арифметикой с фиксированной точкой, а функции вычисляют не разложением в ряд Тейлора, а таблично с кусочно-линейной интерполяцией. Основной принцип - как можно меньше вычислений.

Теперь как замерить время выполнения процедур. Если есть свободный таймер, используешь его. В процедуру вначале вставляешь сброс этого таймера, а в конце запоминаешь то значение, которое он успел насчитать. Это и будет время в "тиках". Его можно преобразовать к единицам времени и вывести на индикацию. Или на терминал через UART.

Спасибо - я подозревал что-то в этом роде. А если например расчеты занимают много циклов и неукладываются в предпологаемый интервал между прерываниями наверное нужно запрещать прерывания перед началом расчетов CLI и снова разрешать по окончании SEI?

Если тахометр, то почему "шесть дырок на оборот"? Какие дырки и оборот чего? У Вас какой-то особенный датчик?

Это обычный индуктивный датчик - он стоит на шкиву с шестью дырками для облегчения, это можно представить как спицы в колесе. Есть металл перед датчиком - на выходе датчика 24в, нет металла - 0в, шесть раз сменился сигнал = один оборот вала.

Share this post


Link to post
Share on other sites

Не переживайте, все успеете за один интервал между импульсами. Разве нельзя было взять сигнал искрообразования с блока зажигания или его датчика? Импульсов меньше - времени для расчетов больше.

Share this post


Link to post
Share on other sites

... в родном отладчике посмотреть время выполнения...

Что вы имеете ввиду под родным отладчиком? AVRStudio4? Я пролистал инструкцию - вроде ничего об этом. Подскажите пожалуйста из какого раздела какого документа можно ознакомится с этим средством.

... сигнал искрообразования с блока зажигания или его датчика...

это для зубошлифовального станка, там счетчик оборотов для индикации двойных ходов долбяка на шкиву перед шатуном, зажигания совсем нет, от электромотора приводится...

Share this post


Link to post
Share on other sites

Что вы имеете ввиду под родным отладчиком? AVRStudio4? Я пролистал инструкцию - вроде ничего об этом. Подскажите пожалуйста из какого раздела какого документа можно ознакомится с этим средством.

В 4 студии при отладке можно посмотреть время, прошедшее с момента запуска, когда надо его можно сбрасывать вручную.

На счет датчика - возможно, стоит использовать внешнее тактирование для какого-нибудь таймера. Выводы T0, T1, ... вроде. Пусть аппаратно считает, без вызова прерываний. Упс, это и так сделано.

post-58864-0-43902200-1440534859.png

Edited by COKPOWEHEU

Share this post


Link to post
Share on other sites
А если например расчеты занимают много циклов и неукладываются в предпологаемый интервал между прерываниями наверное нужно запрещать прерывания перед началом расчетов CLI и снова разрешать по окончании SEI?

А вот это ни в коем случае! А если будет пропущен (или как вариант задержан, если запрещенное прерывание запоминается) сигнал с датчика?

Нет, если уж вычислительной мощности не хватает, а достаточно хорошо оптимизировать не удается - только взять МК помощнее.

Если не хватает мощности обычного компа, то с тормозами можно смириться, а вот для систем на МК это может быть фатально.

Иногда запрет прерываний бывает необходим, например, чтобы сделать операцию чтение-модификация-запись какой либо переменной атомарной, но в случае простой переменной это займет только несколько тактов и не опасно.

Edited by Rafiq

Share this post


Link to post
Share on other sites

Нет, если уж вычислительной мощности не хватает... взять МК помощнее.

Автор взялся писАть на Ассме. О какой нехватке вычислительной мощности, в такой задаче, тут можно говорить? Что тут высчитывать? Если конечно решать на Си по известным формулам, тогда согласен (измерять, делить, умножать, возводить в степень... :) ). Может проще, увеличить вычислительную мощность мозгов и подойти к задаче с другой стороны?

Для начала, не плохо бы узнать, в каких единицах автор желает получить результат (об/сек., об/мин., об/час) и какая точность требуется.

Share this post


Link to post
Share on other sites

А если например расчеты занимают много циклов и неукладываются в предпологаемый интервал между прерываниями...

Он спросил не про эту конкретную задачу, а про общий случай. Я и ответил про общий случай

Что касается вычислительной мощности мозгов, то я вообще то говорил про оптимизацию. И только если не удается оптимизировать так, чтобы все влезло по времени, тогда брать МК мощнее. Хотя, конечно, сначала выбирается метод решения задачи и алгоритм, а уже потом - МК.

Далее, асм. Современные компиляторы хорошо умеют оптимизировать код, так что можно писать и на С. А уж как ты будешь писать - по известным формулам с плавающей точкой или же по их целочисленным аналогам, вычислять функции по разложению в ряд Тейлора или использовать табличный поиск - это зависит только от тебя самого. А не от языка программирования. Это я упоминал кстати в начале темы. Что должно быть как можно меньше вычислений.

Edited by Rafiq

Share this post


Link to post
Share on other sites

Rafid, я выразился не про Вас, а лишь сделал "ответвление" вариантов решения от Вашей мысли. Не надо Вам оправдываться.

Единственное могу заметить, какие бы современные оптимальные компиляторы не существовали, решение на Ассме всегда оптимальнее.

Edited by Геннадий

Share this post


Link to post
Share on other sites

Опытный программист, конечно, может оптимизировать программу лучше, чем компилятор, но ради десятка процентов скорости или экономии памяти писать на асме все - овчинка выделки не стоит - слишком уж сильно снижается производительность труда самого программиста. Ни один работодатель не пойдет на это :) Поэтому программы пишут всегда на С или другом языке программирования высокого уровня и только потом критические участки кода могут переписать на асме.

Share this post


Link to post
Share on other sites

В коммерческом проекте - возможно. Тогда могут выбрать и ардуину вместо ATtiny13 просто потому что так проще программисту и железячнику. Но когда делаешь для себя, тем более, когда мало опыта в оптимизации, лучше начать с асма, прочувствовать камень. Потом проще будет переходить на ЯВУ.

Ну и многие алгоритмы на Си просто невозможно написать компактнее и быстрее, чем на асме, или хотя бы сравнимо, несмотря на всю автооптимизацию.

Share this post


Link to post
Share on other sites

Да и в некоммерческом тоже - в конце-концов, программирование, это просто инструмент, чтобы получить готовое устройство, и терять время просто так нерационально даже в том случае, если это твое собственное свободное время (ты ведь хочешь побыстрее получить работающее устройство? :) Хотя, наверное, есть люди, которые получают удовольствие от самого процесса программирования, но и тогда лучше быстрее закончить с одним девайсом и взяться за другой, чем корпеть долго над одним, программируя на асме). А вот если человек получает удовольствие именно от кодирования на асме :D ну что тут сказать - тогда пусть пишет на асме :) хотя это, на мой взгляд просто понты и мазохизм :)

Ну, мое мнение такое. Может, оно именно такое, потому что я программист, и это для меня просто работа, причем зачастую рутинная. Язык, среда разработки - всего лишь рабочий инструмент, и выбираешь то, что позволяет выполнить работу лучше и быстрее.

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

1) Выбор оптимального метода решения задачи (алгоритма)

2) Алгоритмическая оптимизация (выбранного на 1 этапе алгоритма)

3) Оптимизация кода (программы, реализующей оптимизированный на 2 этапе алгоритм)

Первые два, и частично третий не зависят от языка, а поскольку второй и особенно первый более эффективны, то и на асме можно написать очень неоптимальную программу, если пренебречь первыми двумя :)

А камень? Мне, например, чтобы прочувствовать камень, достаточно держать под рукой даташит с описанием его архитектуры. Ведь в МК не так важно, сколько в нем есть РОНов или какие у него команды, сколько то, как организована периферия и как с ней работать. Да и знания о РОНах и командах (которые будут нужны только если на третьем этапе понадобится использовать асм, а до этого дело скорее всего и не дойдет вовсе, если более высокоуровневая оптимизация проведена хорошо) тоже можно почерпнуть из даташита.

Edited by Rafiq

Share this post


Link to post
Share on other sites

Кстати, в коммерческом проекте, если его планируется запустить в серию, пусть даже мелкую, вряд ли кто-то будет использовать Ардуину. Она хороша как средство быстрого прототипирования, или изготовления одного-двух экземпляров, но для серии это будет уже слишком дорого.

Edited by Rafiq

Share this post


Link to post
Share on other sites

...(ты ведь хочешь побыстрее получить работающее устройство? :)

...пусть пишет на асме :) хотя это, на мой взгляд просто понты и мазохизм :)

Быстро только кролики... :) Даже для коммерческого проекта важно, чтобы устройство не столько быстрее заработало, сколько чтобы оно заработало не кое-как.

Иногда требуется реинжиниринг, а тут без знания Ассма ну никак. Ну и для создания проекта (даже на Ассме) много времени не требуется (при определенном опыте работы с ним), больше времени уходит на выискивание глюков и отладку кода, а это что там, что там - одинаковые заморочки.

И все-же. Мы несколько отвлеклись от темы. Где же наш vd_? Повторю вопрос. Какая цена деления прибора? Точность? Диапазон? Что он должен в итоге делать, стабилизировать частоту или просто "индицировать" кол-во оборотов? Сколько должно быть разрядов индикации? И тд., и тп.

Edited by Геннадий

Share this post


Link to post
Share on other sites

Понятно, что имеется ввиду скорость не в ущерб качеству. Дело в том, что производительность труда одного и того же программиста, одинаково хорошо владеющего и асмом, и С, выраженная в количестве строк отлаженного кода в день, величина примерно постоянная, а поскольку асм, так сказать, более многословен, на получение качественного продукта на асме уйдет гораздо больше времени. Это подтверждается и многолетней практикой - программирование как специальность существует более 50 лет, и если бы разница в производительности между написанием на ЯВУ и на асме не была велика, ЯВУ занимали бы скромную нишу, а асм доминировал бы, однако в реальности дела обстоят наоборот.

Для реинжиниринга асм конечно нужен, не спорю, но сейчас есть защита от чтения флеш, даже в "любительских" avr, если не ошибаюсь.

Возвращаясь к теме, если ТС нужен будет ПИД регулятор частоты вращения, математика понадобится действительно серьезная. При высокой частоте вращения и хорошей точности, ресурсов может и не хватить.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By Вячеслав_НС
      помогите разобраться с кодом .(послать значение по шине TWI на ЦАП PCF8591) не работает в протеусе ...
      #define F_CPU 8000000UL 
      #include <stdlib.h>
      #include <avr/io.h>
      #include <util/delay.h>
      //*** ИНИЦИАЛИЗАЦИЯ ШИНЫ TWI ***/
      void TWI_Init(void)
      {
          // Установка тактовой частоты F_scl  = 100 кГц
          TWBR =32;
          TWSR &= (~((1<<TWPS1)|(1<<TWPS0)));
          TWCR |= (1 << TWEN);            // Разрешение работы TWI-модуля
      }

      /*** ЗАПУСК TWI ***/
      void TWI_Start(void)
      {
          TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
          while(!(TWCR & (1<<TWINT)));
          TWDR = 1001000; // передача адреса модуля PCF8591 в шину TWI
          TWCR=(1<<TWINT)|(1<<TWEN);
          while(!(TWCR & (1<<TWINT)));
      }
      /*** ОСТАНОВКА TWI ***/
      void TWI_Stop(void)
      {
          TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
          while(TWCR & (1<<TWSTO));        // Ожидание завершения передачи условия СТОП
      }
      /***ПЕРЕДАЧА ДАННЫХ В TWI***/
      void TWI_WriteByte(uint8_t data)
      {
          TWDR = data;                    // Загрузка данных в TWDR
          TWCR=(1<<TWINT)|(1<<TWEN);
          while(!(TWCR & (1 << TWINT)));    // Ожидание завершения передачи данных
      }
      /*** ПЕРЕДАТЬ ЗНАЧЕНИЕ В PCF8591 ***/
      void PCF8591_get(void)
      {
          TWI_Start();                // Запуск TWI
          TWI_WriteByte(0x40);        //включаем цап
          TWI_WriteByte(100);            // запись в ЦАП значения 100
          TWI_Stop();                    // Остановить TWI
      }            
          int main(void)
      {
          TWI_Init();    
          while (1)
      {
              PCF8591_get;
             _delay_ms(50);
        }
      }
    • By Olga Kovin
      Анемометр АСО-3.  С хранения, в тубусе. В наличии: 3шт по 3000р/шт.  
       
      Генератор Г4-104.  С хранения, в ящике. Книг и проводов, в комплекте нет. В наличии: 2шт по 3500р/шт.  
       
      Магазин сопротивления Р4833. С хранения, в упаковке. В наличии: 4шт по 3500р/шт. 
       
      Рефрактомер УРЛ-1. С хранения, в упаковке. В наличии:  4шт по 3300р/шт. 
       
      Прибор регистрирующий РП160-09. С хранения, в коробке. Бумага, в комплекте. В наличии: 3шт по 3000р/шт. 
       
      Тахометр 7ТЭ-М1. С хранения, в упаковке.  Комплект. В наличии: 2шт по 3000р/шт.
       
      Тахометр стробоскопический 2ТСт.  С хранения, в упаковке. Полный комплект. В наличии: 1шт. Цена: 4000р 
       
      Регулятор контактной сварки РКС-801.  В отличном состоянии, документация в комплекте. В наличии: 1шт. Цена: 4000р 
       
      Мешалка магнитная ММ-5.  С хранения, в упаковке. Есть документация. В наличи: 2шт по 2700р/шт. 
       
      Мешалка магнитная ММ-5.  Б/у,  в хорошем состоянии. В наличии: 1шт. Цена: 1700р.  (фото, по запросу)
       
      Саратовская обл. г.Энгельс
      Отправим: почтой, транспортной компанией, в Москву - с курьером.
       
      Контакты: 
      Моб. тел.:+7904-240-51-17.
      E-mail: olgalosewa86@mail.ru
       
    • By LegionKC
      Добрый день.
      Экспериментирую с платой TP4056 и MK ATmega8, конкретнее - пытаюсь собрать простенькое зарядное устройство с выводом параметров при зарядке/разрядке на АЦП МК. Для измерения тока нашел ACS712. Думаю, что получится выводить ток при зарядке (т.е. когда идет питание на TP4056 и нагрузка отключена) и при разрядке (питание выключено, нагрузка подключена). Нагрузка - резистор. Возникла проблема с измерением напряжения на АКБ. Вернее, проблема с отсутствием идей как это сделать. Может какую-нибудь схему делителя напряжения нужно сделать? Прошу помочь советом. Схему из пэинта прилагаю.
      Спасибо.
       

    • By pndbr
      Здравствуйте. Может у кого есть печатная плата для отладочной платы на atmega8,32,128 в корпусе tqfp или attiny2313.
      Накопилось много распая с незалоченными камнями и очень хочется пустить их в дело и наконецто научиться хоть как-то программировать. Рисовать печатку самому не хватает опыта. Может у кого есть наработки? Прошу поделиться.
      Поиск выдает только отладочные платы в дип. А если и есть tqfp то в ардуиновском формате т.е без доп перефирии (же дисплеев,клавиатуры,7 сегментных индикаторов,потенциометров,энкодеров..и.т.д)
    • By Olga Kovin
      Измеритель L, C, R универсальный Е7-11. Без ЗИП. В наличии: 1шт. Цена: 4000р.   
      Микроскоп Метам-Р1. С хранения, полный комплект. В наличии: 1шт.
      Цена:  22500р   
      Тахометр ТЧ10-р. В футляре, насадки в комплекте. В отличном состоянии. В наличии:  2шт по 4500р/шт.   
      Фото, все есть - вышлю на Вашу эл. почту. На сайте выложить, мешает, какой-то лимит... Обращайтесь - все пришлю!
      Саратовская обл. г.Энгельс
      Отправим: почтой, транспортной компанией, в Москву - с курьером.
      Наличный-безналичный расчет
      Контакты: 
      Моб. тел.:+7904-240-51-17.
      E-mail: olgalosewa86@mail.ru









×
×
  • Create New...