Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

AndreyE писал(а):Бегущий огонек v1.0 из обучалки
2) возможно это из-за непонимания этого пункта - почему при вычитании из 0 вдруг получается 255, а не -1?


Учим двоичную систему счисления, в частности, представление отрицательных чисел в дополнительном коде. А когда выучим, тогда узнаем, что для числа размером один байт -1 = 255.
Аватара пользователя
GRafGRay
Прорезались зубы
Сообщения: 223
Зарегистрирован: Вт окт 02, 2007 14:43:23
Откуда: Ростов-на-Дону
Контактная информация:

Сообщение GRafGRay »

Господа что-то я где-то прощёлкал и не могу вкурить

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

ldi Temp,238
subi Temp,100

почему после операции вычитания устанавливается флаг отрицательного значения?
При наличии отсутствия пропитанных шпал - это будет не трамвай а одно горе!
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

после вичитания в tmp результат 138 т.е. больше 127 и следовательно 8й разряд в "1" а для системы это означает что число отрицательное.
это задача программиста как интерпретировать 8й разряд.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
GRafGRay
Прорезались зубы
Сообщения: 223
Зарегистрирован: Вт окт 02, 2007 14:43:23
Откуда: Ростов-на-Дону
Контактная информация:

Сообщение GRafGRay »

в таком разе напрашивается вопрос, как проще или с меньшей кровью для ресурсов МК из 238 вычесть 100?

1. цикл в котором 100 раз декреминировать Temp?
2. додумать программу с интерпритацией 8ого разряда?
При наличии отсутствия пропитанных шпал - это будет не трамвай а одно горе!
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

у вас в любом случае после любой операции будь то dec или sub и пр.
будет устанавливаться флаг N
что нужно сделать с остатком-то?
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
GRafGRay
Прорезались зубы
Сообщения: 223
Зарегистрирован: Вт окт 02, 2007 14:43:23
Откуда: Ростов-на-Дону
Контактная информация:

Сообщение 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> не отрицательно
При наличии отсутствия пропитанных шпал - это будет не трамвай а одно горе!
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

"Не отрицательно" для переменных размером байт означает, что они содержат значение от 0 до +127. Поэтому, если надо хранить значение, превышающее +127, надо переходить к двухбайтовым переменным (там верхний предел равен +32767).
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

GRafGRay писал(а):мне тупо нужно посчитать арифметическую разницу, остаток будет использоваться для дальнейших вычислений
я бы очень советовал не поступать тупо, ибо макрос, тупо 123 или сколько там раз отнимает 1 и переменной, уже есть верх тупизны. извините.

нормлаьно получить разницу можно как раз тем способом, что вы изначально показали:

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

   subi  Temp, 123

не обращайте внимание на "знак" результата, и на флаг отрицательного значения тоже - зачем оно вам, если вы заранее знаете, что в результате не может быть отрицательных чисел?

P.S. вообще-то понятие "отрицательное число" - это такааааая абстракция в мире двоичной математики...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
GRafGRay
Прорезались зубы
Сообщения: 223
Зарегистрирован: Вт окт 02, 2007 14:43:23
Откуда: Ростов-на-Дону
Контактная информация:

Сообщение GRafGRay »

<b>to ARV</b>
Вы сударь к словам придираетесь? Выше я писал, что этот макрос работает, но считаю что его использовать не есть хорошо.
При наличии отсутствия пропитанных шпал - это будет не трамвай а одно горе!
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Вы сударь к словам придираетесь? Выше я писал, что этот макрос работает, но считаю что его использовать не есть хорошо.

Мне кажется человек ответил как раз ёмко и по делу. А к словам придираться это "Вы, сударь, к словам придираетесь?
ЗЫ: Прошу извинения за оффтоп. Не сдержался.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

SII писал(а):"Не отрицательно" для переменных размером байт означает, что они содержат значение от 0 до +127. Поэтому, если надо хранить значение, превышающее +127, надо переходить к двухбайтовым переменным (там верхний предел равен +32767).

Это если число со знаком, а если число изначально может принимать только положительные значения (например число пришедших импульсов) то 0..255 :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

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

Это если число со знаком, а если число изначально может принимать только положительные значения (например число пришедших импульсов) то 0..255 :wink:


Совершенно верно. Но человек же написал про "отрицательно", значит, он рассматривает числа как имеющие знак. Хотя мой совет, который я дал в начале страницы, в силе остаётся по-любому: надо хорошо учить двоичную систему и представление чисел в ней. Если с этим разобраться, то подобные вопросы сами собой отпадут, ну а если не разобраться, то лично я не представляю, как можно программировать на асме...
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

к сказанному, я бы добавил, что неплохо бы еще представлять что и с какой точностью надо вычислять и обрабатывать.
Чем дальше, тем больше становлюсь занудой...
Изображение
Qwq
Встал на лапы
Сообщения: 87
Зарегистрирован: Пт ноя 02, 2007 18:18:26
Контактная информация:

Сообщение 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

дальше опять погрызено мышами
только читать не из ПЗУ а из еепрома.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

методы работы с eeprom совершенно аналогичны. только адресация байтная (для flash - словная, отсюда метка*2)
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

просто еепром читать и писать умею

А в чём тогда проблема? Считываете нужную ячейку, сравниваете с заданным, в зависимости от результата считываете ещё две, записывая их куда угодно, хоть в ОЗУ, хоть в РОН...
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Qwq
Встал на лапы
Сообщения: 87
Зарегистрирован: Пт ноя 02, 2007 18:18:26
Контактная информация:

Сообщение Qwq »

догадаться не могу. думаю что все просто, но в лоб не получилось...
мне бы где почитать про это или примерчик какой...
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение 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    
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Qwq
Встал на лапы
Сообщения: 87
Зарегистрирован: Пт ноя 02, 2007 18:18:26
Контактная информация:

Сообщение Qwq »

о! спасибо!
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

Доброго времени!
Подскажите пожалуйста, требуется организовать цикл из 8 обработок, в котором в зависимости от результата в регистре флагов устанавливался в 0 или 1, бит с номером равным итерации в регистре. Т.е. если идет 6 итерация и результат положителен, то ставим бит 6 в 1. При итерации 7 и отрицательном рез-те, сбрасываем бит 7. Команды установки и сброса знаю, но вот выделить номер бита из регистра не получается:( Спасибо заранее.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Ответить

Вернуться в «AVR»