Napisałem program, który ma tylko sprawdzic czy do magistrali i2c jest podłączony PCF8583:program wysyła adres 10100000 i sprawdza czy PCF odpowiada na 9 bicie. Jeżeli PCF wyzeruje linię SDA ma zaświecić sie dioda na porcie D0, jezeli nie na porcie D1. zawsze zapala sie D1. Kwarc: wewnętrzny 1MHz. funkcja wait10 ma dać ok 10uS opóźnienia. Na końcu nie ma funkcji i2cstop ale i tak PCF powinien odpowiedziec. co jest nie tak w tym programie?
#include <avr\io.h>
void waitms(unsigned long t)//ms
{
unsigned long t1;
for(;t>0;t--)
{
for(t1=27;t1!=0;t1--);
}
}
void wait10()
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
int main(void)
{
DDRA = 0xff;
DDRB = 0xff;
DDRC = 0xff;
DDRD = 0xff;
PORTA = 0xff;
PORTB = 0xff;
PORTC = 0xff;
PORTD = 0xff;
waitms(100);
//start i2c
PORTB |= 1 << 6; //SDA wysoki(1)
wait10();
PORTB |= 1 << 7; //SCL wysoki(1)
wait10();
PORTB &= ~(1 << 6); //SDA niski(0)
wait10();
PORTB &= ~(1 << 7); //SCL niski(0)
wait10();
//start i2c
//wysłanie adresu 10100000
//wyslanie 1
PORTB |= 1 << 6; //SDA wysoki(1)
wait10();
PORTB |= 1 << 7; //SCL wysoki(1)
wait10();
PORTB &= ~(1 << 7); //SCL niski(0)
wait10();
//wyslanie 0
PORTB &= ~(1 << 6); //SDA niski(0)
wait10();
PORTB |= 1 << 7; //SCL wysoki(1)
wait10();
PORTB &= ~(1 << 7); //SCL niski(0)
wait10();
//wyslanie 1
PORTB |= 1 << 6; //SDA wysoki(1)
wait10();
PORTB |= 1 << 7; //SCL wysoki(1)
wait10();
PORTB &= ~(1 << 7); //SCL niski(0)
wait10();
//wyslanie 0
PORTB &= ~(1 << 6); //SDA niski(0)
wait10();
PORTB |= 1 << 7; //SCL wysoki(1)
wait10();
PORTB &= ~(1 << 7); //SCL niski(0)
wait10();
//////////////////////////////////////////////
//wyslanie 0
PORTB &= ~(1 << 6); //SDA niski(0)
wait10();
PORTB |= 1 << 7; //SCL wysoki(1)
wait10();
PORTB &= ~(1 << 7); //SCL niski(0)
wait10();
//wyslanie 0
PORTB &= ~(1 << 6); //SDA niski(0)
wait10();
PORTB |= 1 << 7; //SCL wysoki(1)
wait10();
PORTB &= ~(1 << 7); //SCL niski(0)
wait10();
//wyslanie 0
PORTB &= ~(1 << 6); //SDA niski(0)
wait10();
PORTB |= 1 << 7; //SCL wysoki(1)
wait10();
PORTB &= ~(1 << 7); //SCL niski(0)
wait10();
//wyslanie 0
PORTB &= ~(1 << 6); //SDA niski(0)
wait10();
PORTB |= 1 << 7; //SCL wysoki(1)
wait10();
PORTB &= ~(1 << 7); //SCL niski(0)
wait10();
////////////////////////////////////////////////
PORTB |= 1 << 6; //SDA wysoki(1)zwolnienie dla slave'a
wait10();
PORTB |= 1 << 7; //SCL wysoki(1)
wait10();
if(bit_is_clear(PINB,PB6)) //czytaj clear(0)
{
PORTD &= ~(1 << 0);//jezeli jest odp zaswiec PD0
}
else
{
PORTD &= ~(1 << 1);//jezeli nie ma zaswiec PD1
}
PORTB &= ~(1 << 7); //SCL niski(0)
wait10();
for(;;)
{
}
return 0;
}