Tmytry
|
|
1 | |
Ассемблер AVR studio двойные слова числа18.07.2010, 16:56. Показов 13543. Ответов 26
Метки нет (Все метки)
Здравствуйте, вопрос от новичка, пытаюсь изучать МК на конкретной задаче.
Условия такие, МК мега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го Подскажите где можно почитать шаг за шагом? учебный курс для начинающих читаю но не догоняю. Спасибо. |
18.07.2010, 16:56 | |
Ответы с готовыми решениями:
26
AVR ассемблер. объявление массива .db Atmel Studio 7, ошибка компиляции? AVR ассемблер. объявление массива .db в макросе .macro не работает!? Atmel Studio 7 CAVR против AVR Studio, что не так в программе под AVR Studio Ассемблер AVR-AS из AVR-GCC Инкрементация числа до переполнения на ASM в AVR Studio |
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
|
|
19.07.2010, 16:18 | 21 |
На самом деле ещё проще. 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 |
Сообщение от Гарнист
0
|
Tmytry
|
|
19.07.2010, 17:26 | 23 |
Сообщение от STT
Точно, блин, числа то в шеснадцатеричной а не десятичной. Спасибо. А еще один вопрос, изменил таблицу ;А в самом конце программы таблица: ;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
Каждая система имеет свои преимущества, апологетов и недостатки. ATMEL выбрал как у Intel - младшим сначала. То есть число 0x1234 будет записано как 0x34 0x12. Вроде бы для 8-битного процессора смысла в этом нет, но, некоторые команды (и ассемблер как целое) работает именно в этой системе: odyw, sbiw, косвенная адресация - младший байт - в младшем регистре (первым по порядку).
Сообщение от Lmytry
0
|
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 641
|
|
19.07.2010, 23:08 | 25 |
Сообщение от Lmytry
Сообщение от Lmytry
0
|
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
|
|
20.07.2010, 00:24 | 26 |
Сообщение от Lmytry
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 | |
20.07.2010, 12:45 | |
Помогаю со студенческими работами здесь
27
Вывод числа в порт (AVR Studio, ATMEGA 16) (Avr Studio + WinAvr) vs (mikroC PRO for AVR) Как подкрутить AVR Toolchain к AVR Studio 4.19? AVR Studio 6 и AVR Toolchain вопросы! Светофор на AVR АССЕМБЛЕР! Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |