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

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

Сообщение Челюскин »

Скажите, что означает символ ~ ?
Например выражение: ldi r16, ~Space; Автор комментирует это как загрузка символа пустого места( там вывод на семисегментник у него)
Лень - двигатель прогресса!
Реклама
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

Битовое НЕ (инверсия) - меняет каждый бит константы на противоположный.

PS. удобно в знакогенераторе светящиеся сегменты цифры/символа записать единицами. А, в зависимости от схемы подключения индикатора (ОА или ОК), в порт может выводиться или прямое или инверсное значение.
Реклама
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

Сообщение Челюскин »

Спасибо, понял) а в нете нету что-то... или не там искал.
Лень - двигатель прогресса!
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Как это нету? Ищи файл Asm_AVR_rus.pdf там все прекрасно расписано! да, гугл первым результатом выдает.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 30, 2010 12:58:17

Сообщение artmel »

запостил не туда, извиняюсь
Реклама
akl
Друг Кота
Сообщения: 4453
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

FreshMan писал(а):
команды типа out portb,r... не могут использовать r0-r15, поэтому temp=r16
почему ?
Цитируемое утверждение неверно. Вот как ATMEL на него отвечает в этом документе
Изображение
Посмотрел DS на ATtiny2313, ATmega8 и, к своему удивлению, не обнаружил текста, который был в DS на AT90S2313, AT8515
СпойлерAll the register operating instructions in the instruction set have direct and single-cycle
access to all registers. The only exception is the five constant arithmetic and logic
instructions SBCI, SUBI, CPI, ANDI, ORI between a constant and a register and the LDI
instruction for load immediate constant data. These instructions apply to the second half
of the registers in the Register File (R16..R31). The general SBC, SUB, CP, AND, OR,
and all other operations between two registers or on a single register apply to the entire
Register File.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Неправда, нормально оно работает. А не используют их потому что ldi не работает с r0-r15. Ну может еще какие-то команды. Их мало но они часто используются.
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

вот шаблон проги

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

.include "tn2313def.inc"
.list
.def     temp=r16
         .cseg              ;Выбор сегмента программного кода
         .org    0          ;Установка текущего адреса на ноль
;---------------Переопределение векторов прерывания 19шт.-----------------
start:   rjmp    init       ;Переход на начало программы.Прерывание по сбросу
         reti               ;Внешнее прерывание 0
         reti               ;Внешнее прерывание 1
         reti               ;Таймер/счётчик 1,захват
         reti               ;Таймер/счётчик 1,совпадение,канал А
         reti               ;Таймер/счётчик 1,прерывание по переполнению
         reti               ;Таймер/счётчик 0,прерывание по переполнению
         reti               ;Переполнение UART пирём завершён
         reti               ;Переполнение UART регистр данных пуст
         reti               ;Переполнение UART передача завершена
         reti               ;Прерывание по изменению на любом контакте
         reti               ;Переполнение по компаратору
         reti               ;Таймер/счётчик 1,совпадение,канал В
         reti               ;Таймер/счётчик 0,совпадение,канал В
         reti               ;Таймер/счётчик 0,совпадение,канал А
         reti               ;USI готовность к старту
         reti               ;USI Переполнение
         reti               ;EEPROM Готовность
         reti               ;Переполнение охранного таймера
;---------------Инициалазация регистров общего назначения--------------------
init:    ldi     temp,RAMEND;Выбор адреса вершины стека
         out     SPL,temp   ;Запись его в регистр стека
         ldi     temp,0x80  ;Загружаем в R16 число 1000 0000 или 128
         out     acsr,temp  ;Отключаем компаратор
;---------------Сдесь будет работать основная программа----------------------
main:    
         rjmp    main
если я не собираюсь использовать прерывания то прогу можна упростить до такого вида ?

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

.include "tn2313def.inc"
.list
.def     temp=r16
         .cseg              ;Выбор сегмента программного кода
         .org    0          ;Установка текущего адреса на ноль

;---------------Инициалазация регистров общего назначения--------------------
init:    ldi     temp,RAMEND;Выбор адреса вершины стека
         out     SPL,temp   ;Запись его в регистр стека
         ldi     temp,0x80  ;Загружаем в R16 число 1000 0000 или 128
         out     acsr,temp  ;Отключаем компаратор
;---------------Сдесь будет работать основная программа----------------------
main:    
         rjmp    main
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Да. И основная программа будет работать здесь. :))
Docendo discimus
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

а сами вектора прерываний жостко привязаны к своим адресам ?
изменить я ничего не могу ?
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Жёстко. Но если у МК есть бутлоадер, то можно разместить его вначале флэша, а вектор прерываний перемещается в середину (задаётся соотв. фьюзом).
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

а каким образом была сделана эта привязка ?
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Аппаратно, каждое прерывание, если оно разрешено, загружает в командный счетчик свой адрес. В случае с бутлоадером адреса изменяются (возможно фьюзы меняют отдельные биты адреса).
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Видимо, с бутлоадером тут особо никто не заморачивался :)))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Честно, ни разу не было надобности в нем, хотя попробовать интересно :dont_know:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

каким образом вектор прерываний привязали к адресу во флеше ?
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Взяли и засунули его в начало. Или что-то друго интересует?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

тоесть, припустим, в диапвзоне адресов 0x00-0xА0 находятся вектора прерываний
значит в эти адреса, при всем моем желании, я никогда ничего не смогу записать и моя прога будет писаться с адреса 0хВ0 ?
Tell Me The Truth
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Почему? Глянь на свой код: самый первый адрес содержит прыжок куда-то дальше. Ничто не мешает начать писать программу прямо с нуля. И она будет работать.
НО: в случае возникновения любого прерывания счётчик команд перебросит тебя на соответствующую строку, где будет твой код, т.е. неизвестно что. Вот что там будет - то и продолжит работать.

Так что в этом случае нельзя использовать прерывания, и всё.
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

ploop писал(а):Так что в этом случае нельзя использовать прерывания, и всё.
Ну не надо так категорично :)

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

.OGR $000
proga
proga
proga
rjmp PC+2
rjmp preryvanie
proga
proga
...
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

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