Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Мikа »

Я не знаю, почему у вас так подгорело, но

sbIs - это инструкция относительно ПОРТА
sbRc - это инструкция относительно РЕГИСТРА

Через SBIC и SBIS я пропускаю именно одну инструкцию. Да, PC+1.

SBIS PinC,0 ;Если бит в порту C номером 0 установлен - пропустить следующую инструкцию
rjmp an_action ;Пропуская эту инструкцию, мы выполним всё то, что находится под ней до метки an_action

Если вы пишете команду SBIS или SBIC, которая посмотрит, что там в ПОРТУ, то надо писать PinX,#
Если вы пишете команду SBI или CBI, которая изменит значение нужного пита в ПОРТУ, надо писать PortX,#

А вот команды-комманды - это да.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
nirq
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение nirq »

Чтоб у нас ничего не подгорало, надо прекращать мыслить словами (наборами букв либо звуков) и начинать мыслить их смыслом.

Какой смысл вкладываем в слово ПОРТ?
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Alexeyslav »

Да, тут имеется некоторая путаница в терминологии. Портами называют специальное адресное пространство в МК и так же физический порт. Так вот команды контроллера работают ТОЛЬКО с регистрами из адресного пространства портов ввода-вывода, которые в документации называют ПОРТАМИ. Физический порт управляется именно этими регистрами.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Kavka »

Мikа писал(а):Через SBIC и SBIS я пропускаю именно одну инструкцию. Да, PC+1.
Именно инструкцию! И вовсе не обязательно +1 машинное слово (инструкция может быть из двух маш.слов).
Точнее PC+1 это когда нет пропуска, а PC+2 или PC+3, когда пропускается следующая инструкция.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Мikа »

Под словом ПОРТ я понимаю ФИЗИЧЕСКИЙ ПОРТ, состоящий из какого-то количества ПИНОВ, то есть ног.

Но вопрос так и остался без ответа :(

Хотя, исходя из того, что сказал Alexeyslav выходит, что что бы там ни было физически на ноге МК, если в регистр, управляющий этим портом записана 1, она так и останется единицей, когда команда SBIC или SBIS будет проверять состояние этой ноги. Вернее бита, отвечающего за состояние этой ноги. Верно? И если тупо и понятно, то эти инструкции при совпаении условия пропустят следующую строчку в программе?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Alexeyslav »

Для МК не существует такого понятия как порт, он оперирует только регистрами. Одни регистры доступны непосредственно в АЛУ, другие через общее адресное пространство - это называется RAM, а есть еще одна особая область регистров, которая называется портами ввода-вывода. Представляет она собой всё те же регистры, только доступные через специальную команду.

Ты можешь записать что-то в такой регистр или считать с него - выглядит всё снаружи как запись\чтение в RAM. записываешь к примеру в регистр PORTx значение - и тем самым косвенно устанавливаешь режим работы аппаратного порта. С этого же регистра можно СЧИТАТЬ значение - это такая же ячейка как и RAM но конкретно для этого регистра это исключение. Вот именно из-за исключений их и называют портами ввода-вывода. Например тот же самый регистр PINx. Несмотря на то что это регистр доступа к физическому порту в него никто не запрещает попытаться записать, и в этом случае в новой ревизии МК происходит инвертирование указанных маской битов регистра PORTx !!!
Очень важно понять эту абстракцию - регистры это ячейки памяти в которые что записал то и считал, а вот порты ввода-вывода имеют особую конфигурацию и функции чтения и записи разделены аппаратно. и так еж важно понять, что потами называются именно эти порты ввода-вывода, через которые в том числе и осуществляется доступ к физическим портам посредством манипуляции с битами этих портов ввода-вывода.
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4965
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Seriyvolk »

Если речь конкретно про считывание PINx, то считанное будет напрямую зависеть от состояния ноги. Даже если ножка сконфигурирована на выход, и в DDRx записана единица, то при КЗ на землю этой ножки из PINx считается ноль. Проверено лично (случайно, конечно, но сути не меняет).
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Alexeyslav »

На этот счет даташит даёт однозначный ответ - на считывание PINx берет значение непосредственно с ножки. Запись на старых ревизиях ничего не делает, а на новых - инвертирует соответствующие биты в PORTx
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение akl »

Alexeyslav писал(а):Запись на старых ревизиях ничего не делает, а на новых - инвертирует соответствующие биты в PORTx
Уточню, у ATtinyXXX, AT90usbXXX, ATmega48() - в DS есть фраза, приведённая ниже, а у ATmega8, ATmega8515 - такой фразы нет.
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 в вопросах и ответах

Сообщение Мikа »

Теперь всё понятно, относительно моего вопроса, большое спасибо.

Собственно, вот что я хотел услышать.
Seriyvolk писал(а):Если речь конкретно про считывание PINx, то считанное будет напрямую зависеть от состояния ноги. Даже если ножка сконфигурирована на выход, и в DDRx записана единица, то при КЗ на землю этой ножки из PINx считается ноль. Проверено лично (случайно, конечно, но сути не меняет).


Но и относительно конструкции портов новое озарение, что тоже немаловажно:)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Satar15
Родился
Сообщения: 1
Зарегистрирован: Вт окт 07, 2014 21:48:26

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Satar15 »

Всем доброго времени суток! недавно начал осваивать ассемблер atmega8535. возник вопрос... как на двух индикаторах (HG1 и HG2) поставить разные числа?
сначала ставлю биты на оба индикатора, потом через "out portc , r16" ставлю значение... но оно появляется на обоих индикаторах
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Pink-Pank »

Быстрым переключением между индикаторами нужных значений
Fucking static initialization order fiasco
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение pyzhman »

Satar15 писал(а):сначала ставлю биты на оба индикатора

Нужно на разные. Сначала снимаем выбор со второго индикатора, выбираем первый и выставляем на нём данные через тот самый портС. Потом снимаем выбор первого индикатора, выбираем второй и выставляем на нём данные через портС. Такой перебор нужно делать (в случае двух индикаторов) не реже 10мс. Это называется динамическая индикация.
Docendo discimus
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

Satar15 писал(а):как на двух индикаторах (HG1 и HG2) поставить разные числа?

Схема, схема?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
alexan9er
Открыл глаза
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение alexan9er »

Скажите пожалуйста, как делается задержка типа сишного delay_ms в ассемблерном коде в серьезных системах?
Допустим мне надо переждать дребезг кнопки.
Крутить пустой цикл мне кажется топорным решением. Как делают в реальном боевом коде?
nirq
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение nirq »

таймер прерывания
в интернете набираем.

Не по кнопке "цитата", а в интернете. В другом интернете.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Pink-Pank »

Допустим мне надо переждать дребезг кнопки.
Крутить пустой цикл мне кажется топорным решением. Как делают в реальном боевом коде?

В реальном боевом коде именно так и делают. И ничего топорного в этом нет.
Если программа ждет и ничего не делает, то какая ей разница, цикл там или таймер? К тому же, таймер может быть занят под другие нужды.
Если во время ожидания нужно делать что-то полезное, то самый очевидный вариант - система флагов и отдельная переменная для счета циклов основной программы (желательно, чтобы мейн-цикл также имел фиксированное время выполнения, например запускался по таймеру).
Fucking static initialization order fiasco
nirq
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение nirq »

переждать дребезг кнопки
А вот это так делают в боевом говнокоде, и за это таких вояк называют "погромист" от слова "победитель (глюков, багов, дребезга, здравого смысла, надёжности, цены и сроков)".

антидребезг
в интернете, ну ты понял
а вон кто-то уже, смарю, и вентилятор тащит... погнали чуваки за антидребезг! давай прям тут, прям щас и начнём! свежая же гармонь.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

nirq писал(а):а вон кто-то уже, смарю, и вентилятор тащит... погнали чуваки за антидребезг! давай прям тут, прям щас и начнём!

вентилятор, положим, вы и притащили... но раз просите - начнем :)

программист от быдлокодера отличается тем, что всегда применяет наиболее удобные, эффективные и простые методы для достижения решения поставленной задачи. при этом его не смущает ни применение goto, ни задержек пустыми циклами - его вообще ничего не смущает!

а говонокод всегда получается, если не вникнув в суть задачи некто начинает применять "правильные" решения. от непонимания их правильности код превращается в сшитый паутинками пиджак - как не осторожничай, носить нельзя, ибо разлезается при малейшем шевелении.

в контексте затронутой проблемы антидребезга: существующие наиболее популярные 2 метода решения проблемы (пережидание дребезга и метод периодического опроса) следует применять только при осознании соответствующей необходимости, и тогда результат будет качественный. попытка втулить "во что бы то ни стало" какой-то один метод в любой проект скорее приведет к говнокоду.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
alexan9er
Открыл глаза
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение alexan9er »

Способ с флагами мне понравился, но вот что смущает - я обрабатываю нажатие кнопки по внешнему прерыванию, если засекать время по счётчику параллельно крутящегося таймера то не может ли он успеть несколько раз прокрутиться с переполнением и у меня получится ложное срабатывание?
И второй вопрос, как продолжение первого - я видел код, где пауза выполнена как длинная последовательность nop-ов. Это тоже приемлимо? Или правильнее посчитать исходя из рабочей часототы количество тактов и прокрутить их в цикле? Вы так расчитываете паузы?
Ответить

Вернуться в «AVR»