Запустил код на mega 328P заменив TIMSK на TIMSK1 все заработало! Спасибо за урок!
@eugenevladoff27584 жыл бұрын
Спасибо, это интересно. Прерывания - классная штука!
@zavenhovhannisyan25835 жыл бұрын
Глобальная переменная i по умолчанию ровна 0. Вместо строк: OCR1AH = 0b01111010; OCR1AL = 0b00010010; можно писать: OCR1A = 31250; Автору респект: чувствуется закалка в ассемблере :)
@ПетрКонстантинов-с7т2 жыл бұрын
согласен)))),тока я бы не стал вставлять функции в прерывания!!!,зачем выскакивать по сто раз.
@Yupitrer6 жыл бұрын
Чувак ты крутой!!! Спасибо тебе за пролитый свет науки
@ВячеславСартисон5 жыл бұрын
Вот и я до игрался с фьюзами ! Хотел частоту выставить 8МГц . на m328P . А avrdude3.3 каким -то образом поставила мне все нули во фьюзах. А я прошил не проверив. Все кирпич! Благо запасная плата есть. Продолжаю учиться. Потом микросхему перепаяю или JTAG программатор соберу. Всем удачи!
@kosmos84603 жыл бұрын
А вообще этот код работает на AVR 328 ?
@budnirekruta4 жыл бұрын
в прошлом уроке еще хоть что то было понятно, а в этом как будто подслушал разговор двух продвинутых программистов
@adapters_StarKey5 жыл бұрын
Спасибо за уроки. Огромное.
@Wip857 жыл бұрын
Здравствуйте регулярно смотрю ваше уроки по программированию МК. Не большая просьба сделайте видео о там как работать с даташитами МК. Хотя бы важные параметры. Спасибо за уроки
@paracelsushohenheim5196 жыл бұрын
kzbin.info/www/bejne/np61d5atpNOJfcU вот профессиональный препод об этом говорит (о работе контроллера)
@lastmorning94095 жыл бұрын
Формат "почитаю даташит на мк вместе со зрителями". Лайк.
@narodstream5525 жыл бұрын
Дело в том, что многие не знают, как читать техническую документацию и очень много вопросов потом из-за этого возникает. Основная масса вопросов возникает конечно из-за незнания языка вообще, поэтому и был начат новый курс. Кстати урок выйдет сегодня. А многие ещё и злятся, когда я вместо ответа посылаю читать техническую документацию. Даже не представляете, сколько таких.
@lastmorning94095 жыл бұрын
@@narodstream552 Очень много. я вот из 2ста страничного даташита от атмега328 осилил страниц 8
@korobokinos8 жыл бұрын
Спасибо за урок.
@narodstream5528 жыл бұрын
И Вам спасибо за внимание к каналу!
@tem_ruslan8 жыл бұрын
Спасибо за видео, очень помог
@andreyparovozz7 жыл бұрын
Прерывания! Скоро мы станем настоящими кодерами!
@forextraders91059 жыл бұрын
сколько всего нужно знать.
@dargindarginec95613 жыл бұрын
Приветствую, ни как не могу разобраться с кодом по ШИМ и ADC поможете?
@ЭндиДюфрейн-ь3я2 жыл бұрын
как сделать прерывания таймера в библиотеке? и как вывести ее в главную функию?
@vais10004 жыл бұрын
Is there an option to count some internal process (like number of times that i got into some function)? - (Not the system clock or external pin)
@forextraders91059 жыл бұрын
сколько всего нужно знать.....
@TheWladberlin2 жыл бұрын
Спасибо за урок, но - Как то Вы про регистр TCNTn не совсем точно выразились - "хранит" (4:40). Вернее сначала Вы поправились, что он не хранит, но потом почему-то снова начали утверждать, что "он хранит". Нет, конечно на самом деле он ничего не хранит - это просто 8 или 16 битный счетчик, в нем идет, независимо ни от чего, беспрерывный цикл. В зависимости от настроек, число это постоянно сравнивается с регистром OCRn - в котором как раз и "хранится" заданное число, с которым надо сравнивать.
@Жуликнавальнерзеленоеебло8 жыл бұрын
привет а как ты подружил atmel studio и avrdudeprog на 31:32 ?
@narodstream5528 жыл бұрын
+RioesanIsidro Об этом есть в более ранних уроках.
@Жуликнавальнерзеленоеебло8 жыл бұрын
ок попробую найти
@leatherbald5 жыл бұрын
Подскажите как записать если делитель 1024 нужен. Спасибо
@hubby54 жыл бұрын
Странно. В пртее кнопка всеравно останавливает счет. Или я ошибся ?
@DrargonsM9 жыл бұрын
Позновательное видео!
@тураразимхан6 жыл бұрын
здравствуйте в portd все однерки можете по подробнее обьяснить
@kiss68437 жыл бұрын
Скажите пожалуйста, а почему Вы использовали ТCCR1B, а не ТCCR1А?! Могли бы Вы еще сделать уроки по режимам счетчика? Благодарю!
@leatherbald5 жыл бұрын
Потому что именно в регистре В делитель указывается
@ВладимирМалышев-х4ж7 жыл бұрын
Здравствуйте. В ATmega328P есть регистры OCR0B, OCR0A у меня вопрос, если будет установлен режим сброс при совпадении, а значения в регистрах будут разные, получается что счётчик не дойдёт до второго числа в котором число больше и будет всё время сбрасываться? Как они работают?
@MrDacnick7 жыл бұрын
Ну и смысл этого мучения? таймер Т2 (мега 16, для остальных- смотрим даташит)ставим в асинхронный режим, выбираем источник его тактирования- часовой кварц, предделитель- 128, разрешаем прерывания по его переполнению- и имеем на выходе строго 1 Гц. Причем в отличии от предложенного примера это уже источник счета для часов реального времени. А для 16-ти битного таймера с его регистрами сравнения наверняка найдется лучшее применение
@Смок_Беллью8 жыл бұрын
Здравствуйте, спасибо за видео! Вопрос: каким способом реализовать сброс/паузу счётчика?
@narodstream5528 жыл бұрын
+Василий Клименко Ну по идее сбросом или установкой определенных битов в определенных регистров определенного таймера. Подумать надо.
@Смок_Беллью8 жыл бұрын
+narod stream Выходит это не очень и нужно в реальных программах, раз с ходу не скажете?
@romik56084 жыл бұрын
Теоретически, остановить счетчик можно отключив предделитель. Для этого записать нули в биты CSn0, CSn1 и CSn2 регистра TCCRn. Только что при этом произойдет - просто остановка счета или остановка счета со сбросом счетчика - нужно проверять.
@AlekseiChip7 жыл бұрын
У меня при сборке вылетают два предупреждения no previous prototype for 'PortInit' [-Wmissing-prototypes] timer D:\AVR\timer\timer\src\main.c 5 no previous prototype for 'TimerInit' [-Wmissing-prototypes] timer D:\AVR\timer\timer\src\main.c 14
@dorofieiev-dys8 жыл бұрын
весьма доходчиво и полезно! вот бы еще пообъемней и по подробней!
@narodstream5528 жыл бұрын
Ну тут уж не угодишь. Кто-то говорит, что слишком длинные уроки, надо кратко. Ютуб вообще говорит что оптимальное время видеоролика 2 минуты
@dorofieiev-dys8 жыл бұрын
ага, программирование за 2 минуты ...
@peter_savelev8 жыл бұрын
+narod stream спасибо вам за ваш труд!
@narodstream5528 жыл бұрын
Peter Savelev а Вам спасибо за оценку!
@leonid_kolissetskiy7 жыл бұрын
Все хорошо, НО. половину текста вы себе под нос бурчите многое не понятно. Такое ощущение что тут одни профессионалы сидят. Делайте не один урок, 2-3 не длинных. Но с доходчивым объяснением. А то думаешь что вот наконец то начал понимать. Блин а тут опять вы что-то без объяснения дописываете.
@ДмитроПерший8 жыл бұрын
Я так понимаю, что таймеры-счётчики используются, когда нужно подсчитать что нибудь за определённый промежуток времени. Меня интересует обычный подсчёт количества прямоугольных импульсов (лог 1), которые подаются на входящий порт для суммирования количества оборотов коленчатого вала за период с момент запуска до момента останова двигателя. Подскажите алгоритм, как мне использовать прерывания (одно или два), потому как амплитуда импульсов одинакова, а частота отличается (сигнал с ЭБУ на тахометр, усиленный ОУ). Спасибо.
@narodstream5528 жыл бұрын
завести глобальные переменные для счётчиков, запустить таймер с определенным значением регистров и мониторить флаг окончания счёта таймера в циклах. Вроде простой алгоритм. А какие именно регистры, в этом видео всё есть.
@ДмитроПерший8 жыл бұрын
Ок, спасибо!
@ДмитроПерший8 жыл бұрын
Добрый день. Подскажите, бывали ли у Вас случаи, когда Протеус не верно работает с прошивкой? В чём суть. Я написал простенький код по подсчёту количества импульсов на Т0. Чип АТтини2313. Функция прерывания увеличивает значение переменной на единицу каждый раз, когда счётчик переполнен. Протестировал в Протеусе схему с сегментированным индикатором. В качестве импульсов - кнопка на массу. Всё работает, МК считает и выводит индикацию - 1, 2, 3 и т.д. до 9. Но если в качестве кнопки я использую другой МК для формирования прямоугольных импульсов, почему то симуляция не работает (ошибки не выдаёт). Вы сталкивались с подобными проблемами в Протеусе?
@narodstream5528 жыл бұрын
Добрый день. С подобными не сталкивался, но сталкивался с многими другими. Поэтому если что-то не идет в протеусе, я всегда пробую на настоящем контроллере.
@ДмитроПерший8 жыл бұрын
Нужно будет приобрести монтажную плату и программатор.
@АлександрСветлый-х1я5 жыл бұрын
Подскажите пожалуйста, для обработки внешнего прерывания с кнопки нужно использовать ISR(INT0_vector) или нужно читать бит INTF0 регистра GIFR? Благодарю.
@romik56084 жыл бұрын
Зависит от того, что мы хотим. ISR вызывается сразу, как произойдет условие. А для чтения бита для начала нужно дождаться, пока дойдет очередь до выполнения участка кода с чтением бита регистра. А в больших программах это ожидание может занять довольно много времени. Поэтому если скорость обработки внешнего условия критична - используем прерывание, если не критична - читаем регистр.
@anton666498 жыл бұрын
Из урока мне почти все понятно, кроме одного момента. Правильно ли я понимаю? Суть в том, что все , что находится между ISR (TIMER1_COMPA_vect) и }, выполняется, как бы параллельно основному коду? На аппаратном уровне? В этом суть?
@RoxReview7 жыл бұрын
Когда выполняется обработчик прерывания ISR (TIMER1_COMPA_vect){ }, то основной код останавливается, и как только обработчик выполнил все команды внутри себя, то идёт возврат к основному коду с того места, где он остановился.
@Анекдотыототца9 жыл бұрын
Спасибо автору позновательное видео))
@Vivavatnik7 жыл бұрын
Спасибо!
@_Iokanaan_Marusidze_8 жыл бұрын
помогите пожалуйста настроить таймер ATmega328 T1 -16 разрядный частота тактирования - 16МГц режим - fastPWM - как сделать знаю мне надо чтобы период срабатывания по переполнению был равен ровно 2мс играюсь с предделителем но ничего не получается подскажите пожалуйста методику как правильно это сделать
@vedgray97737 жыл бұрын
А что такое H и L ? Нight и Low? Верхний и нижний регистр
@Vitalij3067 жыл бұрын
Здравствуйте. Подскажите пожалуйста можно этот код в оригинальном виде реализовать в среде разработки codevision avr. Если можно то как?
@narodstream5527 жыл бұрын
Здравствуйте! В оригинальном наверно никак. CVAVR грешен использованием дополнительных библиотек, а студия любит, чтобы их писали сами.
@Vitalij3067 жыл бұрын
narod stream Спасибо за информацию
@alekskapitonov27383 жыл бұрын
Спасибо
@vovanstukov65187 жыл бұрын
Подскажите пожалуйста такой вопрос . Как сделать 1 кнопкой переключать порты - 1 нажатие 1 порт в единицу , 2 нажатие , 2 порт . Длительное нажатие более 3 секунд . отключает текущий порт (переводит его в ноль.)
@narodstream5527 жыл бұрын
В принципе, здесь можно использовать режимы, как мы делаем в часах со светодиодным индикатором.
@vovanstukov65187 жыл бұрын
Счётчик задать на опрос порта кнопки ?
@lastmorning94095 жыл бұрын
А можно настроить шим так, чтоб функция из arduino tone() давал сигнал на двух пинах и в противофазе? кстати подпишусь
@narodstream5525 жыл бұрын
На STM можно, на AVR не пробовал.
@sergeystal155 жыл бұрын
я не понял что это за число 1000 0000 0000 0000? А если 16Мгц на тоже число делить или 32Мгц , что за волшебное число 1000 0000 0000 0000?
@РамазанХайбуллин5 жыл бұрын
Так как МК 8 битный, а регистр OCR1A 16 битный(волшебное 16-значное число), то его разделяют на 2 -- OCR1AH(старший), OCR1AL(младший), в данном случае 1000 0000 0000 0000 надо будет записать как: OCR1AH = 0b10000000; OCR1AL = 0b00000000;
@sergeystal155 жыл бұрын
@@РамазанХайбуллин спасибо.
@romik56084 жыл бұрын
@@РамазанХайбуллин Хм.. А почему не 1111 1111 1111 1111? Ведь счетчик то до этого значения считать должен? Или я не прав? Хотя, вроде понял. Считает он до 65535, но мы должны подобрать такой делитель, чтобы число для сравнения было целое и при этом было не больше чем 65535. Если выберем делитель 64, то 8 000 000/64=125 000, что больше, чем 65 535. Если выберем 1024, то 8 000 000/1024 =7 812,5. Т.е. число не целое. Поэтому выбираем делитель 256. 8 000 000/256 =31 250. Число и целое и в регистр помещается. 31 250 - это количество тиков за секунду при установленном предделителе 256.
@РамазанХайбуллин4 жыл бұрын
@@romik5608 Да, вы все верно написали, число сравнения можно задавать любое в диапазоне 0...65535, Целое подбирать необязательно,ведь 8 Мгц/(1024*7812)≈1.00064 Гц, что вполне неплохая точность, главное чтобы эта ошибка в 64мкс не копилась
@НиколайАлексенцев-ж6ь4 жыл бұрын
А если программа в прерывании по времени таймера , превысит тайменг следующего прерывания ... То что будет ?
@romik56084 жыл бұрын
Что-то мне подсказывает, что ничего хорошего не будет :( Наверное, вечное прерывание.
@yuriysayfutdinov6657 жыл бұрын
Класс!) спасибо Автору за его труды, особенно за narodstream.ru/avr-urok-10-tajmery-schetchiki-preryvaniya/
@eucliwoodheadshot7046 жыл бұрын
а откуда берётса время из _delay_ms откуда оно насчитывать?
@narodstream5526 жыл бұрын
для этого мы объявляем частоту тактирования контроллера.
@eucliwoodheadshot7046 жыл бұрын
Я имею в веду в случае с таймерами мы время вычисляем с помощью делителей и прерывания. А как контролер время ничвонеделания вычислял.
@narodstream5526 жыл бұрын
Именно по частоте тактировения. Попробуйте её не объявить и использовать задержку. У Вас будет ошибка сборки.
@eucliwoodheadshot7046 жыл бұрын
Я имел в веду в каком процессе атмега отрабатывает это время, это происходит в каком-то особом таймере? И ли есть кокой-то внутренний счётчик времени который следит за временем отдельно от тех которые пытается создать разработчик? Веть программ должна с каким-то физическим элементом взаимодействовать , и вот с каким ? именно это я хотел уточнить, кто считает время в этом случае. И сколько максимального времени он может насчитать
@narodstream5526 жыл бұрын
В конечном цикле с помощью серии операций "NOP"
@VasyaPupkinus9 жыл бұрын
Здрасти. Назрело пару вопросов. Можно ли в один вектор прерывания засовывать несколько функций, например опрос кнопок и вывод данных на экран. Это нормальная практика или лучше так не делать? И второй вопрос: как можно принудительно завершить действия в векторе и выйти из него?
@narodstream5529 жыл бұрын
+Вася Пупкин можно конечно, особенно если есть уверенность что управимся до вызова нового прерывания.
@narodstream5529 жыл бұрын
+Вася Пупкин принудительное завершение действий смотря каких. не совсем понятно.
@VasyaPupkinus9 жыл бұрын
+narod stream вопрос снят, код удалён как не благонадёжный хоть и рабочий. Ждём видео по управлению шаговиком ))
@anton666498 жыл бұрын
То есть, одно прерывание, может прервать действие другого прерывания? То есть, я правильно понимаю, контроллер "возится", где не будь в цикле тела, затем происходит прерывание по кнопке и начинает выполнятся какое то действие(условно говоря №1), при этом это действие не успевает выполнится, так как сработало другое прерывание и начинает выполнятся другое действие(условно Действие №2). Так вот, после выполнения Действия №2, контроллер вернется к выполнению основного кода, а Действие №1 так и останется не выполненным, я правильно понимаю? Как с этим можно бороться, если такое происходит?
@astronom1007 жыл бұрын
в прерываниях приоритеты есть.. Где выше приоритет, то прерывание и выполняется в первую очередь..
@vedgray97737 жыл бұрын
TCCR1B |= (1
@narodstream5527 жыл бұрын
Начните изучение с битовых сдвигов. Единица - это байт, который мы сдвигаем. То есть сдвигаемый операнд всегда стоит слева в операции. А WGM12 - 'это число, на которое мы сдвигаем левый операнд, то есть единицу. Две птички, повёрнутые на запад - это направление, в котором мы производим сдвиг. Вот он и результат. Мы сдвинули единицу влево на WGM12. Я не знаю, какое именно число WGM12, но это легко посмотреть, кликнув по нему правой кнопочкой мышки и выбрав надлежащий путнкт, по которому Вы попадёте в файл, где он будет описан. Но я точно знаю, что это цифра, не превышающая 7. Например, если он равен 3, то мы сдвинем единицу на 3, тем самым включим 3 бит (получим число 00001000), если равен 0, то вообще не сдвинем, тем самым останется включенным нулевой бит (получим число 00000001) и так далее. Этот вопрос многие путают, потому что уроки надо смотреть с самого начала. Все думают, что мы сдвигаем WGM12. Но это со временем пройдёт. Есть симулятор, приучайтесь им пользоваться и смотрите результаты.
@alexconstructor93686 жыл бұрын
А как можно проверять до скольки досчитал таймер - проверять TCNT1H + TCNT1L ?? Неподскажите как грамотно сделать неполучается ?
@deos_876 жыл бұрын
Рекомендуют считывать сначала TCNT1L в регистр, а затем TCNT1H в другой регистр - именно такой порядок, потому что TCNT1L меняется значительно чаще TCNT1H - все таки это два 8-разрядных регистра 16-разрядного двоичного счетчика. Еще необходимо учесть задержки на обработку прерывания, по которому вы начинаете считывать значение из TCNT, ведь за время циклов переходов регистр таймера может насчитать лишние такты. Лучше всего прочитайте "даташит" на ваш контроллер.
@never.m1nd7 жыл бұрын
Спасибо за уроки! Возникли вопросы некоторые Раз таймеров всего три и задержки использовать нежелательно, как быть если... Допустим собираем часы карманные, нажимаем кнопку - индикация горит 2 секунды - (считает таймер?), чтоб зайти в меню установки времени допустим нужно удерживать кнопку какую нибудь 1 сек - (тоже какой то таймер должен считать?), плюс индикация динамическая тоже на таймере. Я к тому, что как эти интервалы времени правильно прописывать, раз уж таймеров всего три? Если мне нужно будет 5-10 отсчетов времени
@romik56084 жыл бұрын
Запускаем таймер. Вызываем прерывание по переполнению или по сравнению. А уже в самом прерывании вводим дополнительные переменные, которые переключаем в 1 через условных 10, 100, 1000 и т.д. вызовов данного прерывания. А уже в основной программе следим за этими переменными и от того, взведены ли они что-то делаем, а затем сбрасываем их в ноль (сброс тоже делаем в основной программе). Таким образом на одном таймере можно использовать несколько переменных для разных отрезков времени. Конечно, это не будут особо точные промежутки, но для целей отслеживания нажатия кнопки, или динамической индикации вполне подойдут.
@ДенБельский-н5ю7 жыл бұрын
скажите, а как реализовать не на 256 деление, а на 1024???
@ДмитроПерший7 жыл бұрын
В регистры CS12 и CS10 записать единицы.
@bukx34648 жыл бұрын
Респект за видео! классная манера изложения так держать! Извините за ламерский вопрос, не могу сообразить. допустим мы хотим сочетать время сколько времени удерживается кнопка, нажатие на кнопку (вызывает внешние прерывание). получается что если мы обрабатываем прерывание от кнопки, прерывание от таймера блокируются? можно конечно считать кол-во циклов while (кнопка == true) { i++; } (ну это как то не серьезно) а можно по прерыванию от таймера проверять нажатие на кнопку(тогда вопрос синхронизации и точность когда кнопка отпустилась ).
@narodstream5528 жыл бұрын
Спасибо! С этим не заморачивался.
@maxdanilov18408 жыл бұрын
Здравствуйте. Меня интересует следующий вопрос. А почему бы не сделать свой собственный делитель, используя переменную, которая будет увеличиваться на 1 при вызове функции таймера? Весь дальнейший код будет выполняться при условии достижения этой переменной определенного значения. Это я к слову о 8-битном таймере)
@narodstream5528 жыл бұрын
+Max Danilov Конечно можно. Только когда это происходит на аппаратном уровне, вызывается обработчик прерывания автоматически.
@rul-p3t7 жыл бұрын
Всем большой привет и спасибо большое автору за статью! У одних все получается сразу, у других по немного. А у меня как то не выходит. Создал новый проект, вставил полный код этого проекта, но у меня прерывание возникает почему то не в 1 секунду, а где то в 2 - 3 минуты. Это я про дебаггер атмел студии. Оптимизация Q1. Где может нужно настройки студии подправить? что не так, не понимаю. Таймер Т0 я уже настроил, работает, SPI тоже запустил. Снова застрял на первом таймере. как то так выходит, что и в железе, и в студии работает неверно. подскажите косяк, пожалуйста.
@ИванИванович-н9ы7 жыл бұрын
часто на форумах рекомендуют не доверять дебагеру, потому что он может обрабатывать не так, как это будет делать контроллер. заливайте по окончанию код в протеус, не забыв при этом поставить в свойствах контроллера частоту 8 мгц.
@VasyaPupkinus9 жыл бұрын
Здрасти. Помучав таймер Т0 на атмеге8, пришёл к выводу что он самый убогий.Сброс только по переполнению и настроить его можно только делителем. Я правильный вывод сделал?
@narodstream5529 жыл бұрын
+Вася Пупкин Совершенно верно. А вот атмега 32 - это другое дело. Там данный регистр есть и соответственно нулевой таймер там способен несколько на большее, в частности там уже включаются все 4 режима, существующие в таймере 2 - Normal, PWM, Phase Correct и Fast PWM.
@VasyaPupkinus9 жыл бұрын
+narod stream 32-я это хорошо. Но есть жменька мег8, их нужно извести). Ещё вопросик, вектора COMP и OVF , это первый при совпадении второй при переполнении?
@narodstream5529 жыл бұрын
Ну да. В таблице 18 в даташите на атмегу 8 так и указано.
@VasyaPupkinus9 жыл бұрын
+narod stream Кстати , число сравнения вроде можно записать просто OCR1A = 65535; не деля его на OCR1AH и OCR1AL . Разница есть?
@narodstream5529 жыл бұрын
Видимо, нет. Я просто не смотрел полностью реализацию записи в регистры в библиотеке Interrupt. Можете поставить точку останова и посмотреть изменения регистров в окне IO View. Я привык старший и младший бит заносить отдельно для совместимости с ассемблерным кодом.
@buchfreler12907 жыл бұрын
Вы сказали что МК должен постоянно работать, что ему нельзя даже пол секунды ничем не заниматься. Почему? С чем это связано?
@narodstream5527 жыл бұрын
Тоже прочитал где-то в каком-то учебнике, уже, честно говоря и не помню.
@andreyparovozz7 жыл бұрын
Delay на машинном коде заменяется NOP (ничего не делать). Говорят, что бесчисленное количество NOP в коде - это один из способов хакерской атаки. Но это явно не наш случай)). Если промежутки ожидания велики, то логично процессор усыпить. Если надо подождать 10-20 машинных тактов, то процессор переводится в режим ожидания. 2-3 машинных такта пропускаются NOP ами. Просто потому, что процессор из сна и режима ожидания выходит не сразу - какое-то количество тактов пропускается.
@Guraba3334 жыл бұрын
В отличие от ПК ,микроконтроллер после выполнения программы не может передать управление ОС(операционной системе) за неимением таковой и не может начать выполнять другую программу.Все действия должны быть прописаны в одной программе и чтобы микроконтроллер мог всегда реагировать на какие-то события программа никогда не должна завершаться, поэтому при написании программы для микроконтроллера всегда должен использоваться бесконечныйцикл.
@dorofieiev-dys8 жыл бұрын
Вопрос немного не по теме ... Решил сменить тактовую частоту мк - снизить до 128000 и отключил встроенный делитель на 8. Т.к. хотел использовать 8 битные счетчики, чтобы ими отсчитывать секунды, при делителе на 1024. для фьюза LF получил не 62, а Е3. очистил чип, записал фьюзы и позаливал прогу .... но ни че не заработало!? на ответы, пошагово не обратил внимания, ксожалению ... Теперь при попытке достучаться до мк - пишет: . avrdude: safemode: Verify error - unable to read lfuse properly. Programmer may not be reliable. avrdude: safemode: To protect your AVR the programming will be aborted . т.е он типа не может прочесть фьюзы защиты и все останавливает!? . Да и каждый раз меняется Device signature: то 00ffff, ff00ff, 00ff00 ну и в таком духе! А было 1e920A . Это что? я чемто запорол мк? и можно ли теперь еще как то помочь делу? . Зарание признателен за конструктивные коментарии.
@dorofieiev-dys8 жыл бұрын
Инет пишет шо сие из-за того что разные скорости у моего программатора и мк, т.е. мк не поспевает за программатором! И че терь делать?
@narodstream5528 жыл бұрын
Вы, видимо, неправильно выставили фьюзы. С ними надо поаккуратней. Нужно сначала их считать было, а потом уже всякие делители ставить. Теперь даже не знаю что и делать.
@dorofieiev-dys8 жыл бұрын
Через ардуино асп не получается и с усбасп тоже пока затык, народ хелп ...!!!!
@dorofieiev-dys8 жыл бұрын
Фьюзы считывал, + сверял с интернет-калькулятором фьюзов! но вот так получилось! теперь репу чухаю, по инету лажу ... заодно хочу разобраться теперь с купленным усбапсом, до этого использовал ардуино-асп. но усбасп пока не видится синапрогом ... дрова в винде стали ... так шо отовсюду затык ...
@dorofieiev-dys8 жыл бұрын
фюз менял один LF с 62 на E3
@andreyparovozz6 жыл бұрын
А это, не могу понять, что лучше. Необходимо в течение какого-то времени (в течение секунда) подсчитывать импульсы с геркона. Вот как лучше - включить счетчик на внешний такт на секунду, а сами спать. Потом подсчитать количество импульсов. Или тактировать от МК и высчитать время между двумя импульсами от геркона. Смущают следующие вещи: в первом случае необходимо городить RC цепочку с целью подавления дребезга. Вроде у 16 битного есть какой-то фильтр. во втором случае сможем ли мы спать? Ведь во сне генератор встаёт. Юзать сторожевой, который и так занят? Можно ли считать, сколько натикал сторожевой таймер? На работе даташит посмотрю, конечно, сегодня спать уже нада))))
@nicifor95557 жыл бұрын
Непонятно с делителем. Сначала "Разделим 8000000 на 32768, получим приблизительно 244,14. Вот с такой частотой в герцах и будет работать наш таймер, если мы не применим делитель. То есть цифры наши будут меняться 244 раза в секунду, поэтому мы их даже не увидим. " Потом: "нам требуется установить только бит CS12. Так как делитель частоты у нас 256, то на этот делитель мы поделим 8000000, получится 31250, вот такое вот мы и должны занести число в TCNT. До такого числа и будет считать наш таймер, чтобы досчитать до 1 секунды. " Получается 244 раза в секунду не увидим, а 31250 - увидим? или я чего то не понял?
@TheVismoke7 жыл бұрын
Контроллер работающий на частоте 8МГц будет досчитывать в таймере до числа 32768 (10000000 00000000) 244,14 раз в секунду (244,14 Гц), чтоб нам это увидеть, нам надо превратить это в 1 Гц. То есть число 244,14 разделить еще на 244,14. Тогда все будет норм. НО контроллеру нельзя задать произвольный делитель, он оперирует только степенями двойки. Ближайший делитель в этом случае 256. Но опять затык, если мы 244,14 Гц разделим на 256 то получим 0,954 Гц, что меньше 1 Гц и не удовлетворяет условиям задачи. Поэму необходимо подобрать изначальное число такое, которое будет кратно нашему делителю - 256. Поэтому автор берет частоту 8МГц и делит его 256, получает 31250 (0111101000010010). Это то число, до которого данный таймер, при данной частоте контроллера будет досчитывать 256 раз в секунду, чтоб это увидеть нам необходимо установить делитель частоты в 256, что и делается установкой бита CS12. Чет объяснять не мое похоже.
@andreuandreu39267 жыл бұрын
Таймер/ счетчик считает тактовые импульсы от генератора. Частота нашего генератора 8МГц. За 1секунду счетчик досчитает до 8000000. Если мы разделим 8000000 на 256, то получим что за 1 секунду счетчик досчитает до 31250. p.s. Автору огромное спасибо за уроки.
@astronom1007 жыл бұрын
делитель как бы замедляет частоту... 8мгц превращается в 32.768Кгц, есть даже кварцы часовые с подобной частотой.. www.chipdip.ru/news/32768hz-quartz-resonators
@Wip857 жыл бұрын
В интернете и на ютубе подобного нет.
@dj_granderzplay73637 жыл бұрын
А как мне выставить точное врема с етими таймерами потомучто в етих цыфрах непонят мне нужно точно знать каое будет время. Как же быть?
@vedgray97737 жыл бұрын
ну я так и понял. потому что по datasheet WGM12 на b3
@vedgray97737 жыл бұрын
и зачем эти мучения, если есть программное управление временем?
@narodstream5527 жыл бұрын
Затем, что программное - всегда затраты. А аппаратное - надёжность и оптимальность. Если Вы не про это, то конкретно сформулируйте вопрос: 1) Какие именно мучения 2) Альтернатива 3) Минусы мучения 4)Плюсы альтернативы.
@vedgray97737 жыл бұрын
Ну например. В ардуино есть функция millis() которая отсчитывает количество миллисекунд с момента включения микроконтроллера. Я не знаю как она реализована внутри, но думаю что там используется время программно. А мучения в том смысле, что нужно под каждый микропроцессор писать разный код. Охота так, написал функцию и чтобы она была годна для всех железок Тем более уроки по Си
@narodstream5527 жыл бұрын
Да ничего страшного, не развалимся. Заодно и потренеруемся в программировании.
@vedgray97737 жыл бұрын
Так получается же индусский код.
@narodstream5527 жыл бұрын
Мы изучаем работу таймера и использование его регистров. Пока речь не идёт о красоте.
@kosmos84603 жыл бұрын
Так и не завёлся на атмеге 328Р
@tryelectronics2 жыл бұрын
Почему? У меня на ней всё отлично запустилось. Просто стоит писать код в соответствие с даташитом именно 328P.
@ВалерийСоколов-м8ы4 жыл бұрын
неужели у нас нет специалистов в цифровой схемотехнике, знающие английский. Нужен перевод даташита на русский. Без этого мы будем кувыркаться и толку не будет.
@romik56084 жыл бұрын
Уже перевели. Причем давно. we.easyelectronics.ru/AVR/dokumentaciya-po-avr-mikrokontrolleram-vse-na-russkom.html 31 пункт. Рабочая ссылка в комментариях.
@vedgray97737 жыл бұрын
дошло до меня что такое 1
@plut388 жыл бұрын
Меня в таких преподавательских видосах всегда поражал усыпительный потенциал) Попробуйте так "преподавать" в аудитории: студенты или уснут или соотношение С/Ш будет не в пользу препода.
@narodstream5528 жыл бұрын
+plut 38 Отлично! Значит можно рекомендовать мои уроки еще как средство от бессонницы.
@fetkz8 жыл бұрын
Про С/Ш зачет!)))
@-M-a-m-a-6 жыл бұрын
иди и спи или водку пей. или ключ тебе на 45 и в гавнищу гайки крутить, не нравится не смотри, смотри видео про ушлёпков, оно весёлое
@АШЕРДАН6 жыл бұрын
Большое спасибо, отличные уроки, ничего не меняйте, я психов в институте наслушался.
@romik56084 жыл бұрын
А что такое это загадочное соотношение С/Ш ?
@ПавелГеворков-п2л5 жыл бұрын
Я вынужден! поставить лайк и оставить коммент. Но вы задолбали со своим ++ рукож.пы. Даешь ассемблер!
@ldSt33455 жыл бұрын
Господи сколько ж воды, а! Весь смысл можно было уложить в минут десять, смотреть даже на скорости 1.5 затруднительно
@narodstream5525 жыл бұрын
А ничего, что уже 4 года прошло? Всё-таки надо закрывать комментирование. Люди уже не смотрят на давность и все равно кидают какие-то дешёвые предъявы. Жалко конечно нормальных посетителей будет, но что поделаешь.
@igor02425 жыл бұрын
@@narodstream552 не обращайте внимание на идиотов!!! Низкий поклон Вам за эти уроки!!! Учусь ими взахлёб! ОЧЕНЬ ХОРОШО, что они в таком формате, где каждое движение записано и лазенее по даташиту! Именно этого не хватает в разных обучалках!!!
@igor02425 жыл бұрын
@@narodstream552 кстати возник вопрос. Я то чайник прямо сейчас, а урок записан 4 года назад )) TCCR1B |= (1
@romik56084 жыл бұрын
@@igor0242 WGM12 - это бит номер 3 в регистре TCCR1B (это в даташите написано). Когда мы в студии при открытии нового проекта выбираем тип контроллера, то студия автоматически подгружает файл описания для данного контроллера. В этом файле есть строчка вроде такой: #define WGM12 3 А это директива компилятору заменить в тексте программы WGM12 на цифру 3. Следовательно, строчка TCCR1B |= (1