Jump to content

Recommended Posts

Если пользуетесь элементом из меню View - corse, то для адекватного отображения количества выполненных процессор тактов необходимо открывать и disassembly. Только тогда будет реальное количество тактов отладчик считать. Например:

double i=100;

void main(void){

i=i/3;

}

Посмотрите сколько будет отображаться тактов на эту команду с открытым меню disassembly и без. При этом должно быть активно окошко disassembly, нужно ткнуться на него мышкой, и выполняться step into(F11).

Такие вот особенности.

Опять же, надо иметь ввиду, что не все ассемблерные команды выполняются за один машинный такт. Т. е. таймеру можно доверять однозначно, а вот счётчику команд в отладчике нет)

При условии использования ST-LINK конечно.

Share this post


Link to post
Share on other sites

А вообще, есть вариант смотреть сколько именно циклов выполняется там или иная функция. Но это возможно только в режиме "без железа" ,т .е. необходимо пользоваться симулятором.

В меню view/register находим register CPU, и там уже будут виртуальные счётчики CYCLECOUNTER - количество циклов после сброса, CCSTEP-количество циклов на последние действие, и два CCTIMER их можно сбрасывать когда необходимо и смотреть сколько с этого момента заняло циклов выполнение программы.

Share this post


Link to post
Share on other sites

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

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

Подробнее

Как вы подключили файл dalnomer.c ?

#include  <dalnomer.c>

- Если кинуть в папку с проектом этот файл, то компилятор выдает ошибку

- Если создать пустой файл и сохранить его под именем dalnomer.c и дальше кликнуть по main.c => add=>dalnomer.c

То подключения файла не происходит. Как его можно подключить не закидывая этот файл в папку с прогой?

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

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

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

Я вроде про это рассказывал в одном из уроков. А может позабыл. Надо препроцессору задать путь к файлу.e72be58203ba.jpg

Точнее к папке, где находиться файл.

Это в настройках проекта.

Share this post


Link to post
Share on other sites

i80186

не подскажите какие еще будут использоваться устройства в ваших уроках?

Что бы можно было сразу скопом их купить.

Share this post


Link to post
Share on other sites

Если не сложно сделайте пожалуйста отдельный урок по прерываниям.

А то пока не очень понятно как это работает.

Например кто вызывает функцию TIMR4_ISR

__interrupt void TIMR4_ISR(void){

Share this post


Link to post
Share on other sites

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

Устройства будут такие. Ну и наверное индикатор.

http://ru.aliexpress...1725211643.html

http://ru.aliexpress...05-427fcc1ec4a3

Edited by i80186

Share this post


Link to post
Share on other sites

Конспект к уроку 5.

869a9c52e8dd.jpg

Схема подключения:

4932398217f2.jpg

Характеристики датчика HC-SR04

В отличие от инфракрасных дальномеров

+ не влияют источники света или цвет препятствия

- Могут возникнуть затруднения при определении расстояния до пушистых или тонких объектов

- скорость звука в воздухе зависит от температуры

Характеристики

Напряжение питания

Ток потребления в режиме ожидания: 2мА

Ток потребления в режиме работы: 15мА

Частота ультразвука 40 кГц

Угол обзора 15 градусов

Измеряемое расстояние

от 0,03 до 0,6м с разрешающей способностью 3 мм

от 0,6 до погрешность увеличивается

Расчет расстояния

S=F/58,

S – расстояние в сантиметрах,

F – продолжительность импульса в микросекундах.

Для запуска датчика необходимо:

1. МК сформировывает импульс на вход датчика trigger длительностью не менее 10 мкс, по даташиту рекомендуют 60мкс (Т.е. даем единицу на соответствующую ногу микропроцессора)

2. ДАТЧИК передает 8 звуковых импульсов для измерения расстояния (далее датчик сам сформирует на выходе echo сигнал, чем он дольше, тем больше расстояние.)

3. МК принимает сигнал по каналу echo, считает его длительность и далее мы можем перевести это в расстояние по формуле: длительность импульса / 58

//функция ообслуживания датчика
int time_count(void){
int time=0;
i=30; // устанавливаем длительность запускающего импульса
__disable_interrupt(); // запрещаем прерывания
PD_ODR_bit.ODR6=1; // включаем порт D6
while(--i,i); // держим сигнал включенным (30)
PD_ODR_bit.ODR6=0; //Выключаем наш сигнал, порт D6
while(PD_IDR_bit.IDR7==0); // ожидаем импульс с датчика порт D7 echo
while(PD_IDR_bit.IDR7==1){ //как только видим на порту D7 единицу начинаем считать его длительность
++time; //считаем время
}
__enable_interrupt();
return time;
}

//функция измерения дальности
void izm_dalnost(void){
dalnost=time_count()/58; // 58 - рекомендуемый делитель по даташиту, Зависит от скорости тактирования нашего процессора
}

Edited by IDis

Share this post


Link to post
Share on other sites

Тут возник вопрос.

Вот у меня есть рабочая частота - 16 МГц . Как мне узнать сколько тактов будет в одной секунде?

Или если я ее понижу до 2 МГц или до 4 МГц. Сколько тактов будет в секунде?

Если секунды слишком большая величина, то сколько тактов будет в наносекунде?

Есть ли какая то формула? или зависимость?

Share this post


Link to post
Share on other sites

1/fmaster для периферийных устройств, 1/fcpu для ядра процессора. Т. е. если рабочая частота процессора 16 МГц, то время одного машинного такта - 1/16000000 Гц = 62,5 нс.

Edited by i80186

Share this post


Link to post
Share on other sites

А не подскажите при какой частоте процессора начинаются проблемы?

Типа дорожки воспринимаются за емкости и им подобные проблемы. Какая максимально комфортная работа процессора? 16МГц, 24МГц или 64МГц и тд?

Как я понимаю, частоту процессора можно держать значительно выше, чем частоту шины?

Какая максимально комфортная частота процессора и шины?

Edited by IDis

Share this post


Link to post
Share on other sites

Лучше не экспериментировать, какая указана в документации, ту и использовать. Т. е. 16 МГц, или 24 МГц(для тех МК, где это указано в документации) Возможно ядро оно и сможет работать на более высокой частоте, но оно внутри процессора, доступа к нему нет, а узел тактирования может просто кварц/генератор с более высокочастотный не признавать.

Хотя, можете и провести эксперимент. Страшного ничего не должно случиться, только советую на DISCOVERY этого не делать. На отдельном процессоре.

Share this post


Link to post
Share on other sites
время одного машинного такта - 1/16000000 Гц = 62,5 нс

Не подскажите, как подсчитать что бы светодиод моргал с периодичностью точно 1 секунду? Какое значение i должно тут быть?

void delay (unsigned long int i)
{while (i-->0);}
...
PB_CR2_bit.C20=1;
...
 PB_ODR_bit.ODR0=1;
 delay (100000);
 PB_ODR_bit.ODR0=0;
 delay (100000);

Возможно ли выполнить следующую задачу:

- "Светодиод 1" подключен к порту Е6 и мигает на частоте 16МГц с периодичностью в 1 000 тактов

- "Светодиод 2" подключен к порту В1 и мигает на частоте 16/8/128 с периодичностью в 1 000 тактов

- при срабатывании кнопки на порту А4, частоты меняются местами. То есть "Светодиод 1" тактируется с частотой 16/8/128 а "Светодиод 2" тактируется с частотой 16МГц

Как указать, что порт Е6 работает с одной частотой, а порт В1 с другой.

Или это невозможно сделать?

Share this post


Link to post
Share on other sites

Нет, так нельзя. Порты не работают как таковые на какой либо частоте. Собственно порт представляет из себя буферный регистр. Например К1533ИР27 будет хорошим примером порта. Единственное что, тут он ещё и побитно доступен.

Таймер заведи по прерыванию и там время отсчитывай.

Собственно даже и таймер то не нужен. Всё программно можно сделать.

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

Напремер в функцию delay можно передавать не константу, а переменную, и менять её значение, в зависимости от состояния входа.

Edited by i80186

Share this post


Link to post
Share on other sites

хотел спросить, ожидаются ли ещё уроки по stm8?

Отправлено с моего Wileyfox Swift через Tapatalk

Share this post


Link to post
Share on other sites

Эх, не долго музыка играла.

Может кто то сможет перенять эстафету по stm8?

Share this post


Link to post
Share on other sites

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

Отправлено с моего Wileyfox Swift через Tapatalk

Share this post


Link to post
Share on other sites
Guest Сергей

А возможно ли считать прошивку с чипа, внести нужные коррективы а потом обратно её в чип залить?

Share this post


Link to post
Share on other sites

Если в МК не установлена защита от чтения, то считать можно. Записать вообще без проблем. А вот сможете разобраться в том что считаете или нет?

Share this post


Link to post
Share on other sites

Очень нужная тема , рад что нашел , уроки просто луч света во тьме , автору спасибо !

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

Фото контроллера прикрепил 

спасибо 

IMG_20181222_233411[1].png

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. 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...

  • Similar Content

    • By n_angelo
      Привет, знатоки. Написал свою первую программу для контроллера STM8L152C6T6 (STM8L-Discovery). Это, собственно, моя первая программа для контроллеров вообще. Я многого не знаю и не понимаю. Возможно ваш ответ на мой вопрос будет банален.
      Используемая периферия: DAC, DMA, TIM4, CLK, GPIO
      Задача у программы такая:
      В EEPROM зашит один период синусоиды с дискретизацией 44100Гц. Период занимает ровно 101 байт, что по сути должно быть равно 2,29мс (1/44100*101). В коде программы только конфигурация периферии, одно прерывание на кнопке и пустой бесконечный цикл, который ничего не делает. Всю работу выполняет таймер, который настроен выдавать запрос к DMA на каждые 1/44100 (ядро тактируется 2мГц, таймер считает до 45). В свою очередь DMA забирает из EEPROM по одному байту на каждый запрос от таймера и передаёт его в DAC. Далее DAC выводит бесконечную синусоиду на ногу PF0. Прерывание на кнопке запускает весь этот механизм и зажигает светодиод.
      Проблема:
      Измеряя ногу PF0 осциллографом было замечено, что период синусоиды занимает около ≈4мс. Фото под катом.
      Меня это расстроило. Экспериментально выяснилось, что стоит только вписать в бесконечный цикл какую-нибудь проверку, например, [если значение текущего байта синусоиды = 0xFF, то зажечь светодиод, если 0x00, то потушить], то осциллограф показывает правильный тайминг в 2(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается.
      Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг.
      Спасибо.
       
       
       
       
    • By n_angelo
      Привет. Хочу узнать ваше мнение. Я новичок в embedded. Можно сказать, что пришел с веба. Малость Python, JS, C. Меня, конечно, предупреждали начать с AVR, но я уверенный в себе решил сразу залезть на STM32. Вынашивая идею для проекта, параллельно курив Reference Manual и Data Sheet по STM32, я понял что его будет слишком жирно для проекта. Я перескочил на STM8L. И тут меня начал огорчать мир embedded. При переходе между stm8 и stm32 нужно менять IDE (TrueStudio на STVD). Во избежание таких курьёзов я пересаживаюсь на IAR. В процессе подключения родной библиотеки от ST, понимаю что библиотека от IAR для того же самого STM8L152C6T6 дико отличается (макросы, структуры). Привет веб-разработка. Как такое могло произойти, что под один и тот же контроллер ST даёт одну библиотеку, а IAR другую. И нигде в уроках тебя не предупредят об этом. Ну, ребят, у меня всего одна жизнь. Вы уже договоритесь там между собой? Придите к единому стандарту. Или они так решили новичков завендерлочить? Моё мнение (не претендует на правильное): пробираясь сквозь тернии популярной архитектуры ARM, инфраструктуры, инструментария, забываешь про бизнес-логику устройств. А еще просто пропасть между "я ничего не понимаю" и "господи, я зажег светодиод". Речь не о копипастерах с уроков, а действительно понимая что ты делаешь, в каком регистре, что меняешь. Это путь в 2000 (а то и больше) страниц на английском перечитанных по несколько раз, чтобы отоложилось. И в конце тебя ждут разные версии одной и той же библиотки в разных IDE. И сидишь вдупляешь... ну почему... я же в правильный регистр кладу правильную маску... ох, наболело. Такое ощущение что не для людей это всё делали, не для людей.
      Ваше мнение?
    • By akva
      Народ помогите разобратся с выводом изображения на цветной дисплей от видеоискателя видеокамеры панасоник NVR 2000, схема есть куда припаять питание и виеовход
      NV-R50_NV-R500.pdf
    • Guest mrRobot
      By Guest mrRobot
      Добрый день! Был бы признателен, если бы кто нибудь подкинул любые источники информации на тему жизненного цикла микроконтроллеров. Книги, статьи, что угодно - лишь бы освещались данные пункты:
      Описание этапов жизненного цикла изделия (микроконтроллеров) и средств автоматизации, применяемых на данных этапах. Анализ взаимодействия средств автоматизации внутри каждого этапа и между этапами. Заранее спасибо!
    • By DFRobot
      Что может быть проще Arduino IDE!
      Для разработки под ESP32 (ESP-WROOM-32) есть множество различных платформ. Но, если в некоторых ситуациях использование Linux или cygwin под Windows может отпугнуть новичков, то простой и дружественный интерфейс Arduino IDE окажется как нельзя кстати. Ниже рассмотрим по шагам, как её адаптировать для программирования ESP32.
      1. Добавляем URL-адрес платы в Arduino IDE .
      Открываем Arduino IDE (у меня версия 1.8.0). Если у вас она не установлена, то инструкцию по установке можно найти здесь. 
      Далее выбираем Файл -> Настройки и нажимаем на кнопку “Дополнительные ссылки для менеджера плат”, как показано ниже.

       
      В появившемся окне вводим адрес:   https://git.oschina.net/dfrobot/FireBeetle-ESP32/raw/master/package_esp32_index.json и видим :

      После завершения нажимаем ОК.
      2. Обновляем список плат.
      Когда URL платы ESP32 (ESP-WROOM-32) добавлен, обновим список плат, чтобы через Arduino IDE загрузить необходимые библиотеки ESP32 (ESP-WROOM-32).
      Открываем Инструменты -> Плата: “Имя платы” -> Менеджер плат,

       
      и их список должен автоматически обновиться:

       
      3. Установка ESP32 (ESP-WROOM-32).
      Как только обновление завершится, найдём свойства платы FireFly-ESP32 Mainboard.

       
      Выбираем “FireBeetle-ESP32 Mainboard” и жмём “Установить”. Менеджер автоматически скачает необходимые библиотеки.


       
      4. Компилируем программу мигания светодиодом.
      Когда библиотеки установлены, можем, наконец, загрузить тестовую программу. Открываем Инструменты -> Плата, выбираем из списка Firefly-ESP32:

      Внимание: проверьте, что Вы выполнили все шаги, описанные выше. Если Вы не установили плату ESP32 (ESP-WROOM-32), то в списке её не окажется!
      Открываем Файл -> Примеры -> Basics -> Blink:

       
      И жмём  , чтобы запустить компиляцию.

      Готово!
       
      У DFRobot есть много других обучающих статей по ESP32 и готовых проектов на основе ESP32.
×
×
  • Create New...