Ассемблер (ASM) для AVR в вопросах и ответах
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
У DS температура содержится вроде в 2 байтах. Вы правильно в 1 байт конвертируете?
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да, правильно. ))) Температуру показывает без проблем на индикаторе и даже сравнивает с заданной, но в приделах положительных отлично, а вот с отрицательными беда... . Я конвертирую до целых, просто откинув все десятые и т.п.
Станислав
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вообще-то, ЕМНИП, там не только в старшем байте единица (вот в датчике DHT22 - там да, только единица), а вообще там нормальный дополнительный код, т.е. все старшие разряды в единице.СКАЗОЧНИК писал(а):он выдает температуру как есть и отрицательную температуру в дополнительном коде, т.е. в старшем бите байта появляется единица.
Всё, что с полученным оттуда 16-битным числом нужно сделать для получения "чистой" температуры в цельсиях - это всего лишь сдвинуть его влево 4 раза (это для DS18B20, а для DS1820 - один раз). Я в ассемблере не силён, но вроде это ASR для старшего байта и LSR + заёмом из C для младшего. А потом уже этот младший байт можно и сравнивать с порогом в ZUUM
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот так я вытаскиваю температуру из него:
Все верно, отрезаем все лишнее и остается один байт температуры. Все просто.

З.Ы. Причем в 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 он тоже закидывает отрицательные в таком же формате (в дополнительном коде), т.к. вывод на индикатор у них один и тот же, и отображает все корректно.
Станислав
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Поставте точку останова в этом условии и поглядите какие реальные значения в регистрах, какие флаги. Может проблема в другом месте, например забыли регистра сохранить в обработчике прерывания.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
СКАЗОЧНИК
Поменяйте местами операнды
Из описания команды BRLT
cp r16,r1 ; Compare r16 to r1
brlt less ; Branch if r16 < r1 (signed)
...
less: nop ; Branch destination (do nothing)
Поменяйте местами операнды
Код: Выделить всё
cp temp1,ZUUM
; cp ZUUM, temp1
brlt ENN
Из описания команды BRLT
cp r16,r1 ; Compare r16 to r1
brlt less ; Branch if r16 < r1 (signed)
...
less: nop ; Branch destination (do nothing)
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ура!!!! Спасибо всем.
Все правильно вы сказали, так и было раньше, пока не начал эксперименты...
Поменял местами, выдрал и перетащил в более логичное место программы. Все пашет!
Я в восторге!
Дай Вам всем, кто откликнулся вселенная здоровья и денег побольше.
akl писал(а):Поменяйте местами операнды
Все правильно вы сказали, так и было раньше, пока не начал эксперименты...
Поменял местами, выдрал и перетащил в более логичное место программы. Все пашет!
Я в восторге!
Дай Вам всем, кто откликнулся вселенная здоровья и денег побольше.
Станислав
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Код: Выделить всё
swap XH ; Переворачиваем полубайты местами
andi XH, 0xF0 ; Накладываем маску, остаются только старшие 4 бита
swap XL ; Переворачиваем младшие полубайты местами
andi XL, 0x0F ; Накладываем маску, остаются только младшие 4 бита
add XH, XL ; Складываем, в итоге получается готовая температура в XHКод: Выделить всё
andi rab,0xF0 // В rab младшее значение
or temp1,rab // Складываем со старшим
swap temp1 // Меняем местамиК тому же
Код: Выделить всё
add XH, XL ; Складываем, в итоге получается готовая температура в XH- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Почти понял, но не понял...
Вы предлагаете альтернативный вариант, как выделить один байт...
Я почему-то всегда думал, что add не складывает реально, а просто объединяет две половинки...

Вы предлагаете альтернативный вариант, как выделить один байт...
Я почему-то всегда думал, что add не складывает реально, а просто объединяет две половинки...
Станислав
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну да , вспомните как записываются байты получаемые с DS или просто посмотрите. Т.ч трех команд достаточно. Чтобы выделить температуру.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Помогите начинающему! Скачал ASM Editor как советуют в книжке Ревича, накатил туда компилятор с AVR Studio 4. Но не как не могу получить .hex файл! Он за место них .obj выдаёт. Помогите! Что делать? В книжке об этом ничего не написано. На AVR Studio программировать не хочу, слишком много лишнего.
П.С. Компилятор пишет No errors, просто создаёт .obj заместо .hex
П.С. Компилятор пишет No errors, просто создаёт .obj заместо .hex
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Если вы сейчас собираетесь писать на асме, лучше AVR-Studio 4.19 ничего нет. Я с AVR уже почти 10 лет работаю, так что поверьте мне. Есть еще одна альтернатива. IAR. Но в IAR на асме я программы не писал, только на си.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Мне очень сильно избыточен функционал AVR Studio. Пробывал писать в ASM Editor и сразу понравился его минимализм, всё просто и понятно - создал файлик, написал, скомпилировал и всё. А в AVR Studio куча непонятных окошек, каких то настроек, симуляторов. Создать проект и скомпилировать код тот ещё квест. Мне не нужна вся эта мишура, я просто хочу помигать светодиодом
Может существует такие же IDE как ASM Editor для AVR? Чтоб можно было просто код писать, как в блокноте но с нумерацией строк и без всяких лишних окошечек чья функция для меня загадка. А лучше с ASM Editor помогите разобратся...
Может существует такие же IDE как ASM Editor для AVR? Чтоб можно было просто код писать, как в блокноте но с нумерацией строк и без всяких лишних окошечек чья функция для меня загадка. А лучше с ASM Editor помогите разобратся...
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ПТУ-шник писал(а):...
О какой избыточности вы говорите? В студии есть все, что требуется. И ничего лишнего. И редактор и симулятор. Ну и так далее. Никакого квеста. Необходимый набор инструментов. Вы хотите в один файлик? Это только если светодиодиком поморгать. Как только пойдут более-менее серьезные проекты, вам придется научиться модульности программ.
Не надо ничего усложнять. AVR-Studio 4.19 проста как рубанок.
Последний раз редактировалось Demiurg Чт ноя 26, 2015 21:18:07, всего редактировалось 1 раз.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ПТУ-шник писал(а): На AVR Studio программировать не хочу, слишком много лишнего.
Никто и не заставляет использовать "лишнее" - ни Студиевский редактор, ни замечательный его симулятор . Написал в своем любимом редакторе исходник, парой кликов мышью создал проект - и вы уже в Хопре
В общем, не надо бояться человека с ружьем АВР-Студии - она очень хорошая и доброжелательная даже к новичкам
-
Pnjom-Penb
- Мучитель микросхем
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Есть еще один аргумент против ASM Editor'а - как видно из последних постов, количество пользователей этого редактора намного меньше, чем той же студии, или IAR'а, а значит и подсказку получить труднее.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Проблему ASM Editora решил, там в батнике не тот параметр стоял. Поправил и всё заработало.
Возникли вопросы про работу программы на ассемблере. Вот код:
Программа гасит и зажигает светодиод по кнопке. Всё прекрасно работает.
Вопросы:
1) Почему она зациклина? Получается когда счётчик команд в мк доходит до конца помяти то он прыгает в начало т.е. аппаратно находится в цикле? Думал что программа дойдёт до последней команды и остановится, а не прыгнет обратно на первую.
2) Почему этот код вообще работает?
Тут нет векторов прерываний в начале, не установлен начальный адрес. Просто сразу идёт код.
3) Что за дериктива .device? Что именно она делает? А то в inc файлах уже покапался, а с device непонятно.
Возникли вопросы про работу программы на ассемблере. Вот код:
Код: Выделить всё
.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 непонятно.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
"Прекрасно" работает в протеусе или железе?
Станислав
Re: Ассемблер (ASM) для AVR в вопросах и ответах
СКАЗОЧНИК писал(а):"Прекрасно" работает в протеусе или железе?
В железе. Симуляторы не люблю.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
DEVICE - Определить устройство для которого компилируется программа
Директива DEVICE позволяет указать для какого устройства компилируется программа. При использовании данной директивы компилятор выдаст предупреждение, если будет найдена инструкция, которую не поддерживает данный микроконтроллер. Также будет выдано предупреждение, если программный сегмент, либо сегмент EEPROM превысят размер допускаемый устройством. Если же директива не используется то все инструкции считаются допустимыми, и отсутствуют ограничения на размер сегментов.
Если прерывания не используются, то допустимо их не указывать.
По первому вопросу не могу ниче вразумительного сказать. Вообще-то так не принято. Все делают бесконечный цикл. Может ваш компилятор посчитал, что его надо вставить и сделал это сам. Может так и есть, если дошел до конца памяти, то прыгает на начало (или сбрасывается, что скорее всего). Однако, это сильно криво, так делать.
Да и в железе, если даже по умолчанию стоит у МК 1 МГц тактовая, все равно на кнопку реагировать должна как попало.
Директива DEVICE позволяет указать для какого устройства компилируется программа. При использовании данной директивы компилятор выдаст предупреждение, если будет найдена инструкция, которую не поддерживает данный микроконтроллер. Также будет выдано предупреждение, если программный сегмент, либо сегмент EEPROM превысят размер допускаемый устройством. Если же директива не используется то все инструкции считаются допустимыми, и отсутствуют ограничения на размер сегментов.
Если прерывания не используются, то допустимо их не указывать.
По первому вопросу не могу ниче вразумительного сказать. Вообще-то так не принято. Все делают бесконечный цикл. Может ваш компилятор посчитал, что его надо вставить и сделал это сам. Может так и есть, если дошел до конца памяти, то прыгает на начало (или сбрасывается, что скорее всего). Однако, это сильно криво, так делать.

Да и в железе, если даже по умолчанию стоит у МК 1 МГц тактовая, все равно на кнопку реагировать должна как попало.
Станислав

