Да, правильно. ))) Температуру показывает без проблем на индикаторе и даже сравнивает с заданной, но в приделах положительных отлично, а вот с отрицательными беда... . Я конвертирую до целых, просто откинув все десятые и т.п.
он выдает температуру как есть и отрицательную температуру в дополнительном коде, т.е. в старшем бите байта появляется единица.
Вообще-то, ЕМНИП, там не только в старшем байте единица (вот в датчике DHT22 - там да, только единица), а вообще там нормальный дополнительный код, т.е. все старшие разряды в единице.
Всё, что с полученным оттуда 16-битным числом нужно сделать для получения "чистой" температуры в цельсиях - это всего лишь сдвинуть его влево 4 раза (это для DS18B20, а для DS1820 - один раз). Я в ассемблере не силён, но вроде это ASR для старшего байта и LSR + заёмом из C для младшего. А потом уже этот младший байт можно и сравнивать с порогом в ZUUM
rcall READBYTE ; Читаем первый байт (он будет в ДАТЕ)
mov XL, DATA ; Закидывааем значение первого байта в младший регистр Х
rcall READBYTE ; Читаем второй байт (он будет в ДАТЕ)
mov XH, DATA ; Закидывааем значение второго байта в старший регистр Х
; ---------- ПРЕОБРАЗУЕМ И ВЫВОДИМ НА ИНДИКАТОР ----------
swap XH ; Переворачиваем полубайты местами andi XH, 0xF0 ; Накладываем маску, остаются только старшие 4 бита swap XL ; Переворачиваем младшие полубайты местами andi XL, 0x0F ; Накладываем маску, остаются только младшие 4 бита
add XH, XL ; Складываем, в итоге получается готовая температура в XH
rcall CONVERTBYTE ; Забиваем значения для единиц, десятков и сотен
Все верно, отрезаем все лишнее и остается один байт температуры. Все просто.
З.Ы. Причем в ZUUM он тоже закидывает отрицательные в таком же формате (в дополнительном коде), т.к. вывод на индикатор у них один и тот же, и отображает все корректно.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср ноя 18, 2015 14:58:08
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Поставте точку останова в этом условии и поглядите какие реальные значения в регистрах, какие флаги. Может проблема в другом месте, например забыли регистра сохранить в обработчике прерывания.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Все правильно вы сказали, так и было раньше, пока не начал эксперименты... Поменял местами, выдрал и перетащил в более логичное место программы. Все пашет! Я в восторге! Дай Вам всем, кто откликнулся вселенная здоровья и денег побольше.
Почти понял, но не понял... Вы предлагаете альтернативный вариант, как выделить один байт... Я почему-то всегда думал, что add не складывает реально, а просто объединяет две половинки...
Помогите начинающему! Скачал ASM Editor как советуют в книжке Ревича, накатил туда компилятор с AVR Studio 4. Но не как не могу получить .hex файл! Он за место них .obj выдаёт. Помогите! Что делать? В книжке об этом ничего не написано. На AVR Studio программировать не хочу, слишком много лишнего.
П.С. Компилятор пишет No errors, просто создаёт .obj заместо .hex
Если вы сейчас собираетесь писать на асме, лучше AVR-Studio 4.19 ничего нет. Я с AVR уже почти 10 лет работаю, так что поверьте мне. Есть еще одна альтернатива. IAR. Но в IAR на асме я программы не писал, только на си.
Мне очень сильно избыточен функционал AVR Studio. Пробывал писать в ASM Editor и сразу понравился его минимализм, всё просто и понятно - создал файлик, написал, скомпилировал и всё. А в AVR Studio куча непонятных окошек, каких то настроек, симуляторов. Создать проект и скомпилировать код тот ещё квест. Мне не нужна вся эта мишура, я просто хочу помигать светодиодом
Может существует такие же IDE как ASM Editor для AVR? Чтоб можно было просто код писать, как в блокноте но с нумерацией строк и без всяких лишних окошечек чья функция для меня загадка. А лучше с ASM Editor помогите разобратся...
О какой избыточности вы говорите? В студии есть все, что требуется. И ничего лишнего. И редактор и симулятор. Ну и так далее. Никакого квеста. Необходимый набор инструментов. Вы хотите в один файлик? Это только если светодиодиком поморгать. Как только пойдут более-менее серьезные проекты, вам придется научиться модульности программ. Не надо ничего усложнять. AVR-Studio 4.19 проста как рубанок.
Последний раз редактировалось Demiurg Чт ноя 26, 2015 21:18:07, всего редактировалось 1 раз.
На AVR Studio программировать не хочу, слишком много лишнего.
Никто и не заставляет использовать "лишнее" - ни Студиевский редактор, ни замечательный его симулятор . Написал в своем любимом редакторе исходник, парой кликов мышью создал проект - и вы уже в Хопре - компилируй, получай и hex, и obj, и lst - в зависимости от настроек. Создать файл данных для записи в EEPROM - да сколько угодно. А если прога чуть сложнее 'помигать диодами' - отладка в Студии - прямо сказка. И Про Те Усы можно не вспоминать. В общем, не надо бояться человека с ружьем АВР-Студии - она очень хорошая и доброжелательная даже к новичкам
Есть еще один аргумент против ASM Editor'а - как видно из последних постов, количество пользователей этого редактора намного меньше, чем той же студии, или IAR'а, а значит и подсказку получить труднее.
Проблему ASM Editora решил, там в батнике не тот параметр стоял. Поправил и всё заработало.
Возникли вопросы про работу программы на ассемблере. Вот код:
Код:
.include "C:\avrtools\Appnotes\tn13def.inc" ; Библиотека для Тини13 SBI DDRB, 1 ; Настройка порта SBIC PINB, 0 ; Если пин 0 порта В в лог. единице, то выполняем следующую команду. Если лог. нуле то пропускаем. SBI PORTB, 1 ; пин 1 установка SBIS PINB, 0 ; если на пине 0 нет сигнала то пин 1 в ноль CBI PORTB,1
Программа гасит и зажигает светодиод по кнопке. Всё прекрасно работает.
Вопросы: 1) Почему она зациклина? Получается когда счётчик команд в мк доходит до конца помяти то он прыгает в начало т.е. аппаратно находится в цикле? Думал что программа дойдёт до последней команды и остановится, а не прыгнет обратно на первую. 2) Почему этот код вообще работает? Тут нет векторов прерываний в начале, не установлен начальный адрес. Просто сразу идёт код. 3) Что за дериктива .device? Что именно она делает? А то в inc файлах уже покапался, а с device непонятно.
DEVICE - Определить устройство для которого компилируется программа Директива DEVICE позволяет указать для какого устройства компилируется программа. При использовании данной директивы компилятор выдаст предупреждение, если будет найдена инструкция, которую не поддерживает данный микроконтроллер. Также будет выдано предупреждение, если программный сегмент, либо сегмент EEPROM превысят размер допускаемый устройством. Если же директива не используется то все инструкции считаются допустимыми, и отсутствуют ограничения на размер сегментов.
Если прерывания не используются, то допустимо их не указывать.
По первому вопросу не могу ниче вразумительного сказать. Вообще-то так не принято. Все делают бесконечный цикл. Может ваш компилятор посчитал, что его надо вставить и сделал это сам. Может так и есть, если дошел до конца памяти, то прыгает на начало (или сбрасывается, что скорее всего). Однако, это сильно криво, так делать.
Да и в железе, если даже по умолчанию стоит у МК 1 МГц тактовая, все равно на кнопку реагировать должна как попало.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения