YurkaM писал(а):
Более того, это можно ещё сократить до: . . .
Микроконтроллер - очень тепеливое животное. Ему можно скормить и вот такой код :
clr r17
ori r17,1
ori r17,2
ori r17,4
ori r17,8
cp r16,r17
вместо cpi r16,0xF ( это не фантазия - сам читал реальный код, аффтар не из нашего форума ).
Человек, получив такой текст, не выдержал бы : "Да пошел ты с таким кодом ...., программер хренов!" - а МК терпеливо вздыхая и крутя пальцем у виска. выполняет.
Варианты с LDI/LDI/LD и LDS приблизительно равноправны.
В первом на два байта больше кода, но это если дальше нет других обращений к другим регистрам.
Скажем, дождались сигнала на ножке и пишем что-то в порт, тогда в порт можно записать по LDD со смещением при уже готовом адресе.
И тогда уже может быть экономия.
Т.е. это место зависит от послдующего кода, которого я не видел, а вот спагетти из переходов совершенно непонятно.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
В защиту Баскома должен сказать, что между командами переходов должно было находится тело цикла (которого у меня нет). Тогда первый переход выбрасывает нас за пределы цикла в случае, если условие изначально неверно, и не позволяет ни разу выполнится коду тела.
Может пора сказать "ну его" и перейти на С ?
По сути это первый в моей практике случай, когда требуется оптимизация кода по времени. А памяти в современных МК ИМХО и так достаточно.
В любом случае оптимизация с любого языка закончится ассемблером, хотя бы для того, чтобы убедиться, что компилятор создал оптимальную конструкцию : )
так вы же сами сейчас посчитали кол-во символов в числе, что же у нас спрашиваете?
... какие вопросы, такие и ответы) телепаты в отпуске)
в какой среде? как представлены числа? все ведь зависит от программиста. он может и каждый бит числа раскидать по разным регистрам. задайте вопрос конкретно.
надо программно посчитать сколько знаков хранится в переменной типа int и floar
то есть числа представлены в десятичном виде и хранятся в переменных с типами int и floar
среда разработки CodeVisionAVR, надо зделать вставки на ассемблере с этими функциями, которые надо как-то написать!
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 у них один.
Идею понял, но чисто ради научного интереса, почему не работает та запись которую я указал?) Да и это получается лишний регистр. И можно ли в одном таймере (например таймер/каунтер 1 для атмега использовать 2 состояния, анпример оверфлов и прерывание покомпаратору?
stima писал(а):почему не работает та запись которую я указал?)
Потому что во второй раз вы тупо загружаете в регистр новое значение, а надо делать чтение-модификацию-запись. В пользу СиЛабовских 8051 могу сказать, что логические операции там можно делать прямо с регистрами ввода-вывода
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
stima писал(а): Да и это получается лишний регистр...
Желаете сэкономить на регистре? Нет проблем, все что надо - разрешать работу обоих таймеров в одной команде
ldi temp,(1<<ocie1a)|(1<<toie0)
out timsk, temp
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Так что насчет сдвоенной функции прерывания. В моем случае я хочу использовать таймер/каунтер1 в атмеге8 как счетчик секунд и счетчик "мигания" сдвоенного индикатора (я посмотрел там 2 компаратора). Да и если это возможно, то как обойти приходящую в голову проблему: мирцание должно быть частотой выше 25 Гц (я где-то читал поряда 75Гц), а секунда это СК/прескалинг. Т.е. он сделает несколько миганий в каждом переходе (т.е. показания следующией секунды). СК - внутреннийгенератор на 8МГц
Не очень понятно что хотите сделать с таймером Т1.
В Т1 можно реализовать 3 события - преполнение, сравнение А и сравнение В.
При этом надо понимать что интервалы А и В не могут быть больше чем интервал переполнения.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Делаю обычно так в настройках указываю начальный адрес (ОЗУ, но можно и регистра).Обмен начинается с преамбулы, которая не меняется (признак начала)
Затем в обработке прерывания по принятому байту пишу (после распознавания преамбулы)
in temp, udr
st Z+, temp
В итоге все данные упорядочены-читаем как надо\хотим
При приеме новой преамбулы указываю начальный адрес.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже