Цитата(wangan @ May 14 2006, 15:09)

2.Про volatile непонял, какое поведение будет если будет невыполнено это требование,
помойму начинаю догадываться: наверно это чтоб программа не прерывала выполнение если возникнет прерывание в момент модификации этой переменной. Идея такая или иная?
Нет, не совсем верно. Запретом прерывания компилятор заниматься не будет. Тип volatile для глобальной переменной указывает компилятору, что переменная может измениться в любой момент времени. Поэтому копилятор не будет оптимизировать команды с ее "участием".
Типичный пример.
Код
//переменная Clock инкрементируется в таймерном прерывании
unsigned Clock;
void main (void)
{
...
while(Clock<45); // здесь компилятор посчитает, что раз в цикле ожидания
//переменная Clock не изменяется, то данное условие
// не будет выполнено никогда и скомпилирует как JMP сам на себя
// программа здесь зациклится
...
}
Если же указать тип переменной как
Код
volatile unsigned Clock;
то компилятор все "поймет" адекватно и оптимизировать данную команду не будет
Цитата(wangan @ May 14 2006, 15:09)

3.Наверно вы не поняли мой код, идея и задача такова: что на порту висят устройства 1-wire и часть порта используется для открытых стоков а часть как обычные цифровые вх/вых. и существует необходимость одновременного записи /чтения/
MASK_PORT_P2 это маска единиц которая определяет какие порты разрешены в установку типа открытый сток, а S_temp2 это данные собственно которые касаются открытого стока.
Думаю, что я понял. Я лишь указал вам что для организации выхода типа "открытый сток" достаточно PxOUT сбросить, а для управления выходом работать с регисторм PxDIR.