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

i80186

Members
  • Постов

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

  • Посещение

Информация

  • Город
    Орёл

Электроника

  • Стаж в электронике
    10-20 лет
  • Сфера радиоэлектроники
    разработка РЭА, микроконтроллеры, вторичные источники питания, силовая электроника

Посетители профиля

1 189 просмотров профиля

Достижения i80186

Новичок

Новичок (1/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

10

Репутация

  1. Нет, так нельзя. Порты не работают как таковые на какой либо частоте. Собственно порт представляет из себя буферный регистр. Например К1533ИР27 будет хорошим примером порта. Единственное что, тут он ещё и побитно доступен. Таймер заведи по прерыванию и там время отсчитывай. Собственно даже и таймер то не нужен. Всё программно можно сделать. Т. е. не надо указывать никаких частот портам. Нужно временные задержки их переключения менять. Напремер в функцию delay можно передавать не константу, а переменную, и менять её значение, в зависимости от состояния входа.
  2. Лучше не экспериментировать, какая указана в документации, ту и использовать. Т. е. 16 МГц, или 24 МГц(для тех МК, где это указано в документации) Возможно ядро оно и сможет работать на более высокой частоте, но оно внутри процессора, доступа к нему нет, а узел тактирования может просто кварц/генератор с более высокочастотный не признавать. Хотя, можете и провести эксперимент. Страшного ничего не должно случиться, только советую на DISCOVERY этого не делать. На отдельном процессоре.
  3. 1/fmaster для периферийных устройств, 1/fcpu для ядра процессора. Т. е. если рабочая частота процессора 16 МГц, то время одного машинного такта - 1/16000000 Гц = 62,5 нс.
  4. Функции прерывания не вызываются, это адрес, на который процессор переходит автоматически. Т. е. это определённая ячейка в памяти программ, куда записывается адрес функции обслуживания прерывания, процессор автоматически переходит по этому адресу, там лежит адрес программы обслуживания прерывания. Компилятор позволяет выполнить эту операцию в полной мере, сохраняя в стек данные регистров процессора, счётчика команд и т. д. На самом деле обслуживание прерываний необходимо хотя бы один раз попробовать сделать на ассемблере, чтобы получить полное представление об этом. Ну а видео, хорошо, следующие сделаю про прерывания. Устройства будут такие. Ну и наверное индикатор. http://ru.aliexpress...1725211643.html http://ru.aliexpress...05-427fcc1ec4a3
  5. Я вроде про это рассказывал в одном из уроков. А может позабыл. Надо препроцессору задать путь к файлу. Точнее к папке, где находиться файл. Это в настройках проекта.
  6. Схема с программой для Урока 5. Программа+схема.rar
  7. Ну я же говорю, ты намотай, что то получиться. Он же у тебя не постоянно на максимальной мощности работать будет. Посмотришь в живую как греться будет.
  8. Так что уже сделан выбор... Так на 30кГц амплитуда индукции 0,257 Тл. Это как бы для N87 уже многовато. Так что выбор наверное придётся делать заново. Такие дела. Частоту выше делай. Ну а с витками, ну как получиться так и будет. Ничего особо страшного. Ну а на будущие, не надо прельщаться на малые потери в кольцах. Намотка трансформаторов на них, особенно мощных трансформаторов, целое приключение.
  9. Зачем кольцо то? Правильно, что на нём ругается, 2 витка равномерно по кольцу не распределишь. Выбери нормальный сердечник. ETD например, на нём малое количество обмоток мотать удобно. Вот например на моём любимом выглядит так.
  10. А вообще, есть вариант смотреть сколько именно циклов выполняется там или иная функция. Но это возможно только в режиме "без железа" ,т .е. необходимо пользоваться симулятором. В меню view/register находим register CPU, и там уже будут виртуальные счётчики CYCLECOUNTER - количество циклов после сброса, CCSTEP-количество циклов на последние действие, и два CCTIMER их можно сбрасывать когда необходимо и смотреть сколько с этого момента заняло циклов выполнение программы.
  11. Если пользуетесь элементом из меню View - corse, то для адекватного отображения количества выполненных процессор тактов необходимо открывать и disassembly. Только тогда будет реальное количество тактов отладчик считать. Например: double i=100; void main(void){ i=i/3; } Посмотрите сколько будет отображаться тактов на эту команду с открытым меню disassembly и без. При этом должно быть активно окошко disassembly, нужно ткнуться на него мышкой, и выполняться step into(F11). Такие вот особенности. Опять же, надо иметь ввиду, что не все ассемблерные команды выполняются за один машинный такт. Т. е. таймеру можно доверять однозначно, а вот счётчику команд в отладчике нет) При условии использования ST-LINK конечно.
  12. Так с STM8S-DISCOVERY или просто на симуляторе? Симулятор не обеспечивает работу периферии. Ну да на симуляторе, конечно оно и не будет показывать. С самого начала про этого говорилось. Надо "живое" устройство. Это или что то своё, использующие ST-LINK, или STM8S-DISCOVERY. Он не дорогой, в районе 1000р., в зависимости от места покупки. Очень стоит его купить. Там сразу два устройства - ST-LINK и платка с процессором.
  13. Нет не все конечно. Только те, что в функции main. И в циклах не надо объявлять, это просто нечитаемо. А значение таймера - регистр TIM4_CNTR. Это собственно и есть сам таймер. Переменные в любом случае лучше объявлять все в одном месте. Комментарий к каждой писать ведь желательно, через месяц и не вспомнишь, что это. Поэтому или в начале функции, или если глобальная, в начале файла. Так то, по стандартам языка, можно и в функции main объявлять, но вот не нравиться это среде и отладчику. Но вот в операторе это точно делать не стоит. Т. е. каждую переменную, ну или массив, отдельной строкой всегда. Всегда в начале функции/файла. Всегда с комментарием. Именно в начале не от того, что по другому работать не будет. Возможно и будет, просто разбираться в программе будет сложно, если будет иначе.
  14. Объявляй переменные вне основной функции(вне main) TIM4_ARR и TIM4_CNT сравнивать не надо. Это автоматически происходит. Просто проверяй флаг UIF, когда он становиться равен 1, то произошло событие переполнения счётчика/превышение его значение над регистром ARR. Если просто для попробовать, то величину ARR побольше сделай, так смотреть удобнее будет. Т. е. должно быть как то так. #include <iostm8s105c6.h> int a=0; void main (void) { TIM4_CR1_CEN=1; // включили таймер TIM4_CR1_ARPE=1; //разрешаем автолоадер TIM4_ARR=7; if (TIM4_SR_UIF==1){ a=3; TIM4_SR_UIF=0; } else { a=1; } } После if, else, и прочих операторов кавычки ставить надо. И программу надо зациклить, так она только один раз выполниться. Например так. #include <iostm8s105c6.h> int a=0; void main (void) { TIM4_CR1_CEN=1; // включили таймер TIM4_CR1_ARPE=1; //разрешаем автолоадер TIM4_ARR=7 loop: if (TIM4_SR_UIF==1){ a=3; TIM4_SR_UIF=0; } else { a=1; } goto loop; } И да, побольше величину в ARR, ну что бы видно было как таймер насчитывает. Так слишком быстро происходит счёт, можно и не увидеть число 7, потому что пока операторы выполняются регистры отладчиком не обновляются, у тебя сейчас всего восемь тактов на таймере до переполнения, не знаю сколько if else выполняется, можешь просто не увидеть. Ну или предделитель задай. Если надо именно момент увидеть когда таймер стал больше какого то числа, то проверяешь сам регистр счётчика таймера, т. е. так. loop: if (TIM4_CNTR>=6){ a=3; } else { a=1; } goto loop; Но опять же учитывай, таймер может считать быстрее, чем выполняются команды.
×
×
  • Создать...