Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atvega8 помогите разобраться с портами.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Штабскапитан Овечкин
Слеплен девайс:
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?
aaarrr
Цитата(Штабскапитан Овечкин @ May 21 2012, 13:12) *
Всё, вроде бы, понятно. Сомнение, вызывает запись в PD. Можно ли так делать?
Если целиком положить туда байт, не вмешаюсь ли я тем самым в работу UARTа?

Можно, только на RX будет дергаться pull-up постоянно. Замаскируйте эти два бита, делов-то.
demiurg_spb
Код
#define MASK ((1<<1)|(1<<0))

PORTD &= MASK;                      // очистим 6 бит данных
PORTD |= NEW_DATA & ~MASK; // модифицируем 6 бит данных
aaarrr
Цитата(demiurg_spb @ May 21 2012, 14:41) *
#define MASK ((1<<1)|(1<<0))

PORTD |= PORTD & ~MASK | NEW_DATA;

???

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

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

"PORTD |= ..." - это как бы уже не атомарный доступ, если что.
demiurg_spb
Точно! Забывать стал AVRыsad.gif
тогда остаётся побитово модифицировать порт...
aaarrr
Цитата(demiurg_spb @ May 21 2012, 15:16) *
тогда остаётся побитово модифицировать порт...

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

PORTD = DATA & ~MASK;
demiurg_spb
Возможно.
Нам ведь не известна ни схемотехника сего девайса ни логика его работы.
Я бы не дёргал уровнями лишний раз.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.