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

71 lines
2.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "Управление портами как в CodeVisionAvr"
categories: ["mcu", "archive"]
date: 2016-06-03T00:00:00+03:00
draft: false
featured_image: miniature.jpg
---
Наверное, многие, как и я, начинали обучение миру микроконтроллеров в такой замечательной среде программирования как CodeVisionAvr. И не спроста компилятор предоставляет возможности, несколько упрощающие жизнь программисту. Одна из таких возможностей - обращение к конкретным ножкам определённого порта в явном виде.
<!--more-->
Например, мы хотим включить ножку 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;
```