Код: Выделить всё
PIND&(1<<PD5)Код: Выделить всё
PIND&(1<<PD5)Еще раз.....FreshMan писал(а):в одной из статей нашолэто аналог вышеприведенной команды ?Код: Выделить всё
PIND&(1<<PD5)
Код: Выделить всё
PIND&(1<<PD5)Код: Выделить всё
IF (PIND & (1<<PD5))
ветка программы, если на линии порта 1;
ELSE
ветка программы, если на линии порта 0;может и инвертирует, только не на всех контроллерах.shads писал(а): Вывод в пин будет писаться так:И кстати это нормально, такая команда инвертирует соответствующий вывод порта.Код: Выделить всё
PIND |= (1<<PIND5)
Может...juzik писал(а):Как логическое ИЛИ (а =| как раз и есть логическое или) может инвертировать значение бита?
Это фича некоторых Мег...vitalik_1984 писал(а):инвертирует, только не на всех контроллерах.
Дело не в том, что логическое или может инвертировать, а в том, что запись логического 1 в PINxy приводит к инверсии PORTxy в некоторых типах Мк.juzik писал(а):Как логическое ИЛИ (а =| как раз и есть логическое или) может инвертировать значение бита?
Не только по некоторым данным еще в Tiny2313 есть.HHIMERA писал(а):
Это фича некоторых Мег...
А я чет не смог дать ума аппаратному TWI, ну работало вроде, но иногда висло, лень было разбираться, легче оказалось свою программную реализацию написать.....FreshMan писал(а):нужно подключить DS1307 к Atmega8
я так понимаю для данных целей задействуется аппаратный TWI
Код: Выделить всё
#define NOINLINE __attribute__((__noinline__))
#define IICDDR DDRC /*порт управления I2C*/
#define IICPORT PORTC /*порт вывода данных на линию I2C*/
#define IICPIN PINC /*порт ввода данных с линий I2C*/
#define IICData (1<<4) /*линия DATA*/
#define IICClc (1<<5) /*линия CLC*/
char ClockData [7] = {};//массив данных часов: секунды, минуты, часы, день, дата, месяц, год
//#######################################################################################################################
//#
//# ФУНКЦИИ РАБОТЫ С ЧАСАМИ DS1307
//#
//#######################################################################################################################
//ФУНКЦИЯ ЧТЕНИЯ БЛОКА ДАННЫХ ИЗ МИКРОСХЕМЫ ЧАСОВ DS1307
//чтение происходит в глобальный массив ClockData[7]
//последовательность данных - [0]секунды, [1]минуты, [2]часы, [3]день, [4]дата, [5]месяц, [6]год
void IICClockReadData (void)
{
IICStart();
IICByteWrite (0xD0); //запись данных в DS1307
IICByteWrite (0x00); //сбросить указатель адреса DS1307 на 0
IICStop();
IICStart();
IICByteWrite (0xD1); //команда на чтение данных
char* pClockData = &ClockData[0]; //указатель на данные часов
for (char i = 0; i<6; i++)
*pClockData++ = IICByteRead (0); //пишем, секунды, минуты, часы, день, дата, месяц (с выдачей подтверждением)
*pClockData = IICByteRead (1); //пишем год (без подтверждения)
IICStop();
}
//ФУНКЦИЯ ЗАПИСИ БЛОКА ДАННЫХ В МИКРОСХЕМУ ЧАСОВ DS1307
//запись происходит из глобального массив ClockData[7]
//последовательность данных - [0]секунды, [1]минуты, [2]часы, [3]день, [4]дата, [5]месяц, [6]год
void IICClockWriteData (void)
{
IICStart();
IICByteWrite (0xD0); //запись данных в DS1307
IICByteWrite (0x00); //сбросить указатель адреса DS1307 на 0
IICByteWrite (0); //записать секунды
IICByteWrite (ClockData [1]); //минуты
IICByteWrite (ClockData [2]); //часы
IICByteWrite (ClockData [3]); //день
IICByteWrite (ClockData [4]); //дата
IICByteWrite (ClockData [5]); //месяц
IICByteWrite (ClockData [6]); //год
IICStop();
}
//#######################################################################################################################
//#
//# ФУНКЦИИ ОБСЛУЖИВАНИЯ ИНТЕРФЕЙСА I2C (софтовый вариант)
//#
//#######################################################################################################################
//задержка 2 микросекунды для формированя временных задержек IIC
NOINLINE void Delay2Mks (void)
{
_delay_us (2);
}
//ФУНКЦИЯ ФОРМИРОВАНИЯ СОСТОЯНИЯ START ПО ИНТЕРФЕЙСУ IIC
void IICStart (void)
{
IICDDR &= ~(IICData | IICClc); //единички на обеих линиях
Delay2Mks();
IICDDR |= IICData; //подтяжка data к нулю
Delay2Mks();
IICDDR |= IICClc; //подтяжка clc к нулю
Delay2Mks();
}
//ФУНКЦИЯ ФОРМИРОВАНИЯ СОСТОЯНИЯ STOP ПО ИНТЕРФЕЙСУ IIC
void IICStop (void)
{
IICDDR |= (IICData | IICClc); //подтяжка обеих линий к нулю
Delay2Mks();
IICDDR &= ~IICClc; //отпустить data
Delay2Mks();
IICDDR &= ~IICData; //отпустить clc
Delay2Mks();
}
//ФУНКЦИЯ ЗАПИСИ БАЙТА ПО ИНТЕРФЕЙСУ IIC
//АРГУМЕНТ - байт данных для вывода по IIC
//ЗНАЧЕНИЕ - флаг подтверждения 0 (есть подтверждение) или 1 (нет подтверждения)
char IICByteWrite (char byte)
{
for (char i = 0; i<8; i++)
byte = IICBit (byte);
byte = 0x80;
return IICBit (byte); //возвращаем бит подтверждения (0-есть бит подтверждения, 1-нет)
}
//ФУНКЦИЯ ЧТЕНИЯ БАЙТА ПО ИНТЕРФЕЙСУ IIC
//АРГУМЕНТ - значение бита подтверждения (0 - есть подтверждение, 1 - нет подтверждения)
//ЗНАЧЕНИЕ - принятый байт
char IICByteRead (char bit)
{
char byte = 0xFF;
for (char i = 0; i<8; i++)
byte = IICBit (byte);
bit <<= 7;
IICBit (bit); //передать значение бита подтверждения
return byte; //возвращаем принятый байт
}
//ФУНКЦИЯ ЗАПИСИ\ЧТЕНИЯ БИТА ПО ИНТЕРФЕЙСУ IIC
//выводится значение старшего бита аргумента
//принятый бит возвращается в младшем бите предварительно сдвинутого влево аргумента
char IICBit (char byte)
{
if (byte & 0x80) //выводимый бит
IICDDR &= ~IICData; //вывод 1 на линию данных
else
IICDDR |= IICData; //вывод 0 на линию данных
Delay2Mks();
IICDDR &= ~IICClc; //старт строб импульса
while (! (IICPIN & IICClc)){} //ожидание формирования строба
Delay2Mks();
char temp;
if (IICPIN & IICData) //принимаем бит
temp = 1;
else
temp = 0;
IICDDR |= IICClc; //завершить строб
byte <<= 1;
byte |= temp;
return byte;
}
//#######################################################################################################################
//#
//# end
//#
//#######################################################################################################################
В 90% случаев - правильное решение...shads писал(а):А я чет не смог дать ума аппаратному TWI, ну работало вроде, но иногда висло, лень было разбираться, легче оказалось свою программную реализацию написать.....
Код: Выделить всё
ISR (TIMER0_OVF_vect)
{
...
}