Программирование МК AVR. Урок 10. Таймеры-счетчики. Прерывания

  Рет қаралды 60,639

narod stream

narod stream

Күн бұрын

Пікірлер: 166
@ВячеславСартисон
@ВячеславСартисон 5 жыл бұрын
Запустил код на mega 328P заменив TIMSK на TIMSK1 все заработало! Спасибо за урок!
@eugenevladoff2758
@eugenevladoff2758 4 жыл бұрын
Спасибо, это интересно. Прерывания - классная штука!
@zavenhovhannisyan2583
@zavenhovhannisyan2583 5 жыл бұрын
Глобальная переменная i по умолчанию ровна 0. Вместо строк: OCR1AH = 0b01111010; OCR1AL = 0b00010010; можно писать: OCR1A = 31250; Автору респект: чувствуется закалка в ассемблере :)
@ПетрКонстантинов-с7т
@ПетрКонстантинов-с7т 2 жыл бұрын
согласен)))),тока я бы не стал вставлять функции в прерывания!!!,зачем выскакивать по сто раз.
@Yupitrer
@Yupitrer 6 жыл бұрын
Чувак ты крутой!!! Спасибо тебе за пролитый свет науки
@ВячеславСартисон
@ВячеславСартисон 5 жыл бұрын
Вот и я до игрался с фьюзами ! Хотел частоту выставить 8МГц . на m328P . А avrdude3.3 каким -то образом поставила мне все нули во фьюзах. А я прошил не проверив. Все кирпич! Благо запасная плата есть. Продолжаю учиться. Потом микросхему перепаяю или JTAG программатор соберу. Всем удачи!
@kosmos8460
@kosmos8460 3 жыл бұрын
А вообще этот код работает на AVR 328 ?
@budnirekruta
@budnirekruta 4 жыл бұрын
в прошлом уроке еще хоть что то было понятно, а в этом как будто подслушал разговор двух продвинутых программистов
@adapters_StarKey
@adapters_StarKey 5 жыл бұрын
Спасибо за уроки. Огромное.
@Wip85
@Wip85 7 жыл бұрын
Здравствуйте регулярно смотрю ваше уроки по программированию МК. Не большая просьба сделайте видео о там как работать с даташитами МК. Хотя бы важные параметры. Спасибо за уроки
@paracelsushohenheim519
@paracelsushohenheim519 6 жыл бұрын
kzbin.info/www/bejne/np61d5atpNOJfcU вот профессиональный препод об этом говорит (о работе контроллера)
@lastmorning9409
@lastmorning9409 5 жыл бұрын
Формат "почитаю даташит на мк вместе со зрителями". Лайк.
@narodstream552
@narodstream552 5 жыл бұрын
Дело в том, что многие не знают, как читать техническую документацию и очень много вопросов потом из-за этого возникает. Основная масса вопросов возникает конечно из-за незнания языка вообще, поэтому и был начат новый курс. Кстати урок выйдет сегодня. А многие ещё и злятся, когда я вместо ответа посылаю читать техническую документацию. Даже не представляете, сколько таких.
@lastmorning9409
@lastmorning9409 5 жыл бұрын
@@narodstream552 Очень много. я вот из 2ста страничного даташита от атмега328 осилил страниц 8
@korobokinos
@korobokinos 8 жыл бұрын
Спасибо за урок.
@narodstream552
@narodstream552 8 жыл бұрын
И Вам спасибо за внимание к каналу!
@tem_ruslan
@tem_ruslan 8 жыл бұрын
Спасибо за видео, очень помог
@andreyparovozz
@andreyparovozz 7 жыл бұрын
Прерывания! Скоро мы станем настоящими кодерами!
@forextraders9105
@forextraders9105 9 жыл бұрын
сколько всего нужно знать.
@dargindarginec9561
@dargindarginec9561 3 жыл бұрын
Приветствую, ни как не могу разобраться с кодом по ШИМ и ADC поможете?
@ЭндиДюфрейн-ь3я
@ЭндиДюфрейн-ь3я 2 жыл бұрын
как сделать прерывания таймера в библиотеке? и как вывести ее в главную функию?
@vais1000
@vais1000 4 жыл бұрын
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)
@forextraders9105
@forextraders9105 9 жыл бұрын
сколько всего нужно знать.....
@TheWladberlin
@TheWladberlin 2 жыл бұрын
Спасибо за урок, но - Как то Вы про регистр TCNTn не совсем точно выразились - "хранит" (4:40). Вернее сначала Вы поправились, что он не хранит, но потом почему-то снова начали утверждать, что "он хранит". Нет, конечно на самом деле он ничего не хранит - это просто 8 или 16 битный счетчик, в нем идет, независимо ни от чего, беспрерывный цикл. В зависимости от настроек, число это постоянно сравнивается с регистром OCRn - в котором как раз и "хранится" заданное число, с которым надо сравнивать.
@Жуликнавальнерзеленоеебло
@Жуликнавальнерзеленоеебло 8 жыл бұрын
привет а как ты подружил atmel studio и avrdudeprog на 31:32 ?
@narodstream552
@narodstream552 8 жыл бұрын
+RioesanIsidro Об этом есть в более ранних уроках.
@Жуликнавальнерзеленоеебло
@Жуликнавальнерзеленоеебло 8 жыл бұрын
ок попробую найти
@leatherbald
@leatherbald 5 жыл бұрын
Подскажите как записать если делитель 1024 нужен. Спасибо
@hubby5
@hubby5 4 жыл бұрын
Странно. В пртее кнопка всеравно останавливает счет. Или я ошибся ?
@DrargonsM
@DrargonsM 9 жыл бұрын
Позновательное видео!
@тураразимхан
@тураразимхан 6 жыл бұрын
здравствуйте в portd все однерки можете по подробнее обьяснить
@kiss6843
@kiss6843 7 жыл бұрын
Скажите пожалуйста, а почему Вы использовали ТCCR1B, а не ТCCR1А?! Могли бы Вы еще сделать уроки по режимам счетчика? Благодарю!
@leatherbald
@leatherbald 5 жыл бұрын
Потому что именно в регистре В делитель указывается
@ВладимирМалышев-х4ж
@ВладимирМалышев-х4ж 7 жыл бұрын
Здравствуйте. В ATmega328P есть регистры OCR0B, OCR0A у меня вопрос, если будет установлен режим сброс при совпадении, а значения в регистрах будут разные, получается что счётчик не дойдёт до второго числа в котором число больше и будет всё время сбрасываться? Как они работают?
@MrDacnick
@MrDacnick 7 жыл бұрын
Ну и смысл этого мучения? таймер Т2 (мега 16, для остальных- смотрим даташит)ставим в асинхронный режим, выбираем источник его тактирования- часовой кварц, предделитель- 128, разрешаем прерывания по его переполнению- и имеем на выходе строго 1 Гц. Причем в отличии от предложенного примера это уже источник счета для часов реального времени. А для 16-ти битного таймера с его регистрами сравнения наверняка найдется лучшее применение
@Смок_Беллью
@Смок_Беллью 8 жыл бұрын
Здравствуйте, спасибо за видео! Вопрос: каким способом реализовать сброс/паузу счётчика?
@narodstream552
@narodstream552 8 жыл бұрын
+Василий Клименко Ну по идее сбросом или установкой определенных битов в определенных регистров определенного таймера. Подумать надо.
@Смок_Беллью
@Смок_Беллью 8 жыл бұрын
+narod stream Выходит это не очень и нужно в реальных программах, раз с ходу не скажете?
@romik5608
@romik5608 4 жыл бұрын
Теоретически, остановить счетчик можно отключив предделитель. Для этого записать нули в биты CSn0, CSn1 и CSn2 регистра TCCRn. Только что при этом произойдет - просто остановка счета или остановка счета со сбросом счетчика - нужно проверять.
@AlekseiChip
@AlekseiChip 7 жыл бұрын
У меня при сборке вылетают два предупреждения 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-dys
@dorofieiev-dys 8 жыл бұрын
весьма доходчиво и полезно! вот бы еще пообъемней и по подробней!
@narodstream552
@narodstream552 8 жыл бұрын
Ну тут уж не угодишь. Кто-то говорит, что слишком длинные уроки, надо кратко. Ютуб вообще говорит что оптимальное время видеоролика 2 минуты
@dorofieiev-dys
@dorofieiev-dys 8 жыл бұрын
ага, программирование за 2 минуты ...
@peter_savelev
@peter_savelev 8 жыл бұрын
+narod stream спасибо вам за ваш труд!
@narodstream552
@narodstream552 8 жыл бұрын
Peter Savelev а Вам спасибо за оценку!
@leonid_kolissetskiy
@leonid_kolissetskiy 7 жыл бұрын
Все хорошо, НО. половину текста вы себе под нос бурчите многое не понятно. Такое ощущение что тут одни профессионалы сидят. Делайте не один урок, 2-3 не длинных. Но с доходчивым объяснением. А то думаешь что вот наконец то начал понимать. Блин а тут опять вы что-то без объяснения дописываете.
@ДмитроПерший
@ДмитроПерший 8 жыл бұрын
Я так понимаю, что таймеры-счётчики используются, когда нужно подсчитать что нибудь за определённый промежуток времени. Меня интересует обычный подсчёт количества прямоугольных импульсов (лог 1), которые подаются на входящий порт для суммирования количества оборотов коленчатого вала за период с момент запуска до момента останова двигателя. Подскажите алгоритм, как мне использовать прерывания (одно или два), потому как амплитуда импульсов одинакова, а частота отличается (сигнал с ЭБУ на тахометр, усиленный ОУ). Спасибо.
@narodstream552
@narodstream552 8 жыл бұрын
завести глобальные переменные для счётчиков, запустить таймер с определенным значением регистров и мониторить флаг окончания счёта таймера в циклах. Вроде простой алгоритм. А какие именно регистры, в этом видео всё есть.
@ДмитроПерший
@ДмитроПерший 8 жыл бұрын
Ок, спасибо!
@ДмитроПерший
@ДмитроПерший 8 жыл бұрын
Добрый день. Подскажите, бывали ли у Вас случаи, когда Протеус не верно работает с прошивкой? В чём суть. Я написал простенький код по подсчёту количества импульсов на Т0. Чип АТтини2313. Функция прерывания увеличивает значение переменной на единицу каждый раз, когда счётчик переполнен. Протестировал в Протеусе схему с сегментированным индикатором. В качестве импульсов - кнопка на массу. Всё работает, МК считает и выводит индикацию - 1, 2, 3 и т.д. до 9. Но если в качестве кнопки я использую другой МК для формирования прямоугольных импульсов, почему то симуляция не работает (ошибки не выдаёт). Вы сталкивались с подобными проблемами в Протеусе?
@narodstream552
@narodstream552 8 жыл бұрын
Добрый день. С подобными не сталкивался, но сталкивался с многими другими. Поэтому если что-то не идет в протеусе, я всегда пробую на настоящем контроллере.
@ДмитроПерший
@ДмитроПерший 8 жыл бұрын
Нужно будет приобрести монтажную плату и программатор.
@АлександрСветлый-х1я
@АлександрСветлый-х1я 5 жыл бұрын
Подскажите пожалуйста, для обработки внешнего прерывания с кнопки нужно использовать ISR(INT0_vector) или нужно читать бит INTF0 регистра GIFR? Благодарю.
@romik5608
@romik5608 4 жыл бұрын
Зависит от того, что мы хотим. ISR вызывается сразу, как произойдет условие. А для чтения бита для начала нужно дождаться, пока дойдет очередь до выполнения участка кода с чтением бита регистра. А в больших программах это ожидание может занять довольно много времени. Поэтому если скорость обработки внешнего условия критична - используем прерывание, если не критична - читаем регистр.
@anton66649
@anton66649 8 жыл бұрын
Из урока мне почти все понятно, кроме одного момента. Правильно ли я понимаю? Суть в том, что все , что находится между ISR (TIMER1_COMPA_vect) и }, выполняется, как бы параллельно основному коду? На аппаратном уровне? В этом суть?
@RoxReview
@RoxReview 7 жыл бұрын
Когда выполняется обработчик прерывания ISR (TIMER1_COMPA_vect){ }, то основной код останавливается, и как только обработчик выполнил все команды внутри себя, то идёт возврат к основному коду с того места, где он остановился.
@Анекдотыототца
@Анекдотыототца 9 жыл бұрын
Спасибо автору позновательное видео))
@Vivavatnik
@Vivavatnik 7 жыл бұрын
Спасибо!
@_Iokanaan_Marusidze_
@_Iokanaan_Marusidze_ 8 жыл бұрын
помогите пожалуйста настроить таймер ATmega328 T1 -16 разрядный частота тактирования - 16МГц режим - fastPWM - как сделать знаю мне надо чтобы период срабатывания по переполнению был равен ровно 2мс играюсь с предделителем но ничего не получается подскажите пожалуйста методику как правильно это сделать
@vedgray9773
@vedgray9773 7 жыл бұрын
А что такое H и L ? Нight и Low? Верхний и нижний регистр
@Vitalij306
@Vitalij306 7 жыл бұрын
Здравствуйте. Подскажите пожалуйста можно этот код в оригинальном виде реализовать в среде разработки codevision avr. Если можно то как?
@narodstream552
@narodstream552 7 жыл бұрын
Здравствуйте! В оригинальном наверно никак. CVAVR грешен использованием дополнительных библиотек, а студия любит, чтобы их писали сами.
@Vitalij306
@Vitalij306 7 жыл бұрын
narod stream Спасибо за информацию
@alekskapitonov2738
@alekskapitonov2738 3 жыл бұрын
Спасибо
@vovanstukov6518
@vovanstukov6518 7 жыл бұрын
Подскажите пожалуйста такой вопрос . Как сделать 1 кнопкой переключать порты - 1 нажатие 1 порт в единицу , 2 нажатие , 2 порт . Длительное нажатие более 3 секунд . отключает текущий порт (переводит его в ноль.)
@narodstream552
@narodstream552 7 жыл бұрын
В принципе, здесь можно использовать режимы, как мы делаем в часах со светодиодным индикатором.
@vovanstukov6518
@vovanstukov6518 7 жыл бұрын
Счётчик задать на опрос порта кнопки ?
@lastmorning9409
@lastmorning9409 5 жыл бұрын
А можно настроить шим так, чтоб функция из arduino tone() давал сигнал на двух пинах и в противофазе? кстати подпишусь
@narodstream552
@narodstream552 5 жыл бұрын
На STM можно, на AVR не пробовал.
@sergeystal15
@sergeystal15 5 жыл бұрын
я не понял что это за число 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;
@sergeystal15
@sergeystal15 5 жыл бұрын
@@РамазанХайбуллин спасибо.
@romik5608
@romik5608 4 жыл бұрын
@@РамазанХайбуллин Хм.. А почему не 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ь
@НиколайАлексенцев-ж6ь 4 жыл бұрын
А если программа в прерывании по времени таймера , превысит тайменг следующего прерывания ... То что будет ?
@romik5608
@romik5608 4 жыл бұрын
Что-то мне подсказывает, что ничего хорошего не будет :( Наверное, вечное прерывание.
@yuriysayfutdinov665
@yuriysayfutdinov665 7 жыл бұрын
Класс!) спасибо Автору за его труды, особенно за narodstream.ru/avr-urok-10-tajmery-schetchiki-preryvaniya/
@eucliwoodheadshot704
@eucliwoodheadshot704 6 жыл бұрын
а откуда берётса время из _delay_ms откуда оно насчитывать?
@narodstream552
@narodstream552 6 жыл бұрын
для этого мы объявляем частоту тактирования контроллера.
@eucliwoodheadshot704
@eucliwoodheadshot704 6 жыл бұрын
Я имею в веду в случае с таймерами мы время вычисляем с помощью делителей и прерывания. А как контролер время ничвонеделания вычислял.
@narodstream552
@narodstream552 6 жыл бұрын
Именно по частоте тактировения. Попробуйте её не объявить и использовать задержку. У Вас будет ошибка сборки.
@eucliwoodheadshot704
@eucliwoodheadshot704 6 жыл бұрын
Я имел в веду в каком процессе атмега отрабатывает это время, это происходит в каком-то особом таймере? И ли есть кокой-то внутренний счётчик времени который следит за временем отдельно от тех которые пытается создать разработчик? Веть программ должна с каким-то физическим элементом взаимодействовать , и вот с каким ? именно это я хотел уточнить, кто считает время в этом случае. И сколько максимального времени он может насчитать
@narodstream552
@narodstream552 6 жыл бұрын
В конечном цикле с помощью серии операций "NOP"
@VasyaPupkinus
@VasyaPupkinus 9 жыл бұрын
Здрасти. Назрело пару вопросов. Можно ли в один вектор прерывания засовывать несколько функций, например опрос кнопок и вывод данных на экран. Это нормальная практика или лучше так не делать? И второй вопрос: как можно принудительно завершить действия в векторе и выйти из него?
@narodstream552
@narodstream552 9 жыл бұрын
+Вася Пупкин можно конечно, особенно если есть уверенность что управимся до вызова нового прерывания.
@narodstream552
@narodstream552 9 жыл бұрын
+Вася Пупкин принудительное завершение действий смотря каких. не совсем понятно.
@VasyaPupkinus
@VasyaPupkinus 9 жыл бұрын
+narod stream вопрос снят, код удалён как не благонадёжный хоть и рабочий. Ждём видео по управлению шаговиком ))
@anton66649
@anton66649 8 жыл бұрын
То есть, одно прерывание, может прервать действие другого прерывания? То есть, я правильно понимаю, контроллер "возится", где не будь в цикле тела, затем происходит прерывание по кнопке и начинает выполнятся какое то действие(условно говоря №1), при этом это действие не успевает выполнится, так как сработало другое прерывание и начинает выполнятся другое действие(условно Действие №2). Так вот, после выполнения Действия №2, контроллер вернется к выполнению основного кода, а Действие №1 так и останется не выполненным, я правильно понимаю? Как с этим можно бороться, если такое происходит?
@astronom100
@astronom100 7 жыл бұрын
в прерываниях приоритеты есть.. Где выше приоритет, то прерывание и выполняется в первую очередь..
@vedgray9773
@vedgray9773 7 жыл бұрын
TCCR1B |= (1
@narodstream552
@narodstream552 7 жыл бұрын
Начните изучение с битовых сдвигов. Единица - это байт, который мы сдвигаем. То есть сдвигаемый операнд всегда стоит слева в операции. А WGM12 - 'это число, на которое мы сдвигаем левый операнд, то есть единицу. Две птички, повёрнутые на запад - это направление, в котором мы производим сдвиг. Вот он и результат. Мы сдвинули единицу влево на WGM12. Я не знаю, какое именно число WGM12, но это легко посмотреть, кликнув по нему правой кнопочкой мышки и выбрав надлежащий путнкт, по которому Вы попадёте в файл, где он будет описан. Но я точно знаю, что это цифра, не превышающая 7. Например, если он равен 3, то мы сдвинем единицу на 3, тем самым включим 3 бит (получим число 00001000), если равен 0, то вообще не сдвинем, тем самым останется включенным нулевой бит (получим число 00000001) и так далее. Этот вопрос многие путают, потому что уроки надо смотреть с самого начала. Все думают, что мы сдвигаем WGM12. Но это со временем пройдёт. Есть симулятор, приучайтесь им пользоваться и смотрите результаты.
@alexconstructor9368
@alexconstructor9368 6 жыл бұрын
А как можно проверять до скольки досчитал таймер - проверять TCNT1H + TCNT1L ?? Неподскажите как грамотно сделать неполучается ?
@deos_87
@deos_87 6 жыл бұрын
Рекомендуют считывать сначала TCNT1L в регистр, а затем TCNT1H в другой регистр - именно такой порядок, потому что TCNT1L меняется значительно чаще TCNT1H - все таки это два 8-разрядных регистра 16-разрядного двоичного счетчика. Еще необходимо учесть задержки на обработку прерывания, по которому вы начинаете считывать значение из TCNT, ведь за время циклов переходов регистр таймера может насчитать лишние такты. Лучше всего прочитайте "даташит" на ваш контроллер.
@never.m1nd
@never.m1nd 7 жыл бұрын
Спасибо за уроки! Возникли вопросы некоторые Раз таймеров всего три и задержки использовать нежелательно, как быть если... Допустим собираем часы карманные, нажимаем кнопку - индикация горит 2 секунды - (считает таймер?), чтоб зайти в меню установки времени допустим нужно удерживать кнопку какую нибудь 1 сек - (тоже какой то таймер должен считать?), плюс индикация динамическая тоже на таймере. Я к тому, что как эти интервалы времени правильно прописывать, раз уж таймеров всего три? Если мне нужно будет 5-10 отсчетов времени
@romik5608
@romik5608 4 жыл бұрын
Запускаем таймер. Вызываем прерывание по переполнению или по сравнению. А уже в самом прерывании вводим дополнительные переменные, которые переключаем в 1 через условных 10, 100, 1000 и т.д. вызовов данного прерывания. А уже в основной программе следим за этими переменными и от того, взведены ли они что-то делаем, а затем сбрасываем их в ноль (сброс тоже делаем в основной программе). Таким образом на одном таймере можно использовать несколько переменных для разных отрезков времени. Конечно, это не будут особо точные промежутки, но для целей отслеживания нажатия кнопки, или динамической индикации вполне подойдут.
@ДенБельский-н5ю
@ДенБельский-н5ю 7 жыл бұрын
скажите, а как реализовать не на 256 деление, а на 1024???
@ДмитроПерший
@ДмитроПерший 7 жыл бұрын
В регистры CS12 и CS10 записать единицы.
@bukx3464
@bukx3464 8 жыл бұрын
Респект за видео! классная манера изложения так держать! Извините за ламерский вопрос, не могу сообразить. допустим мы хотим сочетать время сколько времени удерживается кнопка, нажатие на кнопку (вызывает внешние прерывание). получается что если мы обрабатываем прерывание от кнопки, прерывание от таймера блокируются? можно конечно считать кол-во циклов while (кнопка == true) { i++; } (ну это как то не серьезно) а можно по прерыванию от таймера проверять нажатие на кнопку(тогда вопрос синхронизации и точность когда кнопка отпустилась ).
@narodstream552
@narodstream552 8 жыл бұрын
Спасибо! С этим не заморачивался.
@maxdanilov1840
@maxdanilov1840 8 жыл бұрын
Здравствуйте. Меня интересует следующий вопрос. А почему бы не сделать свой собственный делитель, используя переменную, которая будет увеличиваться на 1 при вызове функции таймера? Весь дальнейший код будет выполняться при условии достижения этой переменной определенного значения. Это я к слову о 8-битном таймере)
@narodstream552
@narodstream552 8 жыл бұрын
+Max Danilov Конечно можно. Только когда это происходит на аппаратном уровне, вызывается обработчик прерывания автоматически.
@rul-p3t
@rul-p3t 7 жыл бұрын
Всем большой привет и спасибо большое автору за статью! У одних все получается сразу, у других по немного. А у меня как то не выходит. Создал новый проект, вставил полный код этого проекта, но у меня прерывание возникает почему то не в 1 секунду, а где то в 2 - 3 минуты. Это я про дебаггер атмел студии. Оптимизация Q1. Где может нужно настройки студии подправить? что не так, не понимаю. Таймер Т0 я уже настроил, работает, SPI тоже запустил. Снова застрял на первом таймере. как то так выходит, что и в железе, и в студии работает неверно. подскажите косяк, пожалуйста.
@ИванИванович-н9ы
@ИванИванович-н9ы 7 жыл бұрын
часто на форумах рекомендуют не доверять дебагеру, потому что он может обрабатывать не так, как это будет делать контроллер. заливайте по окончанию код в протеус, не забыв при этом поставить в свойствах контроллера частоту 8 мгц.
@VasyaPupkinus
@VasyaPupkinus 9 жыл бұрын
Здрасти. Помучав таймер Т0 на атмеге8, пришёл к выводу что он самый убогий.Сброс только по переполнению и настроить его можно только делителем. Я правильный вывод сделал?
@narodstream552
@narodstream552 9 жыл бұрын
+Вася Пупкин Совершенно верно. А вот атмега 32 - это другое дело. Там данный регистр есть и соответственно нулевой таймер там способен несколько на большее, в частности там уже включаются все 4 режима, существующие в таймере 2 - Normal, PWM, Phase Correct и Fast PWM.
@VasyaPupkinus
@VasyaPupkinus 9 жыл бұрын
+narod stream 32-я это хорошо. Но есть жменька мег8, их нужно извести). Ещё вопросик, вектора COMP и OVF , это первый при совпадении второй при переполнении?
@narodstream552
@narodstream552 9 жыл бұрын
Ну да. В таблице 18 в даташите на атмегу 8 так и указано.
@VasyaPupkinus
@VasyaPupkinus 9 жыл бұрын
+narod stream Кстати , число сравнения вроде можно записать просто OCR1A = 65535; не деля его на OCR1AH и OCR1AL . Разница есть?
@narodstream552
@narodstream552 9 жыл бұрын
Видимо, нет. Я просто не смотрел полностью реализацию записи в регистры в библиотеке Interrupt. Можете поставить точку останова и посмотреть изменения регистров в окне IO View. Я привык старший и младший бит заносить отдельно для совместимости с ассемблерным кодом.
@buchfreler1290
@buchfreler1290 7 жыл бұрын
Вы сказали что МК должен постоянно работать, что ему нельзя даже пол секунды ничем не заниматься. Почему? С чем это связано?
@narodstream552
@narodstream552 7 жыл бұрын
Тоже прочитал где-то в каком-то учебнике, уже, честно говоря и не помню.
@andreyparovozz
@andreyparovozz 7 жыл бұрын
Delay на машинном коде заменяется NOP (ничего не делать). Говорят, что бесчисленное количество NOP в коде - это один из способов хакерской атаки. Но это явно не наш случай)). Если промежутки ожидания велики, то логично процессор усыпить. Если надо подождать 10-20 машинных тактов, то процессор переводится в режим ожидания. 2-3 машинных такта пропускаются NOP ами. Просто потому, что процессор из сна и режима ожидания выходит не сразу - какое-то количество тактов пропускается.
@Guraba333
@Guraba333 4 жыл бұрын
В отличие от ПК ,микроконтроллер после выполнения программы не может передать управление ОС(операционной системе) за неимением таковой и не может начать выполнять другую программу.Все действия должны быть прописаны в одной программе и чтобы микроконтроллер мог всегда реагировать на какие-то события программа никогда не должна завершаться, поэтому при написании программы для микроконтроллера всегда должен использоваться бесконечныйцикл.
@dorofieiev-dys
@dorofieiev-dys 8 жыл бұрын
Вопрос немного не по теме ... Решил сменить тактовую частоту мк - снизить до 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-dys
@dorofieiev-dys 8 жыл бұрын
Инет пишет шо сие из-за того что разные скорости у моего программатора и мк, т.е. мк не поспевает за программатором! И че терь делать?
@narodstream552
@narodstream552 8 жыл бұрын
Вы, видимо, неправильно выставили фьюзы. С ними надо поаккуратней. Нужно сначала их считать было, а потом уже всякие делители ставить. Теперь даже не знаю что и делать.
@dorofieiev-dys
@dorofieiev-dys 8 жыл бұрын
Через ардуино асп не получается и с усбасп тоже пока затык, народ хелп ...!!!!
@dorofieiev-dys
@dorofieiev-dys 8 жыл бұрын
Фьюзы считывал, + сверял с интернет-калькулятором фьюзов! но вот так получилось! теперь репу чухаю, по инету лажу ... заодно хочу разобраться теперь с купленным усбапсом, до этого использовал ардуино-асп. но усбасп пока не видится синапрогом ... дрова в винде стали ... так шо отовсюду затык ...
@dorofieiev-dys
@dorofieiev-dys 8 жыл бұрын
фюз менял один LF с 62 на E3
@andreyparovozz
@andreyparovozz 6 жыл бұрын
А это, не могу понять, что лучше. Необходимо в течение какого-то времени (в течение секунда) подсчитывать импульсы с геркона. Вот как лучше - включить счетчик на внешний такт на секунду, а сами спать. Потом подсчитать количество импульсов. Или тактировать от МК и высчитать время между двумя импульсами от геркона. Смущают следующие вещи: в первом случае необходимо городить RC цепочку с целью подавления дребезга. Вроде у 16 битного есть какой-то фильтр. во втором случае сможем ли мы спать? Ведь во сне генератор встаёт. Юзать сторожевой, который и так занят? Можно ли считать, сколько натикал сторожевой таймер? На работе даташит посмотрю, конечно, сегодня спать уже нада))))
@nicifor9555
@nicifor9555 7 жыл бұрын
Непонятно с делителем. Сначала "Разделим 8000000 на 32768, получим приблизительно 244,14. Вот с такой частотой в герцах и будет работать наш таймер, если мы не применим делитель. То есть цифры наши будут меняться 244 раза в секунду, поэтому мы их даже не увидим. " Потом: "нам требуется установить только бит CS12. Так как делитель частоты у нас 256, то на этот делитель мы поделим 8000000, получится 31250, вот такое вот мы и должны занести число в TCNT. До такого числа и будет считать наш таймер, чтобы досчитать до 1 секунды. " Получается 244 раза в секунду не увидим, а 31250 - увидим? или я чего то не понял?
@TheVismoke
@TheVismoke 7 жыл бұрын
Контроллер работающий на частоте 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. Чет объяснять не мое похоже.
@andreuandreu3926
@andreuandreu3926 7 жыл бұрын
Таймер/ счетчик считает тактовые импульсы от генератора. Частота нашего генератора 8МГц. За 1секунду счетчик досчитает до 8000000. Если мы разделим 8000000 на 256, то получим что за 1 секунду счетчик досчитает до 31250. p.s. Автору огромное спасибо за уроки.
@astronom100
@astronom100 7 жыл бұрын
делитель как бы замедляет частоту... 8мгц превращается в 32.768Кгц, есть даже кварцы часовые с подобной частотой.. www.chipdip.ru/news/32768hz-quartz-resonators
@Wip85
@Wip85 7 жыл бұрын
В интернете и на ютубе подобного нет.
@dj_granderzplay7363
@dj_granderzplay7363 7 жыл бұрын
А как мне выставить точное врема с етими таймерами потомучто в етих цыфрах непонят мне нужно точно знать каое будет время. Как же быть?
@vedgray9773
@vedgray9773 7 жыл бұрын
ну я так и понял. потому что по datasheet WGM12 на b3
@vedgray9773
@vedgray9773 7 жыл бұрын
и зачем эти мучения, если есть программное управление временем?
@narodstream552
@narodstream552 7 жыл бұрын
Затем, что программное - всегда затраты. А аппаратное - надёжность и оптимальность. Если Вы не про это, то конкретно сформулируйте вопрос: 1) Какие именно мучения 2) Альтернатива 3) Минусы мучения 4)Плюсы альтернативы.
@vedgray9773
@vedgray9773 7 жыл бұрын
Ну например. В ардуино есть функция millis() которая отсчитывает количество миллисекунд с момента включения микроконтроллера. Я не знаю как она реализована внутри, но думаю что там используется время программно. А мучения в том смысле, что нужно под каждый микропроцессор писать разный код. Охота так, написал функцию и чтобы она была годна для всех железок Тем более уроки по Си
@narodstream552
@narodstream552 7 жыл бұрын
Да ничего страшного, не развалимся. Заодно и потренеруемся в программировании.
@vedgray9773
@vedgray9773 7 жыл бұрын
Так получается же индусский код.
@narodstream552
@narodstream552 7 жыл бұрын
Мы изучаем работу таймера и использование его регистров. Пока речь не идёт о красоте.
@kosmos8460
@kosmos8460 3 жыл бұрын
Так и не завёлся на атмеге 328Р
@tryelectronics
@tryelectronics 2 жыл бұрын
Почему? У меня на ней всё отлично запустилось. Просто стоит писать код в соответствие с даташитом именно 328P.
@ВалерийСоколов-м8ы
@ВалерийСоколов-м8ы 4 жыл бұрын
неужели у нас нет специалистов в цифровой схемотехнике, знающие английский. Нужен перевод даташита на русский. Без этого мы будем кувыркаться и толку не будет.
@romik5608
@romik5608 4 жыл бұрын
Уже перевели. Причем давно. we.easyelectronics.ru/AVR/dokumentaciya-po-avr-mikrokontrolleram-vse-na-russkom.html 31 пункт. Рабочая ссылка в комментариях.
@vedgray9773
@vedgray9773 7 жыл бұрын
дошло до меня что такое 1
@plut38
@plut38 8 жыл бұрын
Меня в таких преподавательских видосах всегда поражал усыпительный потенциал) Попробуйте так "преподавать" в аудитории: студенты или уснут или соотношение С/Ш будет не в пользу препода.
@narodstream552
@narodstream552 8 жыл бұрын
+plut 38 Отлично! Значит можно рекомендовать мои уроки еще как средство от бессонницы.
@fetkz
@fetkz 8 жыл бұрын
Про С/Ш зачет!)))
@-M-a-m-a-
@-M-a-m-a- 6 жыл бұрын
иди и спи или водку пей. или ключ тебе на 45 и в гавнищу гайки крутить, не нравится не смотри, смотри видео про ушлёпков, оно весёлое
@АШЕРДАН
@АШЕРДАН 6 жыл бұрын
Большое спасибо, отличные уроки, ничего не меняйте, я психов в институте наслушался.
@romik5608
@romik5608 4 жыл бұрын
А что такое это загадочное соотношение С/Ш ?
@ПавелГеворков-п2л
@ПавелГеворков-п2л 5 жыл бұрын
Я вынужден! поставить лайк и оставить коммент. Но вы задолбали со своим ++ рукож.пы. Даешь ассемблер!
@ldSt3345
@ldSt3345 5 жыл бұрын
Господи сколько ж воды, а! Весь смысл можно было уложить в минут десять, смотреть даже на скорости 1.5 затруднительно
@narodstream552
@narodstream552 5 жыл бұрын
А ничего, что уже 4 года прошло? Всё-таки надо закрывать комментирование. Люди уже не смотрят на давность и все равно кидают какие-то дешёвые предъявы. Жалко конечно нормальных посетителей будет, но что поделаешь.
@igor0242
@igor0242 5 жыл бұрын
@@narodstream552 не обращайте внимание на идиотов!!! Низкий поклон Вам за эти уроки!!! Учусь ими взахлёб! ОЧЕНЬ ХОРОШО, что они в таком формате, где каждое движение записано и лазенее по даташиту! Именно этого не хватает в разных обучалках!!!
@igor0242
@igor0242 5 жыл бұрын
@@narodstream552 кстати возник вопрос. Я то чайник прямо сейчас, а урок записан 4 года назад )) TCCR1B |= (1
@romik5608
@romik5608 4 жыл бұрын
@@igor0242 WGM12 - это бит номер 3 в регистре TCCR1B (это в даташите написано). Когда мы в студии при открытии нового проекта выбираем тип контроллера, то студия автоматически подгружает файл описания для данного контроллера. В этом файле есть строчка вроде такой: #define WGM12 3 А это директива компилятору заменить в тексте программы WGM12 на цифру 3. Следовательно, строчка TCCR1B |= (1
@Юляша-в1ж
@Юляша-в1ж 2 жыл бұрын
Огромное спасибо за пояснения
@Serious_Sam
@Serious_Sam 2 жыл бұрын
Спасибо!
Mom Hack for Cooking Solo with a Little One! 🍳👶
00:15
5-Minute Crafts HOUSE
Рет қаралды 23 МЛН
Программирование МК AVR. Урок 7. Кнопка
32:31
ОБЯЗАТЕЛЬНО ПОСМОТРИ! ВСË про ESP32 за 2 МИНУТЫ! ТЕЛЕГА arduino_uno_ws #shorts
2:46
ARDUINO Uno WorkShop - канал про Arduino и прочее
Рет қаралды 2,5 М.