Ассемблер (ASM) для AVR в вопросах и ответах
Глянул в ДЩ на тини13 - регистры таймера в "нормальной области", так что своим STSом я чуть не ввел в заблуждение, как Сусанин. Но для других МК, напр. мега48, вышеописанное имеет место.
- Реклама
Очень некорректное объяснение. Тогда Запись 2<<TOIE0 будет говорит запихать двойку в бит ТОIE0 в регистре?СКАЗОЧНИК писал(а): Запись (1<<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
ПТУ-шник писал(а):А вот с TCCR0 всё равно ругаеться, пишет что и раньше: Undefined variable referenced. Тобишь недопустимый адрес как я понял
- Вложения
-
- jhytfcyf.jpg
- (64.53 КБ) 519 скачиваний
Z_h_e писал(а):Тогда Запись 2<<TOIE0 будет говорит запихать двойку в бит ТОIE0 в регистре?
Да, правильно будет так:
"Возвращает левое выражение, сдвинутое влево на число бит указанное справа"
Только хотел еще и вот это показать, а вы уже написали.
ldi temp, (1<<PB4)|(0<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0) ; Запускаем мотор вверх
out PORTB, temp
Станислав
Мне тоже стало интересно, сколько ты ещё сделаешь попыток донести правду TC. Знаешь , после пятой попытки , выложи чуть другое изо, может сравнительный анализ поможетDemiurg писал(а):ПТУ-шник писал(а):А вот с TCCR0 всё равно ругаеться, пишет что и раньше: Undefined variable referenced. Тобишь недопустимый адрес как я понял
- Реклама
- Сообщения: 1495
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Думаю, ник ПТУ-шник все за себя говорит...ILYAUL писал(а):...
- Сообщения: 167
- Зарегистрирован: Чт янв 01, 2015 16:34:55
Спасибо, вроде с программой разобрались. Компилятор не ругается
По поводу команды. Со скобками понятно, это приоритет операции или просто оформление. С символом << разобрался это сдвиг числа влево. Получаеться команда
Дано число 0b00000001 оно по команде сдвига << сдвинет его так 0b00000100 и запишет в temp. Тоже самое делает с TOIE0.
Всё спасибо, стало понятно.
По поводу команды. Со скобками понятно, это приоритет операции или просто оформление. С символом << разобрался это сдвиг числа влево. Получаеться команда
Код: Выделить всё
LDI temp, (1<<2)
Всё спасибо, стало понятно.
На самом деле, при записи (1<<TOIE0) МК ничего никуда не сдвинет, ему транслятор ассемблера уже сразу даёт готовое число (0b00000100, например). Поэтому нет смысла писать магические числа в программе, которые непонятно откуда берутся, а сразу писать на уровне определений регистров. Код становится понятнее, но при этом ни на йоту "тяжелее" для МК.
чем транслятор отличается от компилятора??? Все время их путаю, а так и не понимаю, что это такое...
Станислав
Транслятор - более общее понятие. Компилятор - лишь подвид трансляторов, обычно преобразующий программу на языке высокого уровня в программу на низкоуровневом языке.
Любой ассемблер - это фактически это лишь более удобная запись тех же машинных команд. Поэтому тут компиляции как таковой и нет.
Любой ассемблер - это фактически это лишь более удобная запись тех же машинных команд. Поэтому тут компиляции как таковой и нет.
- Сообщения: 167
- Зарегистрирован: Чт янв 01, 2015 16:34:55
Ещё один нубский вопросик
Стандартный код задержки:
Так вот. В первой командой понятна, она просто вычитает и если переходит через ноль то записывается бит С.
Со второй и последующей непонятно. Допустим бит С установлен. Это бит успешно вычтут из r17, r18 и переход brcc НЕ сработает т.к. бит С установили и его не кто не сбрасывал. И дальше в программе он будет установлен всегда, пока его вручную не сбросят. Верно рассуждаю? Или этот бит каким то образом сам по себе сброситься? Если сброситься то когда и почему?
Я честно уже раз 10 перечитывал эту часть из книжки «Практическое программирование на языке ассемблера» и гуглил не раз, но ответа так и не нашёл
Стандартный код задержки:
Код: Выделить всё
DELAY:
subi r16, 1 ; Просто вычитания константы, у меня константа ==1
sbci r17, 0 ; Вычитание константы (в моём случае нуля) и бита С (бит переноса) регистра SREG
sbci r18, 0
brcc DELAY ; Переход если нет переноса.
Со второй и последующей непонятно. Допустим бит С установлен. Это бит успешно вычтут из r17, r18 и переход brcc НЕ сработает т.к. бит С установили и его не кто не сбрасывал. И дальше в программе он будет установлен всегда, пока его вручную не сбросят. Верно рассуждаю? Или этот бит каким то образом сам по себе сброситься? Если сброситься то когда и почему?
Я честно уже раз 10 перечитывал эту часть из книжки «Практическое программирование на языке ассемблера» и гуглил не раз, но ответа так и не нашёл
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Команды subi и sbci сами меняют бит переноса. Для них, это - заем из старшего байта. То есть если в r16 будет 0, результат будет 0xFF, а бит C будет установлен. Для любого другого числа r16 уменьшится на 1 без переноса, то есть бит С будет сброшен. Тоже самое с остальными регистрами. Таким образом, вся эта последовательность уменьшает на 1 трехбайтное число r18:r17:r16 и крутится в цикле, пока оно не станет равным нулю.
Читать надо было справку по ассемблерным командам и пройти эти операции в уме.
Читать надо было справку по ассемблерным командам и пройти эти операции в уме.
- Сообщения: 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 страниц. Но там тоже самое почти...
- Сообщения: 1495
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Я уже не могу спокойно читать эти вопросы. Книга Вольфганг Трамперт #AVR-RISC микроконтроллеры фирмы Atmel#. Сайт gaw.ru. Забудьте про форум, пока не прочитаете книгу. И да, студию установите, 4.19.ПТУ-шник писал(а):...
Конечно же компиляция есть, просто она на много проще, чем у языков высокого уровня.WiseLord писал(а):Любой ассемблер - это фактически это лишь более удобная запись тех же машинных команд. Поэтому тут компиляции как таковой и нет.
Вы что-то не то читаете или не внимательно. Если команда выставляет флаги по результату операции, то она выставит их, независимо в каком состоянии флаги были перед выполнением. Если был перенос С=1, если не было С=0. Остальных флагов это тоже касается.ПТУ-шник писал(а):Там не написано что эти команды так битом С управляют.
... с той оговоркой, что бит С и сам может быть одним из операндов ( напр. , в команде SBCI ) , поэтому результат операции, в т.ч. и состояние бита С, будет зависеть от его состояния "до того".Z_h_e писал(а): Если команда выставляет флаги по результату операции, то она выставит их, независимо в каком состоянии флаги были перед выполнением.
Все это замечательно, вплоть до последнего бита, расписано в Comset.pdf на сайте Атмела.
Это уточнение для новичков, чтоб не было разговоров : "А ить нам говорили, что..."Z_h_e писал(а):Ну я ж не писал что результат операции должен быть один и тот же при разных начальных значений флагов.
Если команда выставляет флаги по результату операции, то она выставит их, независимо в каком состоянии флаги были перед выполнением.
Последний раз редактировалось Jack_A Сб дек 19, 2015 16:41:47, всего редактировалось 3 раза.
Ну я ж не писал что результат операции должен быть один и тот же при разных начальных значений флагов.
- Сообщения: 6
- Зарегистрирован: Сб дек 05, 2015 23:21:05
прошу помощи более опытных товарищей)
Не получается справиться с ЖКИ, пишу на ассемблере, контроллер атмел 8535.
Закоментировал передачу данных по интерфейсам spi и twi и обработку этих данных для удобства.
Вроде делаю все по инструкции, да и по форуму лазил, смотрел кто что пишет, но успеха нет)
Не получается справиться с ЖКИ, пишу на ассемблере, контроллер атмел 8535.
Закоментировал передачу данных по интерфейсам spi и twi и обработку этих данных для удобства.
Вроде делаю все по инструкции, да и по форуму лазил, смотрел кто что пишет, но успеха нет)
- Вложения
-
- Архив WinRAR.rar
- (69.56 КБ) 111 скачиваний




