Хелпикс

Главная

Контакты

Случайная статья





PORTD = 0xff;. PORTD = 0x00;. PORTD |= 1<<3;. PORTD &= ~(1<<4);



PORTD = 0xff;

А установить " 0" на всех выводах порта D можно так.

PORTD = 0x00;

К каждому биту регистров PORTx можно обращаться и по отдельности так же, как в случае с регистрами DDRx.

Например, команда

PORTD |= 1< < 3;

установит " 1" (сигнал высокого уровня) на выводе PD3.

Команда

PORTD & = ~(1< < 4);

установит " 0" (сигнал низкого уровня) на выводе PD4.

В AVR GCC сдвиг можно осуществлять и с помощью функции _BV(), которая выполняет поразрядный сдвиг и вставляет результат в компилируемый код.

В случае использования функции _BV() две предыдущие команды будут выглядеть следующим образом.

PORTD |= _BV(PD3); // установить " 1" на линии 3 порта D

PORTD & = ~_BV(PD4); // установить " 0" на линии 4 порта D

 

В микроконтроллерах AVR каждому параллельному порту ввода/вывода поставлен в соответствие также регистр PINx. PINx является регистром выводов порта и в отличие от регистров DDRx и PORTx доступен только для чтения. PINx позволяет считывать входные данные порта на внутреннюю шину микроконтроллера. Об этом регистре мы поговорим чуть позже.

 

 

 

Теперь попробуем написать несколько простых программ для лучшего понимания принципа работы с портами микроконтроллера.

Первые наши программы будут состоять всего из нескольких строк, и в их задачу будет входить зажигание светодиода, подключенного к микроконтроллеру.

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

Рисунок 1 Рисунок 2

 

В зависимости от способа подключения светодиод будет загораться либо от сигнала высокого уровня, подаваемого на вывод PD1 микроконтроллера, как в первом случае, либо от сигнала низкого уровня в случае подключения, изображенного на втором рисунке.

 

 

/*************************************************************************

ПРИМЕР ВКЛЮЧЕНИЯ СВЕТОДИОДА СИГНАЛОМ ВЫСОКОГО УРОВНЯ

Пример подключения на рисунке 1

**************************************************************************/

 

#include < avr/io. h>   

int main( void ) { // начало основной программы

DDRD = 0xff;    // все выводы порта D сконфигурировать как выходы

PORTD |= _BV(PD1); // установить " 1" (высокий уровень) на выводе PD1

}              // закрывающая скобка основной программы

 

 

 

 


 

/***********************************************************************

ПРИМЕР ВКЛЮЧЕНИЯ СВЕТОДИОДА СИГНАЛОМ НИЗКОГО УРОВНЯ

Пример подключения на рисунке 2

************************************************************************/

 

#include < avr/io. h>

  

int main( void ) { // начало основной программы

DDRD = 0xff;    // все выводы порта D сконфигурировать как выходы

PORTD & = ~_BV(PD1); // установить " 0" (низкий уровень) на выводе PD1

}              // закрывающая скобка основной программы

 

 

 

 

Теперь попробуем мигнуть светодиодом, подключенным так, как это изображено на левом рисунке. Для этого используем функцию задержки _delay_ms().

Функция _delay_ms() формирует задержку в зависимости от передаваемого ей аргумента, выраженного в миллисекундах (в одной секунде 1000 миллисекунд). Максимальная задержка может достигать 262. 14 миллисекунд. Если пользователь передаст функции значение более 262. 14, то произойдет автоматическое уменьшение разрешения до 1/10 миллисекунды, что обеспечивает задержки до 6. 5535 секунд. (О формировании более длительных задержек можно прочитать в статье " Циклы в языке Си. Формирование задержки". )

Функция _delay_ms() содержится в файле delay. h, поэтому нам будет необходимо подключить этот файл к программе. Кроме того, для нормальной работы этой функции необходимо указать частоту, на которой работает микроконтроллер, в герцах.

 

 

/*************************************

ПРИМЕР МИГАНИЯ СВЕТОДИОДОМ

Пример подключения на рисунке 1

**************************************/

 

#define F_CPU 1000000UL // указываем частоту в герцах

 

#include < avr/io. h>

#include < util/delay. h>

 

int main( void ) { // начало основной программы

  

DDRD = 0xff;    // все выводы порта D сконфигурировать как выходы

 

PORTD |= _BV(PD1); // установить " 1" (высокий уровень) на выводе PD1,

                  //зажечь светодиод

 

_delay_ms(500); // ждем 0. 5 сек.

 

PORTD & = ~_BV(PD1); // установить " 0" (низкий уровень) на выводе PD1,

                  //погасить светодиод

 

_delay_ms(500); // ждем 0. 5 сек.

 

PORTD |= _BV(PD1); // установить " 1" (высокий уровень) на выводе PD1,

                  //зажечь светодиод

 

_delay_ms(500); // ждем 0. 5 сек.

 

PORTD & = ~_BV(PD1); // установить " 0" (низкий уровень) на выводе PD1,

                  //погасить светодиод

 

}              // закрывающая скобка основной программы

 

 

 

Серия миганий светодиодом будет очень короткой. Для того чтобы сделать мигание непрерывным, можно организовать бесконечный цикл с помощью оператора безусловного перехода " goto". Оператор goto осуществляет переход к месту программы, обозначенному меткой. Имя метки не должно содержать пробелов. После имени метки ставится знак двоеточия. Между именем метки и двоеточием не должно быть пробелов.

 

 

/*******************************************************

ПРИМЕР БЕСКОНЕЧНОГО МИГАНИЯ СВЕТОДИОДОМ

Пример подключения на рисунке 1

********************************************************/

 

#define F_CPU 1000000UL // указываем частоту в герцах

 

#include < avr/io. h>

#include < util/delay. h>

 

int main( void ) { // начало основной программы

  

DDRD = 0xff;    // все выводы порта D сконфигурировать как выходы

 

start:             // метка для команды goto start

 

PORTD |= _BV(PD1); // установить " 1" (высокий уровень) на выводе PD1,

                  //зажечь светодиод

 

_delay_ms(250); // ждем 0. 25 сек.

 

PORTD & = ~_BV(PD1); // установить " 0" (низкий уровень) на выводе PD1,

                  //погасить светодиод

 

_delay_ms(250); // ждем 0. 25 сек.

 

goto start;        // перейти к метке start

 

}              // закрывающая скобка основной программы



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.