Ассемблер (ASM) для AVR в вопросах и ответах
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я не знаю, почему у вас так подгорело, но
sbIs - это инструкция относительно ПОРТА
sbRc - это инструкция относительно РЕГИСТРА
Через SBIC и SBIS я пропускаю именно одну инструкцию. Да, PC+1.
SBIS PinC,0 ;Если бит в порту C номером 0 установлен - пропустить следующую инструкцию
rjmp an_action ;Пропуская эту инструкцию, мы выполним всё то, что находится под ней до метки an_action
Если вы пишете команду SBIS или SBIC, которая посмотрит, что там в ПОРТУ, то надо писать PinX,#
Если вы пишете команду SBI или CBI, которая изменит значение нужного пита в ПОРТУ, надо писать PortX,#
А вот команды-комманды - это да.
sbIs - это инструкция относительно ПОРТА
sbRc - это инструкция относительно РЕГИСТРА
Через SBIC и SBIS я пропускаю именно одну инструкцию. Да, PC+1.
SBIS PinC,0 ;Если бит в порту C номером 0 установлен - пропустить следующую инструкцию
rjmp an_action ;Пропуская эту инструкцию, мы выполним всё то, что находится под ней до метки an_action
Если вы пишете команду SBIS или SBIC, которая посмотрит, что там в ПОРТУ, то надо писать PinX,#
Если вы пишете команду SBI или CBI, которая изменит значение нужного пита в ПОРТУ, надо писать PortX,#
А вот команды-комманды - это да.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Чтоб у нас ничего не подгорало, надо прекращать мыслить словами (наборами букв либо звуков) и начинать мыслить их смыслом.
Какой смысл вкладываем в слово ПОРТ?
Какой смысл вкладываем в слово ПОРТ?
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да, тут имеется некоторая путаница в терминологии. Портами называют специальное адресное пространство в МК и так же физический порт. Так вот команды контроллера работают ТОЛЬКО с регистрами из адресного пространства портов ввода-вывода, которые в документации называют ПОРТАМИ. Физический порт управляется именно этими регистрами.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Именно инструкцию! И вовсе не обязательно +1 машинное слово (инструкция может быть из двух маш.слов).Мikа писал(а):Через SBIC и SBIS я пропускаю именно одну инструкцию. Да, PC+1.
Точнее PC+1 это когда нет пропуска, а PC+2 или PC+3, когда пропускается следующая инструкция.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Под словом ПОРТ я понимаю ФИЗИЧЕСКИЙ ПОРТ, состоящий из какого-то количества ПИНОВ, то есть ног.
Но вопрос так и остался без ответа
Хотя, исходя из того, что сказал Alexeyslav выходит, что что бы там ни было физически на ноге МК, если в регистр, управляющий этим портом записана 1, она так и останется единицей, когда команда SBIC или SBIS будет проверять состояние этой ноги. Вернее бита, отвечающего за состояние этой ноги. Верно? И если тупо и понятно, то эти инструкции при совпаении условия пропустят следующую строчку в программе?
Но вопрос так и остался без ответа
Хотя, исходя из того, что сказал Alexeyslav выходит, что что бы там ни было физически на ноге МК, если в регистр, управляющий этим портом записана 1, она так и останется единицей, когда команда SBIC или SBIS будет проверять состояние этой ноги. Вернее бита, отвечающего за состояние этой ноги. Верно? И если тупо и понятно, то эти инструкции при совпаении условия пропустят следующую строчку в программе?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Для МК не существует такого понятия как порт, он оперирует только регистрами. Одни регистры доступны непосредственно в АЛУ, другие через общее адресное пространство - это называется RAM, а есть еще одна особая область регистров, которая называется портами ввода-вывода. Представляет она собой всё те же регистры, только доступные через специальную команду.
Ты можешь записать что-то в такой регистр или считать с него - выглядит всё снаружи как запись\чтение в RAM. записываешь к примеру в регистр PORTx значение - и тем самым косвенно устанавливаешь режим работы аппаратного порта. С этого же регистра можно СЧИТАТЬ значение - это такая же ячейка как и RAM но конкретно для этого регистра это исключение. Вот именно из-за исключений их и называют портами ввода-вывода. Например тот же самый регистр PINx. Несмотря на то что это регистр доступа к физическому порту в него никто не запрещает попытаться записать, и в этом случае в новой ревизии МК происходит инвертирование указанных маской битов регистра PORTx !!!
Очень важно понять эту абстракцию - регистры это ячейки памяти в которые что записал то и считал, а вот порты ввода-вывода имеют особую конфигурацию и функции чтения и записи разделены аппаратно. и так еж важно понять, что потами называются именно эти порты ввода-вывода, через которые в том числе и осуществляется доступ к физическим портам посредством манипуляции с битами этих портов ввода-вывода.
Ты можешь записать что-то в такой регистр или считать с него - выглядит всё снаружи как запись\чтение в RAM. записываешь к примеру в регистр PORTx значение - и тем самым косвенно устанавливаешь режим работы аппаратного порта. С этого же регистра можно СЧИТАТЬ значение - это такая же ячейка как и RAM но конкретно для этого регистра это исключение. Вот именно из-за исключений их и называют портами ввода-вывода. Например тот же самый регистр PINx. Несмотря на то что это регистр доступа к физическому порту в него никто не запрещает попытаться записать, и в этом случае в новой ревизии МК происходит инвертирование указанных маской битов регистра PORTx !!!
Очень важно понять эту абстракцию - регистры это ячейки памяти в которые что записал то и считал, а вот порты ввода-вывода имеют особую конфигурацию и функции чтения и записи разделены аппаратно. и так еж важно понять, что потами называются именно эти порты ввода-вывода, через которые в том числе и осуществляется доступ к физическим портам посредством манипуляции с битами этих портов ввода-вывода.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Если речь конкретно про считывание PINx, то считанное будет напрямую зависеть от состояния ноги. Даже если ножка сконфигурирована на выход, и в DDRx записана единица, то при КЗ на землю этой ножки из PINx считается ноль. Проверено лично (случайно, конечно, но сути не меняет).
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
На этот счет даташит даёт однозначный ответ - на считывание PINx берет значение непосредственно с ножки. Запись на старых ревизиях ничего не делает, а на новых - инвертирует соответствующие биты в PORTx
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Уточню, у ATtinyXXX, AT90usbXXX, ATmega48() - в DS есть фраза, приведённая ниже, а у ATmega8, ATmega8515 - такой фразы нет.Alexeyslav писал(а):Запись на старых ревизиях ничего не делает, а на новых - инвертирует соответствующие биты в PORTx
Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn. Note that the SBI instruction can be used to toggle one single bit in a port.
Чтобы не проколоться нужно справляться конкретно в DS.
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Теперь всё понятно, относительно моего вопроса, большое спасибо.
Собственно, вот что я хотел услышать.
Но и относительно конструкции портов новое озарение, что тоже немаловажно:)
Собственно, вот что я хотел услышать.
Seriyvolk писал(а):Если речь конкретно про считывание PINx, то считанное будет напрямую зависеть от состояния ноги. Даже если ножка сконфигурирована на выход, и в DDRx записана единица, то при КЗ на землю этой ножки из PINx считается ноль. Проверено лично (случайно, конечно, но сути не меняет).
Но и относительно конструкции портов новое озарение, что тоже немаловажно:)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Всем доброго времени суток! недавно начал осваивать ассемблер atmega8535. возник вопрос... как на двух индикаторах (HG1 и HG2) поставить разные числа?
сначала ставлю биты на оба индикатора, потом через "out portc , r16" ставлю значение... но оно появляется на обоих индикаторах
сначала ставлю биты на оба индикатора, потом через "out portc , r16" ставлю значение... но оно появляется на обоих индикаторах
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Быстрым переключением между индикаторами нужных значений
Fucking static initialization order fiasco
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Satar15 писал(а):сначала ставлю биты на оба индикатора
Нужно на разные. Сначала снимаем выбор со второго индикатора, выбираем первый и выставляем на нём данные через тот самый портС. Потом снимаем выбор первого индикатора, выбираем второй и выставляем на нём данные через портС. Такой перебор нужно делать (в случае двух индикаторов) не реже 10мс. Это называется динамическая индикация.
Docendo discimus
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Satar15 писал(а):как на двух индикаторах (HG1 и HG2) поставить разные числа?
Схема, схема?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Скажите пожалуйста, как делается задержка типа сишного delay_ms в ассемблерном коде в серьезных системах?
Допустим мне надо переждать дребезг кнопки.
Крутить пустой цикл мне кажется топорным решением. Как делают в реальном боевом коде?
Допустим мне надо переждать дребезг кнопки.
Крутить пустой цикл мне кажется топорным решением. Как делают в реальном боевом коде?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
таймер прерывания
в интернете набираем.
Не по кнопке "цитата", а в интернете. В другом интернете.
в интернете набираем.
Не по кнопке "цитата", а в интернете. В другом интернете.
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Допустим мне надо переждать дребезг кнопки.
Крутить пустой цикл мне кажется топорным решением. Как делают в реальном боевом коде?
В реальном боевом коде именно так и делают. И ничего топорного в этом нет.
Если программа ждет и ничего не делает, то какая ей разница, цикл там или таймер? К тому же, таймер может быть занят под другие нужды.
Если во время ожидания нужно делать что-то полезное, то самый очевидный вариант - система флагов и отдельная переменная для счета циклов основной программы (желательно, чтобы мейн-цикл также имел фиксированное время выполнения, например запускался по таймеру).
Fucking static initialization order fiasco
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А вот это так делают в боевом говнокоде, и за это таких вояк называют "погромист" от слова "победитель (глюков, багов, дребезга, здравого смысла, надёжности, цены и сроков)".переждать дребезг кнопки
антидребезг
в интернете, ну ты понял
а вон кто-то уже, смарю, и вентилятор тащит... погнали чуваки за антидребезг! давай прям тут, прям щас и начнём! свежая же гармонь.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
nirq писал(а):а вон кто-то уже, смарю, и вентилятор тащит... погнали чуваки за антидребезг! давай прям тут, прям щас и начнём!
вентилятор, положим, вы и притащили... но раз просите - начнем
программист от быдлокодера отличается тем, что всегда применяет наиболее удобные, эффективные и простые методы для достижения решения поставленной задачи. при этом его не смущает ни применение goto, ни задержек пустыми циклами - его вообще ничего не смущает!
а говонокод всегда получается, если не вникнув в суть задачи некто начинает применять "правильные" решения. от непонимания их правильности код превращается в сшитый паутинками пиджак - как не осторожничай, носить нельзя, ибо разлезается при малейшем шевелении.
в контексте затронутой проблемы антидребезга: существующие наиболее популярные 2 метода решения проблемы (пережидание дребезга и метод периодического опроса) следует применять только при осознании соответствующей необходимости, и тогда результат будет качественный. попытка втулить "во что бы то ни стало" какой-то один метод в любой проект скорее приведет к говнокоду.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Способ с флагами мне понравился, но вот что смущает - я обрабатываю нажатие кнопки по внешнему прерыванию, если засекать время по счётчику параллельно крутящегося таймера то не может ли он успеть несколько раз прокрутиться с переполнением и у меня получится ложное срабатывание?
И второй вопрос, как продолжение первого - я видел код, где пауза выполнена как длинная последовательность nop-ов. Это тоже приемлимо? Или правильнее посчитать исходя из рабочей часототы количество тактов и прокрутить их в цикле? Вы так расчитываете паузы?
И второй вопрос, как продолжение первого - я видел код, где пауза выполнена как длинная последовательность nop-ов. Это тоже приемлимо? Или правильнее посчитать исходя из рабочей часототы количество тактов и прокрутить их в цикле? Вы так расчитываете паузы?