--- title: "Управление портами как в CodeVisionAvr" categories: ["mcu", "archive"] date: 2016-06-03T00:00:00+03:00 draft: false featured_image: miniature.jpg --- Наверное, многие, как и я, начинали обучение миру микроконтроллеров в такой замечательной среде программирования как CodeVisionAvr. И не спроста – компилятор предоставляет возможности, несколько упрощающие жизнь программисту. Одна из таких возможностей - обращение к конкретным ножкам определённого порта в явном виде. Например, мы хотим включить ножку 5 порта C. В CVAvr это делается так: ```c PORTC.5 = 1; ``` А в WinAvr (avr-gcc) это делается так (что более правильно, я не спорю, но менее комфортно): ```c PORTC |= _BV(5); ``` И выключаем ту же ножку. CVAvr: ```c PORTC.5 = 0; ``` А в WinAvr: ```c PORTC &= ~_BV(5); ``` Не так наглядно, согласитесь? Так что попробуем добиться такого же вида обращения к портам как и в CVAvr. Для этого нужно создать восьмибитную структуру: ```c 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: ```c struct port_byte *CVPORTC = (struct port_byte *) &(PORTC); ``` Готово! Теперь можно обращаться к ножкам порта через эту переменную: ```c CVPORTC->P5 = 1; _delay_ms(500); CVPORTC->P5 = 0; ```