Вот эту функцию он выполняет не верно. Возвращаемое значение функции (байт) сдвинуто на 1 влево. В принципе есть определенные догадки, как рассуждает оптимизатор при оптимизации, но по другому нельзя, интерфейс требует установить линию данных в Hi-Z состояние, т.е. судя по логике оптимизатора можно просто спалить линию микроконтроллера и/или ведомой микросхемы (в моем случае это RTC DS1305 3-Wire). Но! При установке оптимизации уровня 1 все работает как задумано (в чем, собственно, я и не сомневался).
Функцию привожу:
Цитата
uint8_t rtc_read_byte(uint8_t address)
{
uint8_t i; // промежуточный счетчик бит
uint8_t buffer; // промежуточный буффер данных
uint8_t rtc_data; // данные
rtc_data=0x0; // запись данных
PORTD=PORTD | (1<<CS); // выбор периферийного устройства
for(i=0; i<8; ++i)
{
buffer=address; // копирование данных
buffer=buffer & 0x1; // выделение младшего бита
if (buffer==0x1)
{
PORTD=PORTD | (1<<DATA); // установка DATA
}
else
{
PORTD=PORTD & (~(1<<DATA)); // сброс DATA
}
PORTD=PORTD | (1<<CLK); // установка CLK
if (i<7)
{
PORTD=PORTD & (~(1<<CLK)); // сброс CLK
}
address=address>>1; // сдвиг вправо
}
PORTD=PORTD & (~(1<<DATA)); // настройка подтягивающего резистора линии DATA порта D
DDRD=DDRD & (~(1<<DATA)); // настройка линии DATA порта D
for(i=0; i<8; ++i)
{
PORTD=PORTD & (~(1<<CLK)); // сброс CLK
buffer=PIND & (1<<DATA); // чтение данных
if (buffer!=0)
{
rtc_data=rtc_data | (1<<i); // установка бита
}
PORTD=PORTD | (1<<CLK); // установка CLK
}
PORTD=PORTD & (~(1<<CS)); // сброс CS
DDRD=DDRD | (1<<DATA); // настройка линии DATA порта D
PORTD=PORTD & (~((1<<DATA) | (1<<CLK) | (1<<CS))); // сброс DATA, CLK, CS
return rtc_data; // выход из функции
}
{
uint8_t i; // промежуточный счетчик бит
uint8_t buffer; // промежуточный буффер данных
uint8_t rtc_data; // данные
rtc_data=0x0; // запись данных
PORTD=PORTD | (1<<CS); // выбор периферийного устройства
for(i=0; i<8; ++i)
{
buffer=address; // копирование данных
buffer=buffer & 0x1; // выделение младшего бита
if (buffer==0x1)
{
PORTD=PORTD | (1<<DATA); // установка DATA
}
else
{
PORTD=PORTD & (~(1<<DATA)); // сброс DATA
}
PORTD=PORTD | (1<<CLK); // установка CLK
if (i<7)
{
PORTD=PORTD & (~(1<<CLK)); // сброс CLK
}
address=address>>1; // сдвиг вправо
}
PORTD=PORTD & (~(1<<DATA)); // настройка подтягивающего резистора линии DATA порта D
DDRD=DDRD & (~(1<<DATA)); // настройка линии DATA порта D
for(i=0; i<8; ++i)
{
PORTD=PORTD & (~(1<<CLK)); // сброс CLK
buffer=PIND & (1<<DATA); // чтение данных
if (buffer!=0)
{
rtc_data=rtc_data | (1<<i); // установка бита
}
PORTD=PORTD | (1<<CLK); // установка CLK
}
PORTD=PORTD & (~(1<<CS)); // сброс CS
DDRD=DDRD | (1<<DATA); // настройка линии DATA порта D
PORTD=PORTD & (~((1<<DATA) | (1<<CLK) | (1<<CS))); // сброс DATA, CLK, CS
return rtc_data; // выход из функции
}