Штабскапитан Овечкин
May 21 2012, 09:12
Слеплен девайс:
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, 09:26
Цитата(Штабскапитан Овечкин @ May 21 2012, 13:12)

Всё, вроде бы, понятно. Сомнение, вызывает запись в PD. Можно ли так делать?
Если целиком положить туда байт, не вмешаюсь ли я тем самым в работу UARTа?
Можно, только на RX будет дергаться pull-up постоянно. Замаскируйте эти два бита, делов-то.
demiurg_spb
May 21 2012, 10:41
Код
#define MASK ((1<<1)|(1<<0))
PORTD &= MASK; // очистим 6 бит данных
PORTD |= NEW_DATA & ~MASK; // модифицируем 6 бит данных
aaarrr
May 21 2012, 10:49
Цитата(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
May 21 2012, 10:59
Не согласен. Ибо порт волотильный и между чтением и новой записью может изменить своё состояние....
Я в сообщении #3 написал верно (пока вы меня цитировали я ещё был в творческом поиске).
aaarrr
May 21 2012, 11:07
Цитата(demiurg_spb @ May 21 2012, 14:59)

Не согласен. Ибо порт волотильный и между чтением и новой записью может изменить своё состояние....
Я в сообщении #3 написал верно (пока вы меня цитировали я ещё был в творческом поиске).
"PORTD |= ..." - это как бы уже не атомарный доступ, если что.
demiurg_spb
May 21 2012, 11:16
Точно! Забывать стал AVRы

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

тогда остаётся побитово модифицировать порт...
Да зачем? Из этих двух бит один игнорируется, а второй коммутирует pull-up на RX.
Нет ни малейшего смысла хранить их значения:
PORTD = DATA & ~MASK;
demiurg_spb
May 21 2012, 19:16
Возможно.
Нам ведь не известна ни схемотехника сего девайса ни логика его работы.
Я бы не дёргал уровнями лишний раз.