Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср май 17, 2017 09:03:08
Встал на лапы
Карма: 3
Рейтинг сообщений: 7
Зарегистрирован: Чт сен 10, 2015 06:59:03 Сообщений: 106 Откуда: Гродно, BY
Рейтинг сообщения:0
Извини, не подумал. Макросы в отдельном файле. Хотел показать простоту реализации ориентировочной реализации вычисления. Занимаюсь нормализацией входного сигнала и масштабированием выходного, посему меняется таблица констант, но алгоритм остается.
Здравствуйте, подскажите пожалуйста собрал измерительный прибор и возникла необходимость перевернуть дисплей вверх ногами. Автор проекта не отвечает, я сам не силен в программировании. Есть исходники проекта, пробовал в WinAVR и AVR Studio но после компиляции даже без каких либо изменений получаемый hex работает только в Proteus-е, а в железе нет - даже экран не включается хотя оригинальный hex работает. Подскажите пожалуйста. В архиве оригинальные исходники, мой в WinAVR и проект Porteus.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Давно такого потока сознания на форуме не наблюдал... Особенно впечатлило :
Цитата:
только нужен доступ к соответствующей расчётной программе.
Так вроде ТС и ищет эту "соответствующую расчётную программу" Или:
Цитата:
Логарифм вызывается одной командой.
я даже подозреваю, эта команда CALL - вызов соответствующей подпрограммы. Вот и выдал бы человек, учитывая его космических высот квалификацию, текст проги - на посрамление нам, неразумным.
Да, это вызов подпрограммы, библиотечного элемента. Я вызываю его так: Log_10 (x, y) где х - аргумент, двухбайтная переменная, y - итог вычисление логарифма, тоже двухбайтная переменная. Программа основана на разбиение всего диапазона на отдельные участки, а на каждом участке используется линейная аппроксимация. Собственно, программа приведена в ссылке, берите и пользуйтесь. Только написана на макроассемблере, на АБ. Для меня классический ассемблер выглядит анахронизмом. Я не программист, поэтому говорить о какой-то особой моей квалификации, тем более космической, не имеет смысла. Написать команду займет несколько минут - и задача решена. Причём с гарантированной точностью 0,5 процента в диапазоне от 1 до 64. Думаю, так и работают профессионалы. Если точности недостаточно, то её можно улучшить. Для этого есть математическая программа, которая по заданной точности и коэффициенту перед логарифмом рассчитывает массивы координат точек разбиения и массивы коэффициентов прямой линии аппроксимации . Остаётся только перенести эти массивы в подпрограмму логарифма - и получите новый логарифм с требуемой точностью. Но эту математическую программу, думаю, в общем доступе не найти. Предельная точность этого логарифма, похоже, 0,1 процента. Там единица представляется числом 1024, поэтому единичный шаг соответствует погрешности 0,1 процента. В принципе, если единицу представлять числом 2048, можно в два раза увеличить точность, только диапазон аргумента уменьшится в два раза.
В общем, решение относительно несложное, никаких космических высот и потоков сознания.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заранее прошу прощения за вопрос. Можно ли в ходе выполнения программы изменять назначение ног контроллера с входа на выход и обратно без ресета, или это одноразовая акция при инициализации контроллера, то есть изменять содержимое регистра DDRB
МК - Attiny 2313 язык - ассемблер
_________________ Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Добавлено after 7 minutes 13 seconds: также просто как записать значение в порт. так получаем 4 состояния порта и возможность их менять в любой момент, только надо соблюдать очередность - сначала значение, потом направление на вывод или сначала направление на вход, а потом значение - так не будет выбросов (из за того, что эти значения в порт не получится записать одновременно) (сам МК ни каких ограничений не накладывает)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
да, только порты можно (до определенной буквы, не помню точно какой, но тинькам это точно не грозит) адресовать и побитно например SBI DDRB,1 (1 нога порта B - на выход) так тоже должно работать. а если как ты писал - то лучше сначала прочитать состояние, потом изменить нужные биты (при помощи масок), а потом вписать обратно - иначе можно испортить направление других выводов порта.
Добавлено after 5 minutes 12 seconds: CBI DDRB,1 - его же на вход (на 100% в правильности написания не уверен, я больше по С)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
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, запускал от внешнего резонатора, все тоже самое
Для формирования точных интервалов предназначены аппаратные таймеры. Программные циклы в качестве задержек имеют крайне ограниченное применение из-за различных факторов. Кроме прочего сам RC-генератор имеет допустимый диапазон погрешности и касательно тиньки 13-й надо весьма точно считать - с 8-9 знаками после запятой.
Особо ежли учесть, что для пониженной частоты генератора константа коррекции должна быть вручную заранее считана и в программе заранее загружена. Автоматом только для основной частоты "по умолчанию" корректируюшша константа загружается.
Для формирования точных интервалов предназначены аппаратные таймеры. Программные циклы в качестве задержек имеют крайне ограниченное применение из-за различных факторов.
Да это я естественно понимаю, но не в 7 раз же погрешность. Мне надо мигать светодиодом раз в 3 часа, +-10 мин. Точность не нужна совершенно.
CKDIV8 дает только стартовое состояние предделителя "по умолчанию", а уж потом - как CLKPS3:..:CLKPS0 поставиш, так и покатится. А вот неизвестно чего в OSCCAL при начальной загрузке попавшее гораздо более проблем создаст. И насчет программных циклов... Хороши, пока не включены прерывания (либо гарантировано защищены от оных).
Уморшить контроллер на 3 часа да ещё и прерывания выключить если Вам надо пирог через 3 часа из духовки вынуть, тоже тиканье часов считать будете? и ни на что не отвлекаться чтобы со счету не сбили даже если контроллер больше ни чем не занят пусть лучше спит как кот, (или ест ) - а от такой практики лучше уходить, чтобы не дай бог не привыкнуть . тем более прерывание использовать не сложно (а темболее когда время задержки не меняется) в подпрограмме добавляешь переменную - где хранится адрес на который прыгнуть и переменную таймера, допустим вызов нашей подпрограммы происходит 1раз в миллисекунду, а нам надо подождать 100 миллисекунд - в переменную таймера вносим 99 (отсчет текущего прерывания только начался) а в адрес - адрес следующей команды и выходим из подпрограммы. При вызове подпрограммы проверяем таймер если 0 - идем по адресу, если нет декремент таймера и выход.
Добавлено after 1 minute 14 seconds: П.С. ни чего не имею против программных таймеров на малые интервалы
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Есть маахонькая разница: 1. программный интервал сформированный на основе повторяющихся циклично машинных кодов; 2. программный интервал на основе генерации метки аппаратным блоком при условии, что длительность интервала между метками значительно превосходит разумную внешнюю погрешность. Первый пункт хорош на сверхмалых интервалах, второй - основа всех типов счета "длинных" интервалов/программных RTC.
Сейчас этот форум просматривают: Varlakotam и гости: 19
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения