Страница 18 из 400
Добавлено: Вт июл 28, 2009 03:52:13
SII
AndreyE писал(а):Бегущий огонек v1.0 из обучалки
2) возможно это из-за непонимания этого пункта - почему при вычитании из 0 вдруг получается 255, а не -1?
Учим двоичную систему счисления, в частности, представление отрицательных чисел в дополнительном коде. А когда выучим, тогда узнаем, что для числа размером один байт -1 = 255.
Добавлено: Пт июл 31, 2009 07:10:44
GRafGRay
Господа что-то я где-то прощёлкал и не могу вкурить
почему после операции вычитания устанавливается флаг отрицательного значения?
Добавлено: Пт июл 31, 2009 07:53:10
GP1
после вичитания в tmp результат 138 т.е. больше 127 и следовательно 8й разряд в "1" а для системы это означает что число отрицательное.
это задача программиста как интерпретировать 8й разряд.
Добавлено: Пт июл 31, 2009 09:39:51
GRafGRay
в таком разе напрашивается вопрос, как проще или с меньшей кровью для ресурсов МК из 238 вычесть 100?
1. цикл в котором 100 раз декреминировать Temp?
2. додумать программу с интерпритацией 8ого разряда?
Добавлено: Пт июл 31, 2009 09:59:28
GP1
у вас в любом случае после любой операции будь то dec или sub и пр.
будет устанавливаться флаг N
что нужно сделать с остатком-то?
Добавлено: Пт июл 31, 2009 10:20:54
GRafGRay
мне тупо нужно посчитать арифметическую разницу, остаток будет использоваться для дальнейших вычислений
что касательно первого варианта, то вот такой пример у меня работает:
Код: Выделить всё
; тра-та-та ... тра-та-та
.macro vichitanie
dec @0
dec @1
breq PC+2
rjmp PC-3
.endmacro
; тра-та-та ... тра-та-та
vichitanie temp1,temp2
; тра-та-та ... тра-та-та
я собственно по выполнинии этого макроса получаю искомую разницу,
но меня смущает что на его вылнение затрачивается <b>temp2</b> тактов
для второго варианта я так понимаю прийдётся остаток сравнивать с числом 127, и если он больше то принудительно стирать флаг отрицательного числа?
в таком разе второй вариант видимо будет предпочтительней
P.S.: в моём случае <b>temp1</b> заведомо больше <b>temp2</b> и не превышает 255, так же <b>temp2</b> не отрицательно
Добавлено: Пт июл 31, 2009 12:00:17
SII
"Не отрицательно" для переменных размером байт означает, что они содержат значение от 0 до +127. Поэтому, если надо хранить значение, превышающее +127, надо переходить к двухбайтовым переменным (там верхний предел равен +32767).
Добавлено: Пт июл 31, 2009 18:42:47
ARV
GRafGRay писал(а):мне тупо нужно посчитать арифметическую разницу, остаток будет использоваться для дальнейших вычислений
я бы очень советовал не поступать тупо, ибо макрос, тупо 123 или сколько там раз отнимает 1 и переменной, уже есть верх тупизны. извините.
нормлаьно получить разницу можно как раз тем способом, что вы изначально показали:
не обращайте внимание на "знак" результата, и на флаг отрицательного значения тоже - зачем оно вам, если вы заранее знаете, что в результате не может быть отрицательных чисел?
P.S. вообще-то понятие "отрицательное число" - это такааааая абстракция в мире двоичной математики...
Добавлено: Сб авг 01, 2009 18:35:49
GRafGRay
<b>to ARV</b>
Вы сударь к словам придираетесь? Выше я писал, что этот макрос работает, но считаю что его использовать не есть хорошо.
Добавлено: Сб авг 01, 2009 19:56:15
Pooher
Вы сударь к словам придираетесь? Выше я писал, что этот макрос работает, но считаю что его использовать не есть хорошо.
Мне кажется человек ответил как раз ёмко и по делу. А к словам придираться это "Вы
, сударь
, к словам придираетесь?
ЗЫ: Прошу извинения за оффтоп. Не сдержался.
Добавлено: Сб авг 01, 2009 20:07:09
GP1
SII писал(а):"Не отрицательно" для переменных размером байт означает, что они содержат значение от 0 до +127. Поэтому, если надо хранить значение, превышающее +127, надо переходить к двухбайтовым переменным (там верхний предел равен +32767).
Это если число со знаком, а если число изначально может принимать только положительные значения (например число пришедших импульсов) то 0..255

Добавлено: Сб авг 01, 2009 21:24:26
SII
GP1 писал(а):SII писал(а):"Не отрицательно" для переменных размером байт означает, что они содержат значение от 0 до +127. Поэтому, если надо хранить значение, превышающее +127, надо переходить к двухбайтовым переменным (там верхний предел равен +32767).
Это если число со знаком, а если число изначально может принимать только положительные значения (например число пришедших импульсов) то 0..255

Совершенно верно. Но человек же написал про "отрицательно", значит, он рассматривает числа как имеющие знак. Хотя мой совет, который я дал в начале страницы, в силе остаётся по-любому: надо хорошо учить двоичную систему и представление чисел в ней. Если с этим разобраться, то подобные вопросы сами собой отпадут, ну а если не разобраться, то лично я не представляю, как можно программировать на асме...
Добавлено: Сб авг 01, 2009 21:33:58
GP1
к сказанному, я бы добавил, что неплохо бы еще представлять что и с какой точностью надо вычислять и обрабатывать.
Добавлено: Чт сен 10, 2009 19:08:46
Qwq
потыкайте пожалуйста носом где почитать про работу с массивами в eeprom.
просто еепром читать и писать умею, а хочется прочитать из 1 ячейки и в зависимости от того что там прочиталось считать 2 другие. т.е. чтото типа
Код: Выделить всё
перед этим погрызено мышами
;Считываем из ЕЕПРОМ в регистр 21 номер режима этот адрес хранится в ячейке 61
LDI R16,61 ; Загружаем адрес ячейки
RCALL EERead ; вызываем процедуру чтения. После которой
; в R21 будет считанный байт.
;Теперь читаем из PWMwidth +№ режима то что надо записать в таймер
ldi ZH,High(PWMwidth*2) ;загрузка адреса 0-го
ldi ZL,Low(PWMwidth*2) ;элемента в рег. пару Z
ldi Temp1,0
add ZL,R21 ;прибавление
adc ZH,Temp1 ;внутр. адреса
lpm ;загрузка из ПЗУ
mov Temp,R0 ;копирование
out ocr0a,temp
;Теперь читаем из PWMwidth1 +№ режима то что надо записать в таймер
ldi ZH,High(PWMwidth1*2) ;загрузка адреса 0-го
ldi ZL,Low(PWMwidth1*2) ;элемента в рег. пару Z
ldi Temp1,0
add ZL,R21 ;прибавление
adc ZH,Temp1 ;внутр. адреса
lpm ;загрузка из ПЗУ
mov Temp,R0 ;копирование
out ocr0b,temp
дальше опять погрызено мышами
только читать не из ПЗУ а из еепрома.
Добавлено: Чт сен 10, 2009 19:50:45
GP1
методы работы с eeprom совершенно аналогичны. только адресация байтная (для flash - словная, отсюда метка*2)
Добавлено: Чт сен 10, 2009 22:52:54
Pooher
просто еепром читать и писать умею
А в чём тогда проблема? Считываете нужную ячейку, сравниваете с заданным, в зависимости от результата считываете ещё две, записывая их куда угодно, хоть в ОЗУ, хоть в РОН...
Добавлено: Пт сен 11, 2009 07:09:24
Qwq
догадаться не могу. думаю что все просто, но в лоб не получилось...
мне бы где почитать про это или примерчик какой...
Добавлено: Пт сен 11, 2009 10:24:44
Pooher
Код: Выделить всё
main:
ldi r16, xx ; загружаем адреса
ldi r17, xx
rcall ReadEEP ; считываем данные
cpi r18, xx ; сравниваем с константой прочитанное из EEP
breq Label1 ; если равно, то переходим
rjmp main
Label1:
ldi r16, xx ; загружаем адреса
ldi r17, xx
rcall ReadEEP; считываем данные
mov data1, r18 ; копируем
ldi r16, xx ; загружаем адреса
ldi r17, xx
rcall ReadEEP; считываем данные
mov data1, r18 ; копируем
rjmp main
ReadEEP:
sbic EECR, EEWE ; ждать завершения записи
rjmp ReadEEP
out EEARL, r16 ; загрузка мл. байта адреса
out EEARH, r17 ; загрузка ст. байта адреса
ldi r16, 1 ; Разрешение чтения
out EECR, r16
in r18, EEDR ; чтение
ret
Добавлено: Пт сен 11, 2009 10:39:16
Qwq
о! спасибо!
Добавлено: Пн сен 21, 2009 15:52:20
Meteor
Доброго времени!
Подскажите пожалуйста, требуется организовать цикл из 8 обработок, в котором в зависимости от результата в регистре флагов устанавливался в 0 или 1, бит с номером равным итерации в регистре. Т.е. если идет 6 итерация и результат положителен, то ставим бит 6 в 1. При итерации 7 и отрицательном рез-те, сбрасываем бит 7. Команды установки и сброса знаю, но вот выделить номер бита из регистра не получается:( Спасибо заранее.