Страница 323 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн фев 05, 2018 09:53:11
akl
Гефестион писал(а):Переменные Read, ReadOffset, ArrCtrOffset объявлены в самом начале (до таблицы векторов прерываний) по 1 байту на каждую.
Может переменные объявлены, но не установлены?
Код: Выделить всё
.equ ReadOffset=$70
.equ ArrCtrOffset=$71
.equ BuffSize=32
CLR R0
STS ArrCtrOffset,R0
STS ReadOffset,R0
TTT:
lds R21,ArrCtrOffset
inc R21 ; Увеличиваем ArrayCounterOffset
cpi R21,6
BRLO Exit
; brne Exit
clr R21
lds R25,ReadOffset
inc R25 ; Увеличиваем ReadOffset
cpi R25,BuffSize
brne Exit
; brne Exit
clr R25
Exit: sts ArrCtrOffset,R21
sts ReadOffset,R25
RJMP TTT
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн фев 05, 2018 09:55:23
АСУ
[uquote="Гефестион",url="/forum/viewtopic.php?p=3301130#p3301130"]сначала никак не хотела работать, поскольку я пробовал регистры R16, R17, R18.[/uquote]
Регистр r16 и r17 у AVR используются как аккумулятор… для новичков их использование не рекомендуется. Тебе нужно взять в привычку при любом прерывании сохранять в стек значения регистров r16, r17 и SREG, а при выходе из прерывания возвращать из стека сохраненные значения этих регистров. Небольшой нюанс при сохранении заключается в следующем: всегда первым сохраняется регистр r16 все последующие не имеют упорядоченного значения. Извлекаются значения из стека строго в обратной последовательности (r16 последним). Таким же образом поступают и с теми регистрами, которые используются как в основном теле программы, так и задействованы в теле прерывания.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн фев 05, 2018 10:51:30
Гефестион
[uquote="akl",url="/forum/viewtopic.php?p=3301166#p3301166"]Может переменные объявлены, но не установлены?
Код: Выделить всё
.equ ReadOffset=$70
.equ ArrCtrOffset=$71
.equ BuffSize=32
CLR R0
STS ArrCtrOffset,R0
STS ReadOffset,R0
TTT:
lds R21,ArrCtrOffset
inc R21 ; Увеличиваем ArrayCounterOffset
cpi R21,6
BRLO Exit
; brne Exit
clr R21
lds R25,ReadOffset
inc R25 ; Увеличиваем ReadOffset
cpi R25,BuffSize
brne Exit
; brne Exit
clr R25
Exit: sts ArrCtrOffset,R21
sts ReadOffset,R25
RJMP TTT
[/uquote]
У меня начало вот так выглядит:
Код: Выделить всё
*************** Константы *****************************************
.equ BuffSize = 32
*************** ОЗУ ***********************************************
.dseg
IN_buff: .byte 32 ; Буфер приема
Read: .byte 1 ; Указатель точки чтения из буфера
ReadOffset: .byte 1 ; Смещение точки чтения
ArrCtrOffset: .byte 1 ; Смещение счётчика чтения массива
Write: .byte 1 ; Указатель точки записи в буфер
;************** Макросы *******************************************
.macro PUSHF
push R16
in R16,SREG
push R16
.endmacro
.macro POPF
pop R16
out SREG,R16
pop R16
.endmacro
*******************************************************************
.cseg
.org 0
Дальше идёт таблица векторов прерывания и затем начинается программа.
Может, я макросы не там разместил? Наверное, их надо размещать после
.cseg ?
Добавлено after 6 minutes 16 seconds:
[uquote="АСУ",url="/forum/viewtopic.php?p=3301171#p3301171"]Тебе нужно взять в привычку при любом прерывании сохранять в стек значения регистров r16, r17 и SREG, а при выходе из прерывания возвращать из стека сохраненные значения этих регистров. Небольшой нюанс при сохранении заключается в следующем: всегда первым сохраняется регистр r16 все последующие не имеют упорядоченного значения. Извлекаются значения из стека строго в обратной последовательности (r16 последним). Таким же образом поступают и с теми регистрами, которые используются как в основном теле программы, так и задействованы в теле прерывания.[/uquote]
В стек всё сохраняю. Начинаю с R16, затем SREG (написал макросы PUSHF и POPF)
Добавлено after 5 minutes 9 seconds:
[uquote="Demiurg",url="/forum/viewtopic.php?p=3301150#p3301150"]Пользуйтесь симулятором в студии для отладки программ.[/uquote] Кстати да, я симулятором ни разу не пользовался. Надо попробовать) Как думаете, лучше Proteus или AVR Studio?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн фев 05, 2018 11:18:18
akl
Не вижу обнуления.
Код: Выделить всё
CLR R0
STS ArrCtrOffset,R0
STS ReadOffset,R0
Симулировать, на мой взгляд, лучше в студии.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт фев 06, 2018 04:49:51
Demiurg
[uquote="АСУ",url="/forum/viewtopic.php?p=3301171#p3301171"]...[/uquote]
Ерундой болтать изволите. Вдобавок позиционируете себя как не новичок, но вышло ровно наеборот.
1 - никакого сравнения регистров авр с другими мк. Аккумуляторы на других мк.
2 - любые регистры можно испрользовать где хочешь, как хочешь. Главное, что ты понимаешь, что делаешь. И учитываем, что у младших регистров ограничения по командам.
3 - Порядок сохранения регистров в прерываний произвольный, вот как тебе на душу ляжет. Главное правило, как правильно сохранять SREG и порядок восстановления регистров.
4 - Сохранять и восстанавливать нужно только те регистры, которые используются в обработчике прерывания.
Код: Выделить всё
push r16
in r16, SREG
push r16
push r17
bla-bla
pop r17
pop r16
out SREG, r16
pop r16
reti
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт фев 06, 2018 08:09:16
Engineer_Keen
[uquote="Гефестион",url="/forum/viewtopic.php?p=3301213#p3301213"]Как думаете, лучше Proteus или AVR Studio?[/uquote]
Если нужна симуляция только куска кода, то можно использовать студию, если нужно учитывать взаимодействие с другими элементами схемы, то без Протеуса будет сложно. ИМХО Протеус в любом случае удобнее студии, тем более что ничто не мешает скомпилировать проект, и моментально переключившись в протеус его запустить. Главное знать в каком симуляторе какие глюки есть!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт фев 06, 2018 09:14:50
siimao
Вклинусь в беседу о симуляторе... В АВР можно пошагово проверить работу, сравнить содержимое регистров,... А в протеус - только работу: реакцию на нажатие,...
Или я не прав относительно Протеус? Было бы здорово наблюдать содержимое регистров, ставить точки останова,...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт фев 06, 2018 10:08:26
Engineer_Keen
Есть там и регистры и точки останова, только регистры I/O там отображаются просто таблицей как и RAM, но их можно в watch лист добавить и дать нормальные имена (причем они там уже в списке есть, только выбрать). Как например в авр студии просимулировать обмен между 2-мя (3-мя, 10-ю) контроллерами например по SPI? Или динамическую индикацию? Тыкать по битам в регистрах PINx уныло...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт фев 06, 2018 12:33:48
Alexeyslav
Вообще-то в протеусе есть модуль удалённой отладки. Не знаю как в новых студиях, но для 4-й есть плагин удалённого отладчика в протеусе, но он несколько неудобен - протеус запускается исключительно в рамках окна студии и "переключиться" на него проблематично. А в остальном отладка происходит в студии, а симуляция полноценной схемы(её надо нарисовать для проекта заранее и сохранить, в отладке схему изменить нельзя да и проблематично).
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт фев 06, 2018 14:27:34
siimao
Значит возможность есть и я о ней не знаю (((
Всегда тыкал в флаги прерывания и руками устанавливал значения регистров (((
Видел, что в протеус можно открыть лист кода... В этом направлении всеми лапами копаться?
Proteus 8.1 SP1
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт фев 06, 2018 15:08:14
Engineer_Keen
Суйте в модель МК в протеусе не hex, а obj-файл, во время симуляции на паузе тыкайте правой кнопкой на контроллер, внизу меню будет пункт "AVR" - вот там все что вам надо и регистры и память и код, если исходник сишный, еще и переменные можно смотреть...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт фев 06, 2018 19:16:29
Alexeyslav
Только там не абы какой obj-файл надо подсунуть, а скомпилированный с отладочными данными - тогда имена переменных появятся и т.д. Но заманчивей всё-таки использовать возможность удалённой отладки. Только х.з. как её настроить из последней студии... может там какой-то виртуальный отладчик ещё должен быть, через который студия сконектится к протеусу как к обычному программатору-отладчику.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср фев 07, 2018 07:17:20
ARV
Alexeyslav писал(а):Но заманчивей всё-таки использовать возможность удалённой отладки. Только х.з. как её настроить из последней студии...
судя по идеологии GCC там должен использоваться gdb-сервер на удаленном хосте, он там запускается, открывает порт и слушает его. а студия потом по сети к этому порту обращается и командует отладчиком gdb. если не ошибаюсь, вся отладка GCC так работает...
со студиями я никаких дел не имею давно, но пробовал такую удаленку запускать в Eclipse. если протеус может быть запущен в качестве gdb-сервера, то всё должно быть достаточно просто - в настройках оладчика надо будет задать адрес хоста и порт, и все. но как быть с протеусом я вообще не в курсе... а без протеуса только simulavr может быть таким сервером - это крайне убогая, глючная, не симулирующая периферию приблуда... о нормальной отладке с нею речь идти не может, разве что для крайне примитивных проектов типа мигания светодиодом на задержках...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср фев 07, 2018 11:48:04
siimao
Ух ты!!! Я и не знал, но очень в этом нуждался.
Спасибо всем за ответы!
Alexeyslav, а где в AVR Studio задаются параметры компиляции (скомпилированный с/без отладочными данными)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт фев 08, 2018 14:40:58
Feruz
Здравствуйте!
Мега128А, 7372800 Гц, таймер в режиме СТС (№4), делитель 1024, должен переключать порт PB5(OC1A) с частотой 1 Гц (OCR1A=3599). Протеус кажет период что-то 4.4 мс, вместо положенной 1 с. Что не так? Опять прибабах протеуса?
Код: Выделить всё
ldi r_temp, (0<<COM1A1)|(1<<COM1A0)|(0<<WGM11)|(0<<WGM10)
out TCCR1A, r_temp
ldi r_temp, 0x0F
out OCR1AL, r_temp
ldi r_temp, 0x0E
out OCR1AH, r_temp
ldi r_temp, (0<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10)
out TCCR1B, r_temp
Добавлено after 15 minutes 26 seconds:
О Боги, каюсь, грешен! Сначала же надо записывать старший а затем младший регистры сравнения!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт фев 08, 2018 14:50:47
akl
16-разрядные регистры таймеров должны заносить в порядке старший-младший
Код: Выделить всё
ldi r_temp, 0x0E
out OCR1AH, r_temp
ldi r_temp, 0x0F
out OCR1AL, r_temp
ldi r_temp, (0<<COM1A1)|(1<<COM1A0)|(0<<WGM11)|(0<<WGM10)
out TCCR1A, r_temp
; ldi r_temp, 0x0F
; out OCR1AL, r_temp
; ldi r_temp, 0x0E
;out OCR1AH, r_temp
ldi r_temp, (0<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10)
out TCCR1B, r_temp
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 09, 2018 05:19:50
Мяукните!
Сделал стартовый комплект на чистом ассемблере. Для компиляции используются утилиты GCC. Для написания программ - только ваш любимый блокнот!

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 09, 2018 09:08:22
АСУ
[uquote="Demiurg",url="/forum/viewtopic.php?p=3301945#p3301945"]Ерундой болтать изволите. Вдобавок позиционируете себя как не новичок, но вышло ровно наеборот.[/uquote]
Читать не пробовал внимательней?
Demiurg писал(а):1 - никакого сравнения регистров авр с другими мк. Аккумуляторы на других мк.
Не понял, что ты хочешь донести.
Demiurg писал(а):2 - любые регистры можно испрользовать где хочешь, как хочешь. Главное, что ты понимаешь, что делаешь. И учитываем, что у младших регистров ограничения по командам.
Я разве писал, что их нельзя использовать?
Demiurg писал(а):3 - Порядок сохранения регистров в прерываний произвольный, вот как тебе на душу ляжет. Главное правило, как правильно сохранять SREG и порядок восстановления регистров.
Вот тут ты не прав… главное правило как я уже писал: всегда первым в стек сохраняется регистр r16, а вот все последующие уже не имеют упорядоченного значения. Так как если не использовать это правило, то данные регистра r16 будут утеряны.
Demiurg писал(а):4 - Сохранять и восстанавливать нужно только те регистры, которые используются в обработчике прерывания.
Я об этом и писал... читай внимательней.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 09, 2018 09:12:25
dgrett
Да прав Demiurg, прав.. Чем R16 такой особенный?
Имел он ввиду, что нет аккумулятора в AVR,это ж не Z80
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 09, 2018 09:21:21
akl
Мяукните! Ассемблер AVR самодостаточен и не нуждается в сторонней поддержке.
ASM_M328P.zip
Загрузить .asm в блокнот - сделать изменения - сохранить - вызвать .bat - полученный .hex и .eep записать в камень.