Słuchajcie mam taki problem nie mogę w języku C dojść ładu z procedurą wysyłającą bajt do pamięci 24C04. Procesor taktuje zegarem 16MHz. W Bascomie wszystko pięknie śmiga a w C nie i nie wiem dlaczego. Poniżej zamieszczam procedury pomóżcie bo już 2-gi dzień siedzę.
#include <reg51.h>
sbit dioda1 = P3^3;
sbit scl = P1^3;
sbit sda = P1^4;
#define nop() ACC++
void delayi2c(void)
{
nop();
nop();
}
void i2c_start(void) //Inicjacja magistrali Start I2C
{
sda=scl=1;
delayi2c();
sda=0;
delayi2c();
scl=0;
}
bit i2c_stop(void) //Wysłanie sekwencji Stop na I2C
{
sda=0;
delayi2c();
scl=1;
delayi2c();
sda=1;
delayi2c();
return (~sda);
}
bit i2c_send(unsigned char byte) //Wysylanie bitu na magistralę I2C
{
unsigned char bitcount=9;
bit temp;
do
{
scl=0;
sda=byte&0x80;
byte=(byte<<1)+1;
delayi2c();
scl=1;
delayi2c();
}while(--bitcount);
temp=sda;
scl=0;
return(temp);
}
void main(void)
{
dioda1=0;
i2c_start();
i2c_send(0xA0);
i2c_send(0x01);
i2c_send(0x08);
i2c_stop();
delayms(20);
if(g==0)
{
dioda1=1;
delays(6);
dioda1=0;
delays(3);
}
while(1);
}
Natomiast procedura w Bascomie jest ok
$regfile = "89C2051.dat"
$crystal = 16000000
P1 = 0
P3 = 0
Config 1wire = P3.4
Config Scl = P1.3
Config Sda = P1.4
Do
I2cstart
I2cwbyte 160
I2cwbyte 3
I2cwbyte 24
I2cstop
Waitms 10
Loop
Pomóżcie bo już analizowałem na wszystkie sposoby i nie wiem co może być, czasy ustawiałem itd
#include <reg51.h>
sbit dioda1 = P3^3;
sbit scl = P1^3;
sbit sda = P1^4;
#define nop() ACC++
void delayi2c(void)
{
nop();
nop();
}
void i2c_start(void) //Inicjacja magistrali Start I2C
{
sda=scl=1;
delayi2c();
sda=0;
delayi2c();
scl=0;
}
bit i2c_stop(void) //Wysłanie sekwencji Stop na I2C
{
sda=0;
delayi2c();
scl=1;
delayi2c();
sda=1;
delayi2c();
return (~sda);
}
bit i2c_send(unsigned char byte) //Wysylanie bitu na magistralę I2C
{
unsigned char bitcount=9;
bit temp;
do
{
scl=0;
sda=byte&0x80;
byte=(byte<<1)+1;
delayi2c();
scl=1;
delayi2c();
}while(--bitcount);
temp=sda;
scl=0;
return(temp);
}
void main(void)
{
dioda1=0;
i2c_start();
i2c_send(0xA0);
i2c_send(0x01);
i2c_send(0x08);
i2c_stop();
delayms(20);
if(g==0)
{
dioda1=1;
delays(6);
dioda1=0;
delays(3);
}
while(1);
}
Natomiast procedura w Bascomie jest ok
$regfile = "89C2051.dat"
$crystal = 16000000
P1 = 0
P3 = 0
Config 1wire = P3.4
Config Scl = P1.3
Config Sda = P1.4
Do
I2cstart
I2cwbyte 160
I2cwbyte 3
I2cwbyte 24
I2cstop
Waitms 10
Loop
Pomóżcie bo już analizowałem na wszystkie sposoby i nie wiem co może być, czasy ustawiałem itd