Страница 234 из 400

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

Добавлено: Ср сен 24, 2014 18:30:58
Мikа
Я не знаю, почему у вас так подгорело, но

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 в вопросах и ответах

Добавлено: Ср сен 24, 2014 19:33:38
nirq
Чтоб у нас ничего не подгорало, надо прекращать мыслить словами (наборами букв либо звуков) и начинать мыслить их смыслом.

Какой смысл вкладываем в слово ПОРТ?

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

Добавлено: Ср сен 24, 2014 19:39:38
Alexeyslav
Да, тут имеется некоторая путаница в терминологии. Портами называют специальное адресное пространство в МК и так же физический порт. Так вот команды контроллера работают ТОЛЬКО с регистрами из адресного пространства портов ввода-вывода, которые в документации называют ПОРТАМИ. Физический порт управляется именно этими регистрами.

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

Добавлено: Ср сен 24, 2014 19:44:00
Kavka
Мikа писал(а):Через SBIC и SBIS я пропускаю именно одну инструкцию. Да, PC+1.
Именно инструкцию! И вовсе не обязательно +1 машинное слово (инструкция может быть из двух маш.слов).
Точнее PC+1 это когда нет пропуска, а PC+2 или PC+3, когда пропускается следующая инструкция.

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

Добавлено: Ср сен 24, 2014 20:45:14
Мikа
Под словом ПОРТ я понимаю ФИЗИЧЕСКИЙ ПОРТ, состоящий из какого-то количества ПИНОВ, то есть ног.

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

Хотя, исходя из того, что сказал Alexeyslav выходит, что что бы там ни было физически на ноге МК, если в регистр, управляющий этим портом записана 1, она так и останется единицей, когда команда SBIC или SBIS будет проверять состояние этой ноги. Вернее бита, отвечающего за состояние этой ноги. Верно? И если тупо и понятно, то эти инструкции при совпаении условия пропустят следующую строчку в программе?

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

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

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

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

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

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

Добавлено: Чт сен 25, 2014 06:31:48
Alexeyslav
На этот счет даташит даёт однозначный ответ - на считывание PINx берет значение непосредственно с ножки. Запись на старых ревизиях ничего не делает, а на новых - инвертирует соответствующие биты в PORTx

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

Добавлено: Чт сен 25, 2014 07:17:48
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.

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

Добавлено: Чт сен 25, 2014 08:57:43
Мikа
Теперь всё понятно, относительно моего вопроса, большое спасибо.

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

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

Добавлено: Вт окт 07, 2014 21:52:33
Satar15
Всем доброго времени суток! недавно начал осваивать ассемблер atmega8535. возник вопрос... как на двух индикаторах (HG1 и HG2) поставить разные числа?
сначала ставлю биты на оба индикатора, потом через "out portc , r16" ставлю значение... но оно появляется на обоих индикаторах

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

Добавлено: Ср окт 08, 2014 07:06:24
Pink-Pank
Быстрым переключением между индикаторами нужных значений

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

Добавлено: Ср окт 08, 2014 08:36:13
pyzhman
Satar15 писал(а):сначала ставлю биты на оба индикатора
Нужно на разные. Сначала снимаем выбор со второго индикатора, выбираем первый и выставляем на нём данные через тот самый портС. Потом снимаем выбор первого индикатора, выбираем второй и выставляем на нём данные через портС. Такой перебор нужно делать (в случае двух индикаторов) не реже 10мс. Это называется динамическая индикация.

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

Добавлено: Ср окт 08, 2014 09:06:54
Gudd-Head
Satar15 писал(а):как на двух индикаторах (HG1 и HG2) поставить разные числа?
Схема, схема?

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

Добавлено: Чт окт 23, 2014 02:45:17
alexan9er
Скажите пожалуйста, как делается задержка типа сишного delay_ms в ассемблерном коде в серьезных системах?
Допустим мне надо переждать дребезг кнопки.
Крутить пустой цикл мне кажется топорным решением. Как делают в реальном боевом коде?

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

Добавлено: Чт окт 23, 2014 03:46:28
nirq
таймер прерывания
в интернете набираем.

Не по кнопке "цитата", а в интернете. В другом интернете.

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

Добавлено: Чт окт 23, 2014 07:06:44
Pink-Pank
Допустим мне надо переждать дребезг кнопки.
Крутить пустой цикл мне кажется топорным решением. Как делают в реальном боевом коде?
В реальном боевом коде именно так и делают. И ничего топорного в этом нет.
Если программа ждет и ничего не делает, то какая ей разница, цикл там или таймер? К тому же, таймер может быть занят под другие нужды.
Если во время ожидания нужно делать что-то полезное, то самый очевидный вариант - система флагов и отдельная переменная для счета циклов основной программы (желательно, чтобы мейн-цикл также имел фиксированное время выполнения, например запускался по таймеру).

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

Добавлено: Чт окт 23, 2014 07:59:03
nirq
переждать дребезг кнопки
А вот это так делают в боевом говнокоде, и за это таких вояк называют "погромист" от слова "победитель (глюков, багов, дребезга, здравого смысла, надёжности, цены и сроков)".

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

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

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

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

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

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

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

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