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

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

Сообщение GP1 »

Интересная мысль :wink:
а по-подробней можно.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

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

Сообщение GP1 »

_noise писал(а): которой считать полные циклы таймера

ibiza11, ты не прав! :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

Сообщение MTF »

GP1
Из выше сказаного не понял ни хр..на, но, ОДИН ТАЙМЕР в одно и тоже время может работать только на одной частоте.



Ну что тут не понятного!!!! сейчас таймер работает при делении CK/256 , а мне надо отсчитывать 0,000064 с ,поэтому и решил переделать на таймер без деления частоты , вот и незнаю как сделать ту часть кода которая была сделана под переполнение таймера каждые 0,016384 c т.е CK/256?????
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

_noise
может я уже "устарел" и ничего не понимаю в современных тенденциях программирования, но в свое время меня учили - чем короче прерывание, тем лучше, особенно для сиситем RealTime, но возможможно это не актуально для современных приложений, не знаю.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Сообщение IfoR »

У меня ещё вопрос по условным переходам.
Дело в том, что компилятор (AVR macro assembler 2.1.41) на переход, например, BRCC 4 или BRNE 1 ругается, что он не может перейти так далеко (Relative branch out of reach). При чём ругается он только на те опкоды, которые расположены далеко (относительно) от 0. Если же вместо них поставить просто rjmp то всё проходит нормально, или же просто создать метку через команду и дать её вместо числа.
Вот у меня в коде перед главным пинающим собаку цикле идёт инициализация всякого мусора. Вот в нём в начале этот переход проходит нормально, а где то в почти конце уже начинает не работать.
Это так и должно быть?
Изображение
/dev/urandom - гигабайты информации.

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

Сообщение Meteor »

Условные относительные переходы идут с адресами от -64 до 63 относительно адреса по которому они вызываются. Безусловный относительный переход (rjmp) переходит в диапазон от - 2047 до 2047 от адреса вызова.
Последний раз редактировалось Meteor Пт янв 29, 2010 21:38:03, всего редактировалось 1 раз.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Сообщение IfoR »

Т.е. хотите сказать, что в параметре условно перехода надо указывать АБСОЛЮТНЫЙ адрес, а не условный, как в справочнике? А как тогда указать относительный? :)
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

обычно в качестве точки перехода указывается имя метки, а компилятор уже сам вычисляет на сколько слов ему переместиться вперед или назад, и если этот переход дальше допустимого то он ругается.
Но если есть желани можешь сам вычислять смещения и вставлять в команду.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Сообщение IfoR »

Да в том то и дело, что нужно пропустить одну, две команды во во многих местах. Писать под каждый переход свою уникальную метку как-то не очень тянет.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

:shock: Первый раз вижу человека, которому проще посчитать смещение (с учетом того размерность у команд разная) чем прост написать две-три буквы и двоеточие.
ИМХО если у тебя много переходов - это говорит о том что программа плохо структуирована.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Сообщение IfoR »

Вобщем суть, этот код умножает двухбайтовое число на 4.875 (умножаемое не превышает 1024):

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

;домножение результата на 4.875
   LDI R21,4   ;Умножаем число на 4
   MUL R18,R21 ;Умножаем младшие разряды
   MOV R2,R0   ;Переносим
   MOV R3,R1
   MUL R19,R21 ;Умножаем старший разряд
   ADD R3,R0   ;Складываем вместе

   LSR R19     ;Делим на 2, складываем
   ROR R18      
   ;BRCC ;Проверка на перенос
   ADD R2,R18
   ADC R3,R19 

   LSR R19     ;Делим на 2, складываем
   ROR R18      
   ;BRCC ;Проверка на перенос
   ADD R2,R18
   ADC R3,R19 

   LSR R19     ;Делим на 2, складываем
   ROR R18      
   ;BRCC ;Проверка на перенос
   ADD R2,R18
   ADC R3,R19

   MOV R18,R2  ;Перенос результата
   MOV R19,R3


Внизу 3 раза повторяется один и тот же код в котором идёт проверка на определения дробной чисти после деления на 2. Если она обнаруживается, то число инкрименируется для округления.
Можно было бы засунуть этот код в цикл, но при этом, хоть и выиграем в размере, потеряем скорость и потребуется регистр (за то и одну метку можно вставить). А размер собственно не критичен.
Он нормально работает, но, как и ожидается, результат слегка занижен.
Вобщем, то, расставить метки труда не составит, однако так захламляется код, да и почему в параметре нужно указывать абсолютное значение?

Первый раз вижу человека, которому проще посчитать смещение

Склонность к оптимизации.
Последний раз редактировалось IfoR Пт янв 29, 2010 22:03:34, всего редактировалось 1 раз.
Изображение
/dev/urandom - гигабайты информации.

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

Сообщение Meteor »

Или я устал или... а куда переходить то? В кого должно упереться BRCC?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Сообщение IfoR »

Этот код закоментирован и нужен пока лишь показать, где он есть. После BRCC (т.е. дробная часть есть) идёт инкрименирование младшей части числа, а если обнаружился перебор, то инкриминируется и старшая часть. Получается два условия и в каждом по одной команде. Собственно, а если дробной части нет, то BRCC перебрасывает на 3 команды вперёд, т.е. на тот ADD.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

_noise писал(а):первой команды семь бит в коде предусмотрено для указания смещения, второй же в коде для указания смещения - 12 бит.

что и дает +- 64 или +-2048 слов для перехода, или мы тебе тут что-то другое говорили?
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Сообщение IfoR »

_noise писал(а):первой команды семь бит в коде предусмотрено для указания смещения

Э-э... Всё равно не понял, почему компилятор ругается на смешение 2 или 1 или 0?

Метки то ладно. С эти разберёмся.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Сообщение IfoR »

Ну скрин не выложу, но код+лог дам.
Вот там в ADC прерывании вставлен от балды BCNE с комментарием ";от балды". На ней компиль клинит.
В принципе, уже в общем-то и без этого обошёлся, погрешность не велика. Но всё же интересно почему?

потом компилятор посчитает смещение до этого адреса и получится опкоде.

Вот собственно интересно, уломать его никак смещение напрямую брать?
Вложения
AnalizT.rar
(1.39 КБ) 183 скачивания
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Сообщение IfoR »

Да я и комментарии обычно не пишу совсем (Пишу, кода действительно могу запутаться, или когда действительно нужно), а ты тут метки. :)
Метки - это сокращения от их истинного назначения, да и к тому же некоторые и не заслуживают названия. Так что смысл всё же есть.
А мне скорее не листать лень, и читать тяжеловато немножко длинные метки. Смысл то и так понятен. Я же ведь по началу не засовывал код в подпрограмму. :)
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

IfoR
У меня чисто риторический вопрос: сколько времени выполняется твой обработчик прерывания?
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Сообщение IfoR »

Проэмулировал: 63 цикла.
Что при 8 Мгц получается 7,875 микросекунды.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Ответить

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