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

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

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

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

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

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

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

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

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

Сообщение nirq »

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

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

Сообщение Alexeyslav »

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

Сообщение Kavka »

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

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

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

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

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

Сообщение Alexeyslav »

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

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

Сообщение Seriyvolk »

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

Сообщение Alexeyslav »

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

Сообщение 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.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

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

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

Сообщение Satar15 »

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

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

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

Сообщение pyzhman »

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

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

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

Сообщение alexan9er »

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

Сообщение nirq »

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

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

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

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

Сообщение nirq »

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

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

Сообщение ARV »

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

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

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

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

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

Сообщение alexan9er »

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

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