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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 6347
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Глянул в ДЩ на тини13 - регистры таймера в "нормальной области", так что своим STSом я чуть не ввел в заблуждение, как Сусанин. Но для других МК, напр. мега48, вышеописанное имеет место.
Изображение
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

СКАЗОЧНИК писал(а): Запись (1<<TOIE0) говорит запихать единицу в бит ТОIE0 в регистре.
Очень некорректное объяснение. Тогда Запись 2<<TOIE0 будет говорит запихать двойку в бит ТОIE0 в регистре? :).

Кстати скобки совсем не обязательно ставить в данном случае.

Следующие команды будут скопмилированы в один и тот же код.

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

ldi R16,0x06
ldi R16,(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)
ldi R16,(1<<ADPS2)+(1<<ADPS1)+(0<<ADPS0)
ldi R16,(1<<ADPS2)+(1<<ADPS1)
ldi R16,0x03<<1
ldi R16,0x0C>>1
ldi R16,3+3

Это биты регистра ADCSRA для тиньки13. Но собственно это не имеет значения сейчас.

Запись (0<<ADPS0) тоже имеет смысл. Потом, например в процессе отладки, если будет необходимость, Вы легко замените значение бита на 1 не заглядывая даташит, кроме того она указывает что такой бит существует, просто Вы в данном случае сбросили его.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ПТУ-шник писал(а):А вот с TCCR0 всё равно ругаеться, пишет что и раньше: Undefined variable referenced. Тобишь недопустимый адрес как я понял
Вложения
jhytfcyf.jpg
(64.53 КБ) 519 скачиваний
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Z_h_e писал(а):Тогда Запись 2<<TOIE0 будет говорит запихать двойку в бит ТОIE0 в регистре?
:))) :facepalm:
Да, правильно будет так:
"Возвращает левое выражение, сдвинутое влево на число бит указанное справа"

Только хотел еще и вот это показать, а вы уже написали.

ldi temp, (1<<PB4)|(0<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0) ; Запускаем мотор вверх
out PORTB, temp
Станислав
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Demiurg писал(а):
ПТУ-шник писал(а):А вот с TCCR0 всё равно ругаеться, пишет что и раньше: Undefined variable referenced. Тобишь недопустимый адрес как я понял
Мне тоже стало интересно, сколько ты ещё сделаешь попыток донести правду TC. Знаешь , после пятой попытки , выложи чуть другое изо, может сравнительный анализ поможет
Реклама
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ILYAUL писал(а):...
Думаю, ник ПТУ-шник все за себя говорит...
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Чт янв 01, 2015 16:34:55

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

Спасибо, вроде с программой разобрались. Компилятор не ругается :)

По поводу команды. Со скобками понятно, это приоритет операции или просто оформление. С символом << разобрался это сдвиг числа влево. Получаеться команда

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

LDI temp, (1<<2)
Дано число 0b00000001 оно по команде сдвига << сдвинет его так 0b00000100 и запишет в temp. Тоже самое делает с TOIE0.

Всё спасибо, стало понятно.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

На самом деле, при записи (1<<TOIE0) МК ничего никуда не сдвинет, ему транслятор ассемблера уже сразу даёт готовое число (0b00000100, например). Поэтому нет смысла писать магические числа в программе, которые непонятно откуда берутся, а сразу писать на уровне определений регистров. Код становится понятнее, но при этом ни на йоту "тяжелее" для МК.
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

чем транслятор отличается от компилятора??? Все время их путаю, а так и не понимаю, что это такое...
Станислав
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Транслятор - более общее понятие. Компилятор - лишь подвид трансляторов, обычно преобразующий программу на языке высокого уровня в программу на низкоуровневом языке.

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

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

Ещё один нубский вопросик :))
Стандартный код задержки:

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

DELAY:             
subi r16, 1 ; Просто вычитания константы, у меня константа ==1       
sbci r17, 0 ; Вычитание константы (в моём случае нуля) и бита С (бит переноса) регистра SREG
sbci r18, 0      
brcc DELAY ; Переход если нет переноса.
Так вот. В первой командой понятна, она просто вычитает и если переходит через ноль то записывается бит С.

Со второй и последующей непонятно. Допустим бит С установлен. Это бит успешно вычтут из r17, r18 и переход brcc НЕ сработает т.к. бит С установили и его не кто не сбрасывал. И дальше в программе он будет установлен всегда, пока его вручную не сбросят. Верно рассуждаю? Или этот бит каким то образом сам по себе сброситься? Если сброситься то когда и почему?

Я честно уже раз 10 перечитывал эту часть из книжки «Практическое программирование на языке ассемблера» и гуглил не раз, но ответа так и не нашёл
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Команды subi и sbci сами меняют бит переноса. Для них, это - заем из старшего байта. То есть если в r16 будет 0, результат будет 0xFF, а бит C будет установлен. Для любого другого числа r16 уменьшится на 1 без переноса, то есть бит С будет сброшен. Тоже самое с остальными регистрами. Таким образом, вся эта последовательность уменьшает на 1 трехбайтное число r18:r17:r16 и крутится в цикле, пока оно не станет равным нулю.
Читать надо было справку по ассемблерным командам и пройти эти операции в уме.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

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

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

COKPOWEHEU писал(а):Команды subi и sbci сами меняют бит переноса. Для них, это - заем из старшего байта. То есть если в r16 будет 0, результат будет 0xFF, а бит C будет установлен. Для любого другого числа r16 уменьшится на 1 без переноса, то есть бит С будет сброшен. Тоже самое с остальными регистрами. Таким образом, вся эта последовательность уменьшает на 1 трехбайтное число r18:r17:r16 и крутится в цикле, пока оно не станет равным нулю.
Читать надо было справку по ассемблерным командам и пройти эти операции в уме.
Читал справку, помойму как раз с радикота скачал. Там не написано что эти команды так битом С управляют. Из ваших слов я понял что:
Когда r16 прошёл через ноль, бит С установился. Затем это бит переноса вычитается из r17 и сбрасывается и так по кругу до тех пор пока r17 не перейдёт через ноль и бит переноса не вычтится из r18. Как то так.
Получается r16 будет проходить через 0 пару десятков тысяч раз прежде чем через ноль перейдёт r18.


Студией не пользуюсь. Откуда можно взять полный справочник по ассмеблеру? Есть две штуки, одна распечатана на 5 страницах и ещё с радиокота на 40 страниц. Но там тоже самое почти...
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

А зря , 4.19 самый цимес. Всё остальное дерьмо
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ПТУ-шник писал(а):...
Я уже не могу спокойно читать эти вопросы. Книга Вольфганг Трамперт #AVR-RISC микроконтроллеры фирмы Atmel#. Сайт gaw.ru. Забудьте про форум, пока не прочитаете книгу. И да, студию установите, 4.19.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

WiseLord писал(а):Любой ассемблер - это фактически это лишь более удобная запись тех же машинных команд. Поэтому тут компиляции как таковой и нет.
Конечно же компиляция есть, просто она на много проще, чем у языков высокого уровня.
ПТУ-шник писал(а):Там не написано что эти команды так битом С управляют.
Вы что-то не то читаете или не внимательно. Если команда выставляет флаги по результату операции, то она выставит их, независимо в каком состоянии флаги были перед выполнением. Если был перенос С=1, если не было С=0. Остальных флагов это тоже касается.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 6347
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Z_h_e писал(а): Если команда выставляет флаги по результату операции, то она выставит их, независимо в каком состоянии флаги были перед выполнением.
... с той оговоркой, что бит С и сам может быть одним из операндов ( напр. , в команде SBCI ) , поэтому результат операции, в т.ч. и состояние бита С, будет зависеть от его состояния "до того".
Все это замечательно, вплоть до последнего бита, расписано в Comset.pdf на сайте Атмела.
Z_h_e писал(а):Ну я ж не писал что результат операции должен быть один и тот же при разных начальных значений флагов.
Это уточнение для новичков, чтоб не было разговоров : "А ить нам говорили, что..." :) А как же :
Если команда выставляет флаги по результату операции, то она выставит их, независимо в каком состоянии флаги были перед выполнением.
Последний раз редактировалось Jack_A Сб дек 19, 2015 16:41:47, всего редактировалось 3 раза.
Изображение
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Ну я ж не писал что результат операции должен быть один и тот же при разных начальных значений флагов.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Родился
Сообщения: 6
Зарегистрирован: Сб дек 05, 2015 23:21:05

Сообщение Shark-vc »

прошу помощи более опытных товарищей)

Не получается справиться с ЖКИ, пишу на ассемблере, контроллер атмел 8535.
Закоментировал передачу данных по интерфейсам spi и twi и обработку этих данных для удобства.

Вроде делаю все по инструкции, да и по форуму лазил, смотрел кто что пишет, но успеха нет)
Вложения
Архив WinRAR.rar
(69.56 КБ) 111 скачиваний
Ответить

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