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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

YurkaM писал(а): Более того, это можно ещё сократить до: . . .
Микроконтроллер - очень тепеливое животное. Ему можно скормить и вот такой код :

clr r17
ori r17,1
ori r17,2
ori r17,4
ori r17,8
cp r16,r17

вместо cpi r16,0xF ( это не фантазия - сам читал реальный код, аффтар не из нашего форума ).
Человек, получив такой текст, не выдержал бы : "Да пошел ты с таким кодом ...., программер хренов!" - а МК терпеливо вздыхая и крутя пальцем у виска. выполняет.
Реклама
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

YurkaM писал(а):Более того, это можно ещё сократить до:

Код: Выделить всё

label:
    LDS R16,$0030
    BST R16,4
    BRTC label
Варианты с LDI/LDI/LD и LDS приблизительно равноправны.
В первом на два байта больше кода, но это если дальше нет других обращений к другим регистрам.
Скажем, дождались сигнала на ножке и пишем что-то в порт, тогда в порт можно записать по LDD со смещением при уже готовом адресе.
И тогда уже может быть экономия.
Т.е. это место зависит от послдующего кода, которого я не видел, а вот спагетти из переходов совершенно непонятно.

А правильно это место сокращать до того, что напишет ассемблерщик или скомпилирует С-компилятор,
как я сказал там -- http://radiokot.ru/forum/viewtopic.php? ... 60#p670200 :

Код: Выделить всё

label:
    SBIS  $10, 4
    RJMP label
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Реклама
Civil
Встал на лапы
Сообщения: 138
Зарегистрирован: Вс май 16, 2010 01:13:39

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

Сообщение Civil »

а вот спагетти из переходов совершенно непонятно.
В защиту Баскома должен сказать, что между командами переходов должно было находится тело цикла (которого у меня нет). Тогда первый переход выбрасывает нас за пределы цикла в случае, если условие изначально неверно, и не позволяет ни разу выполнится коду тела.
Может пора сказать "ну его" и перейти на С ?
По сути это первый в моей практике случай, когда требуется оптимизация кода по времени. А памяти в современных МК ИМХО и так достаточно.
В любом случае оптимизация с любого языка закончится ассемблером, хотя бы для того, чтобы убедиться, что компилятор создал оптимальную конструкцию : )
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

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

Сообщение Sounds »

Подскажите как мне посчитать количество символов в любом числе?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Sounds писал(а):Подскажите как мне посчитать количество символов в любом числе?
Что значит символов в числе???
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

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

Сообщение Sounds »

например число 23 состоит из двух символов, число 9 состоит из одного символа, а число 45687 состоит из пяти символов.
Реклама
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

так вы же сами сейчас посчитали кол-во символов в числе, что же у нас спрашиваете? :)))

... какие вопросы, такие и ответы) телепаты в отпуске)
в какой среде? как представлены числа? все ведь зависит от программиста. он может и каждый бит числа раскидать по разным регистрам. задайте вопрос конкретно.
Ставим плюсы: )
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

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

Сообщение Sounds »

надо программно посчитать сколько знаков хранится в переменной типа int и floar
то есть числа представлены в десятичном виде и хранятся в переменных с типами int и floar
среда разработки CodeVisionAVR, надо зделать вставки на ассемблере с этими функциями, которые надо как-то написать!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Sounds писал(а):int и floar
Насколько я знаю, функции (s)printf возвращают количество символов.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
stima
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Сб ноя 13, 2010 16:16:45

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

Сообщение stima »

Столкнулся с таким что при инициализации таймеров:

Код: Выделить всё

ldi temp,(1<<toie0)                      ;включаем прерывание по tim0
out timsk,temp         
ldi temp,(1<<cs02)|(1<<cs01)|(0<<cs00)   ;от внешнего генератора
out tccr0,temp

ldi temp,(1<<ocie1a)                      ;включаем прерывание по tim1
out timsk,temp         
ldi temp,(0<<cs02)|(1<<cs01)|(0<<cs00)   ;CK/8
out tccr1b,temp
слетает установка первого таймера (toie0 становится в 0). Это получается нельзя одновременно использовать два таймера?) и как вообще в таких случаях, я посмотрел адресс регистра timsk у них один.
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

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

Сообщение Meteor »

stima, сделайте так
in tmp, timsk
ldi temp,(1<<ocie1a)
or temp, tmp
out timsk, temp
все станет по местам и будете иметь в работе оба таймера
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
stima
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Сб ноя 13, 2010 16:16:45

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

Сообщение stima »

Идею понял, но чисто ради научного интереса, почему не работает та запись которую я указал?) Да и это получается лишний регистр. И можно ли в одном таймере (например таймер/каунтер 1 для атмега 8) использовать 2 состояния, анпример оверфлов и прерывание покомпаратору?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

stima писал(а):почему не работает та запись которую я указал?)
Потому что во второй раз вы тупо загружаете в регистр новое значение, а надо делать чтение-модификацию-запись. В пользу СиЛабовских 8051 могу сказать, что логические операции там можно делать прямо с регистрами ввода-вывода :))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

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

Сообщение Meteor »

stima писал(а): Да и это получается лишний регистр...
Желаете сэкономить на регистре? Нет проблем, все что надо - разрешать работу обоих таймеров в одной команде
ldi temp,(1<<ocie1a)|(1<<toie0)
out timsk, temp
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
stima
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Сб ноя 13, 2010 16:16:45

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

Сообщение stima »

2Meteor Спасибо
stima
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Сб ноя 13, 2010 16:16:45

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

Сообщение stima »

Так что насчет сдвоенной функции прерывания. В моем случае я хочу использовать таймер/каунтер1 в атмеге8 как счетчик секунд и счетчик "мигания" сдвоенного индикатора (я посмотрел там 2 компаратора). Да и если это возможно, то как обойти приходящую в голову проблему: мирцание должно быть частотой выше 25 Гц (я где-то читал поряда 75Гц), а секунда это СК/прескалинг. Т.е. он сделает несколько миганий в каждом переходе (т.е. показания следующией секунды). СК - внутреннийгенератор на 8МГц
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

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

Сообщение Meteor »

Не очень понятно что хотите сделать с таймером Т1.
В Т1 можно реализовать 3 события - преполнение, сравнение А и сравнение В.
При этом надо понимать что интервалы А и В не могут быть больше чем интервал переполнения.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
itmaker
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 11, 2010 13:40:56

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

Сообщение itmaker »

Может ли кто нибудь помочь с таким вопросом:
мне нужно чтобы контроллер с регистра считал четырёхзначный код
и использовал только вторую цифру кода
Что хорошо для меня - полезно для всех! ;)
Аватара пользователя
itmaker
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 11, 2010 13:40:56

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

Сообщение itmaker »

Есть 2 вопроса:

Как сделать так чтобы данные принятые с ком порта
сохранялись в нужном регистре?

В регистре 4 х значный код, мне в расчётах нужна только одна из цифр,
как указать какую цифру использовать?
Что хорошо для меня - полезно для всех! ;)
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

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

Сообщение Meteor »

Делаю обычно так в настройках указываю начальный адрес (ОЗУ, но можно и регистра).Обмен начинается с преамбулы, которая не меняется (признак начала)
Затем в обработке прерывания по принятому байту пишу (после распознавания преамбулы)
in temp, udr
st Z+, temp
В итоге все данные упорядочены-читаем как надо\хотим
При приеме новой преамбулы указываю начальный адрес.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Ответить

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