72 сообщения в этой теме

i80186    10

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

double i=100;

void main(void){

i=i/3;

}

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
i80186    10

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IDis    4

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

#include  <dalnomer.c>

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
i80186    10

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IDis    4

i80186

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IDis    4

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

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

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

__interrupt void TIMR4_ISR(void){

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
i80186    10

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

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

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

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

Изменено пользователем i80186

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IDis    4

Конспект к уроку 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 - рекомендуемый делитель по даташиту, Зависит от скорости тактирования нашего процессора
}

Изменено пользователем IDis

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IDis    4

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
i80186    10

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

Изменено пользователем i80186

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IDis    4

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

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

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

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

Изменено пользователем IDis

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
i80186    10

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IDis    4
время одного машинного такта - 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 с другой.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
i80186    10

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

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

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

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

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

Изменено пользователем i80186

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IDis    4

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IDis    4

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IDis    4

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: Pivowar
      Всем привет!
      Мы ищем человека которому интересно заниматься проектированием схем, плат и созданием своих устройств. Мы стартап-команда, занимающаяся разработкой IoT, на основе различных микроконтроллеров с последующей интеграцией с облачными технологиями. Так же имеется большое количество проектов по разработке программно-аппаратных решений "под ключ". Для всего этого необходимо проектировать схемы, разрабатывать прототипы, подбирать различные модули и компоненты, создавать gerber файлы и подготавливать это все для производства. Прошу на обсуждение всех заинтересовавшихся. 
      Наше место дислокации: г. Москва, СЗАО, метро "Октябрьское Поле"
    • Гость Vlad_krsu
      Автор: Гость Vlad_krsu
      Разбираюсь с микросхемой UC3825. Есть работающая схема контроля скважности выходного сигнала переменным резистором, подключенным к ноге 8. Приложена к посту
      Задался целью управлять этой микросхемой не переменным резистором, а с помощью ШИМ от 5в микроконтроллера. Насколько я понял по даташиту UC3825 может работать по току и по напряжению и теоретически это возможно.
      Есть ли кто ни будь, кто хорошо разбирается в функционале это микрухи? Как можно подключить к ней МК и будет ли она работать от входного ШИМ сигнала, частотой скажем 1кГц?

    • Автор: ekaterina_b
      Команда проекта расположена в разных странах, но большинство технических специалистов находятся в России, а именно в Санкт-Петербурге. Само назначение проекта - создание умной потребительской электроники, гаджетов и онлайн-сервисов. Отличительной особенностью этой работы является возможность участия в создании инновационных, нестандартных продуктов. Если тебе это по душе, то откликайся! В связи с расширением мы ищем Инженера-схемотехника.
      Обязанности:
      Разработка электрических принципиальных схем; Выбор элементной базы; Трассировка печатных плат; Техническое сопровождение изготовления опытных образцов, отладка и настройка; Требования:
      Знание и опыт работы с AltiumDesigner; Опыт работы в сфере радио и высокочастотной электроники. Условия:
      Дружная команда единомышленников; Уютный офис в центре города Конкурентоспособная заработная плата; Фрукты и сладости в офисе; Полное обеспечение всеми необходимыми в работе учебными материалами; Возможность участие в отраслевых мероприятиях.
    • Автор: Wenter
      Суть программы нажали на кнопку ушли в прерывание, в прерывании от кнопки поменяли уровень на порту со светодиодом, порт с LED соединён с другим портом на котором тоже есть прерывание при переходе из 0 в 1, Соответственно при нажатии кнопки ушли в прерывание там выставили смену уровня на другой ноге и должно сработать другое прерывание. Проблема, прерывание от кнопки работает, прерывание от смены уровня нет. Хотя этаже программа работала, плата STM8L152C6T6 пере прошивалась затем залилась этаже прога и не заработала.
      Ещё вопрос при прерывании от кнопки устанавливается бит флага  EXTI_SR1_bit.P1F а чтоб его сбросить почему то работает EXTI_SR1_bit.P2F=0; а не EXTI_SR1_bit.P1F=0;
      Код программы полностью: В IAR
      /*
      *15.11.2016
      *STM8L152C6T6
      *
      *Измерять таймером задержку от нажатия кнопки до начала генерации
      */
      #include "iostm8l152c6.h"
      int perep;
      unsigned int tic;
      /**************Обработка вектора прерывания от кнопки**************/
           #pragma vector=EXTI1_vector
           __interrupt void Pin1_interrupt(void)
           {
             EXTI_SR1_bit.P2F=0;//Сброс флага прерывания
             TIM1_CR1_bit.CEN = 1; //Запускаем таймер
             PC_ODR_bit.ODR7^=1; //Инверсия порта С7
           }
      /**************Обработка вектора прерывания от начала генерации**************/
         
       #pragma vector=EXTI6_vector
           __interrupt void Pin6_interrupt(void)
           {
             EXTI_SR1_bit.P2F=0;//Сброс флага прерывания
              TIM1_CR1_bit.CEN = 0; //Останавливаем  таймер
              tic=TIM1_CNTRL;
             PE_ODR_bit.ODR7^=1; //Инверсия порта E7
             
           }
      /************************При переполнении таймера*******************************************************/
       /*#pragma vector=TIM1_OVR_UIF_vector
           __interrupt void TIM1_OVF(void)
           {
             //perep++;
             
           }*/
      int main( void )
      {
      /***************Выберем частоту SYSCLK************/
        //По умолчанию тактируемся от HSI/8
        CLK_CKDIVR=0;// Выбираем делитель на 1
       
      /********Инициализация пина который моргает Светодиодом ИИИИИИИИИИИИИИИНДИКАЦИЯ********/  
        PC_DDR_bit.DDR7 = 1; //Настраиваем 7й пин порта C на выход
        PC_CR1_bit.C17 = 1; //Переключаем его в режим push-pull (это когда он может выдавать
        //и низкий и высокий уровень), а то по-умолчанию он прикидывается пинов с открытым стоком
        //(это когда может выдавать только низкий уровень, а вместо высокого переключается на вход)
       
        /********Инициализация пина который моргает Светодиодом********/  
        PE_DDR_bit.DDR7 = 1; //Настраиваем 7й пин порта C на выход
        PE_CR1_bit.C17 = 1; //Переключаем его в режим push-pull (это когда он может выдавать
        //и низкий и высокий уровень), а то по-умолчанию он прикидывается пинов с открытым стоком
        //(это когда может выдавать только низкий уровень, а вместо высокого переключается на вход)
      /****************************************************************************************/  
       
       /*****************ПРЕРЫВАНИЕ ОТ КНОПКИ****************************************************************************/
        /*С начало настраиваем пины с кнопкой*/
        PC_DDR_bit.DDR1 =0; //Настраиваем 1й пин порта C на вход
        PC_CR1_bit.C11=1; //Настроили порт кнопки на вход pull-up
        PC_CR2_bit.C21=1; //Размещаем прерывание
       
        /***************Настройка прерываний**************/
        /*В регистре EXTI_CONF1 по умолчанию все 0
          тоесть каждый пин даёт нам отдельное прерывание*/
       
        //Настраиваем фронт срабатывания прерывания
        //Т.к. кнопка замыкается на землю то выбираем задний фронт
         EXTI_CR1_bit.P1IS=2; //Прерывание на ножке срабатывает по заднему фронту
         //ITC_SPR1_bit.VECT1SPR=0; //Высокий прерывание от нашей кнопки
      /**************************************************************************************************************/
         
      /*********************ПРЕРЫВАНИЕ ПРИ НАЧАЛЕ ГЕНЕРАЦИИ**********************************************************/
        PC_DDR_bit.DDR6 =0; //Настраиваем 6й пин порта C на вход
        PC_CR1_bit.C16=1; //Настроили порт  на вход pull-up
        PC_CR2_bit.C26=1; //Размещаем прерывание
       
        /***************Настройка прерываний**************/
        /*В регистре EXTI_CONF1 по умолчанию все 0
          то есть каждый пин даёт нам отдельное прерывание*/
       
        //Настраиваем фронт срабатывания прерывания
        //Фронт  прерывания передний
        EXTI_CR2_bit.P6IS=1; //Прерывание на ножке срабатывает по переднему фронту
        //ITC_SPR2_bit.VECT6SPR=3; //Средний приоритет  прерывание от нашей кнопки
         
      /*********Настройка таймера TIM1***************************/
        CLK_PCKENR2_bit.PCKEN21 = 1; //Включаем тактирование таймера TIM1
        //Делитель на 160
        //НО выставляем 15(так как всегда +1)
        TIM1_PSCRH = (15) >> 8;
        TIM1_PSCRL = (15)& 0xFF;
        TIM1_PSCRH = (0) >> 8;
        TIM1_PSCRL = (0)& 0xFF;
        //Счет по умолчанию вверх TIM1_CR1 DIR=0
        //Значение регистра сравнения(До чего тикает таймер)
        TIM1_ARRH = (10000) >> 8;
        TIM1_ARRL = (10000)& 0xFF;//Частота переполнений = 16М / 1600 / 10000 = 1 Гц
       /*Новый пред делитель в таймер записывается только после  события Update (Update Event — UEV)
         чтоб сразу инициализировать нужный пред делитель
         вызовем программно Update (Update Event — UEV), и чтоб в это время не уйти в какое нибудь
         прерывание разрещим прерывание только от переполнения таймера */
        TIM1_CR1_bit.URS = 1; //Прерывание только по переполнению счетчика
        TIM1_EGR_bit.UG = 1;  //Вызываем Update Event
        TIM1_IER_bit.UIE = 0; //Запрещаем прерывание при совпадении с ARR
        TIM1_CR1_bit.CEN = 0; //не Запускаем таймер
       
         asm("RIM");//Глобальное разрешение прерываний
         
        while(1)
        {
        }
      }
       
    • Автор: rampage17
      Доброго времени суток всем.
       
      В данный момент работаю над небольшим проектом.
      Имеется готовая модель rc-вертолета ( T605 SHUTTLE ), необходимо поставить на него микроконтроллер, гироскоп и акселерометр (думаю использовать MPU-6050 и MPU-9250) и написать для него мозги.
      МК должен принимать данные с датчиков, выполнять работу по стабилизации вертолета, посылать ШИМ-сигнал.
      Какой лучше подобрать микроконтроллер, который бы подходил под поставленную задачу ? Пока думаю над atmega 128a (просто потому, что имел с ним дело уже).
      P.S. если с программированием проблем возникнуть не должно, то как это всё подобрать, установить, спаять и тд понятия не имею, поэтому буду благодарен любым советам на эту тему
      Спасибо.
  • Сообщения

    • Зачем там вообще микросхемы, раз время и стабильность не очень важны, поэтому и кварц даже ни к чему. RC задержки достаточно.
    • Есть встроенный усилитель-активная, нет-пассивная. Так есть или нет?
    • Что-то больно много всего погорело. Предохранители вообще что ли отсутствуют?

      А по мере накопления опыта навороченный блок питания почему-то перестает быть нужным.
      Я скрутил на скорую руку простейший с параметрической стабилизацией на 27в 1,5А лет 15 назад. И все. Успокоился. Сделать лучше могу, но нужды почему-то нет.

      Мощные усилители запускаю через ЛАТР со штатными блоками питания. Постепенно повышаю напряжение и смотрю за током. Если ток начинает расти – отключаю и ищу причину.

      Импульсные – через лампочку.
    • Когда инструктора по выживанию спросили: - Что будете делать, если Вы оказались в пустыне, без воды, огня, припасов, оружия,..... , и на Вас идёт стая голодных львов, как спасётесь????? На что инструктор ответил: - Помолюсь, по возможности расслаблюсь, возрадуйюсь, что моя никчёмная жизнь послужит  пищей этим прелестным кошечкам! Выживание - это не противостояние в ситуации - "без всего, голыми руками, кругом опасность", а как раз избежание возможности попадания в такую ситуацию!! Не раз наблюдал как человек впадал в "технологический ступор", от невозможности починить девайс из-за отсутствия копеечной детали, при наличии под рукой всякой полезной мелочи. Так что наличие "фольги,  припоя, провода,  паяльника" не гарантирует благополучного исхода Бывали случаи когда, в полевых условиях,  фольгой от пачки сигарет восстановил работу системы сбора датчиков контроля процессов бурения.... С помощью конька Наполеон восстановил работу выносной антенны спутникового телефона "Глобалстар".... С уважением, Сергей    
    • Я так не изощряюсь.... Тут был у меня аппарат, - который грохнули на пол, или ногами били....
      плата треснута в 10 местах. Восстанавливал по старинке проводочками. Эффектный метод - никто не додумался. 
    • Воздух - это хорошо.