реклама на сайте
подробности

 
 
> Настройка портов в AVR, разжуйте пожалуйста
Zelepuk
сообщение Nov 5 2010, 13:46
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



есть две строчки кода

DDRD = (0<<PD1)|(1<<PD0);
PORTD = (1<<PD1)|(0<<PD0);

что они делают? желательно как можно подробнее.
Я понимаю так: что в регистр DDRD записываем число получающееся после сдвига числа ноль влево на PD1, а также числа 1 влево на PD0. А так же операции ИЛИ между результатами двух этих операций. Но чему равны PD1 и PD0 непонятно.
Наверное я совсем ничего не понимаю в этом, подскажите пожалуйста.

к PD1 подключен пьезик
к PD0 подключена кнопка.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Zelepuk
сообщение Nov 5 2010, 16:52
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Спасибо большое!
Пример заработал. Вот только не совсем понятна фраза как таковая "здвигаем на PD0 единиц"...
Чему изначально равно PD0? Или дело обстоит так, сначала выставляем на PD0 единицу, а потом уже работаем с ним?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 5 2010, 17:31
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Zelepuk @ Nov 5 2010, 19:52) *
Чему изначально равно PD0? Или дело обстоит так, сначала выставляем на PD0 единицу, а потом уже работаем с ним?

Обычно пины портов у AVR определяются в одном из хидеров, как НОМЕP этого пина:
#define PD0 0
#define PD1 1
#define PD2 2
......................
#define PD7 7
Однако во многих командах пин порта соответствует определенному биту. В таких случаях порт выглядит при программировании, как байт, а пины этого порта выглядят, как биты внутри этого байта.
Запись типа 0<<PD2, хоть и численно равна нулю, но является наглядным способом указания того, что бит в маске порта, соответствующий пину PD2, равен нулю. Такая форма записи подразумевает, что определения пинов PD0-PD7 соответствуют номеру бита в байте. А чтобы запихнуть в данное место 0 или 1, их сдвигают влево операцией сдвига << на это же число двоичных разрядов.
Сама операция такого сдвига кода не порождает, т.к. операции над числовыми константами компилятор делает "в уме", подставляя на исполнение уже готовый результат.
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Nov 17 2010, 12:00
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



В Си для задания битовых масок обычно пишут (стиль варируется)
Код
DDRD =
//(1<<PD7) |
//(1<<PD6) |
//(1<<PD5) |
//(1<<PD4) |
//(1<<PD3) |
//(1<<PD2) |
//(1<<PD1) |
(1<<PD0) |
0;

Студия не понимает такие фокусы, поэтому удобно писать
Код
DDRD =  (0<<PD7) |(0<<PD6) |(0<<PD5) |(0<<PD4) |(0<<PD3) |(0<<PD2) |(0<<PD1) |(1<<PD0);

Особенно удобно, когда конфигурируешь переферию (типа SPI или UART), где биты имеют разные имена. Например SPI для Mega88
Код
ldi    temp,(1<<SPIE)|(1<<SPE)|(0<<DORD)|(0<<MSTR)|(1<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0)

Чтобы быстро переконфигурировать не вспоминая их корявых названий: в СИ достаточно закомментирова/раскомментировать строку, при таком способе записи поменять "0" на "1" или "1" на "0".

Заголовочники для МК как лежат в C:\Program Files\AVRStudio4\AvrAssembler2\Appnotes файлы типа m8def.inc (для Mega8) и tn2313def.inc (ATtiny2313). В них можно увидеть следующее
Цитата
; ***** PORTD ************************
; PORTD - Data Register, Port D
.equ PORTD0 = 0 ;
.equ PD0 = 0 ; For compatibility
.equ PORTD1 = 1 ;
.equ PD1 = 1 ; For compatibility
.equ PORTD2 = 2 ;
.equ PD2 = 2 ; For compatibility
.equ PORTD3 = 3 ;
.equ PD3 = 3 ; For compatibility
.equ PORTD4 = 4 ;
.equ PD4 = 4 ; For compatibility
.equ PORTD5 = 5 ;
.equ PD5 = 5 ; For compatibility
.equ PORTD6 = 6 ;
.equ PD6 = 6 ; For compatibility

; DDRD
.equ DDD0 = 0 ;
.equ DDD1 = 1 ;
.equ DDD2 = 2 ;
.equ DDD3 = 3 ;
.equ DDD4 = 4 ;
.equ DDD5 = 5 ;
.equ DDD6 = 6 ;


По оформлению в своё время с коллегой "Сишником" долго дискутировал. Он также убеждал, что запись (0<<PD5) смысла не имеет и не стоит поэтому уродовать код cool.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 04:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.07584 секунд с 7
ELECTRONIX ©2004-2016