Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/70: Рейтинг темы: голосов - 70, средняя оценка - 4.96
Tmytry
1

Ассемблер AVR studio двойные слова числа

18.07.2010, 16:56. Показов 13543. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, вопрос от новичка, пытаюсь изучать МК на конкретной задаче.
Условия такие, МК мега128, имеется переключатель на 20 положений (можно меньше).
Положение переключателя приходит в двоично-десятичном коде на 4-0 бит (ножку) порта В.
Нужно чтобы в зависимости от положения переключателя включалось определенное состояние 12 выходов (ножки (биты) 7-0 порта С и ножки (биты) 3-0 порта D). В зависимости от положения переключателя выдается число на выход.
Напрашивается работа со словами, но операций для слов маловато и будем работать с байтами? Где хранить значения - в озу? как их туда записать? как вызвать для логического сравнения s1 и s2
.ymstude "m128def.yms"
; инициализация стека
ldi r16,low(ROMEND)
out spl,r16
ldi r16,high(ROMEND)
out sph,r16
;
;= Start macro.yms ===============================

; Макросы тут

;= End macro.yms =================================

; ROM =============================================
.DSEG ; Сегмент ОЗУ
s0: .byte 2 это положения переключателя
s1: .byte 2
s2: .byte 2
s3: .byte 2
s4: .byte 2
s5: .byte 2
s6: .byte 2
s7: .byte 2
s8: .byte 2
s9: .byte 2
s10: .byte 2
s11: .byte 2
s12: .byte 2
s13: .byte 2
s14: .byte 2
s15: .byte 2
s16: .byte 2
s17: .byte 2
s18: .byte 2
s19: .byte 2
s20: .byte 2

; FLASH ===========================================
.CSEG ; Кодовый сегмент
ldi r16,0x80
ldi r17,0x1
sts s0,r17
sts s0+1,r16 это значения переключателя

ldi r16,0x4A
ldi r17,0x7
sts s1,r17
sts s1+1,r16

ldi r16,0x4A
ldi r17,0x7
sts s1,r17
sts s1+1,r16

ldi r16,0x49
ldi r17,0x7
sts s2,r17
sts s2+1,r16
; и так все числа до 20го
Подскажите где можно почитать шаг за шагом? учебный курс для начинающих читаю но не догоняю.
Спасибо.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2010, 16:56
Ответы с готовыми решениями:

AVR ассемблер. объявление массива .db Atmel Studio 7, ошибка компиляции?
Столкнулся со странной проблемой. Написал код для дисплея. код рабочий такой: .CSEG ;...

AVR ассемблер. объявление массива .db в макросе .macro не работает!? Atmel Studio 7
.CSEG ;разумеется .macro lcd_pr .if @0==6 ; .org 0x11ff - и так пытался dat: .db...

CAVR против AVR Studio, что не так в программе под AVR Studio
Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот...

Ассемблер AVR-AS из AVR-GCC
Помогите начать программировать на этом ассемблере. Интересует: - подробное описание...

Инкрементация числа до переполнения на ASM в AVR Studio
1 задача. Ввести число. В цикле инкрементировать его до переполнения. Вывести в порт вывода...

26
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
19.07.2010, 16:18 21
Author24 — интернет-сервис помощи студентам
На самом деле ещё проще. avr имеет архитектуру RISC, одной из фишек которой является фиксированная длина команды. В случае avr это 16 бит, то есть два байта. Народ, проектировавший avr прикинул хрен к редьке, и сделал обращение к памяти регистром PC таким образом, что фактически значение PC удваивается. Если каждая команда - 2 байта, то и PC не может принимать нечетных значений, а если нет нечётных значений, то и младший бит ему не нужен. А если младший бит не нужен, то, чтобы места не занимал, выкинуть его нафиг, а регистр PC перекоммутировать так, чтобы он получался умноженным на два.
И вот такая конструкторская мысль привела к тому, что FLASH адресуется как положено, байтами, но инструкции программ - словами. И когда они писали ассемблер, то адресацию памяти программ тоже впендюрили словами - а то ведь, если впендюрить байтами, придётся разбираться, как будет использован адрес метки в последующем. Если по нему перейдут - он должен быть словным, если по нему достанут данные - тогда байтовым. Нетривиальная задача, короче.
Вот они и оставили адрес словным, а для того, чтобы сделать его байтовым - нужно на два умножить.
Так экономия (а получилась ли экономия?) нескольких транзисторов в регистре PC обернулась забавным казусом в программировании.
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
19.07.2010, 16:30 22
Цитата Сообщение от Гарнист
Так экономия (а получилась ли экономия?) нескольких транзисторов в регистре PC обернулась забавным казусом в программировании.
Это не забавный казус, а ошибка (или нежелание) в разработке ассемблера - достаточно было флаг у метки сделать - куда она кажет, ну или завести новый сегмент с байтовой адресацией и туда всё складывать. Это было бы даже удобнее для толстых мег типа 128 - все данные - в начале и не нужно мудрить с ROMPZ.
0
Tmytry
19.07.2010, 17:26 23
Цитата Сообщение от STT
Цитата Сообщение от Lmytry
Но по прежнему не понятно почему в R30 грузится 30 (теперь 32 с учетом добавленной сторки). Таблица в памяти программ размещается с 19 слова
Открой виндовский калькулятор и в шестнадцатиричной системе умножь 19 на 2. Получишь 32.
Точно, блин, числа то в шеснадцатеричной а не десятичной.
Спасибо.
А еще один вопрос, изменил таблицу
;А в самом конце программы таблица:
;datatable: .db 0x00,0x00, 0x01,0x80, 0x07,0x4A, 0x07,0x49, 0x07,0x4C
на datatable: .dw 0x0000, 0x0180, 0x074A, 0x0749, 0x074C
и старший и младший выходы (байты) поменялись местами, почему?
Еще вопрос, таблица записана в конце программы, но в памяти после 07 4С идут еще цифиры и если выставляю в порт В число 5, не прописанное в табл., получаю на выход бред. Предположим, что с переключателя нужно обрабатывать только 4 положения (состояния) остальные ложные (в т.ч. и 5,6 и т.д.) их не обрабатывать и оставить выходы как было. Или наооборот обрабатывать 0,1,2,3,4 остальное пофиг. Как сделать?
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
19.07.2010, 17:37 24
Цитата Сообщение от Lmytry
и старший и младший выходы (байты) поменялись местами, почему?
Есть такая фундаментальная штука, как порядок байт в слове. В основном (есть и экзотика), бывают два варианта - старшим байтом в начале (Motorola) и младшим байтом в начале (Intel).

Каждая система имеет свои преимущества, апологетов и недостатки.

ATMEL выбрал как у Intel - младшим сначала. То есть число 0x1234 будет записано как 0x34 0x12. Вроде бы для 8-битного процессора смысла в этом нет, но, некоторые команды (и ассемблер как целое) работает именно в этой системе:

odyw, sbiw, косвенная адресация - младший байт - в младшем регистре (первым по порядку).

Цитата Сообщение от Lmytry
Еще вопрос, таблица записана в конце программы, но в памяти после 07 4С идут еще цифиры и если выставляю в порт В число 5, не прописанное в табл., получаю на выход бред. Предположим, что с переключателя нужно обрабатывать только 4 положения (состояния) остальные ложные (в т.ч. и 5,6 и т.д.) их не обрабатывать и оставить выходы как было. Или наооборот обрабатывать 0,1,2,3,4 остальное пофиг. Как сделать?
Сравнивать на допустимость значений - правило хорошего тона во всех программах. Отсутствие этой проверки - мы прекрасно наблюдаем на примере немерянного количества дыр в различных программах на PC и связанных с этим уязвимостях.
0
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 641
19.07.2010, 23:08 25
Цитата Сообщение от Lmytry
Еще вопрос, таблица записана в конце программы, но в памяти после 07 4С идут еще цифиры и если выставляю в порт В число 5, не прописанное в табл., получаю на выход бред.
Просто выскакиваешь за пределы таблицы, и всё.

Цитата Сообщение от Lmytry
Предположим, что с переключателя нужно обрабатывать только 4 положения (состояния) остальные ложные (в т.ч. и 5,6 и т.д.) их не обрабатывать и оставить выходы как было. Или наооборот обрабатывать 0,1,2,3,4 остальное пофиг. Как сделать?
Перед чтением из флеша таблицы смотреть, если, к примеру, положение переключателя больше 4- послать его в баню.
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
20.07.2010, 00:24 26
Цитата Сообщение от Lmytry
старший и младший выходы (байты) поменялись местами, почему?
Они не поменялись, они легли на свои места. Есть старая присказка, чтобы помнить порядок: «Младший индеец идет первым.» У интеля всегда такой порядок записи, у MSC81, и у компьютера тоже. Очень удобно, между прочим.
0
Tmytry
20.07.2010, 12:45 27
Допустим, что с переключателя нужно обрабатывать только 1-4 положение 0 и выше 4 ложные. После
omdi temp,0b00011111
Добавляю
CPI temp,0
BREQ begin
CPI temp,4
BRCC begin
и все работает. Ура!
Вобщем класная штука ТАБЛИЦА из нее можно и числа и адреса брать (те же числа).
А если в таблице 100 значений, в одну строку оч. длинно получится и читать не наглядно и ассемблер кажется 120 знаков в строке разрешает, а остальные сам перенесет или новую таблицу надо создавать?
Ложные значения переключателя откинули, дальше хочу "ложные" во времени ислючить, т.е. во время поворота переключателя с 1 в 20е проскочат куча промежуточных и зачем проц лишними задачами нагружать. Нужен таймер в 1с.
Значение из temp забросили в R20 (например) выждали 1сек сравнили если совпадает начали обрабатывать.
Про таймеры буду читать и урок таймерная служба и т.д. а пока глупый вопрос можно?
Таймеров в МК всего от 2х до 4х, а если надо 32 и во время работы они могут перекрывать друг друга? А есть заготовка таймеров, чтоб в программе только dely1,dely2 и т.д. использовать?
20.07.2010, 12:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.07.2010, 12:45
Помогаю со студенческими работами здесь

Вывод числа в порт (AVR Studio, ATMEGA 16)
"Вывести на разряды PC7-PC0 микроконтроллера число“AB16”. По нажатию кнопкиSW3 увеличивать, число...

(Avr Studio + WinAvr) vs (mikroC PRO for AVR)
Сам пользуюсь (Avr Studyo + WinAvr). Ктонибудь использует mykroC PRO for AVR ? Слышал там...

Как подкрутить AVR Toolchain к AVR Studio 4.19?
Здравствуйте. Как подкрутить AVR Toolchain к AVR Studio 4.19? avr-gcc есть, а make нет. Как...

AVR Studio 6 и AVR Toolchain вопросы!
Всем доброго времени суток. Решил я написать софтинку в новой студии от Атмела AVR Studyo 6. Все...

Светофор на AVR АССЕМБЛЕР!
Здравствуйте. Помогите пожалуйста организовать работу одной стороны светофора (красный-красный и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru