А вы не думали что оно не от хорошей жизни происходит? Когда функции malloc и free отожрут лишних пару килобайт весьма ценного флеша?
Ну, тут уж вам придется сделать свой нелегкий выбор и решить, что для вас важнее: либо переменные, вечно сидящие во флеше из-за какой-то одной вторичной функции, или же динамическая работа с памятью, где объем используется в разы эффективнее и позволяет сделать на паре кБ то, что многие привыкли делать на 32-64 кБ.
Не порите чушь, ей больно.
_________________ Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
пока что мне не попадались проекты на AVR, где использование динамического распределения памяти давало бы какой-то заметный выигрыш.
Есть много вещей, друг мой Горацио... Собственно, старшие AVRки с 64 и больше кБ на борту уже позволяют ваять многоуровневые проекты, где и динамическая память, и классы заметно упростят задачу.
Собственно, старшие AVRки с 64 и больше кБ на борту уже позволяют ваять многоуровневые проекты, где и динамическая память, и классы заметно упростят задачу
это о каких AVRках вы говорите? и о каких конкретно проектах?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Не програмист! Нужно "поморгать" светодиодом на всех портах меги16. Как мог так написал код в CVAVR, прошил и такая ерунда: в полную яркость моргают только 0 биты, остальные 7 бит еле-еле видно свечение. Что не так? Спойлер#include <mega16.h> #include <delay.h>
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Не програмист! Нужно "поморгать" светодиодом на всех портах меги16. Как мог так написал код в CVAVR, прошил и такая ерунда: в полную яркость моргают только 0 биты, остальные 7 бит еле-еле видно свечение. Что не так?
остальные настроены на вход. Надо так: DDRx = 0xff;
Здравствуйте. Подскажите пожалуйста, как в программе сбросить микроконтроллер по нажатию например определенных кнопок. Т.е. интересует именно сброс не по сторожевому таймеру, он в моем случае отключен, а , например, нажал кнопку (любую, а не ту, которая вывод reset на "0" садит), и мк начинает выполнение команд со строки reset. Подскажите, как это реализовать в CodeVisionAvr. Спасибо.
"сбросить микроконтроллер" и "мк начинает выполнение команд со строки reset" - это разные вещи. Как минимум сброс предполагант установку регистров в начальное состояние. Так что, если хотите сбросить, то лучше запретить прерывания, включить сторожевой таймер, и уйти в спячку: через некоторое время микроконтроллер именно СБРОСИТСЯ.
Ну а если надо просто начать выполняться с вектора reset, то какие проблемы? Ассемблерные вставки в CVAVR вроде есть, адрес вектора reset известен, команда JMP в AVR имеется.
как в программе сбросить микроконтроллер по нажатию например определенных кнопок
Конечная цель такого решения? Что вы этим хотите добиться? Как раз по сторожевому таймеру самое простое решение. При определенном событии уходим в глухой цикл. Сторожевой таймер сбросит МК. Но это полный сброс МК. Компиляторы Си в начале программы делают очистку ОЗУ. Этого не видно в коде, но видно в дизассемблере. Есть специальные ключи, которые позволяют начинать программу обходя блок инициализации ОЗУ. Если вам нужно, чтобы при вашем сбросе содержимое ОЗУ осталось как есть, нужно продумать алгоритм и применение специальных ключей. Скажем, в начале программы есть специальная переменная. Если эта переменная не инициализирована, считаем, что МК только что включен или был аппаратный сброс. Инициализируем эту переменную и переменные программы. Выполнение дальнейшего кода. Если переменная инициализирована, выполняем соответствующий код.
Есть "но" при таком решении. Сброс произошел программный, а не аппаратный. И нам неизвестно, какая периферия включена, как настроена и в каком сейчас состоянии. И запросто может быть ситуация, при глобальном разрешении прерываний начнут срабатывать прерывания.
Исправил код, в Протэусе мега 16 мигает всеми портами. Проверял работоспособность 2-х б/у мег16, в обеих не работают портыРС2-РС5. Заказал новую, прошил-история таже, не работают РС2-РС5. Может в настройках CV перед созданием проэкта нужно какие манипуляции сделать? Спойлер#include <mega16.h> #include <delay.h>
А теперь задачка от меня. Имеем в программе ряд дефайнов-констант. Препроцессор позволяет сделать конструкцию вида
Код:
#define FIELD_LENGTH 21 #define RAM_ADDRESS_LENGTH 2 #define FULL_FIELD_LENGTH (FIELD_LENGTH + RAM_ADDRESS_LENGTH) #define MAX_FRAM_ADDRESS 32767U #define FIELDS_NUM 1700U #if (FIELDS_NUM * FIELD_LENGTH) > MAX_FRAM_ADDRESS Number of fields are bigger than all fram space!!!!!!! #endif
Что собственно генерит ошибку компиляции если параметры забиты не корректно и условие выполняется. Вопрос - есть ли грамотный способ бросать ошибку на уровне препроцессора? Чисто из перфекционизма интересуюсь.
Здравствуйте. Откровенно говоря, хотел сам разобраться, но зашел в тупик. Увы, не хватает знаний. Может поможете, или пнете в нужное направление !? Суть программки - В основном цикле таймер остановлен. При нажатии на кнопку (лог.0), срабатывает внешнее прерывании INT0 и в нем запускается плавно ШИМ от нуля до определенной величины. При отпускании кнопки - уходим опять в вечный цикл. Вроде все работает, но скважность ШИМ постоянно увеличивается и потом уменьшается. И так беcконечно, пока не отпустить кнопку. Как можно исправить этот момент? Подскажите пожалуйста.
TCCR0A |=(1<<WGM00); // Режим Phase correct PWM, в этом режиме счет идет до 255, а потом обратно до 0 TCCR0A |=(1<<COM0A1) | (0<<COM0A0); // 0 при 1-м равенстве регистров TCNT0 и OCROA и 1 при 2-м равенстве. (инвертированный ШИМ-сигнал) TCCR0B |= (1<<CS01); // делитель 8 OCR0A =0;// регистр сравнения
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения