Страница 59 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 14:03:26
Jack_A
YurkaM писал(а):
Более того, это можно ещё сократить до: . . .
Микроконтроллер - очень тепеливое животное. Ему можно скормить и вот такой код :
clr r17
ori r17,1
ori r17,2
ori r17,4
ori r17,8
cp r16,r17
вместо cpi r16,0xF ( это не фантазия - сам читал реальный код, аффтар не из нашего форума ).
Человек, получив такой текст, не выдержал бы : "Да пошел ты с таким кодом ...., программер хренов!" - а МК терпеливо вздыхая и крутя пальцем у виска. выполняет.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 14:14:28
avreal
YurkaM писал(а):Более того, это можно ещё сократить до:
Варианты с LDI/LDI/LD и LDS приблизительно равноправны.
В первом на два байта больше кода, но это если дальше нет других обращений к другим регистрам.
Скажем, дождались сигнала на ножке и пишем что-то в порт, тогда в порт можно записать по LDD со смещением при уже готовом адресе.
И тогда уже может быть экономия.
Т.е. это место зависит от послдующего кода, которого я не видел, а вот спагетти из переходов совершенно непонятно.
А
правильно это место сокращать до того, что напишет ассемблерщик или скомпилирует С-компилятор,
как я сказал там --
http://radiokot.ru/forum/viewtopic.php? ... 60#p670200 :
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 15:27:58
Civil
а вот спагетти из переходов совершенно непонятно.
В защиту Баскома должен сказать, что между командами переходов должно было находится тело цикла (которого у меня нет). Тогда первый переход выбрасывает нас за пределы цикла в случае, если условие изначально неверно, и не позволяет ни разу выполнится коду тела.
Может пора сказать "ну его" и перейти на С ?
По сути это первый в моей практике случай, когда требуется оптимизация кода по времени. А памяти в современных МК ИМХО и так достаточно.
В любом случае оптимизация с любого языка закончится ассемблером, хотя бы для того, чтобы убедиться, что компилятор создал оптимальную конструкцию : )
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 17:03:18
Sounds
Подскажите как мне посчитать количество символов в любом числе?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 18:31:57
Gudd-Head
Sounds писал(а):Подскажите как мне посчитать количество символов в любом числе?
Что значит символов в числе???
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 18:42:51
Sounds
например число 23 состоит из двух символов, число 9 состоит из одного символа, а число 45687 состоит из пяти символов.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 18:48:18
ibiza11
так вы же сами сейчас посчитали кол-во символов в числе, что же у нас спрашиваете?
... какие вопросы, такие и ответы) телепаты в отпуске)
в какой среде? как представлены числа? все ведь зависит от программиста. он может и каждый бит числа раскидать по разным регистрам. задайте вопрос конкретно.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 18:57:24
Sounds
надо программно посчитать сколько знаков хранится в переменной типа int и floar
то есть числа представлены в десятичном виде и хранятся в переменных с типами int и floar
среда разработки CodeVisionAVR, надо зделать вставки на ассемблере с этими функциями, которые надо как-то написать!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс янв 09, 2011 21:13:16
Gudd-Head
Sounds писал(а):int и floar
Насколько я знаю, функции (s)printf возвращают количество символов.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 12:07:56
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 у них один.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 12:24:58
Meteor
stima, сделайте так
in tmp, timsk
ldi temp,(1<<ocie1a)
or temp, tmp
out timsk, temp
все станет по местам и будете иметь в работе оба таймера
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 12:52:43
stima
Идею понял, но чисто ради научного интереса, почему не работает та запись которую я указал?) Да и это получается лишний регистр. И можно ли в одном таймере (например таймер/каунтер 1 для атмега

использовать 2 состояния, анпример оверфлов и прерывание покомпаратору?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 13:36:38
Gudd-Head
stima писал(а):почему не работает та запись которую я указал?)
Потому что во второй раз вы тупо загружаете в регистр новое значение, а надо делать чтение-модификацию-запись. В пользу СиЛабовских 8051 могу сказать, что логические операции там можно делать прямо с регистрами ввода-вывода

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 14:13:56
Meteor
stima писал(а): Да и это получается лишний регистр...
Желаете сэкономить на регистре? Нет проблем, все что надо - разрешать работу обоих таймеров в одной команде
ldi temp,(1<<ocie1a)|(1<<toie0)
out timsk, temp
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 14:51:22
stima
2Meteor Спасибо
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 17:34:22
stima
Так что насчет сдвоенной функции прерывания. В моем случае я хочу использовать таймер/каунтер1 в атмеге8 как счетчик секунд и счетчик "мигания" сдвоенного индикатора (я посмотрел там 2 компаратора). Да и если это возможно, то как обойти приходящую в голову проблему: мирцание должно быть частотой выше 25 Гц (я где-то читал поряда 75Гц), а секунда это СК/прескалинг. Т.е. он сделает несколько миганий в каждом переходе (т.е. показания следующией секунды). СК - внутреннийгенератор на 8МГц
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн янв 10, 2011 17:37:14
Meteor
Не очень понятно что хотите сделать с таймером Т1.
В Т1 можно реализовать 3 события - преполнение, сравнение А и сравнение В.
При этом надо понимать что интервалы А и В не могут быть больше чем интервал переполнения.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс янв 16, 2011 16:06:48
itmaker
Может ли кто нибудь помочь с таким вопросом:
мне нужно чтобы контроллер с регистра считал четырёхзначный код
и использовал только вторую цифру кода
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс янв 16, 2011 16:11:35
itmaker
Есть 2 вопроса:
Как сделать так чтобы данные принятые с ком порта
сохранялись в нужном регистре?
В регистре 4 х значный код, мне в расчётах нужна только одна из цифр,
как указать какую цифру использовать?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс янв 16, 2011 16:19:51
Meteor
Делаю обычно так в настройках указываю начальный адрес (ОЗУ, но можно и регистра).Обмен начинается с преамбулы, которая не меняется (признак начала)
Затем в обработке прерывания по принятому байту пишу (после распознавания преамбулы)
in temp, udr
st Z+, temp
В итоге все данные упорядочены-читаем как надо\хотим
При приеме новой преамбулы указываю начальный адрес.