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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 15660
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Дык ежли макросы в исходник впихерены, то необходимо и их описание вместе с оным исходником выкладывать, дабы не прослыть СУСАНИНЫМ.
8)
Реклама
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Извини, не подумал. Макросы в отдельном файле.
Хотел показать простоту реализации ориентировочной реализации вычисления.
Занимаюсь нормализацией входного сигнала и масштабированием выходного, посему меняется таблица констант, но алгоритм остается.
Реклама
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 07, 2011 12:53:26

Сообщение Jonson77 »

Здравствуйте, подскажите пожалуйста собрал измерительный прибор и возникла необходимость перевернуть дисплей вверх ногами. Автор проекта не отвечает, я сам не силен в программировании. Есть исходники проекта, пробовал в WinAVR и AVR Studio но после компиляции даже без каких либо изменений получаемый hex работает только в Proteus-е, а в железе нет - даже экран не включается хотя оригинальный hex работает. Подскажите пожалуйста. В архиве оригинальные исходники, мой в WinAVR и проект Porteus.
Вложения
AmperVolt.7z
(928.13 КБ) 196 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 15660
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Дык... проект-то СИшный... а не ассемблер...
:?
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 223
Зарегистрирован: Сб июл 30, 2011 21:00:24

Сообщение AQ29 »

[uquote="Jack_A",url="/forum/viewtopic.php?p=3106493#p3106493"]Давно такого потока сознания на форуме не наблюдал... Особенно впечатлило :
только нужен доступ к соответствующей расчётной программе.
Так вроде ТС и ищет эту "соответствующую расчётную программу"
Или:
Логарифм вызывается одной командой.
я даже подозреваю, эта команда CALL - вызов соответствующей подпрограммы. Вот и выдал бы человек, учитывая его космических высот квалификацию, текст проги - на посрамление нам, неразумным.[/uquote]
Да, это вызов подпрограммы, библиотечного элемента. Я вызываю его так:
Log_10 (x, y)
где х - аргумент, двухбайтная переменная,
y - итог вычисление логарифма, тоже двухбайтная переменная.
Программа основана на разбиение всего диапазона на отдельные участки, а на каждом участке используется линейная аппроксимация.
Собственно, программа приведена в ссылке, берите и пользуйтесь. Только написана на макроассемблере, на АБ.
Для меня классический ассемблер выглядит анахронизмом.
Я не программист, поэтому говорить о какой-то особой моей квалификации, тем более космической, не имеет смысла.
Написать команду займет несколько минут - и задача решена. Причём с гарантированной точностью 0,5 процента в диапазоне от 1 до 64. Думаю, так и работают профессионалы.
Если точности недостаточно, то её можно улучшить. Для этого есть математическая программа, которая по заданной точности и коэффициенту перед логарифмом рассчитывает массивы координат точек разбиения и массивы коэффициентов прямой линии аппроксимации . Остаётся только перенести эти массивы в подпрограмму логарифма - и получите новый логарифм с требуемой точностью.
Но эту математическую программу, думаю, в общем доступе не найти.
Предельная точность этого логарифма, похоже, 0,1 процента. Там единица представляется числом 1024, поэтому единичный шаг соответствует погрешности 0,1 процента.
В принципе, если единицу представлять числом 2048, можно в два раза увеличить точность, только диапазон аргумента уменьшится в два раза.

В общем, решение относительно несложное, никаких космических высот и потоков сознания.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Сообщение Jetetex »

Заранее прошу прощения за вопрос.
Можно ли в ходе выполнения программы изменять назначение ног контроллера с входа на выход и обратно без ресета, или это одноразовая акция при инициализации контроллера, то есть изменять содержимое регистра DDRB :oops:


МК - Attiny 2313
язык - ассемблер
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

вообще без проблем.

Добавлено after 7 minutes 13 seconds:
также просто как записать значение в порт. так получаем 4 состояния порта и возможность их менять в любой момент, только надо соблюдать очередность - сначала значение, потом направление на вывод или сначала направление на вход, а потом значение - так не будет выбросов (из за того, что эти значения в порт не получится записать одновременно) (сам МК ни каких ограничений не накладывает)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Сообщение Jetetex »

Я правильно понял ваше сообщение?
СпойлерReset:

ldi Temp,0b01111111 ;настройка портов
out DDRB,Temp

бла-бла-бла
инициализация
reti

main: осн цикл
бла-бла-бла
кусок программы

ldi Temp,0b00000000 ;меняем назначение портов
out DDRB,Temp

бла-бла-бла
еще кусок кода в котором применяем новое направление

ldi Temp,0b01111111 ;ставим все на место
out DDRB,Temp

rjmp main
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

да, только порты можно (до определенной буквы, не помню точно какой, но тинькам это точно не грозит) адресовать и побитно например
SBI DDRB,1 (1 нога порта B - на выход) так тоже должно работать.
а если как ты писал - то лучше сначала прочитать состояние, потом изменить нужные биты (при помощи масок), а потом вписать обратно - иначе можно испортить направление других выводов порта.

Добавлено after 5 minutes 12 seconds:
CBI DDRB,1 - его же на вход (на 100% в правильности написания не уверен, я больше по С)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Собственно, один из вариантов эмуляции выхода с открытым стоком на AVR - это выставить PORT в 0, а дальше уже дёргать DDR по необходимости.

В этом случае при DDR=1 будет выдаваться активный 0, а при DDR=0 - Z-состояние, что полностью идентично тому, как если бы это был открытый сток.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

WiseLord писал(а):...полностью идентично тому, как если бы это был открытый сток.
Нет не полностью. Вам все равно на входе нельзя превышать напряжение питания МК.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Прорезались зубы
Аватара пользователя
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

Сообщение Coldheart »

подскажите пож. как считать программные задержки.
И почему онлайн калькуляторы некорректно подсчитывают
например
http://www.bretmulvey.com/avrdelay.html

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

; Delay 4 800 000 cycles
; 1s at 4.8 MHz

    ldi  r18, 25
    ldi  r19, 90
    ldi  r20, 178
L1: dec  r20
    brne L1
    dec  r19
    brne L1
    dec  r18
    brne L1
    rjmp PC+1
Почему в строке циклы пишется на порядок больше т.е. 48 000 000 ?
А когда зашиваю в реальный контроллер получается не 1 сек а 7 сек. Контроллер Attiny13A
Естественно пробовал разные частоты генератора.
Пробовал и на Attiny2313, запускал от внешнего резонатора, все тоже самое
Друг Кота
Аватара пользователя
Сообщения: 15660
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Для формирования точных интервалов предназначены аппаратные таймеры.
Программные циклы в качестве задержек имеют крайне ограниченное применение из-за различных факторов.
Кроме прочего сам RC-генератор имеет допустимый диапазон погрешности и касательно тиньки 13-й надо весьма точно считать - с 8-9 знаками после запятой.
:wink:
Особо ежли учесть, что для пониженной частоты генератора константа коррекции должна быть вручную заранее считана и в программе заранее загружена. Автоматом только для основной частоты "по умолчанию" корректируюшша константа загружается.
:twisted:
Прорезались зубы
Аватара пользователя
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

Сообщение Coldheart »

[uquote="BOB51",url="/forum/viewtopic.php?p=3116560#p3116560"]Для формирования точных интервалов предназначены аппаратные таймеры.
Программные циклы в качестве задержек имеют крайне ограниченное применение из-за различных факторов.[/uquote]
Да это я естественно понимаю, но не в 7 раз же погрешность. Мне надо мигать светодиодом раз в 3 часа, +-10 мин. Точность не нужна совершенно.
akl
Друг Кота
Сообщения: 4461
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

FUSE- БИТ CKDIV8 снимите.
Прорезались зубы
Аватара пользователя
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

Сообщение Coldheart »

[uquote="akl",url="/forum/viewtopic.php?p=3116580#p3116580"]FUSE- БИТ CKDIV8 снимите.[/uquote]
спасибоОО огромнейшее!! :beer:
akl
Друг Кота
Сообщения: 4461
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

По мне, гораздо проще программные задержки формировать пользуясь возможностями ассемблера.

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

.equ   Fo=4800000
T:
	LDI	R23,BYTE4(1*Fo/6-1)
	LDI	R22,BYTE3(1*Fo/6-1)
	LDI	R21,BYTE2(1*Fo/6-1)
	LDI	R20,BYTE1(1*Fo/6-1)		;1 сек
;	LDI	R23,BYTE4(3*3600*Fo/6)
;	LDI	R22,BYTE3(3*3600*Fo/6)
;	LDI	R21,BYTE2(3*3600*Fo/6)
;	LDI	R20,BYTE1(3*3600*Fo/6)	;3 часа

L:
	SUBI	R20,1
	SBCI	R21,0
	SBCI	R22,0
	SBCI	R23,0
	BRSH	L
	RJMP	T
Друг Кота
Аватара пользователя
Сообщения: 15660
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

CKDIV8 дает только стартовое состояние предделителя "по умолчанию", а уж потом - как CLKPS3:..:CLKPS0 поставиш, так и покатится.
А вот неизвестно чего в OSCCAL при начальной загрузке попавшее гораздо более проблем создаст.
И насчет программных циклов...
Хороши, пока не включены прерывания (либо гарантировано защищены от оных).
8)
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

Уморшить контроллер на 3 часа :shock: да ещё и прерывания выключить :shock: :shock: если Вам надо пирог через 3 часа из духовки вынуть, тоже тиканье часов считать будете? :)) и ни на что не отвлекаться чтобы со счету не сбили :)) :))
даже если контроллер больше ни чем не занят пусть лучше спит как кот, (или ест :hunger: ) - а от такой практики лучше уходить, чтобы не дай бог не привыкнуть :)) :)) :)) .
тем более прерывание использовать не сложно (а темболее когда время задержки не меняется) в подпрограмме добавляешь переменную - где хранится адрес на который прыгнуть и переменную таймера, допустим вызов нашей подпрограммы происходит 1раз в миллисекунду, а нам надо подождать 100 миллисекунд - в переменную таймера вносим 99 (отсчет текущего прерывания только начался) а в адрес - адрес следующей команды и выходим из подпрограммы.
При вызове подпрограммы проверяем таймер если 0 - идем по адресу, если нет декремент таймера и выход.

Добавлено after 1 minute 14 seconds:
П.С. ни чего не имею против программных таймеров на малые интервалы
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Друг Кота
Аватара пользователя
Сообщения: 15660
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Есть маахонькая разница:
1. программный интервал сформированный на основе повторяющихся циклично машинных кодов;
2. программный интервал на основе генерации метки аппаратным блоком
при условии, что длительность интервала между метками значительно превосходит разумную внешнюю погрешность.
Первый пункт хорош на сверхмалых интервалах, второй - основа всех типов счета "длинных" интервалов/программных RTC.
8)
Ответить

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