Свежие обсуждения
Микроконтроллеры

AVR начинающим - вопросы и ответы

1 28 68

Если Вы имеете в виду битовые переменные наподобие PORTB.1, то это - извращение CVAVR, к стандарту С никакого отношения не имеющее. Не думаю, что их можно передать в функцию как параметры, потому что минимальный размер параметра - 1 байт, а в нем аж 8 штук битов. С каким именно битом из восьми должна работать функция? Как она об этом узнает? Ответ - да никак! Если нужно работать с тем или иным битом, можно попробовать два варианта:
1. Передавать в функцию два параметра - байт целиком, как есть (не выделяя бит), и маску, в которой будет лог.1 для нужного бита. В функции будете разбираться.
2. Если параметр нужен только в плане true/false, можно воспользоваться тернарной операцией (PORTB.1 ? 1 : 0)

 

Zandy: CVAVR работает с битовыми переменными.
Нет, не работает. Он гробит целый байт.

 

Спасибо за ответы. Сам тоже поизучал документацию.

Работать-то он работает:

"The global bit variables located in the GPIOR register(s) and R2 to R14 memory space.
These variables are declared using the bit keyword.
The syntax is:

bit <identifier>;"

Да вот только:

"The bit data type is supported only for global variables."

 

Alexey: Zandy: CVAVR работает с битовыми переменными.
Нет, не работает. Он гробит целый байт.

Интересно. Попробовал сгенерить пустую программу с bit a; и c unsigned char a; -- размер программы в % от памяти кристалла не изменился. Неужели и правда cvavr под бит байт выделяет!?

 

Задумался ещё вот над чем, в cvavr инкременирование работает если записать так:
"i++;" или так "++i;". А вообще как правильно или разница только - поймет тот или иной компилятор или нет?

 

Digital: Неужели и правда cvavr под бит байт выделяет!?
В Линухе С++ под bool-переменную вообще 4 байта выделяет! Увидел - офигел...

Digital: А вообще как правильно
Это две разные операции, потому что они отличаются результатом. Переменная i в любом случае увеличится, но ++i возвращает новое значение переменной, а i++ - прежнее.

 

chav1961: В Линухе С++ под bool-переменную вообще 4 байта выделяет! Увидел - офигел...

Что-то не очень вериться. Может среда не правильная ?

 

Zandy: Так почему я не могу передавать биты в функцию, как параметры? Пишет ошибку при компиляции

Передавать можно...только осторожно Надо задекларировать структуру, а в ней объявить битовые переменные произвольной ширины, можно от 1 до 32 бит. В принципе, структуру можно передавать как обычный аргумент в подпрограмму, но для экономии памяти МК (озу) лучше передавать указатель на структуру. Ниже приведен фрагмент кода, в котором используется структура с однобитовыми переменными.


struct FLAGS
{
unsigned char rshift:1;
unsigned char lshift:1;
unsigned char ctrl:1;
unsigned char alt:1;
} fkey;
/* this structure will occupy 1 byte in SRAM as the bit field data type is unsigned char */
struct alpha
{
unsigned char a:1; /* bit 0 */
unsigned char b:4; /* bits 1..4 */
unsigned char c:3; /* bits 5..7 */
};

void main (void)
{
char k1,k2;
k1=fkey.rshift;
k2=fkey.ctrl;
fkey.alt=1;
fkey.lshift=0;

Ну а поскольку байт это минимальная информединица, обрабатываемая в 8-битном МК, то все структуры с битовыми полями используют один-два-три-четыре байта в соответствии с описанием данной структуры, так что хоть для одного битового поля, хоть для 8-ми, всё равно будет использован один байт хранения, а в некоторых случаях - даже два, например, когда переменная хранится во флеши.

 

Удалов: Что-то не очень вериться.
Очень легко проверить. Запускаем Линух, заходим в KDeveloper, пишем printf("%d",sizeof(bool)); запускаем.
PS. Зашел, проверил. Получил единицу Приношу извинения, спутал с enum

 

Еще раз спасибо всем. Прога уже давно написана и работает. Воспользовался стандартным приемом наложения масок.
По поводу проверок. В левой колонке cvavr после компиляции пишет, куда были прописаны глобальные переменные (адрес регистра или ОЗУ). Надо там опцию в настройках перед компиляцией установить, и тогда они, во-первых всегда будут в рабочих регистрах, а битовые будут в одном рабочем регистре и занимать один бит.
Допускаю, что если птицу не поставить, битовые будут занимать байт и записываться не в регистры, а в область ОЗУ или куда попало, если явно не указывать.
Кстати, протеус не любит переменных в ОЗУ. Симулировать - симулирует, но при пошаговой отладке переменные не видны. Пишет, что мол эта область памяти мне не доступна для отображения.

Привет - Джоржу. Давненько на форуме не было.