На портах висят датчики температуры DS18S20 у ATmega640. Код в IAR AVR.
Если работать с битами портов по варианту 1, где операция сдвига
осуществляется при выполнении операции, то с выводов мы всегда считываем 0xFF.
Если работать по варианту 2, где переменной pin сразу присваивается сдвинутый
номер вывода, и внутри подпрограмм сдвига в операциях над портами нет, то
всё замечательно работает со всеми датчиками температуры. Ещё одна особенность
в варианте 1, если на любом порте работаем с датчиком на PIN0, то они нормально
опрашиваются. В симуляторе багов не заметил, и он показывает что нормально управляет
ножками портов как в варианте 1 так и 2.
Вариант 1:
Код
ptr_dport = (uchar*)&DDRD;
ptr_pin = (uchar*)&PIND;
pin = PD1;
*ptr_dport |= (1<<pin); //0 на линии
*ptr_dport &= ~(1<<pin);//1 на линии
Вариант 2:
Код
ptr_dport = (uchar*)&DDRD;
ptr_pin = (uchar*)&PIND;
pin = 1<<PD1;
*ptr_dport |= pin; //0 на линии
*ptr_dport &= ~pin; //1 на линии