Ассемблер (ASM) для AVR в вопросах и ответах
nibiluk, я оттуда и начал учить.............., дошел вот сюда http://easyelectronics.ru/avr-uchebnyj- ... ml#more-19 и начал задавать знатокам вопросы о .CSEG и .ORG address................, короче забуксовал........, там автор излагает не для тех кто в танке..........., где б найти материал в котором бы это излагалось для таких непонятливых как я....................

Tell Me The Truth
- Реклама
Что тут непонятного? У вас программа по умолчанию помещается начиная с нулевого адреса флэш-памяти. Если вы хотите изменить адрес — пишете .ОРГ адрес.FreshMan писал(а):начал задавать знатокам вопросы о .CSEG и .ORG address................, короче забуксовал........,
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ну так там всё слишком просто, что бы писать целые книги об этом. 
Вот этого вне хватило, всё расписано просто и понятно, хоть на стену перед монитором вешай:
http://dfe3300.karelia.ru/koi/posob/avr ... sm-rus.htm
А вот на счёт периферии, это я уже по даташитам конкретного микроконтроллера смотрю. Там тоже, если представляешь себе примерно ход работы данного устройства, то достаточно взглянуть на структуры настроечных регистров и писать код.
Ну ещё по поводу .xSEG-ов всяких. Тут следует учитывать, что у атмелок архитектура Гарвардская, т.е. участок памяти с кодом и с ОЗУ (и с EEPROM) полностью разделены друг от друга и не имеют общей шины (у каждого блока своя шина и, соответственно, адрес начало каждого блока равен 0) и напрямую из одного блока в другой общаться нельзя (если из FLASH в ОЗУ общаться, так тут это организовывает сам процессор, а что бы в EEPROM, то тут вообще обращение через периферию идёт). Вот .xSEG указывают с каким блоком идёт дальше работа, а .ORG устанавливает адрес конкретно в этом блоке.
Вот этого вне хватило, всё расписано просто и понятно, хоть на стену перед монитором вешай:
http://dfe3300.karelia.ru/koi/posob/avr ... sm-rus.htm
А вот на счёт периферии, это я уже по даташитам конкретного микроконтроллера смотрю. Там тоже, если представляешь себе примерно ход работы данного устройства, то достаточно взглянуть на структуры настроечных регистров и писать код.
Ну ещё по поводу .xSEG-ов всяких. Тут следует учитывать, что у атмелок архитектура Гарвардская, т.е. участок памяти с кодом и с ОЗУ (и с EEPROM) полностью разделены друг от друга и не имеют общей шины (у каждого блока своя шина и, соответственно, адрес начало каждого блока равен 0) и напрямую из одного блока в другой общаться нельзя (если из FLASH в ОЗУ общаться, так тут это организовывает сам процессор, а что бы в EEPROM, то тут вообще обращение через периферию идёт). Вот .xSEG указывают с каким блоком идёт дальше работа, а .ORG устанавливает адрес конкретно в этом блоке.
вопрос такой: мог бы кто небесплатно разумеется (но и не очень дорого) написать программку для мега32 для термометра на дс18б20 с несколько хитрой индикацией?
Ищу тиратрон ТХИ1-2000/4, ГРИ ИН-23, ФЭУ-103; 134; 135, 138, 155, 157, лампу ИСШ-7.
Любые ГИС серий 203, 225, 233, 244, 250, 296, 801, 838 в любом состоянии. Компоненты и детали от миниатюрных твердотельных лазеров.
Любые ГИС серий 203, 225, 233, 244, 250, 296, 801, 838 в любом состоянии. Компоненты и детали от миниатюрных твердотельных лазеров.
Дык, это на "Из лап в лапы" попахиваетsuslogon писал(а):вопрос такой: мог бы кто небесплатно разумеется (но и не очень дорого) написать программку для мега32 для термометра на дс18б20 с несколько хитрой индикацией?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
- Сообщения: 4435
- Зарегистрирован: Сб мар 07, 2009 20:44:36
Доброй ночи
Пишу для Attiny2313
Как организовать побитовый вывод регистра общего назначения в 1 выход порта микроконтроллера?
при этом свободно по своему усмотрению использовать другие биты этого же порта?
Пишу для Attiny2313
Как организовать побитовый вывод регистра общего назначения в 1 выход порта микроконтроллера?
при этом свободно по своему усмотрению использовать другие биты этого же порта?
Не умеешь - не берись, но не взявшись не научишься...
Анализировать крайний бит РОН (левый или правый, смотря с какой стороны выводить), в зависимости от его состояния устанавливать или сбрасывать бит порта, затем сдвигать содержимое РОН влево/вправоКак организовать побитовый вывод регистра общего назначения в 1 выход порта микроконтроллера?
А при чём тут они? Как их настроите, так и будут работать.при этом свободно по своему усмотрению использовать другие биты этого же порта?
------------------
Во, даже отрыл пример вывода 6 байт из памяти на сдвиговый регистр:
Код: Выделить всё
print:
ldi XH,high(display_buf+6)
ldi XL,low(display_buf+6)
ldi rx1,6 ; выводим 6 байт с конца
print_0:
ld rx3,-X ; в rx3 - выводимый байт
ldi rx2,8 ; в rx2 - счётчик до 8
print_1: ; data_port,data_bit - куда выводим
sbrc rx3,0
sbi data_port,data_bit
sbrs rx3,0
cbi data_port,data_bit
push_imp
lsr rx3
dec rx2
brne print_1
dec rx1
brne print_0
ret
Т.е. преобразовать параллельный код в последовательный. Можно закинуть его в регистр данных SPI, и он сделает это автоматически. Конечно, SPI должен быть настроен и ничем другим не занят.ploop писал(а):Анализировать крайний бит РОН (левый или правый, смотря с какой стороны выводить), в зависимости от его состояния устанавливать или сбрасывать бит порта, затем сдвигать содержимое РОН влево/вправоКак организовать побитовый вывод регистра общего назначения в 1 выход порта микроконтроллера?
- Сообщения: 4435
- Зарегистрирован: Сб мар 07, 2009 20:44:36
Спасибо за помощь 
Вчера еще организовал так:
копирует младший бит регистра в бит Т SREG, а потом сдвигаем содержимое регистра, вставляем этот бит в другой регистр - надеваем на него маску - и выводим на порт:)
Вчера еще организовал так:
копирует младший бит регистра в бит Т SREG, а потом сдвигаем содержимое регистра, вставляем этот бит в другой регистр - надеваем на него маску - и выводим на порт:)
Не умеешь - не берись, но не взявшись не научишься...
Можно и так, но посчитай количество тактов на один проходкопирует младший бит регистра в бит Т SREG, а потом сдвигаем содержимое регистра, вставляем этот бит в другой регистр - надеваем на него маску - и выводим на порт:)
Код: Выделить всё
sbrc Rx,0
sbi port,bit
sbrs Rx,0
cbi port,bit
Бит Т может обмениваться содержимым не только с младшим, но с любым битом РОН. Правда, если речь идет о передаче всех битов РОН, то вышесказанное в цикле не катит. Остается решить - что важнее: быстродействие или затраты памяти. В первом случае -- повторить эту пару команд BST - BLD 8 разArlleex писал(а): Вчера еще организовал так:
копирует младший бит регистра в бит Т SREG, а потом сдвигаем содержимое регистра, вставляем этот бит в другой регистр - надеваем на него маску - и выводим на порт:)
вопрос:
какая разница между инструкцией и директивой ?
раньше я думал что это синонимы.............
какая разница между инструкцией и директивой ?
раньше я думал что это синонимы.............
Tell Me The Truth
Директива -- это приказ транслятору что-то там сделать (выделить память под переменную, установить адрес, с которого будет размещаться следующий код и т.д.). А инструкция или команда -- то, что будет выполняться процессором при работе программы.
- Сообщения: 136
- Зарегистрирован: Пн дек 17, 2007 13:15:43
Господа. Прошу вашей помощи в вопросе который давно не даёт покоя.
Имеет некоторую, байтовую переменную, которую необходимо просуммировать с регистровой парой:
.def r14 = indx
add XL,indx
clr r16
adc XH,r16
или:
.def r14 = indx
clr r16
add XL,indx
adc XH,r16
Но вот раздражает необходимость чистить вспомогательный регистр, в данном случае r16 для того что-бы выполнить сложение со знаком переноса (carry).
Конечно можно организовать регистр который будет всегда равен "0x00":
.def r13 = zero
И далее сложение с переносом делать с этим самым регистром:
add XL,indx
adc XH,zero
Ну вот регистра жалко
Можно сделать и так:
com XH
add XL,indx
sbci XH,low(0x00)
com XH
Или при помощи инструкций типа BRxx, но здесь растёт число инструкций, что тоже не греет душу.
Эдакая задачка для эрудиции
Имеет некоторую, байтовую переменную, которую необходимо просуммировать с регистровой парой:
.def r14 = indx
add XL,indx
clr r16
adc XH,r16
или:
.def r14 = indx
clr r16
add XL,indx
adc XH,r16
Но вот раздражает необходимость чистить вспомогательный регистр, в данном случае r16 для того что-бы выполнить сложение со знаком переноса (carry).
Конечно можно организовать регистр который будет всегда равен "0x00":
.def r13 = zero
И далее сложение с переносом делать с этим самым регистром:
add XL,indx
adc XH,zero
Ну вот регистра жалко
Можно сделать и так:
com XH
add XL,indx
sbci XH,low(0x00)
com XH
Или при помощи инструкций типа BRxx, но здесь растёт число инструкций, что тоже не греет душу.
Эдакая задачка для эрудиции
Боишся - не делай. Делаешь - не бойся.
Собсно, где задача?john_rise писал(а):Эдакая задачка для эрудиции
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 136
- Зарегистрирован: Пн дек 17, 2007 13:15:43
Задача отмахнуться минимумом строк и желательно не прибегать к дополнительному регистру.
Вообще я хочу посмотреть другие варианты.
Вообще я хочу посмотреть другие варианты.
Боишся - не делай. Делаешь - не бойся.
Вариант с занулённым регистром может быть оптимальным. Регистров довольно много, а при частых операциях var16 += var8 экономия одной команды может быть существенной.
Ни по словам, ни по тактам не длиннее
или так
а так:
По длине как второй вариант, но не требует постоянно выделенного доп. регистра.
По сравнению с первым вариантом и короче, и даже временно не требует доп регистра.
Не сильно и растётjohn_rise писал(а):Или при помощи инструкций типа BRxx, но здесь растёт число инструкций, что тоже не греет душу.
Код: Выделить всё
add XL,indx
brcc noinc
inc XH
noinc:А ещё вопрос -- откуда взялись значения XL, XH. Если они только что загрузились константами, то, как я уже писал в этой теме несколько страниц назад, лучше всего не такjohn_rise писал(а):Код: Выделить всё
add XL,indx clr r16 adc XH,r16
Код: Выделить всё
ldi XL, low(table)
ldi XH, high(table)
add XL,indx
clr r16
adc XH,r16Код: Выделить всё
ldi XL, low(table)
ldi XH, high(table)
add XL,indx
adc XH, ZERO_REGКод: Выделить всё
mov XL,indx
clr XH
subi XL, low( -table)
sbci XH, high( -table)По сравнению с первым вариантом и короче, и даже временно не требует доп регистра.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
avreal , полностью согласен, только писать надо не table, а (table*2), как например здесь http://radiokot.ru/forum/viewtopic.php? ... start=1600
справедливо если table расположено во флеше, а вот если в EEPROMе или RAMе...IM1 писал(а):avreal , полностью согласен, только писать надо не table, а (table*2)
При этом надо учитывать, конечно, что в случае EEPROM это решает только часть проблемы - ставит указатель на нужный адрес, а достучаться до этого адреса все равно только с помощью установленного ритуала, а не просто ld, st.GP1 писал(а): справедливо если table расположено во флеше, а вот если в EEPROMе или RAMе...
Интересно, что в очень примитивном МК ST6260 ( от STM ) доступ к EEPROM был намного проще : там было окно, в которое настройкой битов в регистре можно было "высунуть" то ли часть ОЗУ, то ли EEPROM, и можно было адресоваться как к обычному ОЗУ.




