Например TDA7294

Форум РадиоКот • Просмотр темы - Почему у меня читается только первый элемент массива?
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 23, 2024 11:38:09

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 20 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Сб май 14, 2011 22:34:39 
Первый раз сказал Мяу!

Зарегистрирован: Вс дек 27, 2009 01:49:18
Сообщений: 38
Рейтинг сообщения: 0
Я только третий день разбираюсь в программирование, поэтому прошу вашей помощи.
Написал программу по аналогии со статьей из обучалки, где переключаются массивы.
Проблемы:
1) Почему у меня читается только первый элемент массива, а второй игнорируется?
2) Как сделать так, чтобы массив читался только один раз и по прочтении останавливался на последнем значении (то есть не зацикливался)
3)как сделать так, чтобы переключение массивов (при нажатии на кнопку) происходило по заднему фронту?

Листинг программы (прошу сильно не пинать, только начал учиться :write: )))

.include "2313def.inc"
.def Temp =r16
.def temp1 =r17
.def temp2 =r18 ;

.def knopka=R21

.cseg
.org 0

RESET:

ser temp
out DDRB, temp ;
out PORTB,temp


yvelichenie:
ldi Temp1,0
ldi Temp2,0

l_res:
dec Temp1
brne l_res

dec Temp2
brne l_res

sbis PIND,0x00
inc knopka


SelectArray:

andi knopka,0b00000111

Tst0: cpi knopka,0
brne Tst1
ldi ZH,High(Array0*2)
ldi ZL,Low(Array0*2)
rjmp ReadArray

Tst1: cpi knopka,1
brne Tst2
ldi ZH,High(Array1*2)
ldi ZL,Low(Array1*2)
rjmp ReadArray

Tst2: cpi knopka,2
brne Tst3
ldi ZH,High(Array2*2)
ldi ZL,Low(Array2*2)
rjmp ReadArray

Tst3: cpi knopka,3
brne Tst4
ldi ZH,High(Array3*2)
ldi ZL,Low(Array3*2)
rjmp ReadArray

Tst4: cpi knopka,4
brne Tst5
ldi ZH,High(Array4*2)
ldi ZL,Low(Array4*2)
rjmp ReadArray

Tst5: cpi knopka,5
brne Tst6
ldi ZH,High(Array5*2)
ldi ZL,Low(Array5*2)
rjmp ReadArray

Tst6: cpi knopka,6
brne Tst7
ldi ZH,High(Array6*2)
ldi ZL,Low(Array6*2)
rjmp ReadArray

Tst7: ldi ZH,High(Array7*2)
ldi ZL,Low(Array7*2)
rjmp ReadArray


ReadArray:

ldi Temp,0
add ZL,Temp1
adc ZH,Temp

lpm

mov Temp,R0

inc Temp1

rjmp Output

Init: ldi Temp1,0
rjmp SelectArray

Output: out PortB,Temp

Array0:
.db 0b01111111,0b01111111

Array1:
.db 0b00111111,0b10111111

Array2:
.db 0b10011111,0b11011111

Array3:
.db 0b11001111,0b11101111

Array4:
.db 0b11100111,0b11110111

Array5:
.db 0b11110011,0b11111011

Array6:
.db 0b11111001,0b11111101

Array7:
.db 0b11111100,0b11111110

rjmp yvelichenie


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Вс май 15, 2011 02:47:21 
Друг Кота
Аватар пользователя

Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52
Сообщений: 4470
Откуда: Главный Улей России (Moscow)
Рейтинг сообщения: 0
Код:
Output: out PortB,Temp

Array0:
.db 0b01111111,0b01111111

Array1:
.db 0b00111111,0b10111111

Array2:
.db 0b10011111,0b11011111

Array3:
.db 0b11001111,0b11101111

Array4:
.db 0b11100111,0b11110111

Array5:
.db 0b11110011,0b11111011

Array6:
.db 0b11111001,0b11111101

Array7:
.db 0b11111100,0b11111110

rjmp yvelichenie ; Это!!!!

Ничего не заметили?
Массивы надо ставить в конце. У Вас получается, что программа лезет исполнять массивы и МК просто перезагружается.
Вот так надо:
Код:
Output: out PortB,Temp

rjmp yvelichenie ;Вот тут оно должно быть. )))

Array0:
.db 0b01111111,0b01111111
Array1:
.db 0b00111111,0b10111111
Array2:
.db 0b10011111,0b11011111
Array3:
.db 0b11001111,0b11101111
Array4:
.db 0b11100111,0b11110111
Array5:
.db 0b11110011,0b11111011
Array6:
.db 0b11111001,0b11111101
Array7:
.db 0b11111100,0b11111110

Скачайте себе 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!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Вс май 15, 2011 12:31:33 
Первый раз сказал Мяу!

Зарегистрирован: Вс дек 27, 2009 01:49:18
Сообщений: 38
Рейтинг сообщения: 0
Спасибо Вам огромное, теперь стало понятнее, сейчас буду пробовать, но думаю вопросы еще появятся ))


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Вс май 15, 2011 13:50:58 
Друг Кота
Аватар пользователя

Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52
Сообщений: 4470
Откуда: Главный Улей России (Moscow)
Рейтинг сообщения: 0
Чтобы достать любой элемент из массива, можно так:
Код:
;.........
;....
.def temp = r16
;..........
..............
ldi ZL, Low(Array*2)
ldi ZH, High(Array*2)
ldi temp, 0x00 ;Вытащим первый элемент (хотя, лучше назвать его нулевым)
;..........
;...............
add ZL, temp
clr temp
adc ZH, temp
lpm temp, Z
;----------
;----------
Array:
.db 1, 2, 4, 8, 16, 32, 64, 128

Задавая значение регистру temp от нуля до семи, мы можем достать любое число из массива.
Если будут вопросы, выкладывайте.

_________________
I am DX168B and this is my favourite forum on internet!


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Вс май 15, 2011 14:01:36 
Первый раз сказал Мяу!

Зарегистрирован: Вс дек 27, 2009 01:49:18
Сообщений: 38
Рейтинг сообщения: 0
Чего-то я торможу, теперь у меня читается только второй элемент массива, не могу сообразить, что с регистрами я делаю не так:


Последний раз редактировалось Xaero Ср май 18, 2011 20:09:16, всего редактировалось 1 раз.

Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Вс май 15, 2011 14:03:52 
Первый раз сказал Мяу!

Зарегистрирован: Вс дек 27, 2009 01:49:18
Сообщений: 38
Рейтинг сообщения: 0
Получается у меня вся проблема с момента ReadArray ?
Кстати как у Вас получается добавлять коментарии в коде без искажения кодировки?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: 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!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Вс май 15, 2011 14:29:29 
Первый раз сказал Мяу!

Зарегистрирован: Вс дек 27, 2009 01:49:18
Сообщений: 38
Рейтинг сообщения: 0
"Отлаживаю на СТК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!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Вс май 15, 2011 15:03:00 
Друг Кота
Аватар пользователя

Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52
Сообщений: 4470
Откуда: Главный Улей России (Moscow)
Рейтинг сообщения: 0
Вот:
Код:
.include "tn2313def.inc"
.def Temp =r16
.def temp1 =r17
.def temp2 =r18
.def knopka=R21
;----------
.cseg
.org 0x0000
rjmp RESET
.org INT_VECTORS_SIZE
;----------
RESET:
ldi      temp,      Low(RAMend)
out      SPL,      temp
ldi      temp,      0xFF
out      DDRB,      temp
out      PORTB,      temp
clr      knopka
BT_RQ:
sbis   PIND,      0
rjmp   BT_RQ
BT_RQ1:
sbic   PIND,      0
rjmp   BT_RQ1
ldi      temp1,      0x02
;----------
cpi      knopka,      0x00
brne   INIT1
ldi      ZL,         Low(Array0*2)
ldi      ZH,         High(Array0*2)
rjmp   LOAD_ARRAY
;----------
INIT1:
cpi      knopka,      0x01
brne   INIT2
ldi      ZL,         Low(Array1*2)
rjmp   LOAD_ARRAY
;----------
INIT2:
cpi      knopka,      0x02
brne   INIT3
ldi      ZL,         Low(Array2*2)
ldi      ZH,         High(Array2*2)
rjmp   LOAD_ARRAY
;----------
INIT3:
cpi      knopka,      0x03
brne   INIT4
ldi      ZL,         Low(Array3*2)
ldi      ZH,         High(Array3*2)
rjmp   LOAD_ARRAY
;----------
INIT4:
cpi      knopka,      0x04
brne   INIT5
ldi      ZL,         Low(Array4*2)
ldi      ZH,         High(Array4*2)
rjmp   LOAD_ARRAY
;----------
INIT5:
cpi      knopka,      0x05
brne   INIT6
ldi      ZL,         Low(Array5*2)
ldi      ZH,         High(Array5*2)
rjmp   LOAD_ARRAY
;----------
INIT6:
cpi      knopka,      0x06
brne   INIT7
ldi      ZL,         Low(Array6*2)
ldi      ZH,         High(Array6*2)
rjmp   LOAD_ARRAY
;----------
INIT7:
ldi      ZL,         Low(Array7*2)
ldi      ZH,         High(Array7*2)
;----------
LOAD_ARRAY:
lpm      temp,      Z+
out      PORTB,      temp
dec      temp1
brne   LOAD_ARRAY
cpi      knopka,      0x07
breq   CLEAR
inc      knopka
rjmp   BT_RQ
CLEAR:
clr      knopka
rjmp   BT_RQ
;----------
Array0:
.db  0b01111111,0b01111111

Array1:
.db  0b00111111,0b10111111

Array2:
.db  0b10011111,0b11011111

Array3:
.db  0b11001111,0b11101111

Array4:
.db  0b11100111,0b11110111

Array5:
.db  0b11110011,0b11111011

Array6:
.db  0b11111001,0b11111101

Array7:
.db  0b11111100,0b11111110
;----------

Я бы сделал методом табличной адресации, но вам это рано пока.

_________________
I am DX168B and this is my favourite forum on internet!


Последний раз редактировалось DX168B Вс май 15, 2011 15:09:14, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Вс май 15, 2011 15:07:21 
Первый раз сказал Мяу!

Зарегистрирован: Вс дек 27, 2009 01:49:18
Сообщений: 38
Рейтинг сообщения: 0
Да так...
Навсякий случай еще раз приведу последовательность.

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!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Вс май 15, 2011 15:17:39 
Первый раз сказал Мяу!

Зарегистрирован: Вс дек 27, 2009 01:49:18
Сообщений: 38
Рейтинг сообщения: 0
У меня чего-то затык получился с инкриментом значения кнопки, то есть прогграмма зависает в разделе INIT2 и дальше ни сместа, хотя значение регистра кнопки уже равно трем, ведь поидеи он должен идти дальше(как делает это в предыдущих двух случаях) а он чего то завис на этих двух строчках
Код:
cpi      knopka,      0x02
brne   INIT2


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Вс май 15, 2011 15:25:26 
Друг Кота
Аватар пользователя

Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52
Сообщений: 4470
Откуда: Главный Улей России (Moscow)
Рейтинг сообщения: 0
Исправь:
Код:
cpi      knopka,      0x02
brne   INIT3

Это я копированием делал и забыл поправить. :)
И тут тоже:
Код:
LOAD_ARRAY:
lpm      temp,      Z+
out      PORTB,      temp
dec      temp1
brne   LOAD_ARRAY
cpi      knopka,      0x07 ;ЭТО ПОПРАВИТЬ
breq   CLEAR
inc      knopka
rjmp   BT_RQ
CLEAR:
clr      knopka
rjmp   BT_RQ

_________________
I am DX168B and this is my favourite forum on internet!


Последний раз редактировалось DX168B Вс май 15, 2011 15:29:13, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Вс май 15, 2011 15:27:51 
Первый раз сказал Мяу!

Зарегистрирован: Вс дек 27, 2009 01:49:18
Сообщений: 38
Рейтинг сообщения: 0
Еще вопрос, почему вы всякого рода числовые значения записываете в 16-ричной системе исчисления? Неужели так проще?
Что значит строчка .org INT_VECTORS_SIZE ?
Почему мы должны очистить регистр clr knopka, в нем изначально что-то записан?
Почему ldi temp, 0xFF, а не 0х00 ?
.
Вот блин, я сам лопух, такого не заметил, кинулся сразу прогу испытывать, спасибо ))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Вс май 15, 2011 15:32:05 
Первый раз сказал Мяу!

Зарегистрирован: Вс дек 27, 2009 01:49:18
Сообщений: 38
Рейтинг сообщения: 0
Повтороюсь, так как я использую стк500, то начальное положение кнопки равно 1, если мне нужно сделать по последнему фронту, то нужно написать так?
Код:
sbis   PIND,      1
rjmp   BT_RQ
BT_RQ1:
sbic   PIND,      0
rjmp   BT_RQ1


Не, чего то не так, оно конечно и переключается по заднему фронту теперь, но зато массивы хаотично переключать стала, щас надо попробовать разобраться, из-за чего так (может из-за дребезга?)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: 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
А поменять надо так:
Код:
BT_RQ:
sbic   PIND,      0
rjmp   BT_RQ
BT_RQ1:
sbis   PIND,      0
rjmp   BT_RQ1

_________________
I am DX168B and this is my favourite forum on internet!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Ср май 18, 2011 18:16:10 
Первый раз сказал Мяу!

Зарегистрирован: Вс дек 27, 2009 01:49:18
Сообщений: 38
Рейтинг сообщения: 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

Это всё работает, но я захотел сделать задержку после нажатия кнопки, то есть нажал кнопку, а переключение например спустя пару секунд сработало, так вот я попытался же эту структуру вставить после обработки кнопки
Код:
BT_RQ:
sbis   PIND,      0
rjmp   BT_RQ
BT_RQ1:
sbic   PIND,      0
rjmp   BT_RQ1
.............
Вот тут........
.............
ldi      temp1,      0x02

Но почему то у меня даже программа в Авр студио не запускается, соответсвенно в контроллер то же не записывается.
Просто у меня окно диалога куда-то за пределы экрана убежало (второй монитор подрубал), а как вернуть его не знаю, так поэтому и не знаю, что за 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!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Почему у меня читается только первый элемент массива?
СообщениеДобавлено: Ср май 18, 2011 20:04:56 
Первый раз сказал Мяу!

Зарегистрирован: Вс дек 27, 2009 01:49:18
Сообщений: 38
Рейтинг сообщения: 0
Ага спасибо за совет...
Слушайте, я попытался вставить задержку по вашему совету, но почему то разницы никакой не заметил, хотя в авр студио должна быть порядочная (по процессорному времени смотрел). Светодиоды с задержкой мигают, а переключение после нажатия происходит сразу же....
Код:
.include "tn2313def.inc"
.def Temp =r16
.def temp1 =r17
.def temp2 =r18
.def knopka=R21
.def zad1  =r19
.def zad2  =r20
;----------
.cseg
.org 0x0000
rjmp RESET
.org INT_VECTORS_SIZE
;----------
RESET:
ldi      temp,      Low(RAMend)
out      SPL,      temp
ldi      temp,      0xFF
out      DDRB,      temp
out      PORTB,      temp
clr      knopka
BT_RQ:
sbis   PIND,      0
rjmp   BT_RQ
BT_RQ1:
sbic   PIND,      0
rjmp   BT_RQ1
rcall Delay                                   ; Вызов подпрограммы задержки
ldi      temp1,      0x02
;----------
cpi      knopka,      0x00
brne   INIT1
ldi      ZL,         Low(Array0*2)
ldi      ZH,         High(Array0*2)
rjmp   LOAD_ARRAY
;----------
INIT1:
cpi      knopka,      0x01
brne   INIT2
ldi      ZL,         Low(Array1*2)
rjmp   LOAD_ARRAY
;----------
INIT2:
cpi      knopka,      0x02
brne   INIT3
ldi      ZL,         Low(Array2*2)
ldi      ZH,         High(Array2*2)
rjmp   LOAD_ARRAY
;----------
INIT3:
cpi      knopka,      0x03
brne   INIT4
ldi      ZL,         Low(Array3*2)
ldi      ZH,         High(Array3*2)
rjmp   LOAD_ARRAY
;----------
INIT4:
cpi      knopka,      0x04
brne   INIT5
ldi      ZL,         Low(Array4*2)
ldi      ZH,         High(Array4*2)
rjmp   LOAD_ARRAY
;----------
INIT5:
cpi      knopka,      0x05
brne   INIT6
ldi      ZL,         Low(Array5*2)
ldi      ZH,         High(Array5*2)
rjmp   LOAD_ARRAY
;----------
INIT6:
cpi      knopka,      0x06
brne   INIT7
ldi      ZL,         Low(Array6*2)
ldi      ZH,         High(Array6*2)
rjmp   LOAD_ARRAY
;----------
INIT7:
ldi      ZL,         Low(Array7*2)
ldi      ZH,         High(Array7*2)
;----------
LOAD_ARRAY:
lpm      temp,      Z+
out      PORTB,      temp
;----------
rcall delay                               ;Еще один вызов подпрограммы
;----------
dec      temp1
brne   LOAD_ARRAY
cpi      knopka,      0x07
breq   CLEAR
inc      knopka
rjmp   BT_RQ
CLEAR:
clr      knopka
rjmp   BT_RQ
Delay:                                       ;Подпрограмма задержки
ldi zad1,0xff
ldi zad2,0xff
l_res:
dec zad1
brne l_res
dec zad2
brne l_res
ret                                             ;Выход из под программы
;----------
Array0:
.db  0b01111111,0b01111111

Array1:
.db  0b00111111,0b10111111

Array2:
.db  0b10011111,0b11011111

Array3:
.db  0b11001111,0b11101111

Array4:
.db  0b11100111,0b11110111

Array5:
.db  0b11110011,0b11111011

Array6:
.db  0b11111001,0b11111101

Array7:
.db  0b11111100,0b11111110
;----------


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 20 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y