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

Обсуждаем контроллеры компании Atmel.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

У DS температура содержится вроде в 2 байтах. Вы правильно в 1 байт конвертируете?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Да, правильно. ))) Температуру показывает без проблем на индикаторе и даже сравнивает с заданной, но в приделах положительных отлично, а вот с отрицательными беда... . Я конвертирую до целых, просто откинув все десятые и т.п.
Станислав
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

СКАЗОЧНИК писал(а):он выдает температуру как есть и отрицательную температуру в дополнительном коде, т.е. в старшем бите байта появляется единица.
Вообще-то, ЕМНИП, там не только в старшем байте единица (вот в датчике DHT22 - там да, только единица), а вообще там нормальный дополнительный код, т.е. все старшие разряды в единице.

Всё, что с полученным оттуда 16-битным числом нужно сделать для получения "чистой" температуры в цельсиях - это всего лишь сдвинуть его влево 4 раза (это для DS18B20, а для DS1820 - один раз). Я в ассемблере не силён, но вроде это ASR для старшего байта и LSR + заёмом из C для младшего. А потом уже этот младший байт можно и сравнивать с порогом в ZUUM
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Вот так я вытаскиваю температуру из него:

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


.......

                 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 он тоже закидывает отрицательные в таком же формате (в дополнительном коде), т.к. вывод на индикатор у них один и тот же, и отображает все корректно.
Станислав
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Поставте точку останова в этом условии и поглядите какие реальные значения в регистрах, какие флаги. Может проблема в другом месте, например забыли регистра сохранить в обработчике прерывания.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

СКАЗОЧНИК
Поменяйте местами операнды

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

	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
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Ура!!!! Спасибо всем.
akl писал(а):Поменяйте местами операнды
Все правильно вы сказали, так и было раньше, пока не начал эксперименты...
Поменял местами, выдрал и перетащил в более логичное место программы. Все пашет! :beer: :music:
Я в восторге!
Дай Вам всем, кто откликнулся вселенная здоровья и денег побольше. :)
Станислав
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

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

         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
может как бы не взначай добавить 1 к старшей тетраде
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Почти понял, но не понял...
Вы предлагаете альтернативный вариант, как выделить один байт...
Я почему-то всегда думал, что add не складывает реально, а просто объединяет две половинки... :dont_know: :facepalm: :)
Станислав
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Ну да , вспомните как записываются байты получаемые с DS или просто посмотрите. Т.ч трех команд достаточно. Чтобы выделить температуру.
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Чт янв 01, 2015 16:34:55

Сообщение ПТУ-шник »

Помогите начинающему! Скачал ASM Editor как советуют в книжке Ревича, накатил туда компилятор с AVR Studio 4. Но не как не могу получить .hex файл! Он за место них .obj выдаёт. Помогите! Что делать? В книжке об этом ничего не написано. На AVR Studio программировать не хочу, слишком много лишнего.

П.С. Компилятор пишет No errors, просто создаёт .obj заместо .hex
Это не хвост, это антенна
Сообщения: 1491
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Если вы сейчас собираетесь писать на асме, лучше AVR-Studio 4.19 ничего нет. Я с AVR уже почти 10 лет работаю, так что поверьте мне. Есть еще одна альтернатива. IAR. Но в IAR на асме я программы не писал, только на си.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Чт янв 01, 2015 16:34:55

Сообщение ПТУ-шник »

Мне очень сильно избыточен функционал AVR Studio. Пробывал писать в ASM Editor и сразу понравился его минимализм, всё просто и понятно - создал файлик, написал, скомпилировал и всё. А в AVR Studio куча непонятных окошек, каких то настроек, симуляторов. Создать проект и скомпилировать код тот ещё квест. Мне не нужна вся эта мишура, я просто хочу помигать светодиодом :)

Может существует такие же IDE как ASM Editor для AVR? Чтоб можно было просто код писать, как в блокноте но с нумерацией строк и без всяких лишних окошечек чья функция для меня загадка. А лучше с ASM Editor помогите разобратся...
Это не хвост, это антенна
Сообщения: 1491
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ПТУ-шник писал(а):...
О какой избыточности вы говорите? В студии есть все, что требуется. И ничего лишнего. И редактор и симулятор. Ну и так далее. Никакого квеста. Необходимый набор инструментов. Вы хотите в один файлик? Это только если светодиодиком поморгать. Как только пойдут более-менее серьезные проекты, вам придется научиться модульности программ.
Не надо ничего усложнять. AVR-Studio 4.19 проста как рубанок.
Последний раз редактировалось Demiurg Чт ноя 26, 2015 21:18:07, всего редактировалось 1 раз.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6325
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

ПТУ-шник писал(а): На AVR Studio программировать не хочу, слишком много лишнего.
Никто и не заставляет использовать "лишнее" - ни Студиевский редактор, ни замечательный его симулятор . Написал в своем любимом редакторе исходник, парой кликов мышью создал проект - и вы уже в Хопре :) - компилируй, получай и hex, и obj, и lst - в зависимости от настроек. Создать файл данных для записи в EEPROM - да сколько угодно. А если прога чуть сложнее 'помигать диодами' - отладка в Студии - прямо сказка. И Про Те Усы можно не вспоминать.
В общем, не надо бояться человека с ружьем АВР-Студии - она очень хорошая и доброжелательная даже к новичкам :)
Изображение
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Сообщение Pnjom-Penb »

Есть еще один аргумент против ASM Editor'а - как видно из последних постов, количество пользователей этого редактора намного меньше, чем той же студии, или IAR'а, а значит и подсказку получить труднее.
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Чт янв 01, 2015 16:34:55

Сообщение ПТУ-шник »

Проблему 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 непонятно.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

"Прекрасно" работает в протеусе или железе?
Станислав
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Чт янв 01, 2015 16:34:55

Сообщение ПТУ-шник »

СКАЗОЧНИК писал(а):"Прекрасно" работает в протеусе или железе?
В железе. Симуляторы не люблю.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

DEVICE - Определить устройство для которого компилируется программа
Директива DEVICE позволяет указать для какого устройства компилируется программа. При использовании данной директивы компилятор выдаст предупреждение, если будет найдена инструкция, которую не поддерживает данный микроконтроллер. Также будет выдано предупреждение, если программный сегмент, либо сегмент EEPROM превысят размер допускаемый устройством. Если же директива не используется то все инструкции считаются допустимыми, и отсутствуют ограничения на размер сегментов.

Если прерывания не используются, то допустимо их не указывать.

По первому вопросу не могу ниче вразумительного сказать. Вообще-то так не принято. Все делают бесконечный цикл. Может ваш компилятор посчитал, что его надо вставить и сделал это сам. Может так и есть, если дошел до конца памяти, то прыгает на начало (или сбрасывается, что скорее всего). Однако, это сильно криво, так делать. :dont_know:

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

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