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

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Извини, не подумал. Макросы в отдельном файле.
Хотел показать простоту реализации ориентировочной реализации вычисления.
Занимаюсь нормализацией входного сигнала и масштабированием выходного, посему меняется таблица констант, но алгоритм остается.
Хотел показать простоту реализации ориентировочной реализации вычисления.
Занимаюсь нормализацией входного сигнала и масштабированием выходного, посему меняется таблица констант, но алгоритм остается.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Здравствуйте, подскажите пожалуйста собрал измерительный прибор и возникла необходимость перевернуть дисплей вверх ногами. Автор проекта не отвечает, я сам не силен в программировании. Есть исходники проекта, пробовал в WinAVR и AVR Studio но после компиляции даже без каких либо изменений получаемый hex работает только в Proteus-е, а в железе нет - даже экран не включается хотя оригинальный hex работает. Подскажите пожалуйста. В архиве оригинальные исходники, мой в WinAVR и проект Porteus.
- Вложения
-
- AmperVolt.7z
- (928.13 КБ) 195 скачиваний
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Дык... проект-то СИшный... а не ассемблер...

Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Jack_A",url="/forum/viewtopic.php?p=3106493#p3106493"]Давно такого потока сознания на форуме не наблюдал... Особенно впечатлило :
Или:
Да, это вызов подпрограммы, библиотечного элемента. Я вызываю его так:
Log_10 (x, y)
где х - аргумент, двухбайтная переменная,
y - итог вычисление логарифма, тоже двухбайтная переменная.
Программа основана на разбиение всего диапазона на отдельные участки, а на каждом участке используется линейная аппроксимация.
Собственно, программа приведена в ссылке, берите и пользуйтесь. Только написана на макроассемблере, на АБ.
Для меня классический ассемблер выглядит анахронизмом.
Я не программист, поэтому говорить о какой-то особой моей квалификации, тем более космической, не имеет смысла.
Написать команду займет несколько минут - и задача решена. Причём с гарантированной точностью 0,5 процента в диапазоне от 1 до 64. Думаю, так и работают профессионалы.
Если точности недостаточно, то её можно улучшить. Для этого есть математическая программа, которая по заданной точности и коэффициенту перед логарифмом рассчитывает массивы координат точек разбиения и массивы коэффициентов прямой линии аппроксимации . Остаётся только перенести эти массивы в подпрограмму логарифма - и получите новый логарифм с требуемой точностью.
Но эту математическую программу, думаю, в общем доступе не найти.
Предельная точность этого логарифма, похоже, 0,1 процента. Там единица представляется числом 1024, поэтому единичный шаг соответствует погрешности 0,1 процента.
В принципе, если единицу представлять числом 2048, можно в два раза увеличить точность, только диапазон аргумента уменьшится в два раза.
В общем, решение относительно несложное, никаких космических высот и потоков сознания.
Так вроде ТС и ищет эту "соответствующую расчётную программу"только нужен доступ к соответствующей расчётной программе.
Или:
я даже подозреваю, эта команда CALL - вызов соответствующей подпрограммы. Вот и выдал бы человек, учитывая его космических высот квалификацию, текст проги - на посрамление нам, неразумным.[/uquote]Логарифм вызывается одной командой.
Да, это вызов подпрограммы, библиотечного элемента. Я вызываю его так:
Log_10 (x, y)
где х - аргумент, двухбайтная переменная,
y - итог вычисление логарифма, тоже двухбайтная переменная.
Программа основана на разбиение всего диапазона на отдельные участки, а на каждом участке используется линейная аппроксимация.
Собственно, программа приведена в ссылке, берите и пользуйтесь. Только написана на макроассемблере, на АБ.
Для меня классический ассемблер выглядит анахронизмом.
Я не программист, поэтому говорить о какой-то особой моей квалификации, тем более космической, не имеет смысла.
Написать команду займет несколько минут - и задача решена. Причём с гарантированной точностью 0,5 процента в диапазоне от 1 до 64. Думаю, так и работают профессионалы.
Если точности недостаточно, то её можно улучшить. Для этого есть математическая программа, которая по заданной точности и коэффициенту перед логарифмом рассчитывает массивы координат точек разбиения и массивы коэффициентов прямой линии аппроксимации . Остаётся только перенести эти массивы в подпрограмму логарифма - и получите новый логарифм с требуемой точностью.
Но эту математическую программу, думаю, в общем доступе не найти.
Предельная точность этого логарифма, похоже, 0,1 процента. Там единица представляется числом 1024, поэтому единичный шаг соответствует погрешности 0,1 процента.
В принципе, если единицу представлять числом 2048, можно в два раза увеличить точность, только диапазон аргумента уменьшится в два раза.
В общем, решение относительно несложное, никаких космических высот и потоков сознания.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Заранее прошу прощения за вопрос.
Можно ли в ходе выполнения программы изменять назначение ног контроллера с входа на выход и обратно без ресета, или это одноразовая акция при инициализации контроллера, то есть изменять содержимое регистра DDRB
МК - Attiny 2313
язык - ассемблер
Можно ли в ходе выполнения программы изменять назначение ног контроллера с входа на выход и обратно без ресета, или это одноразовая акция при инициализации контроллера, то есть изменять содержимое регистра DDRB
МК - Attiny 2313
язык - ассемблер
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Ассемблер (ASM) для AVR в вопросах и ответах
вообще без проблем.
Добавлено after 7 minutes 13 seconds:
также просто как записать значение в порт. так получаем 4 состояния порта и возможность их менять в любой момент, только надо соблюдать очередность - сначала значение, потом направление на вывод или сначала направление на вход, а потом значение - так не будет выбросов (из за того, что эти значения в порт не получится записать одновременно) (сам МК ни каких ограничений не накладывает)
Добавлено after 7 minutes 13 seconds:
также просто как записать значение в порт. так получаем 4 состояния порта и возможность их менять в любой момент, только надо соблюдать очередность - сначала значение, потом направление на вывод или сначала направление на вход, а потом значение - так не будет выбросов (из за того, что эти значения в порт не получится записать одновременно) (сам МК ни каких ограничений не накладывает)
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я правильно понял ваше сообщение?
ldi Temp,0b01111111 ;настройка портов
out DDRB,Temp
бла-бла-бла
инициализация
reti
main: осн цикл
бла-бла-бла
кусок программы
ldi Temp,0b00000000 ;меняем назначение портов
out DDRB,Temp
бла-бла-бла
еще кусок кода в котором применяем новое направление
ldi Temp,0b01111111 ;ставим все на место
out DDRB,Temp
rjmp main
Спойлер
Reset:ldi Temp,0b01111111 ;настройка портов
out DDRB,Temp
бла-бла-бла
инициализация
reti
main: осн цикл
бла-бла-бла
кусок программы
ldi Temp,0b00000000 ;меняем назначение портов
out DDRB,Temp
бла-бла-бла
еще кусок кода в котором применяем новое направление
ldi Temp,0b01111111 ;ставим все на место
out DDRB,Temp
rjmp main
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Ассемблер (ASM) для AVR в вопросах и ответах
да, только порты можно (до определенной буквы, не помню точно какой, но тинькам это точно не грозит) адресовать и побитно например
SBI DDRB,1 (1 нога порта B - на выход) так тоже должно работать.
а если как ты писал - то лучше сначала прочитать состояние, потом изменить нужные биты (при помощи масок), а потом вписать обратно - иначе можно испортить направление других выводов порта.
Добавлено after 5 minutes 12 seconds:
CBI DDRB,1 - его же на вход (на 100% в правильности написания не уверен, я больше по С)
SBI DDRB,1 (1 нога порта B - на выход) так тоже должно работать.
а если как ты писал - то лучше сначала прочитать состояние, потом изменить нужные биты (при помощи масок), а потом вписать обратно - иначе можно испортить направление других выводов порта.
Добавлено after 5 minutes 12 seconds:
CBI DDRB,1 - его же на вход (на 100% в правильности написания не уверен, я больше по С)
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Собственно, один из вариантов эмуляции выхода с открытым стоком на AVR - это выставить PORT в 0, а дальше уже дёргать DDR по необходимости.
В этом случае при DDR=1 будет выдаваться активный 0, а при DDR=0 - Z-состояние, что полностью идентично тому, как если бы это был открытый сток.
В этом случае при DDR=1 будет выдаваться активный 0, а при DDR=0 - Z-состояние, что полностью идентично тому, как если бы это был открытый сток.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Нет не полностью. Вам все равно на входе нельзя превышать напряжение питания МК.WiseLord писал(а):...полностью идентично тому, как если бы это был открытый сток.
- Coldheart
- Прорезались зубы
- Сообщения: 244
- Зарегистрирован: Пт сен 10, 2010 20:39:32
- Откуда: Украина Луганская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
подскажите пож. как считать программные задержки.
И почему онлайн калькуляторы некорректно подсчитывают
например
http://www.bretmulvey.com/avrdelay.html
Почему в строке циклы пишется на порядок больше т.е. 48 000 000 ?
А когда зашиваю в реальный контроллер получается не 1 сек а 7 сек. Контроллер Attiny13A
Естественно пробовал разные частоты генератора.
Пробовал и на Attiny2313, запускал от внешнего резонатора, все тоже самое
И почему онлайн калькуляторы некорректно подсчитывают
например
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А когда зашиваю в реальный контроллер получается не 1 сек а 7 сек. Контроллер Attiny13A
Естественно пробовал разные частоты генератора.
Пробовал и на Attiny2313, запускал от внешнего резонатора, все тоже самое
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Для формирования точных интервалов предназначены аппаратные таймеры.
Программные циклы в качестве задержек имеют крайне ограниченное применение из-за различных факторов.
Кроме прочего сам RC-генератор имеет допустимый диапазон погрешности и касательно тиньки 13-й надо весьма точно считать - с 8-9 знаками после запятой.

Особо ежли учесть, что для пониженной частоты генератора константа коррекции должна быть вручную заранее считана и в программе заранее загружена. Автоматом только для основной частоты "по умолчанию" корректируюшша константа загружается.

Программные циклы в качестве задержек имеют крайне ограниченное применение из-за различных факторов.
Кроме прочего сам RC-генератор имеет допустимый диапазон погрешности и касательно тиньки 13-й надо весьма точно считать - с 8-9 знаками после запятой.
Особо ежли учесть, что для пониженной частоты генератора константа коррекции должна быть вручную заранее считана и в программе заранее загружена. Автоматом только для основной частоты "по умолчанию" корректируюшша константа загружается.
- Coldheart
- Прорезались зубы
- Сообщения: 244
- Зарегистрирован: Пт сен 10, 2010 20:39:32
- Откуда: Украина Луганская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="BOB51",url="/forum/viewtopic.php?p=3116560#p3116560"]Для формирования точных интервалов предназначены аппаратные таймеры.
Программные циклы в качестве задержек имеют крайне ограниченное применение из-за различных факторов.[/uquote]
Да это я естественно понимаю, но не в 7 раз же погрешность. Мне надо мигать светодиодом раз в 3 часа, +-10 мин. Точность не нужна совершенно.
Программные циклы в качестве задержек имеют крайне ограниченное применение из-за различных факторов.[/uquote]
Да это я естественно понимаю, но не в 7 раз же погрешность. Мне надо мигать светодиодом раз в 3 часа, +-10 мин. Точность не нужна совершенно.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
FUSE- БИТ CKDIV8 снимите.
- Coldheart
- Прорезались зубы
- Сообщения: 244
- Зарегистрирован: Пт сен 10, 2010 20:39:32
- Откуда: Украина Луганская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="akl",url="/forum/viewtopic.php?p=3116580#p3116580"]FUSE- БИТ CKDIV8 снимите.[/uquote]
спасибоОО огромнейшее!!
спасибоОО огромнейшее!!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
По мне, гораздо проще программные задержки формировать пользуясь возможностями ассемблера.
Код: Выделить всё
.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 в вопросах и ответах
CKDIV8 дает только стартовое состояние предделителя "по умолчанию", а уж потом - как CLKPS3:..:CLKPS0 поставиш, так и покатится.
А вот неизвестно чего в OSCCAL при начальной загрузке попавшее гораздо более проблем создаст.
И насчет программных циклов...
Хороши, пока не включены прерывания (либо гарантировано защищены от оных).

А вот неизвестно чего в OSCCAL при начальной загрузке попавшее гораздо более проблем создаст.
И насчет программных циклов...
Хороши, пока не включены прерывания (либо гарантировано защищены от оных).
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Уморшить контроллер на 3 часа
да ещё и прерывания выключить
если Вам надо пирог через 3 часа из духовки вынуть, тоже тиканье часов считать будете?
и ни на что не отвлекаться чтобы со счету не сбили
даже если контроллер больше ни чем не занят пусть лучше спит как кот, (или ест
) - а от такой практики лучше уходить, чтобы не дай бог не привыкнуть
.
тем более прерывание использовать не сложно (а темболее когда время задержки не меняется) в подпрограмме добавляешь переменную - где хранится адрес на который прыгнуть и переменную таймера, допустим вызов нашей подпрограммы происходит 1раз в миллисекунду, а нам надо подождать 100 миллисекунд - в переменную таймера вносим 99 (отсчет текущего прерывания только начался) а в адрес - адрес следующей команды и выходим из подпрограммы.
При вызове подпрограммы проверяем таймер если 0 - идем по адресу, если нет декремент таймера и выход.
Добавлено after 1 minute 14 seconds:
П.С. ни чего не имею против программных таймеров на малые интервалы
даже если контроллер больше ни чем не занят пусть лучше спит как кот, (или ест
тем более прерывание использовать не сложно (а темболее когда время задержки не меняется) в подпрограмме добавляешь переменную - где хранится адрес на который прыгнуть и переменную таймера, допустим вызов нашей подпрограммы происходит 1раз в миллисекунду, а нам надо подождать 100 миллисекунд - в переменную таймера вносим 99 (отсчет текущего прерывания только начался) а в адрес - адрес следующей команды и выходим из подпрограммы.
При вызове подпрограммы проверяем таймер если 0 - идем по адресу, если нет декремент таймера и выход.
Добавлено after 1 minute 14 seconds:
П.С. ни чего не имею против программных таймеров на малые интервалы
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Есть маахонькая разница:
1. программный интервал сформированный на основе повторяющихся циклично машинных кодов;
2. программный интервал на основе генерации метки аппаратным блоком
при условии, что длительность интервала между метками значительно превосходит разумную внешнюю погрешность.
Первый пункт хорош на сверхмалых интервалах, второй - основа всех типов счета "длинных" интервалов/программных RTC.

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