Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.85/33: Рейтинг темы: голосов - 33, средняя оценка - 4.85
orm-17
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 35
1

Ограничивалка

26.03.2014, 11:18. Просмотров 5951. Ответов 24
Метки нет (Все метки)

Подскажите, как Сравнить на макс. и мин. значение в двоичном счетчике в самом инкременте декременте счетчика?

Forward:
cbr flags, (1__IvimtForward);сбросить флаг,обработали событие
;перед odyw надо сделать проверку числа на максимальное значение (0xffff), и если равно макс. значению то пропустить инкремент (odyw)

odyw CountHigh:CountLow,1 ;инкремент 16-ти битного счетчика

Покажите пример на ASM. пожалуйста. Очень надо.
0
oomomstir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
26.03.2014, 12:10 2
Делайте наоборот: если при инкременте было переполнение (выставился флаг C) - верните предыдущее значение.
0
orm-17
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 35
26.03.2014, 12:24 3
Я делал так.Вот моя ограничевалка.

;*******************ограничевалка*****************************************

ldi temp1,0x36 ;6

cp temp1,tASCII4

breq equal

rjmp end_int

equal:

ldi temp1,0x35 ;5

cp temp1,tASCII3

breq equal_1

rjmp end_int

equal_1:

ldi temp1,0x35 ;5

cp temp1,tASCII2

breq equal_2

rjmp end_int

equal_2:

ldi temp1,0x33 ;3

cp temp1,cnt16a

breq equal_3

rjmp end_int

equal_3:

ldi temp1,0x35 ;5

cp temp1,tASCII2

breq equal_4

end_int:

ret

;**********************************************************************

Она работает,но мне сказали что,Сравнения на макс. и мин. значение надо делать с двоичным счетчиком получается быстрее.Нужна скорость счета. Напишите пример пожалуйста,а то я что-то ни как не пойму.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
26.03.2014, 13:07 4
AVR202: 16-Byt Arithmetics on tinyAVR omd megaAVR divices

[1.79 Кб]
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
26.03.2014, 13:56 5
Название темы не соответствует сути вопроса. Подправьте.
Цитата Сообщение от orm-17
Forward:
cbr flags, (1__IvimtForward);сбросить флаг,обработали событие
;перед odyw надо сделать проверку числа на максимальное значение (0xffff), и если равно макс. значению то пропустить инкремент (odyw)

odyw CountHigh:CountLow,1 ;инкремент 16-ти битного счетчика

Покажите пример на ASM. пожалуйста. Очень надо.
Просимулируйте в студии и попробуйте разобраться. Исходные данные из первого сообщения.
Код именно на переполнение. Ничего ни с чем не сравнивается.
Код
.include "tn2313def.yms"      ;  ATTiny2313

Start:      cli
ldi r16,low(ramend)
out spl,r16

clr r24
clr r25

m1:         odyw r24,1
brcs m0
rjmp m1

m0:         ser r24
ser r25
rjmp m0
Шпаргалка
0
orm-17
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 35
26.03.2014, 15:46 6
Вот подсказали как.
.def MAX_LOW=R16 ;используем любые свободные регистры
.def MAX_HI=R17

LDI MAX_LOW,Low(0xFFFF) ;грузим число для сравнения
LDI MAX_HI,High(0xFFFF)

CP CountLow,MAX_LOW ;сравниваем
CPC CountHigh,MAX_HI
BREQ SKIP_INCREMENT ;перескакиваем если равно
odyw CountHigh:CountLow,1 ;инкремент 16-ти битного счетчика
SKIP_INCREMENT:
0
orm-17
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 35
26.03.2014, 15:52 7
А как тему отредактировать?
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
26.03.2014, 16:21 8
Редактируешь первое сообщение. Там есть поле "Тема"."Заголовок".
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
26.03.2014, 16:27 9
Цитата Сообщение от orm-17
Вот подсказали как.
Код рабочий, но вам же быстрый код нужен?
В подсказанном примере у вас перед каждым инкрементом два сравнения. В моем варианте после инкремента проверка на переполнение и возврат предыдущего значения, если оно произошло. Сэмулируйте в студии и посчитайте такты. Мой код в каждой итерации на 2 цикла короче.
0
orm-17
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 35
26.03.2014, 16:59 10
Поменял Заголовок.)))
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
26.03.2014, 17:02 11
Тоже весьма информативно. Вы сами-то что подумаете о теме с таким названием?
0
orm-17
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 35
26.03.2014, 17:14 12
У меня в реверсивном счетчике через меню выбираешь любую цифру от 00000 до 65535 сохраняешь в EEPROM, а как сравнить сохраненное число допустим 33333 с счетчиком. Я не могу реализовать.

Выход чисел в регистрах
tASCII4;6
tASCII3;5
tASCII2;5
cnt16a;3
,tASCII2;5
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.03.2014, 17:47 13
Самое верное решение на ограничивание команды:
Код
brlo
brsh
Потому что, если использовать breq, и число каким-либо образом перевалило, не важно, в силу каких случаев, то программа не будет корректно работать.
Если на уменьшение, то, в случае, если до 0, лучше использовать команду tst.
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
26.03.2014, 17:55 14
Цитата Сообщение от orm-17
У меня в реверсивном счетчике через меню выбираешь любую цифру от 00000 до 65535 сохраняешь в EEPROM, а как сравнить сохраненное число допустим 33333 с счетчиком. Я не могу реализовать.
Ну а перед записью в ЕЕПРОМ сделать вычитание ($FFFF- записываемое число) и в счетчик загружать не нули, а полученную разность- не? Точно так же, только считаем не от нуля до запомненного числа, а от ($FFFF минус требуемое значение) до $FFFF.
0
orm-17
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 35
05.04.2014, 21:16 15
НЕ понял вашу идею. Можно по подробней.
0
Ot-x
0 / 0 / 0
Регистрация: 30.12.2013
Сообщений: 192
06.04.2014, 01:18 16
Код
      lpm      temp, Z+ ; Максимальное значение L
cp      temp6, temp;0x12
lpm      temp, Z+ ; Максимальное значение M
cpc      temp5, temp;0x00
lpm      temp, Z+ ; Максимальное значение H
cpc      temp4, temp;0x36
brsh   adc_error_level
вот так я сравнивал даже 3-байтное значение, тут разрядности не важна.
0
orm-17
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 35
07.04.2014, 22:17 17
А что за Z+? Как туда подставить числа? Извините за глупые вопросы, только изучаю ASM/
0
orm-17
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 35
07.04.2014, 22:23 18
В моем случае ,выглядит вот так.

lpm temp, Z+
cp tASCII4, temp;
lpm temp, Z+
cpc tASCII3, temp;
lpm temp, Z+
cpc tASCII2, temp;
lpm temp, Z+
cpc cnt16a, temp
lpm temp, Z+
cpc fASCIIL, temp

; brsh adc_error_level
ret
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
07.04.2014, 22:51 19
Цитата Сообщение от orm-17
А что за Z+? Как туда подставить числа? Извините за глупые вопросы, только изучаю ASM/
Z это регистровая пара. состоит из регистров r30 и r31, у которых есть символические имена zl и zh соответственно. числа туда засовываются командами ldi или mov, как и во все прочие регистры.
В данном случае, ваша конструкция «lpm temp, Z+»
переводится на русский язык так - «взять байт из памяти программ, по адресу в паре Z, и поместить его в temp, после чего увеличить адрес в паре Z на 1»
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
07.04.2014, 22:58 20
Книга "AVR RISC Микроконтроллеры фирмы ATMEL" Вольфганг Трамперт. Многие вопросы снимутся. И вы сэкономите время себе и участникам форума. Уж лучше более сложные вопросы решать, чем отвечать на элементарщину.
0
07.04.2014, 22:58
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru