Страница 30 из 400

Добавлено: Пт янв 29, 2010 18:29:11
GP1
Интересная мысль :wink:
а по-подробней можно.

Добавлено: Пт янв 29, 2010 19:02:18
ibiza11
при CK/0 в обработчике прерывания инкрементируем переменную и тут же ее проверяем, если достигло требуемого значения можно либо выставить флаг, который проверяется в главном цикле (после проверки которого выполняется требуемое действие в главном цикле), либо тут же выполняется требуемое действие. в обоих случаях переменная обнуляется. подробнее, наверное, только кусок кода привести.

Добавлено: Пт янв 29, 2010 19:04:18
GP1
_noise писал(а): которой считать полные циклы таймера
ibiza11, ты не прав! :wink:

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

Ну что тут не понятного!!!! сейчас таймер работает при делении CK/256 , а мне надо отсчитывать 0,000064 с ,поэтому и решил переделать на таймер без деления частоты , вот и незнаю как сделать ту часть кода которая была сделана под переполнение таймера каждые 0,016384 c т.е CK/256?????

Добавлено: Пт янв 29, 2010 19:41:15
GP1
_noise
может я уже "устарел" и ничего не понимаю в современных тенденциях программирования, но в свое время меня учили - чем короче прерывание, тем лучше, особенно для сиситем RealTime, но возможможно это не актуально для современных приложений, не знаю.

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

Добавлено: Пт янв 29, 2010 21:26:36
Meteor
Условные относительные переходы идут с адресами от -64 до 63 относительно адреса по которому они вызываются. Безусловный относительный переход (rjmp) переходит в диапазон от - 2047 до 2047 от адреса вызова.

Добавлено: Пт янв 29, 2010 21:30:24
IfoR
Т.е. хотите сказать, что в параметре условно перехода надо указывать АБСОЛЮТНЫЙ адрес, а не условный, как в справочнике? А как тогда указать относительный? :)

Добавлено: Пт янв 29, 2010 21:34:54
GP1
обычно в качестве точки перехода указывается имя метки, а компилятор уже сам вычисляет на сколько слов ему переместиться вперед или назад, и если этот переход дальше допустимого то он ругается.
Но если есть желани можешь сам вычислять смещения и вставлять в команду.

Добавлено: Пт янв 29, 2010 21:39:01
IfoR
Да в том то и дело, что нужно пропустить одну, две команды во во многих местах. Писать под каждый переход свою уникальную метку как-то не очень тянет.

Добавлено: Пт янв 29, 2010 21:45:29
GP1
:shock: Первый раз вижу человека, которому проще посчитать смещение (с учетом того размерность у команд разная) чем прост написать две-три буквы и двоеточие.
ИМХО если у тебя много переходов - это говорит о том что программа плохо структуирована.

Добавлено: Пт янв 29, 2010 21:58: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. Если она обнаруживается, то число инкрименируется для округления.
Можно было бы засунуть этот код в цикл, но при этом, хоть и выиграем в размере, потеряем скорость и потребуется регистр (за то и одну метку можно вставить). А размер собственно не критичен.
Он нормально работает, но, как и ожидается, результат слегка занижен.
Вобщем, то, расставить метки труда не составит, однако так захламляется код, да и почему в параметре нужно указывать абсолютное значение?
Первый раз вижу человека, которому проще посчитать смещение
Склонность к оптимизации.

Добавлено: Пт янв 29, 2010 22:01:55
Meteor
Или я устал или... а куда переходить то? В кого должно упереться BRCC?

Добавлено: Пт янв 29, 2010 22:06:20
IfoR
Этот код закоментирован и нужен пока лишь показать, где он есть. После BRCC (т.е. дробная часть есть) идёт инкрименирование младшей части числа, а если обнаружился перебор, то инкриминируется и старшая часть. Получается два условия и в каждом по одной команде. Собственно, а если дробной части нет, то BRCC перебрасывает на 3 команды вперёд, т.е. на тот ADD.

Добавлено: Пт янв 29, 2010 22:20:47
GP1
_noise писал(а): первой команды семь бит в коде предусмотрено для указания смещения, второй же в коде для указания смещения - 12 бит.
что и дает +- 64 или +-2048 слов для перехода, или мы тебе тут что-то другое говорили?

Добавлено: Пт янв 29, 2010 22:23:10
IfoR
_noise писал(а):первой команды семь бит в коде предусмотрено для указания смещения
Э-э... Всё равно не понял, почему компилятор ругается на смешение 2 или 1 или 0?

Метки то ладно. С эти разберёмся.

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

Добавлено: Пт янв 29, 2010 23:29:00
IfoR
Да я и комментарии обычно не пишу совсем (Пишу, кода действительно могу запутаться, или когда действительно нужно), а ты тут метки. :)
Метки - это сокращения от их истинного назначения, да и к тому же некоторые и не заслуживают названия. Так что смысл всё же есть.
А мне скорее не листать лень, и читать тяжеловато немножко длинные метки. Смысл то и так понятен. Я же ведь по началу не засовывал код в подпрограмму. :)

Добавлено: Пт янв 29, 2010 23:32:11
GP1
IfoR
У меня чисто риторический вопрос: сколько времени выполняется твой обработчик прерывания?

Добавлено: Пт янв 29, 2010 23:34:38
IfoR
Проэмулировал: 63 цикла.
Что при 8 Мгц получается 7,875 микросекунды.