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

Проблемы с массивом в AVR на ASM

18.10.2015, 21:17. Показов 3465. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, прошу помощи так как не могу разобраться уже месяц с массивом на 8 меге.
Задаю массив из десяти 16-х чисел, которые являются кодами для 7-ми сегментного индикатора, получаю данные с часов реального времени, разбиваю маской эти данные и прибавляю к счетчику, хочу получить на выходе цифру с часов на индикаторе, но при прибавлении к счетчику правильно выдает только самое первое число, затем только 0xFF. НЕ могу разобраться.
Привожу код в котором реализована только работа с массивом, отдельно от всей программы.
.divice ATMiko8
.include "m8def.yms"
.org 0x00

ldi r16, low (ramend)
out spl, r16
ldi r16, high (ramend)
out sph, r16

ldi ZL,LOW(2*sym_table);задаю массив
ldi ZH,High(2*sym_table)

/////////////////////////////////////////

ldi r16,5;задаю числа для прибавления к счетчику
ldi r17,8;--||--||--
ldi r19,1;--||--||--

ldi r20,0;запрашиваю данные из массива
add ZL,r16
adc ZH,r20
lpm
;правильные данные только здесь, затем только FF
ldi r20,0
add ZL,r17
adc ZH,r20
lpm
ldi r20,0
add ZL,r18
adc ZH,r20
lpm
stop: rjmp stop

sym_table:
.db 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x07,0x7f,0x6f,0xff

Я так понял что счетчик, по какой-то причине не обнуляется после первой операции
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2015, 21:17
Ответы с готовыми решениями:

ASM + AVR Studio
Осваиваю AVR+ASM, необходимо сделать цикл N число раз, N считывается из порта C. Как считать N в...

Asm вставки в AVR GCC
Есть у кого-то описание как писать эти _страшные_ вещи? Конструкция подразумевающая всего лишь swap...

Табличный переход в AVR (ASM)
Есть код, который в зависимости от установленного бита порта должен сделать переход на определенный...

TCP/HTTP + AVR .ASM
Приветствую! Наткнулся на сабж как и на этот форум несколько дней назад в журнале радио. Начал с...

4
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
18.10.2015, 21:49 2
Код
.divice ATMiko8
.include "m8def.yms"
.org 0x00

ldi r16, low (ramend)
out spl, r16
ldi r16, high (ramend)
out sph, r16

ldi ZL,LOW(2*sym_table);задаю массив
ldi ZH,High(2*sym_table)

/////////////////////////////////////////

ldi r16,5;задаю числа для прибавления к счетчику
ldi r17,8;--||--||--
ldi r19,1;--||--||--

ldi r20,0;запрашиваю данные из массива
add ZL,r16
adc ZH,r20
lpm
;правильные данные только здесь, затем только FF
ldi ZL,LOW(2*sym_table);задаю массив
ldi ZH,High(2*sym_table)

ldi r20,0
add ZL,r17
adc ZH,r20
lpm
ldi ZL,LOW(2*sym_table);задаю массив
ldi ZH,High(2*sym_table)
ldi r20,0
add ZL,r18
adc ZH,r20
lpm
stop: rjmp stop

sym_table:
.db 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x07,0x7f,0x6f,0xff
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
18.10.2015, 23:26 3
Ну, как-то так...
Код
//========================================================================
.equ   ANOD_ONE      = 1<<5
.equ    ANOD_TEN        = 1<<4
.equ    ANOD_HANDRED     = 1<<3
.equ    ANOD_THOUSAND     = 1<<2

.equ   A            = 1<<6
.equ   B            = 1<<7 //     A
.equ   C            = 1<<3 //   F   B
.equ   D            = 1<<2 //     G
.equ   E            = 1<<1 //   E   C
.equ   F            = 1<<5 //     D
.equ   G            = 1<<4
.equ   H            = 1<<0
//------------------------------------------------------------------------

//------------------------------------------------------------------------
.equ   ZERO         = A+B+C+D+E+F
.equ   ONE            = B+C
.equ   TWO            = A+B+D+E+G
.equ   THREE         = A+B+C+D+G
.equ   FOUR         = B+C+F+G
.equ   FIVE         = A+C+D+F+G
.equ   SIX            = A+C+D+E+F+G
.equ   SEVEN         = A+B+C
.equ   EIGHT         = A+B+C+D+E+F+G
.equ   NINE         = A+B+C+D+F+G
//========================================================================

.dseg

//========================================================================
DISPLAY_BUFFER:
.equ   DISPLAY_BUFFER_SIZE = 4
.byte   DISPLAY_BUFFER_SIZE
//========================================================================

.cseg

//========================================================================
.macro   Proc_7_Segm_Ind
mov      CNT, CNT_7_SEGM_IND

clr      ZH
mov      ZL, CNT
lsl      ZL
subi   ZL, LOW(-(Table_7_Segm_Ind*2))
sbci   ZH, HIGH(-(Table_7_Segm_Ind*2))

lpm      CNT_7_SEGM_IND, Z+
lpm      ANODS, Z

ldz      DISPLAY_BUFFER
addw   Z, CNT, RCLR
ld      ZL, Z

clr      ZH
subi   ZL, LOW(-(Table_7_Segm_Char*2))
sbci   ZH, HIGH(-(Table_7_Segm_Char*2))

lpm      KATODS, Z
.endmacro
//------------------------------------------------------------------------

//------------------------------------------------------------------------
Table_7_Segm_Ind:
.db      0x01, ANOD_THOUSAND
.db      0x02, ANOD_HANDRED
.db      0x03, ANOD_TEN
.db      0x00, ANOD_ONE

Table_7_Segm_Char:
.db      ZERO,    ONE
.db      TWO,     THREE
.db      FOUR,    FIVE
.db      SIX,     SEVEN
.db      EIGHT,   NINE
//========================================================================
0
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 49
19.10.2015, 17:05 4
ZL/ZH нужно загружать перед каждым lpm.
Ещё, команда "lpm" грузит данные в регистр R0, здесь можно использовать "lpm r16,z"
0
MoxyOK
19.10.2015, 17:27 5
Всем спасибо. Ни в каком из примеров которые находил, этого небыло
19.10.2015, 17:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2015, 17:27
Помогаю со студенческими работами здесь

Интерполяция на asm для AVR
Приветствую всех. Назрела проблема линейной интерполяции для шаговых двигателей,которые будут...

Вопрос к пишущим на asm в AVR Studio 4-5-6
Собственно хотелось бы услышать какая версия наименее глючная и удобная в этом ключе. Какие глюки...

AVR (ASM). Одновременное нажатие кнопок
Как организовать одновременное нажатие двух кнопок чтобы, при этом загорались три светодиода. (на...

C++/C#/ASM STM32/AVR разработчик. Ищу работу
Доброго времени суток Закончил университет по специальности радиотехника. Хорошо знаю железо,...

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

Управление светодиодами кнопками в ASM для AVR
Есть программа на ассемблере для AVR. К порту C присоединены в протеусе одна кнопка и один...


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

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