Можно скопировать состояние вашего бита, который вы не хотите менять, и включить его в переменную, которую вы хотите в порт вывести. Так же у AVR есть ассемблерные команды работы с каждым битом порта в отдельности, но это будет дольше работать)
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
4 буквы написать, остальное даже сам поисковик за тебя додумывает :
так вот и ищу же как решить эту проблему. только понять не могу как я понимаю надо взять значение порта и присвоить ему значение но с маской на младший бит. как блин это сделать
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт апр 20, 2017 22:37:56
Модератор
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Вам нужно сделать 2 операции. 1. Сброс всех битов, которые будут модифицироваться, с помощью "&" и маской. 2. Установка необходимых битов с помощью "|", маской будет являться само устанавливаемое значение.
Добавлено after 6 minutes 55 seconds:
ARV писал(а):
& ~MASK
Этого можно не делать, если исходные данные не затрут "ненужный" бит. Получится 2 операции - & с маской и "|" с исходными данными.
Что-то я совсем потерялся, как получить доступ к глобальной переменной из функции.
пример
Код:
volatile bit s1; //
char function (char a, char b) { if (a == b) return 0; }
Допустим я хочу внутри функции иметь доступ к s1, как ее передать туда и изменить там ума не приложу. объявления типа bit в теле функций не работает, на char ругается, что это не char. Создавать промежуточные переменные я не хочу, ибо bit это 1 бит, и в один байт в регистре можно 8 переменных пихнуть, а любая переменная это минимум 8 бит минимум и вся экономия коту под хвост.
Допустим я хочу внутри функции иметь доступ к s1, как ее передать туда и изменить там ума не приложу
глобальные переменные доступны ни же по коду в теле любых функций напрямую:
Код:
volatile bit s1; //
char function (char a, char b) { s1 = 1; // вот так if (a == b) return 0; }
однако, проблемы, с которыми вы сталкиваетесь
jeka79 писал(а):
объявления типа bit в теле функций не работает, на char ругается, что это не char
уже как бы намекают вам, что bit - это костыль, в стандарте Си нет такого типа. и зря вы им пользуетесь - уже сейчас у вас проблемы, а что потом будет? пользуйтесь только стандартными типами Си - будет вам счастье.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Прочитал в факе кодвижн bit это заюз младших регистров, если у меня булевые данные зачем мне использовать для их хранения обычные переменные, с каждой новой переменной код пухнет, а для меня крайне критична минимизация, поэтому в глобальной переменной типа bit удобно хранить такие данные, можно конечно и обычные переменные заюзать и побитно с ними работать, но это не очень удобно, с типом бит проще, с отдельным битом как с обычной переменной. спс понял, что объявлять не надо, все заработало.
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт апр 21, 2017 12:30:25
Модератор
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
jeka79 писал(а):
Допустим я хочу внутри функции иметь доступ к s1, как ее передать туда и изменить там ума не приложу
Глобальные переменные на то и глобальные, что их область видимости расширенная. Их не нужно никуда передавать, они видятся везде.
jeka79 писал(а):
объявления типа bit в теле функций не работает
Естественно. Под локальные переменные выделяется область в стеке, при входе в функцию, а как компилятору выделить 1 бит ? По этому, если компиляторы поддерживают битовый тип, то они могут быть только глобальными или статическими, чтобы линкер на этапе компиляции, заранее, выделил под них место.
если у меня булевые данные зачем мне использовать для их хранения обычные переменные, с каждой новой переменной код пухнет, а для меня крайне критична минимизация
А тут не совсем верно. Побитное хранение нескольких (до восьми штук в одном байте) флагов требует большего количества (читай, размера)кода, чем для каждой своей переменной. Хотя ОЗУ экономится, это да.
В общем bit рулит, не знаю почему, но только что переписал код на хранение 8 битов в переменной и в типе бит. разница в 200 байт, при компиляции, для кода из 1 функции и проверки, 6 переменных.
выделил в регистре переменную:
Код:
register unsigned char t_buf = 0x00;
либо просто
Код:
bit flag1 = 0; bit flag2 = 1; .........
в функции с флагами делаю все просто
Код:
if (flag) flag = 1;
c переменной:
Код:
if (((t_buf) & (1<<0))) t_buf |= (1<<0);
При чем в асме при работе с bit всегда простые команды SBIS, CBI, а с переменной генерит кучу переходов.
Сейчас этот форум просматривают: pasha71 и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения