mmote.ru/content/posts/avr-gcc-cvports/index.md

2.2 KiB
Raw Permalink Blame History

title categories date draft featured_image
Управление портами как в CodeVisionAvr
mcu
archive
2016-06-03T00:00:00+03:00 false miniature.jpg

Наверное, многие, как и я, начинали обучение миру микроконтроллеров в такой замечательной среде программирования как CodeVisionAvr. И не спроста компилятор предоставляет возможности, несколько упрощающие жизнь программисту. Одна из таких возможностей - обращение к конкретным ножкам определённого порта в явном виде.

Например, мы хотим включить ножку 5 порта C. В CVAvr это делается так:

PORTC.5 = 1;

А в WinAvr (avr-gcc) это делается так (что более правильно, я не спорю, но менее комфортно):

PORTC |= _BV(5);

И выключаем ту же ножку. CVAvr:

PORTC.5 = 0;

А в WinAvr:

PORTC &= ~_BV(5);

Не так наглядно, согласитесь? Так что попробуем добиться такого же вида обращения к портам как и в CVAvr.

Для этого нужно создать восьмибитную структуру:

struct port_byte {
 bool P0 : 1;
 bool P1 : 1;
 bool P2 : 1;
 bool P3 : 1;
 bool P4 : 1;
 bool P5 : 1;
 bool P6 : 1;
 bool P7 : 1;
};

Дабы компилятор не ругался на bool нужно подключить заголовок stdbool.h

Теперь самое интересное. Нужно создать переменную-указатель для нужного порта и присвоить ей начальный адрес. В данном случае используем PORTC:

struct port_byte *CVPORTC = (struct port_byte *) &(PORTC);

Готово! Теперь можно обращаться к ножкам порта через эту переменную:

CVPORTC->P5 = 1;
_delay_ms(500);
CVPORTC->P5 = 0;