Консультация № 182479
12.03.2011, 07:52
0.00 руб.
0 10 1
Здравствуйте! Прошу помощи в следующем вопросе:
В массиве, состоящим из N 16-разрядных кодов, определить минимальный элемент и зафиксировать его адрес. Массив находится во внешнем ОЗУ . оформить как подпрограмму.
Параметры подпрограмм хранить в свободной зоне внутренней памяти данных.
Микроконтроллер ATmega8535.

Обсуждение

давно
Посетитель
7438
7205
12.03.2011, 10:14
общий
Допустим, 51 контроллер я знаю, хоть ночью разбуди, напишу любую программу
Вот только с ATmega8535 мне (подозреваю, впрочем, что и многим другим экспертам также) не приходилось сталкиваться
Так что было бы весьма неплохо, если бы Вы дали информацию, "с чем его едят" , т.е. описание и набор команд.
Может у Вас есть примеры программ? Любые...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
12.03.2011, 10:32
общий
Адресаты:
ATmega8535 является КМОП 8- битным микроконтроллером, построенным на расширенной AVR RISC архитектуре.
в прикрепленных все что у меня есть по нему
Прикрепленные файлы:
aaa0148621903ecac6807f88e6fb181b.doc
давно
Посетитель
7438
7205
12.03.2011, 10:59
общий
Ок, будем разбираться...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
21.03.2011, 15:59
общий
это ответ
Здравствуйте, katbka!
Вот, попробовал ответить...
Я не уверен полностью в правильности, т.к. нет возможности проверить.
Даже не компилировал. Тянуть студию на 500 Мб мне почему-то не захотелось
Пробуйте сами. Если что не так, разберемся

[code h=200]
.include "m8535def.inc"

.equ N=100 ;размерность массива

;Назначим регистрам символические имена
.def counter=r17 ;количество слов
;регистровые пары
.def curr_addr=r30 ;Z=r30-r31: адрес текущего элемента
.def min_addr=r28 ;r28-r29: адрес минимального элемента
.def save_addr=r26 ;r26-r27: сохраненный адрес текущего элемента
;одиночные
.def work=r16 ;временный регистр
.def curr_lo=r18 ;r18-r19: текущее слово
.def curr_hi=r19
.def min_lo=r20 ;r20-r21: минимальный элемент
.def min_hi=r21

.ESEG ;сегмент в EEPROM
array:
.db 1,0 ;... задаем 100 слов (предоставляю Вам право набить 200 байт)

.CSEG ;кодовый сегмент
rjmp Start

Start: ;точка входа
ldi R16, low(RAMEND) ;зададим стек
out SPL, R16
ldi R16, high(RAMEND)
out SPH, R16

;Зададим адрес массива и число элементов
;результат в min_addr = r28:r29
;само значение в r20:r21
ldi ZL, low(array) ;мл байт адреса массива
ldi ZH, high(array) ;ст байт адреса массива
ldi counter, $N ;количество
call min ;ищем адрес минимального элемента

wait: jmp wait ;зацикливаемся

min: ;поиск адреса минимального элемента
mov min_lo, $0ffh ;min = заведомо самому большому числу (0ffffh)
mov min_hi, $0ffh

loop: ;цикл по всем элементам
movw save_addr, curr_addr ;сохраним адрес текущего элемента
ld curr_lo, Z+ ;мл байт текущего элемента
ld curr_hi, Z+ ;ст байт текущего элемента
cp curr_hi, min_hi
cpc curr_lo, min_lo
brcs next
;нашли новый минимальный
movw min_addr, save_adr ;сохраним адрес минимального
mov min_lo, curr_lo ;и его значение
mov min_hi, curr_hi
next: ;переходим на анализ следующего элемента
dec counter ;уменьшаем счетчик
brne loop ;циклим, пока counter=r17 не ноль
ret

[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
29.03.2011, 19:33
общий
Адресаты:
Спасибо Вам большое за ответ.. Пробовала в VMLabe, он ругался на обозначения символических имен, заменила все на регистры.. почему-то всегда записывается последний элемент(хотя он точно не максимальный). не могу понять что не так(
давно
Посетитель
7438
7205
30.03.2011, 01:16
общий
У меня есть только одно подозрение: может быть читается не та память?
Покажите преподавателю...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
30.03.2011, 01:33
общий
Адресаты:
да и память уже поменяла, не в EEPROM...
он при запуске и пошаговом выполнении ругается на строчку brge next. просто воскл. знак рядом с ней ставит.
Неизвестный
30.03.2011, 10:04
общий
Адресаты:
Все, разобралась) Спасибо Вам еще раз большое)
давно
Посетитель
7438
7205
30.03.2011, 10:07
общий
Ну и славно
А что было-то? А то я уже "голову сломал"
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
03.04.2011, 20:55
общий
Адресаты:
заменили
Код:
brge	next


на
Код:
brcs	next
Форма ответа