Страница 1 из 1

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

Добавлено: Чт мар 27, 2014 11:22:42
arm-17
Подскажите, как Сравнить на макс. и мин. значение в двоичном счетчике в самом инкременте декременте счетчика?



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

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

Покажите пример на ASM. пожалуйста. Очень надо.


Пожаловаться на это сообщение

Re: Ограничевалка

Добавлено: Чт мар 27, 2014 12:35:13
Engineer_Keen

Код: Выделить всё

.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 ;перескакиваем если равно
adiw CountHigh:CountLow,1 ;инкремент 16-ти битного счетчика
SKIP_INCREMENT:
С минимумом аналогично.

Re: Ограничевалка

Добавлено: Чт мар 27, 2014 13:32:29
arm-17
Вот спасибо.Теперь все понятно.

Re: Ограничевалка

Добавлено: Пт апр 11, 2014 10:58:03
arm-17
Подскажите пожалуйста. После сохранения через меню у меня в EEPROM сохраняется любое число от 65535 до 00000.
Надо, чтоб при совпадении число которое в EEprom и число которое образуется при счете импульсов , загорался светик.
Сложность в том , что в такой форме.

Выход чисел в регистрах
tASCII4;0x36
tASCII3;0x35
tASCII2;0x35
cnt16a;0x33
fASCII2;0x35

Вопрос: Как реализовать совпадение чисел?
И чтоб циклов по меньше.

Я делал так.Вот моя ограничевалка.

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

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

Re: Ограничевалка

Добавлено: Пт апр 11, 2014 11:08:56
Engineer_Keen
А тут всего 2 варианта - быстрый и компактный. Быстрый - линейный, это то что вы написали. Компактный - цикл, подходит только в случае, если регистры идут подряд.
Можно поступить по-другому. ASCII-формат нужен только для индикации, так что все сравнения можно делать в бинарном виде, тогда для чисел до 65536 достаточно сравнить две пары регистров, так и на хранение результата в EEPROM будет расходоваться меньше ячеек. А преобразование в ASCII производить непосредственно перед выводом куда-либо.

Re: Ограничевалка

Добавлено: Сб апр 12, 2014 17:38:12
arm-17
Подскажите что тут с чем сравнивать???

;преобразования 16-битного двоичного значения в неупакованный BCD формат
;*********************************************************************
;* количество слов кода :22 + возврат
;* количество циклов :60/220 (Мин/Мах) + возврат
;* Использования младшие регистры :5 (fASCIIL/tASCII0,fASCIIH,tASCII2,
;* tASCII3,tASCII4)
;* Использования старшие регистры :3 (cnt16a/tASCII1,tmp16a,tmp16b)
;*********************************************************************
bin2ASCII16:
;двоичный код должен быть в fASCIIL,fASCIIH (r11,r12).
ldi tmp16a, low(10000)
ldi tmp16b, high(10000)
rcall bin2ASCII_digit
mov tASCII4, cnt16a
ldi tmp16a, low(1000)
ldi tmp16b, high(1000)
rcall bin2ASCII_digit
mov tASCII3, cnt16a
ldi tmp16a, low(100)
ldi tmp16b, high(100)
rcall bin2ASCII_digit
mov tASCII2, cnt16a
ldi tmp16a, low(10)
ldi tmp16b, high(10)
bin2ASCII_digit:
ldi cnt16a, -1
bin2ASCII_digit_loop:
inc cnt16a
sub fASCIIL, tmp16a
sbc fASCIIH, tmp16b
brsh bin2ASCII_digit_loop
add fASCIIL, tmp16a
adc fASCIIH, tmp16b
ret
;итог число 0xffff преобразовалось в 65535 (десятичное ) и лежит
;в tASCII4(r15),tASCII3(r14),tASCII2(r13),cnt16a(r16),fASCIIL(r11).
; заняло 162 такта. Все работает.

Re: Ограничевалка

Добавлено: Пн апр 14, 2014 09:55:46
Engineer_Keen
До преобразования нужно сравнить fASCIIL : fASCIIH с 0xFFFF.

Re: Ограничевалка

Добавлено: Вт апр 15, 2014 13:34:13
arm-17
Спасибо. Буду пробовать :) .Я уже сделал по своему. Все работает, но медленно. А если добавить к Attiny 2313 кварцевый резонатор на 16 МГц, я скорость увеличу?

Re: Ограничевалка

Добавлено: Вт апр 15, 2014 13:53:03
Engineer_Keen
arm-17 писал(а):Все работает, но медленно. А если добавить к Attiny 2313 кварцевый резонатор на 16 МГц, я скорость увеличу?
Контроллер новый? А вы встроенный делитель на 8 (фьюз CLKDIV8) не забыли отключить? Его можно отключить программно:

Код: Выделить всё

	LDI	R16,(1<<CLKPCE)
	OUT CLKPR,R16
	LDI	R16,0
	OUT CLKPR,R16
Скорость увеличится в 8 раз. Если поставить кварц на большую частоту, скорость естественно увеличится, только источник тактирования опять же фьюзами нужно поменять (CKSEL0-3).

Re: Ограничевалка

Добавлено: Вт апр 15, 2014 23:22:18
arm-17
Забыл :) .После отключения вообще не тормозит. Уже думаю есть смысл кварц ставить. Спасибо.
Для чего нужен этот CKDIV8?Зачем /8.

Re: Ограничевалка

Добавлено: Вт апр 15, 2014 23:41:27
Engineer_Keen
1) чем выше частота, тем выше потребление, большая скорость нужна не всегда.
2) на маленькой частоте проще делать задержки, нужно меньше разрядности для таймеров (но зато страдает точность и дискретность интервалов)