Заголовок сообщения: Re: AVR studio в вопросах и ответах
Добавлено: Пт апр 05, 2019 13:24:49
Это не хвост, это антенна
Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22 Сообщений: 1368 Откуда: Беларусь
Рейтинг сообщения:0
Да. Переменная не объявлена volatile. Попробую, отпишусь. Спасибо! PS Работает! Спасибо большое за дельный совет.
_________________ «Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Кто может подучить по 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
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Это я читал. Я не могу понять какой алгоритм для приходящего байта написал автор. Код я конечно перевел. Например out. Зачем автор из регистра отправляет в порт данные если он принимает байт портом. Вообще алгоритм не понятен
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
данный формат описания обработчика прерывания, как и формат ассемблерной вставки, не характерен для Atmel Studio (и для AVR Studio тоже), поэтому вопрос задан не в той теме.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Например out. Зачем автор из регистра отправляет в порт данные если он принимает байт портом
потому как каждый порт имеет наименование - вы по адресу порта определили, что это за порт? а ведь это не просто порт... замените адреса их соответствующими наименованиями (в даташите наваш МК все есть!), и вы поймете, с какой периферией идет работа. зная это вы сможете расписать значение каждого бита в константах, которые в эти самые "порты" выводятся - и тогда станет понятно, что на самом деле происходит
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Нет что вы. Это я могу сделать сам. Единственное скажите там где 0x00 это всегда адрес?
Ну вот.
In r16, 0x3F // загрузить данные из порта I/O в регистр. То есть данные из SREG в переменную r16. Или не так понял.
А это.
Ldi r16, 0x00 // загрузить непосредственное значение. 0x00 по таблице просто зарезервирован и не имеет никакой функции. Или как понять.? Я только в codevishion avr могу что нибудь написать. Asm не понимаю. Хотя очень надо понять как выполняется эта программа
Последний раз редактировалось mixon46 Ср апр 10, 2019 11:57:49, всего редактировалось 1 раз.
Единственное скажите там где 0x00 это всегда адрес?
не всегда. команды ассемблера могут быть без операндов (например, cli), с оним операндом (ser r0) или с двумя операндами (out port, r16) как правило, если один операнд в команде, то это регистр (даже не вспомню сразу - есть ли исключения?) а вот у двухоперандных команд только один из операндов может быть (а может и не быть) адресом, а второй, всегда регистр. но все вышесказанное вы можете узнать по описанию команд ассемблера AVR, о чем вам уже говорили. находите команду, читаете её описание, узнаете, какие у неё операнды, а затем по этим операндам разбираетесь, что это - адрес или что-то иное.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Заголовок сообщения: Re: AVR studio в вопросах и ответах
Добавлено: Ср апр 10, 2019 14:08:11
Это не хвост, это антенна
Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22 Сообщений: 1368 Откуда: Беларусь
Рейтинг сообщения:0
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-й студии и переносе кода пришлось немножко пошаманить и код заработал.
_________________ «Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
При миграции проекта в Атмел Студио 7 из 6-й версии проект отказывался работать. После создания нового проекта в 7-й студии и переносе кода пришлось немножко пошаманить и код заработал
это очень информативное замечание. я уверен, что ни у кого вот вообще никаких вопросов не возникло - все же знают о проблеме, да и шаман тут каждый первый.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
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
}
но не очень понятно как посчитали что бы прерывание срабатывало в середине бита. нет общей картины. не вижу
Объясните мне пожалуйста как работает этот программный 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. Что за бред.
я запомнил только [Ctrl]+[M]+[L]. Хотя есть еще комбинации клавиш. Может еще кто чего подскажет?
Тоже вопрос есть. Как вернуть вкладку VA Outline? Нечаянно закрыл, а где она включается найти теперь не могу. На одном компе она есть, на другом нет
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Здравствуйте. Есть вопрос, не совсем в тему но все же. Смотрите - есть Atmega128, в допотопной железяке. Есть предполагаемый разьем для программирования. Но на этот разьем выведены пины PDI, не спи, не житаг. Шилось это все каким-то програматором фирменным - корпус как у MkII, но интерфейс COM. Но старики хрестятся что и юсбшным МК2 шьется. Только вот студия не конектится, да и нет там варианта подключения по ПДИ к такому камню. Может кто внести ясность что это такое? Так же есть в распоряжении Atmel ICE, но выбрав его в студии так же не появляется варианта по ПДИ. Нам надо стащить с чипа прошивку, и прошить аналогичную железяку. Это типа нашего производства, только ему лет 15 и уже никто ничего не помнит
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 52
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения