Можно скопировать состояние вашего бита, который вы не хотите менять, и включить его в переменную, которую вы хотите в порт вывести. Так же у AVR есть ассемблерные команды работы с каждым битом порта в отдельности, но это будет дольше работать)
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
4 буквы написать, остальное даже сам поисковик за тебя додумывает :
так вот и ищу же как решить эту проблему. только понять не могу как я понимаю надо взять значение порта и присвоить ему значение но с маской на младший бит. как блин это сделать
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт апр 20, 2017 22:37:56
Модератор
Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4564 Откуда: Планета Земля
Рейтинг сообщения: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
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4564 Откуда: Планета Земля
Рейтинг сообщения: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, а с переменной генерит кучу переходов.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения