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

 
 
 
Reply to this topicStart new topic
> Atvega8 помогите разобраться с портами.
Штабскапитан Ове...
сообщение May 21 2012, 09:12
Сообщение #1


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

Группа: Участник
Сообщений: 103
Регистрация: 29-08-07
Пользователь №: 30 122



Слеплен девайс:
1. Собственно, сабжевая атмега
2. Параллельный 16-битовый ЦАП.
3. Дынные для ЦАПа грузятся через UART атмеги.
Старший байт данных распаян на PB, младшие же из-за пункта 3 пришлось раскидывать на 2 порта: все биты, кроме 0 и 1 - на соответствующие биты PD, бит 0 на PC0, бит 1 на PC1. Защёлка данных ЦАПа - на PC2. С о старшим байтом всё понятно - его выкидываю в PB. Младший байт планирую передавать так: пишу целиком его в PD, поднимаю отдельно PC0 и PC1. Защёлкиваю всё это безобразьё, цмыкнув битом PC2.
Всё, вроде бы, понятно. Сомнение, вызывает запись в PD. Можно ли так делать?
Если целиком положить туда байт, не вмешаюсь ли я тем самым в работу UARTа?
А, если это нельзя, то можно ли как-то обойти, замаскировать биты PB0 и PB1 при записи байта в PB?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 21 2012, 09:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Штабскапитан Овечкин @ May 21 2012, 13:12) *
Всё, вроде бы, понятно. Сомнение, вызывает запись в PD. Можно ли так делать?
Если целиком положить туда байт, не вмешаюсь ли я тем самым в работу UARTа?

Можно, только на RX будет дергаться pull-up постоянно. Замаскируйте эти два бита, делов-то.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 21 2012, 10:41
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Код
#define MASK ((1<<1)|(1<<0))

PORTD &= MASK;                      // очистим 6 бит данных
PORTD |= NEW_DATA & ~MASK; // модифицируем 6 бит данных


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 21 2012, 10:49
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(demiurg_spb @ May 21 2012, 14:41) *
#define MASK ((1<<1)|(1<<0))

PORTD |= PORTD & ~MASK | NEW_DATA;

???

PORTD = (NEW_DATA & ~MASK) | (PORTD & MASK);

Если уж так хочется именно сохранить значение младших бит.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 21 2012, 10:59
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Не согласен. Ибо порт волотильный и между чтением и новой записью может изменить своё состояние....
Я в сообщении #3 написал верно (пока вы меня цитировали я ещё был в творческом поиске).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 21 2012, 11:07
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(demiurg_spb @ May 21 2012, 14:59) *
Не согласен. Ибо порт волотильный и между чтением и новой записью может изменить своё состояние....
Я в сообщении #3 написал верно (пока вы меня цитировали я ещё был в творческом поиске).

"PORTD |= ..." - это как бы уже не атомарный доступ, если что.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 21 2012, 11:16
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Точно! Забывать стал AVRыsad.gif
тогда остаётся побитово модифицировать порт...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 21 2012, 11:59
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(demiurg_spb @ May 21 2012, 15:16) *
тогда остаётся побитово модифицировать порт...

Да зачем? Из этих двух бит один игнорируется, а второй коммутирует pull-up на RX.
Нет ни малейшего смысла хранить их значения:

PORTD = DATA & ~MASK;
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 21 2012, 19:16
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Возможно.
Нам ведь не известна ни схемотехника сего девайса ни логика его работы.
Я бы не дёргал уровнями лишний раз.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:11
Рейтинг@Mail.ru


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