Обсуждаем контроллеры компании Atmel.
Ответить

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

Ср май 17, 2017 08:51:45

Дык ежли макросы в исходник впихерены, то необходимо и их описание вместе с оным исходником выкладывать, дабы не прослыть СУСАНИНЫМ.
8)

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

Ср май 17, 2017 09:03:08

Извини, не подумал. Макросы в отдельном файле.
Хотел показать простоту реализации ориентировочной реализации вычисления.
Занимаюсь нормализацией входного сигнала и масштабированием выходного, посему меняется таблица констант, но алгоритм остается.

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

Пт май 19, 2017 11:42:50

Здравствуйте, подскажите пожалуйста собрал измерительный прибор и возникла необходимость перевернуть дисплей вверх ногами. Автор проекта не отвечает, я сам не силен в программировании. Есть исходники проекта, пробовал в WinAVR и AVR Studio но после компиляции даже без каких либо изменений получаемый hex работает только в Proteus-е, а в железе нет - даже экран не включается хотя оригинальный hex работает. Подскажите пожалуйста. В архиве оригинальные исходники, мой в WinAVR и проект Porteus.
Вложения
AmperVolt.7z
(928.13 KiB) Скачиваний: 180

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

Пт май 19, 2017 15:18:38

Дык... проект-то СИшный... а не ассемблер...
:?

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

Вс май 21, 2017 20:21:37

Давно такого потока сознания на форуме не наблюдал... Особенно впечатлило :
только нужен доступ к соответствующей расчётной программе.

Так вроде ТС и ищет эту "соответствующую расчётную программу"
Или:
Логарифм вызывается одной командой.

я даже подозреваю, эта команда CALL - вызов соответствующей подпрограммы. Вот и выдал бы человек, учитывая его космических высот квалификацию, текст проги - на посрамление нам, неразумным.

Да, это вызов подпрограммы, библиотечного элемента. Я вызываю его так:
Log_10 (x, y)
где х - аргумент, двухбайтная переменная,
y - итог вычисление логарифма, тоже двухбайтная переменная.
Программа основана на разбиение всего диапазона на отдельные участки, а на каждом участке используется линейная аппроксимация.
Собственно, программа приведена в ссылке, берите и пользуйтесь. Только написана на макроассемблере, на АБ.
Для меня классический ассемблер выглядит анахронизмом.
Я не программист, поэтому говорить о какой-то особой моей квалификации, тем более космической, не имеет смысла.
Написать команду займет несколько минут - и задача решена. Причём с гарантированной точностью 0,5 процента в диапазоне от 1 до 64. Думаю, так и работают профессионалы.
Если точности недостаточно, то её можно улучшить. Для этого есть математическая программа, которая по заданной точности и коэффициенту перед логарифмом рассчитывает массивы координат точек разбиения и массивы коэффициентов прямой линии аппроксимации . Остаётся только перенести эти массивы в подпрограмму логарифма - и получите новый логарифм с требуемой точностью.
Но эту математическую программу, думаю, в общем доступе не найти.
Предельная точность этого логарифма, похоже, 0,1 процента. Там единица представляется числом 1024, поэтому единичный шаг соответствует погрешности 0,1 процента.
В принципе, если единицу представлять числом 2048, можно в два раза увеличить точность, только диапазон аргумента уменьшится в два раза.

В общем, решение относительно несложное, никаких космических высот и потоков сознания.

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

Пн май 22, 2017 17:43:30

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


МК - Attiny 2313
язык - ассемблер

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

Пн май 22, 2017 18:04:40

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

Добавлено after 7 minutes 13 seconds:
также просто как записать значение в порт. так получаем 4 состояния порта и возможность их менять в любой момент, только надо соблюдать очередность - сначала значение, потом направление на вывод или сначала направление на вход, а потом значение - так не будет выбросов (из за того, что эти значения в порт не получится записать одновременно) (сам МК ни каких ограничений не накладывает)

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

Пн май 22, 2017 18:11:21

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

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

Пн май 22, 2017 18:45:44

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

Добавлено after 5 minutes 12 seconds:
CBI DDRB,1 - его же на вход (на 100% в правильности написания не уверен, я больше по С)

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

Вт май 23, 2017 00:04:43

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

В этом случае при DDR=1 будет выдаваться активный 0, а при DDR=0 - Z-состояние, что полностью идентично тому, как если бы это был открытый сток.

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

Вт май 23, 2017 11:54:06

WiseLord писал(а):...полностью идентично тому, как если бы это был открытый сток.
Нет не полностью. Вам все равно на входе нельзя превышать напряжение питания МК.

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

Вт май 30, 2017 09:44:26

подскажите пож. как считать программные задержки.
И почему онлайн калькуляторы некорректно подсчитывают
например
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, запускал от внешнего резонатора, все тоже самое

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

Вт май 30, 2017 09:58:28

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

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

Вт май 30, 2017 10:05:13

Для формирования точных интервалов предназначены аппаратные таймеры.
Программные циклы в качестве задержек имеют крайне ограниченное применение из-за различных факторов.

Да это я естественно понимаю, но не в 7 раз же погрешность. Мне надо мигать светодиодом раз в 3 часа, +-10 мин. Точность не нужна совершенно.

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

Вт май 30, 2017 10:22:12

FUSE- БИТ CKDIV8 снимите.

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

Вт май 30, 2017 10:31:34

FUSE- БИТ CKDIV8 снимите.

спасибоОО огромнейшее!! :beer:

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

Вт май 30, 2017 10:38:39

По мне, гораздо проще программные задержки формировать пользуясь возможностями ассемблера.
Код:
.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

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

Вт май 30, 2017 13:13:29

CKDIV8 дает только стартовое состояние предделителя "по умолчанию", а уж потом - как CLKPS3:..:CLKPS0 поставиш, так и покатится.
А вот неизвестно чего в OSCCAL при начальной загрузке попавшее гораздо более проблем создаст.
И насчет программных циклов...
Хороши, пока не включены прерывания (либо гарантировано защищены от оных).
8)

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

Вт май 30, 2017 16:07:04

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

Добавлено after 1 minute 14 seconds:
П.С. ни чего не имею против программных таймеров на малые интервалы

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

Ср май 31, 2017 06:18:50

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