Страница 93 из 399

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

Добавлено: Чт июл 14, 2011 22:41:05
FreshMan
nibiluk, я оттуда и начал учить.............., дошел вот сюда http://easyelectronics.ru/avr-uchebnyj- ... ml#more-19 и начал задавать знатокам вопросы о .CSEG и .ORG address................, короче забуксовал........, там автор излагает не для тех кто в танке..........., где б найти материал в котором бы это излагалось для таких непонятливых как я.................... :dont_know: :( :dont_know:

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

Добавлено: Пт июл 15, 2011 08:40:10
Gudd-Head
FreshMan писал(а):начал задавать знатокам вопросы о .CSEG и .ORG address................, короче забуксовал........,
Что тут непонятного? У вас программа по умолчанию помещается начиная с нулевого адреса флэш-памяти. Если вы хотите изменить адрес — пишете .ОРГ адрес.

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

Добавлено: Пт июл 15, 2011 08:41:16
IfoR
Ну так там всё слишком просто, что бы писать целые книги об этом. :)
Вот этого вне хватило, всё расписано просто и понятно, хоть на стену перед монитором вешай:
http://dfe3300.karelia.ru/koi/posob/avr ... sm-rus.htm
А вот на счёт периферии, это я уже по даташитам конкретного микроконтроллера смотрю. Там тоже, если представляешь себе примерно ход работы данного устройства, то достаточно взглянуть на структуры настроечных регистров и писать код.

Ну ещё по поводу .xSEG-ов всяких. Тут следует учитывать, что у атмелок архитектура Гарвардская, т.е. участок памяти с кодом и с ОЗУ (и с EEPROM) полностью разделены друг от друга и не имеют общей шины (у каждого блока своя шина и, соответственно, адрес начало каждого блока равен 0) и напрямую из одного блока в другой общаться нельзя (если из FLASH в ОЗУ общаться, так тут это организовывает сам процессор, а что бы в EEPROM, то тут вообще обращение через периферию идёт). Вот .xSEG указывают с каким блоком идёт дальше работа, а .ORG устанавливает адрес конкретно в этом блоке.

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

Добавлено: Пн июл 18, 2011 12:43:04
suslogon
вопрос такой: мог бы кто небесплатно разумеется (но и не очень дорого) написать программку для мега32 для термометра на дс18б20 с несколько хитрой индикацией?

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

Добавлено: Пн июл 18, 2011 12:47:50
Gudd-Head
suslogon писал(а):вопрос такой: мог бы кто небесплатно разумеется (но и не очень дорого) написать программку для мега32 для термометра на дс18б20 с несколько хитрой индикацией?
Дык, это на "Из лап в лапы" попахивает :wink:

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

Добавлено: Пн июл 18, 2011 22:30:13
Arlleex
Доброй ночи :)
Пишу для Attiny2313
Как организовать побитовый вывод регистра общего назначения в 1 выход порта микроконтроллера?
при этом свободно по своему усмотрению использовать другие биты этого же порта?

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

Добавлено: Вт июл 19, 2011 06:57:25
ploop
Как организовать побитовый вывод регистра общего назначения в 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

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

Добавлено: Вт июл 19, 2011 12:56:03
Jack_A
ploop писал(а):
Как организовать побитовый вывод регистра общего назначения в 1 выход порта микроконтроллера?
Анализировать крайний бит РОН (левый или правый, смотря с какой стороны выводить), в зависимости от его состояния устанавливать или сбрасывать бит порта, затем сдвигать содержимое РОН влево/вправо
Т.е. преобразовать параллельный код в последовательный. Можно закинуть его в регистр данных SPI, и он сделает это автоматически. Конечно, SPI должен быть настроен и ничем другим не занят.

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

Добавлено: Вт июл 19, 2011 13:19:13
Arlleex
Спасибо за помощь :)
Вчера еще организовал так:
копирует младший бит регистра в бит Т SREG, а потом сдвигаем содержимое регистра, вставляем этот бит в другой регистр - надеваем на него маску - и выводим на порт:)

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

Добавлено: Вт июл 19, 2011 14:00:00
ploop
копирует младший бит регистра в бит Т SREG, а потом сдвигаем содержимое регистра, вставляем этот бит в другой регистр - надеваем на него маску - и выводим на порт:)
Можно и так, но посчитай количество тактов на один проход :) Самым оптимальным (что я смог придумать) оказалось это:

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

    sbrc Rx,0
    sbi port,bit
    sbrs Rx,0
    cbi port,bit

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

Добавлено: Вт июл 19, 2011 16:27:49
Jack_A
Arlleex писал(а): Вчера еще организовал так:
копирует младший бит регистра в бит Т SREG, а потом сдвигаем содержимое регистра, вставляем этот бит в другой регистр - надеваем на него маску - и выводим на порт:)
Бит Т может обмениваться содержимым не только с младшим, но с любым битом РОН. Правда, если речь идет о передаче всех битов РОН, то вышесказанное в цикле не катит. Остается решить - что важнее: быстродействие или затраты памяти. В первом случае -- повторить эту пару команд BST - BLD 8 раз :)

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

Добавлено: Вт июл 19, 2011 17:40:57
FreshMan
вопрос:
какая разница между инструкцией и директивой ? :dont_know:
раньше я думал что это синонимы............. :tea:

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

Добавлено: Вт июл 19, 2011 17:49:23
SII
Директива -- это приказ транслятору что-то там сделать (выделить память под переменную, установить адрес, с которого будет размещаться следующий код и т.д.). А инструкция или команда -- то, что будет выполняться процессором при работе программы.

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

Добавлено: Ср июл 20, 2011 18:10:48
john_rise
Господа. Прошу вашей помощи в вопросе который давно не даёт покоя.

Имеет некоторую, байтовую переменную, которую необходимо просуммировать с регистровой парой:

.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, но здесь растёт число инструкций, что тоже не греет душу.

Эдакая задачка для эрудиции :)

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

Добавлено: Ср июл 20, 2011 18:17:22
Gudd-Head
john_rise писал(а):Эдакая задачка для эрудиции
Собсно, где задача?

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

Добавлено: Ср июл 20, 2011 21:15:23
john_rise
Задача отмахнуться минимумом строк и желательно не прибегать к дополнительному регистру.

Вообще я хочу посмотреть другие варианты.

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

Добавлено: Чт июл 21, 2011 00:32:59
avreal
Вариант с занулённым регистром может быть оптимальным. Регистров довольно много, а при частых операциях var16 += var8 экономия одной команды может быть существенной.
john_rise писал(а):Или при помощи инструкций типа BRxx, но здесь растёт число инструкций, что тоже не греет душу.
Не сильно и растёт

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

    add XL,indx
    brcc noinc
    inc XH
noinc:
Ни по словам, ни по тактам не длиннее
john_rise писал(а):

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

    add XL,indx
    clr r16
    adc XH,r16
А ещё вопрос -- откуда взялись значения XL, XH. Если они только что загрузились константами, то, как я уже писал в этой теме несколько страниц назад, лучше всего не так

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

    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)
По длине как второй вариант, но не требует постоянно выделенного доп. регистра.
По сравнению с первым вариантом и короче, и даже временно не требует доп регистра.

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

Добавлено: Чт июл 21, 2011 01:08:27
IM1
avreal , полностью согласен, только писать надо не table, а (table*2), как например здесь http://radiokot.ru/forum/viewtopic.php? ... start=1600

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

Добавлено: Чт июл 21, 2011 08:14:38
GP1
IM1 писал(а):avreal , полностью согласен, только писать надо не table, а (table*2)
справедливо если table расположено во флеше, а вот если в EEPROMе или RAMе...

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

Добавлено: Чт июл 21, 2011 10:41:34
Jack_A
GP1 писал(а): справедливо если table расположено во флеше, а вот если в EEPROMе или RAMе...
При этом надо учитывать, конечно, что в случае EEPROM это решает только часть проблемы - ставит указатель на нужный адрес, а достучаться до этого адреса все равно только с помощью установленного ритуала, а не просто ld, st.
Интересно, что в очень примитивном МК ST6260 ( от STM ) доступ к EEPROM был намного проще : там было окно, в которое настройкой битов в регистре можно было "высунуть" то ли часть ОЗУ, то ли EEPROM, и можно было адресоваться как к обычному ОЗУ.