Обсуждаем контроллеры компании Atmel.
Ответить

Re: AVR studio в вопросах и ответах

Пт апр 05, 2019 11:59:57

Я Си не перевариваю. Ассемблер рулит!

Re: AVR studio в вопросах и ответах

Пт апр 05, 2019 13:24:49

Да. Переменная не объявлена volatile. Попробую, отпишусь. Спасибо!
PS Работает! Спасибо большое за дельный совет.

Re: AVR studio в вопросах и ответах

Вт апр 09, 2019 21:46:38

Кто может подучить по ASM в виде комментариев к командам. Вот на примере. Что там вообще происходит. Что можете сказать по данному коду?
Спойлерinterrupt [PCINT0] void pin_change_isr(void)
{
// Пришел Старт-бит, инициируем прием кадра

#asm

push r16
in r16,0x3F
push r16
ldi r16,0x00
out 0x3B,r16
in r16,0x32
subi r16,0xC2
cpi r16,0x7C
brcs LI000A

subi r16,0x7C
LI000A:
out 0x29,r16
ldi r16,0x00
mov r11,r16
pop r16
out 0x3F,r16
pop r16

#endasm

}

А вот еще. Мне это тоже нужно разобрать.
Спойлерinterrupt [TIM0_COMPB] void timer0_compb_isr(void)
{
// Обработка принятых бит по линии RxD
#asm
push r16
push r17
in r16,0x3F
push r16
ldi r17,0x0A
cp r11,r17
brcc LB001E

ldi r17,0x00
cp r11,r17
brne LB000C

sbic 0x16,0x4
rjmp LB0016

LB000C:
ldi r16,0x08
cp r16,r11
brcs LB0014

lsr r12
in r16,0x16
bst r16,0x4
bld r12,0x7
rjmp LB001D

LB0014:

sbic 0x16,0x4
rjmp LB001A

LB0016:
ldi r16,0x9E
mov r12,r16
ldi r16,0x09
mov r11,r16
LB001A:
ldi r16,0x20
out 0x3A,r16
out 0x3B,r16
LB001D:
inc r11
LB001E:
pop r16
out 0x3F,r16
pop r17
pop r16

#endasm
}

Re: AVR studio в вопросах и ответах

Ср апр 10, 2019 05:11:53

Кто может подучить по ASM в виде комментариев к командам.

Вам нужно описание команд почитать, там все подробно расписано. Вот: http://www.gaw.ru/html.cgi/txt/doc/micr ... /start.htm
Или PDF: https://yadi.sk/i/m4ztj2m8SLot6w

Re: AVR studio в вопросах и ответах

Ср апр 10, 2019 06:30:21

Это я читал. Я не могу понять какой алгоритм для приходящего байта написал автор. Код я конечно перевел. Например out. Зачем автор из регистра отправляет в порт данные если он принимает байт портом. Вообще алгоритм не понятен

Re: AVR studio в вопросах и ответах

Ср апр 10, 2019 06:42:15

mixon46 писал(а): Что можете сказать по данному коду?
mixon46 писал(а):interrupt [PCINT0] void pin_change_isr(void)
данный формат описания обработчика прерывания, как и формат ассемблерной вставки, не характерен для Atmel Studio (и для AVR Studio тоже), поэтому вопрос задан не в той теме.

Re: AVR studio в вопросах и ответах

Ср апр 10, 2019 10:49:27

Это вставка asm в codevishion avr. Но мне надо понимать что происходит в asm коде. Что он выполняет

Re: AVR studio в вопросах и ответах

Ср апр 10, 2019 10:54:32

mixon46 писал(а):Это вставка asm в codevishion avr
о чем я и написал - не та тема.
mixon46 писал(а):Например out. Зачем автор из регистра отправляет в порт данные если он принимает байт портом
потому как каждый порт имеет наименование - вы по адресу порта определили, что это за порт? а ведь это не просто порт...
замените адреса их соответствующими наименованиями (в даташите наваш МК все есть!), и вы поймете, с какой периферией идет работа. зная это вы сможете расписать значение каждого бита в константах, которые в эти самые "порты" выводятся - и тогда станет понятно, что на самом деле происходит

Re: AVR studio в вопросах и ответах

Ср апр 10, 2019 11:26:42

Еще раз. Пример.

In r16, 0x3F


Тут 0x3F адрес периферии? Адрес регистра периферии?

Re: AVR studio в вопросах и ответах

Ср апр 10, 2019 11:32:00

mixon46 писал(а):Тут 0x3F адрес периферии? Адрес регистра периферии?
вы хотите, чтобы я за вас сходил в даташит и нашел там этот адрес, а затем сказал вам, какому регистру периферии он соответствует? ;)

Re: AVR studio в вопросах и ответах

Ср апр 10, 2019 11:40:47

Нет что вы. Это я могу сделать сам. Единственное скажите там где 0x00 это всегда адрес?

Ну вот.

In r16, 0x3F // загрузить данные из порта I/O в регистр. То есть данные из SREG в переменную r16. Или не так понял.

А это.

Ldi r16, 0x00 // загрузить непосредственное значение. 0x00 по таблице просто зарезервирован и не имеет никакой функции. Или как понять.? Я только в codevishion avr могу что нибудь написать. Asm не понимаю. Хотя очень надо понять как выполняется эта программа
Последний раз редактировалось mixon46 Ср апр 10, 2019 11:57:49, всего редактировалось 1 раз.

Re: AVR studio в вопросах и ответах

Ср апр 10, 2019 11:57:34

mixon46 писал(а):Единственное скажите там где 0x00 это всегда адрес?
не всегда.
команды ассемблера могут быть без операндов (например, cli), с оним операндом (ser r0) или с двумя операндами (out port, r16)
как правило, если один операнд в команде, то это регистр (даже не вспомню сразу - есть ли исключения?)
а вот у двухоперандных команд только один из операндов может быть (а может и не быть) адресом, а второй, всегда регистр.
но все вышесказанное вы можете узнать по описанию команд ассемблера AVR, о чем вам уже говорили.
находите команду, читаете её описание, узнаете, какие у неё операнды, а затем по этим операндам разбираетесь, что это - адрес или что-то иное.

Re: AVR studio в вопросах и ответах

Ср апр 10, 2019 12:25:54

похоже я понял что я ничего не понял. Не ну я понял что вы написали. Я не понял вот это

ldi r16, 0x00 \\ 0x00 это адрес РОН R1. Я так понял. Загрузить данные из R1 в R16. А зачем?

Re: AVR studio в вопросах и ответах

Ср апр 10, 2019 14:08:11

LDI Rd, K Load Immediate Rd ← K - команда ldi записывает константу в регистр.
В каждом datasheet имеется раздел Instruction Set Summary в котором расписаны команды и их особенности для конкретного микроконтроллера.

Добавлено after 7 minutes 50 seconds:
У меня другой, непонятный мне вопрос:
Написанный мной код в студии версии 6.0 отказывается работать в студии 7-й версии.
При отладке получаю, что участок кода:
stack1_new[count_task_save] = SP;
предназначенный сохранить текущий адрес стека по счетчику в массив сохраняет в ячейку watch stack1_new[0] значение 1096 при значении адреса стека 0x448.
Вот участок дизассемблера:
Спойлер00000173 IN R24,0x3D In from I/O location
00000174 IN R25,0x3E In from I/O location
00000175 LDS R30,0x008C Load direct from data space - адрес count_task_save
00000177 LDI R31,0x00 Load immediate
00000178 LSL R30 Logical Shift Left
00000179 ROL R31 Rotate Left Through Carry
0000017A SUBI R30,0x72 Subtract immediate
0000017B SBCI R31,0xFF Subtract immediate with carry
0000017C STD Z+1,R25 Store indirect with displacement
0000017D STD Z+0,R24 Store indirect with displacement

Строка IRAM
Спойлерdata 0x0088 00 00 00 00 00 01 48 04 00 00 00 00 00 00 00 00 00 00 00 00

Как быть в такой ситуации - не знаю, т.к. код не работает в 7-й студии от слова совсем.
PS Сам дурак! Представление данных в watch в десятичном виде!

Добавлено after 1 hour 16 minutes 34 seconds:
Может кому будет важно. При миграции проекта в Атмел Студио 7 из 6-й версии проект отказывался работать.
После создания нового проекта в 7-й студии и переносе кода пришлось немножко пошаманить и код заработал.

Re: AVR studio в вопросах и ответах

Чт апр 11, 2019 06:31:56

dr.doc писал(а):При миграции проекта в Атмел Студио 7 из 6-й версии проект отказывался работать.
После создания нового проекта в 7-й студии и переносе кода пришлось немножко пошаманить и код заработал
это очень информативное замечание. я уверен, что ни у кого вот вообще никаких вопросов не возникло - все же знают о проблеме, да и шаман тут каждый первый.

Re: AVR studio в вопросах и ответах

Вс апр 14, 2019 22:11:40

Я тут подробно расписал инициализацию принятого байта. Из того кода на asm что бы понять что происходит. Я практически понял весь смысл его.

Спойлерinterrupt [3] void pin_change_isr(void)
{
// Пришел Старт-бит, инициируем прием кадра

#asm

push r16 //сохранить в стек переменную
in r16,SREG //присвоить переменной значение SREG
push r16 //сохранить в стек переменную со значением SREG
ldi r16,0x00 //записать в переменную константу со значением 0
out 0x3B ,r16 //записать в регистр GIMSK значение переменной 0
in r16,0x32 //присвоить переменной значение TCNT0
subi r16,0xC2 //вычесть из переменной константу со значением 194 (;дополнение до 1 Half_Bit_Width)
cpi r16,0x7C //сравнить переменную с константой значение которой 124, если константа больше переменной то установить флаг переноса 1 (;Bit_Width)
brcs LI000A //перейти если флаг переноса С установлен в 1

subi r16,0x7C //вычесть из переменной константу со значением 124 (;Bit_Width)
LI000A:
out 0x29,r16 //записать в регистр OCR0B значение переменной
ldi r16,0x00 //записать в переменную константу со значением 0
mov r11,r16 //обнулить Rx_Count счетчик бит
pop r16 //загрузить R16 из стека
out SREG,r16 //и присвоить регистру статуса прошлое значение
pop r16 //загрузить R16 из стека ?

#endasm

}



но не очень понятно как посчитали что бы прерывание срабатывало в середине бита. нет общей картины. не вижу

Re: AVR studio в вопросах и ответах

Чт апр 18, 2019 14:29:54

Объясните мне пожалуйста как работает этот программный uart. Не могу дать ладу. Зачем автор записывает значение таймера счетчика TCNT в РОН. Затем он вычитает из этого значения 194. Затем идет сравнение с числом 124. И если 124 больше чем значение TCNT-194 то записывает в регистр сравнения получившиеся число. А если меньше то вычитает 124 и записывает в регистр сравнения. Если в регистр сравнения должно быть записано число 124. Так как судя из ф ормулы для расчета скорости передачи uart и кварцем на 9.6 мнц и председателем на 8. Должно быть занесено в регистр сравнения число 124 что является в свою очередь прерыванием каждые 104 мкс и равно скорости 9600 бод в секунду. Зачем сделано так. Не пойму.

Объясните если например TCNT был 43 например. И мы вычитаем 194. 43-194. Мк посчитает что равно нулю или равно 104 будет. Потом будет сравнение. Константа 124 будет больше чем 104. И запишет в регистр сравнения 104. Что за бред.

Re: AVR studio в вопросах и ответах

Вс май 19, 2019 07:54:50

В редакторе - код внутри { } можно сворачивать. Можно как то в последней студии свернуть сразу весь код на странице?

Re: AVR studio в вопросах и ответах

Вт май 21, 2019 11:42:59

я запомнил только [Ctrl]+[M]+[L]. Хотя есть еще комбинации клавиш. Может еще кто чего подскажет?

Тоже вопрос есть. Как вернуть вкладку VA Outline? Нечаянно закрыл, а где она включается найти теперь не могу. На одном компе она есть, на другом нет :(

Re: AVR studio в вопросах и ответах

Ср май 22, 2019 14:58:32

Здравствуйте. Есть вопрос, не совсем в тему но все же. Смотрите - есть Atmega128, в допотопной железяке. Есть предполагаемый разьем для программирования. Но на этот разьем выведены пины PDI, не спи, не житаг. Шилось это все каким-то програматором фирменным - корпус как у MkII, но интерфейс COM. Но старики хрестятся что и юсбшным МК2 шьется. Только вот студия не конектится, да и нет там варианта подключения по ПДИ к такому камню. Может кто внести ясность что это такое? Так же есть в распоряжении Atmel ICE, но выбрав его в студии так же не появляется варианта по ПДИ. Нам надо стащить с чипа прошивку, и прошить аналогичную железяку. Это типа нашего производства, только ему лет 15 и уже никто ничего не помнит :)))
Ответить