Дай Бог Александру здоровья , творческих успехов и ВСЕГО необходимого . Пару сот таких людей могут сделать больше , чем все вузы страны. Ещё раз СПАСИБО !
Еще раз низкий поклон за эти Уроки !! Жалко сейчас их нет как раньше.. Обращаюсь к вашим урокам постоянно!!! С эти индикатором пришлось провозиться 18 часов.. Но получилось....!!!!!!!!!!!!!!!!!!!!!!
программу можно улучшить. сначала тушить разряд. потом менять значение цифры. зажигать следующую. а так как написано у вас в темноте будет проявляться "засветка" разряда. в темноте это заметно, особенно если попадать в прерывание.
Видео, бес сомнения, интересное и полезное, он... мой учитель информатики еще лет 20 назад поставил бы мне за этот код твердую двойку. 1. Всю функцию peresot можно записать в 3! строки: Danie_Razrad_1=temp /100; Danie_Razrad_2 = (temp%100)/10; Danie_Razrad_3=temp%10; И я уверен, что это занимает меньше машинного времени, чем while'ы 2. Хорошей практикой было бы сделать массив переменных Danie_razrad. 3. имея массив, можно и в прерывании обойтиcь бес case. 4. Про названия переменных - молчу. Поймите меня правильно, я только за таких проектов, но у молодежи нужно воспитывать "культуру" кода с самого начала. Потом трудно переучивать.
1. Нет, вы очень не правы, ваш вариант красив но значительно медленней. 2. Это всего то вариант как можно работать. По большому счету, массив не как не выигрывает, а вот отдельными переменными информативнее работать в программе. 4. Вы правы, в дальнейших примерах я осмысленные названия стал задавать.
наткнулся тут на Ваше видео в рекомендованных. касательно первого пункта i92.fastpic.ru/big/2017/0705/01/713dabe8b1160f87318f45139e9f8201.jpg i92.fastpic.ru/big/2017/0705/d4/88f87937f5cd057b69866c1f6ba11bd4.jpg
хороший урок.на сегодняшний день лучшая инф. в сети!спасибо!хотелось бы увидеть что-то по led матрицам,т.к тема будет очень интересна для многих. реализация бегущей строки и прочих эффектов.
Александр, у меня тут появился очередной вопрос, ответ на который думаю будет полезен многим, для более гибкого применения данного примера и тема для след. урока. Хорошо знаю, что такое пром-оборудование и насколько порой отличаются условия эксплуатации заложенные разработчиком от нашей суровой реальности и пытаясь представить разработку алгоритма под конкретную задачу, ставлю себя на место таких как Вы и пытаюсь угадать логику конструктора) Предположим, я создаю устройство, управляющее станком, у станка имеется механизм подачи рабочего органа до определенного уровня, который задается датчиком(концевиком), зная хар-стики станка и длину пути, предстоящую перед этим механизмом, я узнаю время, необходимое для выполнения операции и понимая, что провод к концевику может оборваться, мне стоит заложить время действия управляющего импульса соответствующим, по истечении которого, не получив сигнал с концевика, работа программы прервется и скажем светодиод сообщит о сбое. Но поскольку я не знаю, в каких условиях и кем будет обслуживаться станок у заказчика, мне стоит кроме светодиода вывести сообщение на табло с указанием на узел, из-за которого алгоритм прервался, чтобы подвыпивший криворукий электрик пол станка не разобрал в поисках причины. Скажем концевик по схеме указан как "Е1", насколько я понимаю(сам пока проверить не могу, вчера почему-то среда отказалась коды прошагивать...), для этого мне всего-лишь придется расширить масив "sifra", скажем до 50, заложив кроме цифр еще числовые коды для знаков/символов используемых для вывода сообщ. об ошибке и вывести из масива упомянутые выше "Е" и "1" обратившись к их номерам в масиве, но ведь тема "надежного кода" намного обширнее. Простите, что так много букаф написал, но мне кажется, после атомарных операций и сторожевого таймера как раз время уделить внимание вопросу отслеживания и оповещения о сбоях алгоритма, а также служебных(сервисных) функциях с этим связанных. Ведь за такой срок у Вас думаю накопился набор простых и надежных рекомендаций для защиты оборудования от непредвиденных ситуаций.
Тут вы правы. Электроника для производство отличается. Сейчас какраз заканчиваю линию по производству металлических 200литровах бочек. Было железо без электроники. Поскольку электроники пришлось делать немерено, да еще и самому, ушло времени на это уйму. Сейчас процесс обкатки. Ну, это так отступление. Что касается вашего примера. Перед тем как совершить перемещение механизма на станке, нужно сначала проверить концевик, убедится, что он в правильном положении, а только после проверки осуществить перемещение механизма станка до срабатывания этого концевика. Что касается аварийного времени для перемещения, это вполне рабочий вариант. Предположим за указанное время концевик не сработал, это хорошо, если есть упор. Ваше выставленное время посчитало, и скажем двигатель отключился. А если нет упора, может произойти повреждение. В таких случаях нужно ставить датчики линейного перемещения или аварийный концевик. Хотя все зависит от оборудования. Насчет отображения на индикаторе режим неисправности, просто необходим. По себе скажу реально помогает, проходит какое-то время и сам забываешь, как что должно работать. А так глянул на надпись, к примеру, пишет нет ответа БВК6. В дакументации нашол что за датчик и где находится. Реально сокращает время нахождения неисправности.
Александр Писанец Вот-вот, об этом и разговор, хорошо, если человек пишущий прошивку знаком с производством, а если нет?.. Думаю подобные простые алгоритмы проверок и сервисных функций не помешало бы когда-нибуть осветить отдельным уроком. Также пришел к примеру к выводу, что если нужно сделать програмный "грибок" аварийной остановки, на оборудовании, где нельзя просто вырубить общее питание, то для быстрого отклика не стоит запрещать прерывания одной командой на пол страницы кода, а если это возможно, разбить на участки и каждый отдельно защитить от прерываний. Конечно мы будем рады любому уроку, побольше бы Вам свободного времени на их создание, тем более, что почти в каждом из них так или иначе затрагивается "защита от внештатных ситуаций", за что отдельное спасибо)
уроки сделано очень грамотно ,Дай Бог Александру здоровья , творческих успехов и ВСЕГО необходимого ,вы знаете ассемблер я считаю что это язык высокого уровня у меня к вам несколько вопросов ? 1.как убрать не назначенных нулей при динамическом индикации таймер обратного отчета чтобы например после цифра 10 не писал цифра 09 а просто 9. на семисегментного индикатора ? 2.Если можно то сделать урок по защиту 3-х фазных двигателей который есть ваш видео,объяснение программы если можно то добавит программно еще тертую фазу токовую защиту. 3. Если можно то сделать урок по защиту по напряжение например какие то пределы защиты бытовой техники схемы в интернете есть на микроконтроллере но интересно было увидеть программы на avr studio 6 например установит защиту от 160в до 240в это примерно. 4.как сделать паузы на программе с кнопкой на микроконтроллере как на стиральном машине чтобы он работал дальше с точки останова. 5.уроки по звук на микроконтроллере что бы при каких да событии прозвучал звук например как на микроволновке при окончании нагрева и т д.
Я новичек.Спасибо большое за ваши уроки.Очень помогают. Пытаюсь подключить шкалу на 18 светодиодов через два сдвиговых регистра 74HC595 по SPI. Вольтметр. Могли бы вы сделать урок об этом. Или подсказать какой нибудь ресурс.Поисковики уже замучал. Нужен пример. Спасибо.
По дисплею надо готовить материал его там просто море . Для себя давно сделал библиотеку и пользуюсь, та и подзабыл малость . Уроки по LCD планировал, там есть что расказать, в интернете у всех одно и тоже . И много моментов по работе с LCD не раскрывает никто .
Для тих хто буде программу копіювати в Codevision потрібно функцію записати не так Peresot ( volatile unsigned char Temp ) а так void Peresot (volatile unsigned char Temp) компілятор видає помилку без void, asm("cli"); Записати з знаком на початку# #asm("cli"); #asm("sei"); #asm("nop") Щоб відображати більше 255 потрібно змінну Danie змінити на int замість char Також поміняти змінну у функції на int void Peresot (volatile unsigned int Temp) Для легкої настройки індикатора краще массив записати у бінарні системі числення unsigned char sifra[10]= { 0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111,0b00000001,0b00001001}; Дякую за хороший кусок кода автору.
Здравствуйте можете подсказать: В массиве хранятся числа 0...9. Я собираюсь их выводить в двоичном формате по 4 пинам. Как вывести именно на эти пины, не трогая остальные. так вот я не могу додумать. массив содержит допустим цифру 9 0b00001001; далее как ее два младших бита вывести на четыре ножки порта не изменяя состояния остальных если мы напишем PORTC= 0b00001001 он заменит нужные и остальные тоже, которые трогать нельзя они под другое заняты.
Добрый день Александр. Как изменить программу если сегменты индикатора подключены к разным портам контроллера, (допустим часть к порту В, а часть к порту С) ведь тогда нельзя просто создать массив с цифрами? Если у Вас будет свободное время, сделайте видео урок по подключению сегментов к разным портам. Буду очень благодарен Вам.
Почему вектор прерывания не записывается в main? И как вообще остальные строки программы взаимодействуют с этими прерываниями? И как сделать так чтобы переменную Danie (которая отображается на индикаторе) можно было менять в реальном времени? А то не слишком полезно все время выводить одно и тоже число. Например, я хочу чтобы при нажатии кнопки число 145(как у вас) увеличивалось на 1.
У меня atmega128 работает от внешнего кварца 8 МГц, пишу в Atmega Studio 6.0. Так вот взял ваш пример, не работает. Не входит в функцию Peresort. Подсовываю тело этой функции в обработчик прерывания. все ок.
В сети есть статья про часы на семисегментных индикаторах ИВ-9. Реализованы они на Atmega8, использованы регистры сдвига TLC6C598-Q1. Подскажите, пожалуйста, как программно это реализовать? Вот ссылка на статью www.petrofflab.ru/2015/06/3D-numitron-iv9-2-tube-clock.html
Я в шоке, сколько информации перелопатил, и вот! Золотая жила!! Спасибо большое! Дошло до меня :) Но есть один вопрос, можно ли подключать семисегментник анодом прямиком к ножке как показано на схеме 0:41? Не сгорит ли ножка PORTDx при цифре 8 скажем?
Ваши уроки мене очень помогли переступить порог к микроконтроллерам. Есть один вопрос? А где могу найти описания слов таких как например: ISR, case, break, switch и.т.д. Так как есть идеи реализовать разные задумки но не хватает базы стандартных алгоритмов, слов, наборов инструкций .... (К примеру я знаю десять цифр и исходя из этого я подставляю любую цифру я могу выложить любое число. Так и в программе если я буду знать всю стандартную библиотеку то смогу в итоге сделать любую программу)
Здравствуйте. Не удается разобраться с пониманием того как произойдет выход из подпрограммы обработки прерывания TIMER0_COMP_vect. В блоке CASE 3 в конце команда break. В результате выполнение программы возвращается на строчку 20: Vibor_razrada++ и все зацикливается. Получается из вектора прерывания никогда не выйдет?
Строчка 37 сбрасывает значение на ноль и выходит из теле вектора. При следующем заходе в прерывание начинается обслуживание первого разряда и так постоянно все повторяется
Александр, если можно несколько вопросов. 1. Почему многие называют индикаторы 7-ми сегментными, ведь по факту 8 символов (точка). 2. Для чего у вас в коде всегда присутствует пустой оператор asm("nop"); ? 3. Зачем для проверки условия использовали цикл, а не if?
Точка не является информотивным сегментом а только разделительным. Оператор 'nop' для демонстрации, чтоб останавливаться при отладке. IF это мой вариант, можно и по другому все написать.
@@АлександрПисанец Блин. У меня либо ярко, но с мерцаниями, либо без мерцаний, но тускло. С предделителем играл, время совпадения тоже, нет яркости, резисторы убрал, толку нет. В комнате индикатор хорошо видно, на улице на солнце, даже в тени - нет. Пробовал ставить задержку циклом на разряд while(i != 2000){i++;}, работает - один сегмент после этого начинает гореть в полный "накал", если поставить цикл на каждый разряд, всё разваливается, программа перестаёт корректно работать. Я в тупике.
Здравствуйте я хотел узнать как вы в окне IO view в режиме мониторинга состояния битов в поле Value изменили систему счисления? Сейчас у меня отображаются данные в 16тиричной системе счисления, а у вас в видео в десятичной. Заранее спасибо!
При разложении числа выше одного байта (255) на индикаторе выводится чёрт знает что. Проблему решил объявлением переменной "Danie" и "Temp" как бес знаковое двух байтовое число "volatile unsigned int". Александр скажите пожалуйста зачем вы используете ключевое слово "volatile"?
Дает понять компилятору что ненужно оптимезировать переменные после слова volatile . А-то компилятор может посчитать их ненужными, и исключит из программы вообще, или использовать коряво.
как известно в чужой монастырь со своими уставами не ходят, поэтому заранее прошу прощения за свое замечание от такого неуча как я....., по моему правильнее было бы к настройкам регистра применять вот такую запись TCCR1B |=1
Скопируйте таблицу в главе "Выражения" отсюда: ru.wikipedia.org/wiki/%D0%A1%D0%B8_%28%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29 По сути, выполняя справа налево: пин 1 переводим в лог.1, дальше тильдой(волн. линия) инвертируем в лог.0 и знаком & присваиваем значение порту, то есть пину 1 порта В присваиваем лог.0, у вас же 0b00000001, то есть лог.1 присваиваем 0-му пину.
Polyakov Konstantin Тускло может быть, если частота на свечения сегментов выбрана большая. А насчет мигания трудно, что - либо подсказать, нужно все пошагово в отладчике смотреть.
Polyakov Konstantin Проверил другие варианты последовательности работы сегментов, чтобы не было "послесвечения" сегментов соседних цифр перепишите код по образцу: Выкл. предидущий разряд Передать числовой эквивалент цифры порту Вкл. действующий разряд Или для данного кода: PORTD &=~(1
Александр, а почему кстати не наоборот, почему не гасим сначала 1 символ, а потом зажигаем 2? Кстати для тех, у кого отладчика нет, а считать лень, очень полезная программка, для подбора букв на индикаторе тоже: sergeyk.kiev.ua/soft/led2asm/ П. С. Пришел к выводу, что код стоит оставить 1 в 1, как у Вас(при той же распиновке индикатора), кроме цифры 2, туда вписать 40, если точку отображать не надо, то освобождаем 2 пин порта В для отслеживания прерываний.
Роман Тихий Насколько я понял, то у Вас 4 семисегментника с общим катодом? Если так, то у Вас всего 4 катода (необходимо 4 транзистора и 4 шт. 74HC595)
простите за критику но в вашем уроке оная тема раскрыта немного не до конца вы расмотрели самый легкий вариант как быть когда аноды и катоды индикатора разбросаны по всем портам мк ? а в остальном like :)
Здравствуйте Александр! У меня вопрос. А если бы это был урок не для начинающих, то как бы вы реализовали цикличное переключение по индикаторам? Как бы более профессионально и компактно.
+Александр Писанец Я почему спросил, код этого урока у меня работает по другому, сначала зажигается 1 индикатор, потом 3, потом 2, потом 1, потом 2, потом 1, потом 3 . Вот такая бяда((
Александр. Из-за вашего канала, я разошелся не на шутку. Развожу плату, появилась нужда несколько пинов, которые целиком вешаются на порт, те, которые отвечают за свечение нужных сегментов, перенести на другой порт. Подскажите как проще реализовать код?
В программировании полный ноль, если не сказать хуже, плюс мне всегда теория осваивается тяжко, если нет возможности пощупать ручками "в железе", поэтому пока нет атмеловских чипов, решил поиграться в протеусе, чтоб хоть как-то закрепить полученные знания, но тут возникло несколько вопросов. 1. На Вашем устройстве точка не отображается, но и программно она не отключена, насколько я понимаю запятая должна была быть повешенной на пин 3 порта Б, но похоже была отключена схемно. Соотв. вопрос, как лучше, "затемнить" её програмно или просто не соединять с пином? 2. Вначале не объявлена переменная Temp, почему? 3. Устройство с тремя семисегментными индикаторами способно отобразить число до 999, но переменные Danie и Temp объявлены как unsigned char, то есть насколько я понимаю там диапазон ограничен числом 255, этот вопрос меня ввел в ступор, либо это ошибка, либо я чего-то не понимаю. Еще раз спасибо большое за уроки, появились бы лет 5 назад, я бы уже точно полным нулем не был))
Здравствуйте. Насчет точки можно делать как хочите, но гибче программно выключать, вдруг захочете точку отображать. Я сделал функцию Peresot и в ней есть принимаемый параметр Temp. Хотя можно Temp объявить глобальной. В данном примере число можно максимальное отобразить 999 (объявляем как int). Поскольку это простой пример то я и отображаю 145 (объявлен как char )
Александр Писанец Спасибо, всё понял, значит в общем не ошибся, на счет точки спрашивал, так как наслышан о плохой помехоустойчивости Атмеловских чипов и подумалось, что оставлять в воздухе пин чревато. И да, вопросов думается я Вам еще поназадаю кучу, вроде зацепило меня это программирование)
Может это я не понял вопроса ). Это программатор отладчик, при помощи которого в реальных условиях пошагово отлаживать свою прогру уже прошитого микроконтроллера.
В интернетах кое-где написано, что Dragon - это-де по факту не отладчик, а эмулятор, собственно эмулирующий МК - память, регистры и т. д. и таким образом производящий отладку прошивки "внутри себя". и потом заливающий в отдельный пустой МК. Под отладкой на живом МК понимается отладка не "внутри себя", а непосредственно на отдельном МК (в том числе находящемся в обвязке/на плате проекта).
Я опечатался =) Вопрос в том, что для байта же эквивалентно будет приравнять его к 1? Это же тоже даст 0b11111111? А раз так, запись же получается короче.
Aleksandr Maslo Совершено верно, в моем случае будет автоматически присвоено int возврат из функции.Поскольку функция не возвращает не чего, то вы правы нужно указать void.
Я нашел ошибку : в функции прерывания перед оператором switch нужно обнулять порт иначе выводятся кракозябры, т.к. значения разрядов накладываются друг на друга
доброго дня, шановний автор. У відео ви говорите про 20 мілісекунд на кожен сегмент, що є не зовсім вірним, це час на ввесь індикатор, тому у вашому випадку 20/3=6.6 мілісекунд.
+Александр Писанец , спасибо! Решилось заменой типа переменной char на int в трех местах: volatile unsigned char(int) Danie_Razrad_1,Danie_Razrad_2,Danie_Razrad_3,Danie; static unsigned char(int) Vibor_Razrada; volatile unsigned char(int) Temp теперь считает до 2147483647...
Александр, добрый день. Огромное спасибо за видеоуроки. Я начинающий программист. Помогите написать этот урок, только для ATmega8. Есть проблема с таймерами. Моя почта avp7213@rambler.ru.Заранее спасибо.
Дай Бог Александру здоровья , творческих успехов и ВСЕГО необходимого .
Пару сот таких людей могут сделать больше , чем все вузы страны.
Ещё раз СПАСИБО !
Спасибо.
Подписываюсь под каждым словом!
Еще раз низкий поклон за эти Уроки !! Жалко сейчас их нет как раньше.. Обращаюсь к вашим урокам постоянно!!! С эти индикатором пришлось провозиться 18 часов.. Но получилось....!!!!!!!!!!!!!!!!!!!!!!
программу можно улучшить. сначала тушить разряд. потом менять значение цифры. зажигать следующую.
а так как написано у вас в темноте будет проявляться "засветка" разряда.
в темноте это заметно, особенно если попадать в прерывание.
Шикарный урок. У Вас очень хорошо получается объяснять! Желаю успехов в Вашем нелегком начинании!
Спасибо
Видео, бес сомнения, интересное и полезное, он... мой учитель информатики еще лет 20 назад поставил бы мне за этот код твердую двойку.
1. Всю функцию peresot можно записать в 3! строки:
Danie_Razrad_1=temp /100;
Danie_Razrad_2 = (temp%100)/10;
Danie_Razrad_3=temp%10;
И я уверен, что это занимает меньше машинного времени, чем while'ы
2. Хорошей практикой было бы сделать массив переменных Danie_razrad.
3. имея массив, можно и в прерывании обойтиcь бес case.
4. Про названия переменных - молчу.
Поймите меня правильно, я только за таких проектов, но у молодежи нужно воспитывать "культуру" кода с самого начала. Потом трудно переучивать.
1. Нет, вы очень не правы, ваш вариант красив но значительно медленней.
2. Это всего то вариант как можно работать. По большому счету, массив не как не выигрывает, а вот отдельными переменными информативнее работать в программе.
4. Вы правы, в дальнейших примерах я осмысленные названия стал задавать.
наткнулся тут на Ваше видео в рекомендованных. касательно первого пункта
i92.fastpic.ru/big/2017/0705/01/713dabe8b1160f87318f45139e9f8201.jpg
i92.fastpic.ru/big/2017/0705/d4/88f87937f5cd057b69866c1f6ba11bd4.jpg
вооот, почти в 2 раза быстрее
Огромное спасибо за уроки!!!
Смотрю с удовольствием!
Большая просьба, сделайте урок по типам данных (преобразование типов, хитрости работы с ними).
Все очень доходчиво объяснил. С нетерпением жду продолжения !!!
Спасибо за Ваш труд
хороший урок.на сегодняшний день лучшая инф. в сети!спасибо!хотелось бы увидеть что-то по led матрицам,т.к тема будет очень интересна для многих. реализация бегущей строки и прочих эффектов.
+Ievgen Od Постараюсь какой то интересный проект на матрице за бабахать.
лучшее объяснение, которое встречал
Александр, у меня тут появился очередной вопрос, ответ на который думаю будет полезен многим, для более гибкого применения данного примера и тема для след. урока. Хорошо знаю, что такое пром-оборудование и насколько порой отличаются условия эксплуатации заложенные разработчиком от нашей суровой реальности и пытаясь представить разработку алгоритма под конкретную задачу, ставлю себя на место таких как Вы и пытаюсь угадать логику конструктора) Предположим, я создаю устройство, управляющее станком, у станка имеется механизм подачи рабочего органа до определенного уровня, который задается датчиком(концевиком), зная хар-стики станка и длину пути, предстоящую перед этим механизмом, я узнаю время, необходимое для выполнения операции и понимая, что провод к концевику может оборваться, мне стоит заложить время действия управляющего импульса соответствующим, по истечении которого, не получив сигнал с концевика, работа программы прервется и скажем светодиод сообщит о сбое. Но поскольку я не знаю, в каких условиях и кем будет обслуживаться станок у заказчика, мне стоит кроме светодиода вывести сообщение на табло с указанием на узел, из-за которого алгоритм прервался, чтобы подвыпивший криворукий электрик пол станка не разобрал в поисках причины. Скажем концевик по схеме указан как "Е1", насколько я понимаю(сам пока проверить не могу, вчера почему-то среда отказалась коды прошагивать...), для этого мне всего-лишь придется расширить масив "sifra", скажем до 50, заложив кроме цифр еще числовые коды для знаков/символов используемых для вывода сообщ. об ошибке и вывести из масива упомянутые выше "Е" и "1" обратившись к их номерам в масиве, но ведь тема "надежного кода" намного обширнее. Простите, что так много букаф написал, но мне кажется, после атомарных операций и сторожевого таймера как раз время уделить внимание вопросу отслеживания и оповещения о сбоях алгоритма, а также служебных(сервисных) функциях с этим связанных. Ведь за такой срок у Вас думаю накопился набор простых и надежных рекомендаций для защиты оборудования от непредвиденных ситуаций.
Тут вы правы. Электроника для производство отличается. Сейчас какраз заканчиваю линию по производству металлических 200литровах бочек. Было железо без электроники. Поскольку электроники пришлось делать немерено, да еще и самому, ушло времени на это уйму. Сейчас процесс обкатки. Ну, это так отступление.
Что касается вашего примера. Перед тем как совершить перемещение механизма на станке, нужно сначала проверить концевик, убедится, что он в правильном положении, а только после проверки осуществить перемещение механизма станка до срабатывания этого концевика. Что касается аварийного времени для перемещения, это вполне рабочий вариант. Предположим за указанное время концевик не сработал, это хорошо, если есть упор. Ваше выставленное время посчитало, и скажем двигатель отключился. А если нет упора, может произойти повреждение. В таких случаях нужно ставить датчики линейного перемещения или аварийный концевик. Хотя все зависит от оборудования.
Насчет отображения на индикаторе режим неисправности, просто необходим. По себе скажу реально помогает, проходит какое-то время и сам забываешь, как что должно работать. А так глянул на надпись, к примеру, пишет нет ответа БВК6. В дакументации нашол что за датчик и где находится. Реально сокращает время нахождения неисправности.
Александр Писанец
Вот-вот, об этом и разговор, хорошо, если человек пишущий прошивку знаком с производством, а если нет?.. Думаю подобные простые алгоритмы проверок и сервисных функций не помешало бы когда-нибуть осветить отдельным уроком. Также пришел к примеру к выводу, что если нужно сделать програмный "грибок" аварийной остановки, на оборудовании, где нельзя просто вырубить общее питание, то для быстрого отклика не стоит запрещать прерывания одной командой на пол страницы кода, а если это возможно, разбить на участки и каждый отдельно защитить от прерываний. Конечно мы будем рады любому уроку, побольше бы Вам свободного времени на их создание, тем более, что почти в каждом из них так или иначе затрагивается "защита от внештатных ситуаций", за что отдельное спасибо)
Жду следующих выпусков.Все супер.
спасибо буду дальше учится.Вы грамотный учител.
Та какой там учитель, делюсь своим опытом )
Лучшее обьяснение на весь ютуб!
Сделайте на 7сег лсд по типу как на мультиметрах с мультиплексорным управлением. Умоляю.
уроки сделано очень грамотно ,Дай Бог Александру здоровья , творческих успехов и ВСЕГО необходимого ,вы знаете ассемблер я считаю что это язык высокого уровня у меня к вам несколько вопросов ?
1.как убрать не назначенных нулей при динамическом индикации таймер обратного отчета чтобы например после цифра 10 не писал цифра 09 а просто 9.
на семисегментного индикатора ?
2.Если можно то сделать урок по защиту 3-х фазных двигателей который есть ваш видео,объяснение программы если можно то добавит программно еще тертую фазу
токовую защиту.
3. Если можно то сделать урок по защиту по напряжение например какие то пределы защиты бытовой техники схемы в интернете есть на микроконтроллере
но интересно было увидеть программы на avr studio 6 например установит защиту
от 160в до 240в это примерно.
4.как сделать паузы на программе с кнопкой на микроконтроллере как на стиральном машине чтобы он работал дальше с точки останова.
5.уроки по звук на микроконтроллере что бы при каких да событии прозвучал звук
например как на микроволновке при окончании нагрева и т д.
Спасибо огромное за Ваши видео!
Тут вы правы. В последующих уроках буду так делать
Я новичек.Спасибо большое за ваши уроки.Очень помогают. Пытаюсь подключить шкалу на 18 светодиодов через два сдвиговых регистра 74HC595 по SPI. Вольтметр. Могли бы вы сделать урок об этом. Или подсказать какой нибудь ресурс.Поисковики уже замучал. Нужен пример. Спасибо.
Реально у ВАС всё просто
Лайк
Я хочу на ассемблере
С начало так и планировал, а потом передумал. Решил, что будет так нагляднее.
По дисплею надо готовить материал его там просто море . Для себя давно сделал библиотеку и пользуюсь, та и подзабыл малость . Уроки по LCD планировал, там есть что расказать, в интернете у всех одно и тоже . И много моментов по работе с LCD не раскрывает никто .
Спасибо, за видео, недавно также мучил сегметный индикатор, как насчет видео по работе с LCD дисплеем, к примеру HD44780?
Для тих хто буде программу копіювати в Codevision потрібно функцію записати не так Peresot ( volatile unsigned char Temp ) а так void Peresot (volatile unsigned char Temp) компілятор видає помилку без void,
asm("cli"); Записати з знаком на початку# #asm("cli"); #asm("sei"); #asm("nop")
Щоб відображати більше 255 потрібно змінну Danie змінити на int замість char Також поміняти змінну у функції на int void Peresot (volatile unsigned int Temp)
Для легкої настройки індикатора краще массив записати у бінарні системі числення
unsigned char sifra[10]= {
0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111,0b00000001,0b00001001};
Дякую за хороший кусок кода автору.
Для atmel studio7 так же void
Здравствуйте
можете подсказать:
В массиве хранятся числа 0...9.
Я собираюсь их выводить в двоичном формате по 4 пинам.
Как вывести именно на эти пины, не трогая остальные.
так вот я не могу додумать.
массив содержит допустим цифру 9 0b00001001;
далее как ее два младших бита вывести на четыре ножки порта не изменяя состояния остальных
если мы напишем PORTC= 0b00001001 он заменит нужные и остальные тоже, которые трогать нельзя они под другое заняты.
Добрый день Александр. Как изменить программу если сегменты индикатора подключены к разным портам контроллера, (допустим часть к порту В, а часть к порту С) ведь тогда нельзя просто создать массив с цифрами? Если у Вас будет свободное время, сделайте видео урок по подключению сегментов к разным портам. Буду очень благодарен Вам.
смог узнать как?
@@Sxemodelkin Ага
Почему вектор прерывания не записывается в main? И как вообще остальные строки программы взаимодействуют с этими прерываниями? И как сделать так чтобы переменную Danie (которая отображается на индикаторе) можно было менять в реальном времени? А то не слишком полезно все время выводить одно и тоже число. Например, я хочу чтобы при нажатии кнопки число 145(как у вас) увеличивалось на 1.
Хорошие уроки! Спасибо)
У меня atmega128 работает от внешнего кварца 8 МГц, пишу в Atmega Studio 6.0. Так вот взял ваш пример, не работает. Не входит в функцию Peresort. Подсовываю тело этой функции в обработчик прерывания. все ок.
Всё воедино собираю в Vegas Pro.
В сети есть статья про часы на семисегментных индикаторах ИВ-9. Реализованы они на Atmega8, использованы регистры сдвига TLC6C598-Q1. Подскажите, пожалуйста, как программно это реализовать?
Вот ссылка на статью www.petrofflab.ru/2015/06/3D-numitron-iv9-2-tube-clock.html
СПАСИБО !!!
а в какой среде вы делаете видео ?
Я в шоке, сколько информации перелопатил, и вот! Золотая жила!! Спасибо большое! Дошло до меня :) Но есть один вопрос, можно ли подключать семисегментник анодом прямиком к ножке как показано на схеме 0:41? Не сгорит ли ножка PORTDx при цифре 8 скажем?
Можно. Только токоограничующие резисторы надо ставить.
Р.С Извеняюся за несвоевременный ответ youtub порой не отображает, что был комментарии.
Александр Писанец Спасибо! Ничего я привык что не сразу отвечают на Ютубе
Ваши уроки мене очень помогли переступить порог к микроконтроллерам. Есть один вопрос? А где могу найти описания слов таких как например: ISR, case, break, switch и.т.д. Так как есть идеи реализовать разные задумки но не хватает базы стандартных алгоритмов, слов, наборов инструкций .... (К примеру я знаю десять цифр и исходя из этого я подставляю любую цифру я могу выложить любое число. Так и в программе если я буду знать всю стандартную библиотеку то смогу в итоге сделать любую программу)
Виталик Трохименко ruclips.net/p/PLygUYOEl6XIrGEzxbg1qsitAa3oekoUJ6
Александр Писанец Спасибо
Здравствуйте. Не удается разобраться с пониманием того как произойдет выход из подпрограммы обработки прерывания TIMER0_COMP_vect.
В блоке CASE 3 в конце команда break. В результате выполнение программы возвращается на строчку 20: Vibor_razrada++ и все зацикливается. Получается из вектора прерывания никогда не выйдет?
Строчка 37 сбрасывает значение на ноль и выходит из теле вектора. При следующем заходе в прерывание начинается обслуживание первого разряда и так постоянно все повторяется
Спасибо за видео
Здравствуйте! Вы имели дело с радиомодулем nRF24L01 ?
В примере для скачивания, в главной функции пропущена запись в регистр OCR0
Точнее сказать, максимальное число, которое можно вывести на индикатор, даже если ставит вручную, 255.
Александр, если можно несколько вопросов.
1. Почему многие называют индикаторы 7-ми сегментными, ведь по факту 8 символов (точка).
2. Для чего у вас в коде всегда присутствует пустой оператор asm("nop"); ?
3. Зачем для проверки условия использовали цикл, а не if?
Точка не является информотивным сегментом а только разделительным. Оператор 'nop' для демонстрации, чтоб останавливаться при отладке. IF это мой вариант, можно и по другому все написать.
Подскажите программу по-круче. На 4 разрядный индикатор. Что-то боль какая-то. Либо тускло горит, либо мерцает. Замучился.
Это стандартная программа, и 4 разряда работают отлично, безо всяких очевидных мерцаний.
@@АлександрПисанец Блин. У меня либо ярко, но с мерцаниями, либо без мерцаний, но тускло. С предделителем играл, время совпадения тоже, нет яркости, резисторы убрал, толку нет. В комнате индикатор хорошо видно, на улице на солнце, даже в тени - нет. Пробовал ставить задержку циклом на разряд while(i != 2000){i++;}, работает - один сегмент после этого начинает гореть в полный "накал", если поставить цикл на каждый разряд, всё разваливается, программа перестаёт корректно работать. Я в тупике.
А плонируете работать с nRF24L01 ?
Здравствуйте я хотел узнать как вы в окне IO view в режиме мониторинга состояния битов в поле Value изменили систему счисления? Сейчас у меня отображаются данные в 16тиричной системе счисления, а у вас в видео в десятичной.
Заранее спасибо!
+Эмиль Исламов На данном окне правой клавишей мышки кликните, выпадающем списке выберете.
понравилось, но после спать захотел
Спасибо исправил.
шикарно
При разложении числа выше одного байта (255) на индикаторе выводится чёрт знает что.
Проблему решил объявлением переменной "Danie" и "Temp" как бес знаковое двух байтовое число "volatile unsigned int".
Александр скажите пожалуйста зачем вы используете ключевое слово "volatile"?
Дает понять компилятору что ненужно оптимезировать переменные после слова volatile . А-то компилятор может посчитать их ненужными, и исключит из программы вообще, или использовать коряво.
как известно в чужой монастырь со своими уставами не ходят, поэтому заранее прошу прощения за свое замечание от такого неуча как я....., по моему правильнее было бы к настройкам регистра применять вот такую запись TCCR1B |=1
Извините за тупой вопрос, но я новенький в этом деле. Вы устанавливаете значение порта записью "PORTB &=~(1
Скопируйте таблицу в главе "Выражения" отсюда: ru.wikipedia.org/wiki/%D0%A1%D0%B8_%28%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29
По сути, выполняя справа налево: пин 1 переводим в лог.1, дальше тильдой(волн. линия) инвертируем в лог.0 и знаком & присваиваем значение порту, то есть пину 1 порта В присваиваем лог.0, у вас же 0b00000001, то есть лог.1 присваиваем 0-му пину.
Здравствуйте! С чем может быть связан "шум" индикаторов?
Здравствуйте. Не понял сам вопрос, что за шум ?
То есть тускло и хаотично мигают остальные сегменты.
Polyakov Konstantin
Тускло может быть, если частота на свечения сегментов выбрана большая. А насчет мигания трудно, что - либо подсказать, нужно все пошагово в отладчике смотреть.
Polyakov Konstantin
Проверил другие варианты последовательности работы сегментов, чтобы не было "послесвечения" сегментов соседних цифр перепишите код по образцу:
Выкл. предидущий разряд
Передать числовой эквивалент цифры порту
Вкл. действующий разряд
Или для данного кода:
PORTD &=~(1
Александр, а почему кстати не наоборот, почему не гасим сначала 1 символ, а потом зажигаем 2? Кстати для тех, у кого отладчика нет, а считать лень, очень полезная программка, для подбора букв на индикаторе тоже: sergeyk.kiev.ua/soft/led2asm/
П. С. Пришел к выводу, что код стоит оставить 1 в 1, как у Вас(при той же распиновке индикатора), кроме цифры 2, туда вписать 40, если точку отображать не надо, то освобождаем 2 пин порта В для отслеживания прерываний.
Доброго дня!
Спасибо за уроки
может Вы подскажите схемотехнику 4-х 7-ми сегментных
Аноды понятно через 74НС595 а аноды их получается ах 16 штук
Аноды понятно через 74НС595 а катоды их получается ах 16 штук
Роман Тихий Насколько я понял, то у Вас 4 семисегментника с общим катодом? Если так, то у Вас всего 4 катода (необходимо 4 транзистора и 4 шт. 74HC595)
не совсем у меня 4х4х7 сегментника
Спасибо!
Планирую свой канал развевать. Возможно уроки выходить будут не часто всё упирается в свободное время.
Здравствуйте! на сколько уроков вас хватит?
У как с ним работать расскажитие?
простите за критику но в вашем уроке оная тема раскрыта немного не до конца
вы расмотрели самый легкий вариант
как быть когда аноды и катоды индикатора разбросаны по всем портам мк ?
а в остальном like :)
В принципе, можно програмульку подготовить и обяснить.
+Александр Писанец , это было бы очень хорошо.
спасибо за вашу работу !
Здравствуйте Александр! У меня вопрос. А если бы это был урок не для начинающих, то как бы вы реализовали цикличное переключение по индикаторам? Как бы более профессионально и компактно.
+Dmitriy kosterov Данный способ я и применяю он достаточно быстр и компактен.
+Александр Писанец Я почему спросил, код этого урока у меня работает по другому, сначала зажигается 1 индикатор, потом 3, потом 2, потом 1, потом 2, потом 1, потом 3 . Вот такая бяда((
Я завтра посмотрю
Александр. Из-за вашего канала, я разошелся не на шутку. Развожу плату, появилась нужда несколько пинов, которые целиком вешаются на порт, те, которые отвечают за свечение нужных сегментов, перенести на другой порт. Подскажите как проще реализовать код?
Дайте почту, (zim48@yandex.ru) вышлю свой код.
shizlgizl@yandex.ru)
В программировании полный ноль, если не сказать хуже, плюс мне всегда теория осваивается тяжко, если нет возможности пощупать ручками "в железе", поэтому пока нет атмеловских чипов, решил поиграться в протеусе, чтоб хоть как-то закрепить полученные знания, но тут возникло несколько вопросов.
1. На Вашем устройстве точка не отображается, но и программно она не отключена, насколько я понимаю запятая должна была быть повешенной на пин 3 порта Б, но похоже была отключена схемно. Соотв. вопрос, как лучше, "затемнить" её програмно или просто не соединять с пином?
2. Вначале не объявлена переменная Temp, почему?
3. Устройство с тремя семисегментными индикаторами способно отобразить число до 999, но переменные Danie и Temp объявлены как unsigned char, то есть насколько я понимаю там диапазон ограничен числом 255, этот вопрос меня ввел в ступор, либо это ошибка, либо я чего-то не понимаю.
Еще раз спасибо большое за уроки, появились бы лет 5 назад, я бы уже точно полным нулем не был))
Здравствуйте. Насчет точки можно делать как хочите, но гибче программно выключать, вдруг захочете точку отображать.
Я сделал функцию Peresot и в ней есть принимаемый параметр Temp. Хотя можно Temp объявить глобальной. В данном примере число можно максимальное отобразить 999 (объявляем как int). Поскольку это простой пример то я и отображаю 145 (объявлен как char )
Александр Писанец
Спасибо, всё понял, значит в общем не ошибся, на счет точки спрашивал, так как наслышан о плохой помехоустойчивости Атмеловских чипов и подумалось, что оставлять в воздухе пин чревато. И да, вопросов думается я Вам еще поназадаю кучу, вроде зацепило меня это программирование)
Нет надобности. Меня вполне устраивает RF12
Что за отладчик (железка)? AVR JTAG ICE или аналог?
Dragon
Я не совсем понял: Dragon - это эмулятор?
А вообще отладка на живом МК возможна?
Может это я не понял вопроса ). Это программатор отладчик, при помощи которого в реальных условиях пошагово отлаживать свою прогру уже прошитого микроконтроллера.
В интернетах кое-где написано, что Dragon - это-де по факту не отладчик, а эмулятор, собственно эмулирующий МК - память, регистры и т. д. и таким образом производящий отладку прошивки "внутри себя". и потом заливающий в отдельный пустой МК.
Под отладкой на живом МК понимается отладка не "внутри себя", а непосредственно на отдельном МК (в том числе находящемся в обвязке/на плате проекта).
Так вот именно на отдельном микроконтроллере и производится отладка. микроконтроллер находится уже в собранной плате.
А вместо "255" в порт DDRB нельзя не проще было бы присвоить просто "0"? или в этом есть какой-то смысл? Я не критикую, просто хочу уяснить.
Насколько правильно я понял вопрос. Результат то разный. 255 установит все биты в 1 ,а ноль в ноль.
Я опечатался =) Вопрос в том, что для байта же эквивалентно будет приравнять его к 1? Это же тоже даст 0b11111111? А раз так, запись же получается короче.
Если посмотреть в ассемблере как разложил компилятор. Оба действия абсолютно одинаковы, и в итоге выигрыша не какого.
+ERadicator49
Ky ky a ya tyt :D
Privet iz makintosha axaxaxaxax
Доброго вечора, ще одне питання з приводу об'яви функції Peresot (), адже вірний синтаксис void Peresot ().
Aleksandr Maslo Совершено верно, в моем случае будет автоматически присвоено int возврат из функции.Поскольку функция не возвращает не чего, то вы правы нужно указать void.
Я нашел ошибку : в функции прерывания перед оператором switch нужно обнулять порт иначе выводятся кракозябры, т.к. значения разрядов накладываются друг на друга
Странно как то, они и так обновляются при записи новых значений. У меня таких проблем не разу не было
У вас какая оптимизация стоит?
Os2
У меня есть максимальная только Os. Сильно ли отличается от Os2?
На Os нужно грамотно писать программы, капризная штука. Os2 не сильно отличается, зато менее капризна.
А не лучше сначала гасить разряд, потом записывать данные и потом уже зажигать нужный разряд.
доброго дня, шановний автор. У відео ви говорите про 20 мілісекунд на кожен сегмент, що є не зовсім вірним, це час на ввесь індикатор, тому у вашому випадку 20/3=6.6 мілісекунд.
Aleksandr Maslo Та нет, я все правильно показал, именно каждый сегмент 20 мілісекунд
Здравствуйте. Если запустить счетчик, Peresot(Danie++); считает только до 255. Как можно исправить, подскажите пожалуйста.
+Виталий Зубенко Сделайте расширение на char, к примеру int Danie. В функции Peresot добавите возможность пересчета 1000.
+Александр Писанец , спасибо! Решилось заменой типа переменной char на int в трех местах:
volatile unsigned char(int) Danie_Razrad_1,Danie_Razrad_2,Danie_Razrad_3,Danie;
static unsigned char(int) Vibor_Razrada;
volatile unsigned char(int) Temp
теперь считает до 2147483647...
Добрый вечер .В основном я понять, как работает программа. Но как понять эту функцию ? TCCR0 &=(1
ну в таком случае надо писать коменты....., вы же хотите чтобы ваш продукт был качественным....., ведь на вас смотрят неокрепшие умы )))
По преобразованию типам данных я и сам несилен. Ненужно мне было этого в своих программах, обходился без них, поэтому сильно не вникал.
Только с RF12
я не хочу вас обидеть,, просто столько каналов где только 5-10 уроков =( безысходность...
Александр, добрый день. Огромное спасибо за видеоуроки. Я начинающий программист. Помогите написать этот урок, только для ATmega8. Есть проблема с таймерами. Моя почта avp7213@rambler.ru.Заранее спасибо.
Спасибо за видео