71 lines
2.2 KiB
Markdown
71 lines
2.2 KiB
Markdown
|
---
|
|||
|
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;
|
|||
|
```
|