а по-подробней можно.
Ассемблер (ASM) для AVR в вопросах и ответах
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
при CK/0 в обработчике прерывания инкрементируем переменную и тут же ее проверяем, если достигло требуемого значения можно либо выставить флаг, который проверяется в главном цикле (после проверки которого выполняется требуемое действие в главном цикле), либо тут же выполняется требуемое действие. в обоих случаях переменная обнуляется. подробнее, наверное, только кусок кода привести.
Ставим плюсы: )
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
GP1
Ну что тут не понятного!!!! сейчас таймер работает при делении CK/256 , а мне надо отсчитывать 0,000064 с ,поэтому и решил переделать на таймер без деления частоты , вот и незнаю как сделать ту часть кода которая была сделана под переполнение таймера каждые 0,016384 c т.е CK/256?????
Из выше сказаного не понял ни хр..на, но, ОДИН ТАЙМЕР в одно и тоже время может работать только на одной частоте.
Ну что тут не понятного!!!! сейчас таймер работает при делении CK/256 , а мне надо отсчитывать 0,000064 с ,поэтому и решил переделать на таймер без деления частоты , вот и незнаю как сделать ту часть кода которая была сделана под переполнение таймера каждые 0,016384 c т.е CK/256?????
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
У меня ещё вопрос по условным переходам.
Дело в том, что компилятор (AVR macro assembler 2.1.41) на переход, например, BRCC 4 или BRNE 1 ругается, что он не может перейти так далеко (Relative branch out of reach). При чём ругается он только на те опкоды, которые расположены далеко (относительно) от 0. Если же вместо них поставить просто rjmp то всё проходит нормально, или же просто создать метку через команду и дать её вместо числа.
Вот у меня в коде перед главным пинающим собаку цикле идёт инициализация всякого мусора. Вот в нём в начале этот переход проходит нормально, а где то в почти конце уже начинает не работать.
Это так и должно быть?
Дело в том, что компилятор (AVR macro assembler 2.1.41) на переход, например, BRCC 4 или BRNE 1 ругается, что он не может перейти так далеко (Relative branch out of reach). При чём ругается он только на те опкоды, которые расположены далеко (относительно) от 0. Если же вместо них поставить просто rjmp то всё проходит нормально, или же просто создать метку через команду и дать её вместо числа.
Вот у меня в коде перед главным пинающим собаку цикле идёт инициализация всякого мусора. Вот в нём в начале этот переход проходит нормально, а где то в почти конце уже начинает не работать.
Это так и должно быть?
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Условные относительные переходы идут с адресами от -64 до 63 относительно адреса по которому они вызываются. Безусловный относительный переход (rjmp) переходит в диапазон от - 2047 до 2047 от адреса вызова.
Последний раз редактировалось Meteor Пт янв 29, 2010 21:38:03, всего редактировалось 1 раз.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Вобщем суть, этот код умножает двухбайтовое число на 4.875 (умножаемое не превышает 1024):
Внизу 3 раза повторяется один и тот же код в котором идёт проверка на определения дробной чисти после деления на 2. Если она обнаруживается, то число инкрименируется для округления.
Можно было бы засунуть этот код в цикл, но при этом, хоть и выиграем в размере, потеряем скорость и потребуется регистр (за то и одну метку можно вставить). А размер собственно не критичен.
Он нормально работает, но, как и ожидается, результат слегка занижен.
Вобщем, то, расставить метки труда не составит, однако так захламляется код, да и почему в параметре нужно указывать абсолютное значение?
Склонность к оптимизации.
Код: Выделить всё
;домножение результата на 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 раз.
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Этот код закоментирован и нужен пока лишь показать, где он есть. После BRCC (т.е. дробная часть есть) идёт инкрименирование младшей части числа, а если обнаружился перебор, то инкриминируется и старшая часть. Получается два условия и в каждом по одной команде. Собственно, а если дробной части нет, то BRCC перебрасывает на 3 команды вперёд, т.е. на тот ADD.
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Ну скрин не выложу, но код+лог дам.
Вот там в ADC прерывании вставлен от балды BCNE с комментарием ";от балды". На ней компиль клинит.
В принципе, уже в общем-то и без этого обошёлся, погрешность не велика. Но всё же интересно почему?
Вот собственно интересно, уломать его никак смещение напрямую брать?
Вот там в ADC прерывании вставлен от балды BCNE с комментарием ";от балды". На ней компиль клинит.
В принципе, уже в общем-то и без этого обошёлся, погрешность не велика. Но всё же интересно почему?
потом компилятор посчитает смещение до этого адреса и получится опкоде.
Вот собственно интересно, уломать его никак смещение напрямую брать?
- Вложения
-
- AnalizT.rar
- (1.39 КБ) 183 скачивания
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Да я и комментарии обычно не пишу совсем (Пишу, кода действительно могу запутаться, или когда действительно нужно), а ты тут метки.
Метки - это сокращения от их истинного назначения, да и к тому же некоторые и не заслуживают названия. Так что смысл всё же есть.
А мне скорее не листать лень, и читать тяжеловато немножко длинные метки. Смысл то и так понятен. Я же ведь по началу не засовывал код в подпрограмму.
Метки - это сокращения от их истинного назначения, да и к тому же некоторые и не заслуживают названия. Так что смысл всё же есть.
А мне скорее не листать лень, и читать тяжеловато немножко длинные метки. Смысл то и так понятен. Я же ведь по началу не засовывал код в подпрограмму.

