Я только третий день разбираюсь в программирование, поэтому прошу вашей помощи. Написал программу по аналогии со статьей из обучалки, где переключаются массивы. Проблемы: 1) Почему у меня читается только первый элемент массива, а второй игнорируется? 2) Как сделать так, чтобы массив читался только один раз и по прочтении останавливался на последнем значении (то есть не зацикливался) 3)как сделать так, чтобы переключение массивов (при нажатии на кнопку) происходило по заднему фронту?
Листинг программы (прошу сильно не пинать, только начал учиться )))
Скачайте себе AVR Studio 4 и будет Вам проще. Там хоть симулировать можно программу, то есть выполнять по шагам и следить за регистрами.
Следующее: Вы складываете Temp1 с парой, но в течении всей программы у Вас Temp1 не изменяется. Если задать регистру Temp1 значение 0x01 или 0b00000001, то тогда у Вас будут читаться вторые элементы массивов. Регистровая пара - это указатель адреса ячейки ПЗУ, с которой надо проделать операцию. Получается, что Вы указываете адрес начала массива, но не ходите по нему.
Код:
.include "tn2313def.inc" .def temp0 = r16 .def count = r17 ;---------- .cseg .org 0x0000 ldi temp0, 0xFF out DDRB, temp0 ;---------- MAIN: ldi ZL, Low(Array*2) ldi ZH, High(array*2) ldi count, 0x09 ;---------- LOOP: lpm temp0, Z+ ;Загружаем значение сразу в temp0, и после этого сразу увеличиваем Z на 1 out PORTB, temp0
;Где-то тут можно вставить задержку
dec count brne LOOP rjmp MAIN ;---------- Array: .db 1, 2, 4, 8, 16, 32, 64, 128
В этом образце мы читаем по очереди элементы одного массива и выводим их в PORTB Этот образец расчитан на ATTINY2313 - почти полный аналог AT90S2313, только более нафаршированный, дешёвый и легче найти. (AT90S2313 давно снят с производства)
_________________ I am DX168B and this is my favourite forum on internet!
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
Добавлено: Вс май 15, 2011 14:13:21
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4470 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
Я вручную писал прямо в странице. Открываете исходник блокнотом и копируете на сайт, тогда кодировка не искажается. Так, давайте определимся с ТЗ. Значит нам надо в массивах завести значения для мигалок? А по нажатию кнопки, переключаться между массивами. Так? Вам кнопку надо повесить на прерывание, или периодически опрашивать её таймером.
_________________ I am DX168B and this is my favourite forum on internet!
"Отлаживаю на СТК500 поэтому все значия портов инверсно" Суть ТЗ такая: 1)При включении устройства срабатывает первое реле (в случае отладки это будет первый светодиод "01111111" чтение 1-ого массива) 2)по приходу первого импульса на PIND 0 должно сработать чтение второго массива, то есть сначала в порт В должно вывестись 00111111, а следом за ним 11011111 3)ждать следующего импульса, если импульса нет, то контроллер должен остановиться на последнем элементе последнего массива. 4)по приходу импульса начать чтение следующего массива по аналогичной схеме. Ну и так далее Так вот вроде в моей корявой проге оно и происходит, за исключением того, что когда нажимаю на кнопку (импульс) то у меня читается либо первый, либо второй элемент массива, а не последовательно весь.
Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
Добавлено: Вс май 15, 2011 14:37:33
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4470 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
То есть надо прочитать все элементы массива и остановиться до тех пор, пока не проскочит импульс? Как проскочит, прочитать следующий массив, за тем снова ждать импульса? Так? Ждите исходник.
_________________ I am DX168B and this is my favourite forum on internet!
Да так... Навсякий случай еще раз приведу последовательность.
1)Нажали на кнопку, пошел вывод Array0. 2)Ждем следующего нажатия, в порту вывода находится предыдущее значение 3)Нажали еще раз на кнопку, пошел вывод Array1, сначала 00111111, следом за ним (можно без задержек) 10111111 4)Ждем следующего нажатия, в порту вывода находится последний элемент (10111111) 5)Нажали на кнопку, пошел вывод Array2, сначала 10011111, следом 11011111. Ну и так далее до последнего массива....
Буду премного благодарен за исходник, мне как для новичка так будет проще(не в том плане,что готовый код) а втом плане, что так проще понять будет, да и в дизасме будет на что посмотреть...вобщем думаю вы меня поняли.
Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
Добавлено: Вс май 15, 2011 15:11:15
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4470 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
Я так и сделал. Чтение массива начинается по заднему фронту, это если в исходном состоянии на ноге PD0 логический нуль. Если так, то советую резистор на минус питания, во избежание ложняков из-за Z состояния входов.
_________________ I am DX168B and this is my favourite forum on internet!
У меня чего-то затык получился с инкриментом значения кнопки, то есть прогграмма зависает в разделе INIT2 и дальше ни сместа, хотя значение регистра кнопки уже равно трем, ведь поидеи он должен идти дальше(как делает это в предыдущих двух случаях) а он чего то завис на этих двух строчках
Еще вопрос, почему вы всякого рода числовые значения записываете в 16-ричной системе исчисления? Неужели так проще? Что значит строчка .org INT_VECTORS_SIZE ? Почему мы должны очистить регистр clr knopka, в нем изначально что-то записан? Почему ldi temp, 0xFF, а не 0х00 ? . Вот блин, я сам лопух, такого не заметил, кинулся сразу прогу испытывать, спасибо ))
Не, чего то не так, оно конечно и переключается по заднему фронту теперь, но зато массивы хаотично переключать стала, щас надо попробовать разобраться, из-за чего так (может из-за дребезга?)
Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
Добавлено: Вс май 15, 2011 15:42:01
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4470 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
Привычка просто, да и запись короче получается 0xFF - это тоже самое, что 0b11111111 0x0F - это 0b00001111 0xF0 - это 0b11110000 0x00 - это 0b00000000 Я в основном использую только значения, которые привёл выше и числа от 0 до 15 (от 0x00 до 0x0F) Значения выше - в десятичной (16 - 254) А выборочные единицы пишу так:
Код:
ldi temp, (1<<PB0)|(1<<PB1)|(1<<PB3) ; Получается 0b00001011 out DDRB, temp
На счёт кнопки - нет. sbis PIND, 0 ; Это проверка ноги PD0 sbis PIND, 1 ; Это проверка ноги PD1 sbis PIND, 2 ; Это проверка ноги PD2
SBIS - Skip next command, if bit in I\O register is set То есть: Пропустить следующую команду, если на ноге лог. 1 SBIC - тоже самое, но если на ноге лог. 0 А поменять надо так:
Еще такой вопро, я орагнизовал задержку между переключениями элементов массива таким образом
Код:
LOAD_ARRAY: lpm temp, Z+ out PORTB, temp ;---------- ldi zad1,0 ldi zad2,0 l_res: dec zad1 brne l_res dec zad2 brne l_res ;---------- dec temp1 brne LOAD_ARRAY cpi knopka, 0x07 breq CLEAR inc knopka rjmp BT_RQ CLEAR: clr knopka rjmp BT_RQ
Это всё работает, но я захотел сделать задержку после нажатия кнопки, то есть нажал кнопку, а переключение например спустя пару секунд сработало, так вот я попытался же эту структуру вставить после обработки кнопки
Но почему то у меня даже программа в Авр студио не запускается, соответсвенно в контроллер то же не записывается. Просто у меня окно диалога куда-то за пределы экрана убежало (второй монитор подрубал), а как вернуть его не знаю, так поэтому и не знаю, что за error он мне выдает, а сам чего то не пойму, почему он ругается.....Может просто ввиде перехода оформить?
Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
Добавлено: Ср май 18, 2011 18:43:25
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4470 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
Отключите второй экран в свойствах рабочего стола вот тут:
Можно оформить в виде вызываемой подпрограммы:
Код:
.cseg .org 0x0000 rjmp RESET .org INT_VECTORS_SIZE ;Эта строка организует нашу программу ; после таблицы векторов прерываний RESET: ldi R16, Low(RAMend) out SPL, R16 ;Инициализация стека. ;Без этого не будут работать вызываемые подпрограммы. ............ rcall DELAY ;Вызовем задержку в любом месте программы, после завершения ; задержки, по команде ret в конце неё, мы вернёмся сюда и продолжим дальше. ......... ...... ;---------- DELAY: ;Подпрограмма задержки ...... ..... ret ;Выходим из неё.
Старайтесь задействовать для задержек только свободные регистры, иначе потеряете данные с рабочих регистров.
_________________ I am DX168B and this is my favourite forum on internet!
Ага спасибо за совет... Слушайте, я попытался вставить задержку по вашему совету, но почему то разницы никакой не заметил, хотя в авр студио должна быть порядочная (по процессорному времени смотрел). Светодиоды с задержкой мигают, а переключение после нажатия происходит сразу же....
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения