Witam! Oto program wykorzystujący programowe I2C, jednak nie działa on poprawie bo dostaje złe dane(tak jakbym dostawał za mało bitów). Układ współpracuje z ADS1110.
#define F_CPU 4000000UL
#include <util/delay.h>
#include <avr\io.h>
#include <avr\signal.h>
#include <avr\interrupt.h>
#include <inttypes.h>
#include <avr/pgmspace.h>
#define A PB1
#define B PB2
#define C PB3
#define D PB4
#define E PB5
#define F PB0
#define G PB6
#define K PB7 //kropka
#define UART_BAUD 9600
#define UART_CONST (F_CPU/(16ul*UART_BAUD)-1)
#define I2CDir DDRD
#define I2COut PORTD
#define I2CIn PIND
//
#define SDA 6
#define SCL 5
//
#define SET_SDA I2COut |= (1 << SDA)
#define CLR_SDA I2COut &= ~(1 << SDA)
//
#define SET_SCL I2COut |= (1 << SCL)
#define CLR_SCL I2COut &= ~(1 << SCL)
//
#define SDA_OUT I2CDir |= (1 << SDA)
#define SDA_IN I2CDir &= ~(1 << SDA)
//
#define SCL_OUT I2CDir |= (1 << SCL)
#define SCL_IN I2CDir &= ~(1 << SDA)
//
#define GET_SDA (I2CIn & (1 << SDA))
//
#define ACK 0
#define NOACK 1
//
volatile char znak;
uint8_t g_WzoryCyfr[21] ;
uint8_t miejsce_przecinka =0;
uint8_t dane=0;
uint8_t wysw=1;
unsigned int liczba = 0;
volatile uint8_t Dziesiatki=0;
volatile uint8_t Jednosci=0;
volatile uint8_t Setki=0;
volatile uint8_t Czesc=0,KROPKA1,KROPKA2;
volatile uint8_t temp[10];
uint8_t k=0;
void delay(void)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
// funkcja generujaca sygnał start
void i2cstart(void)
{
SDA_OUT; //
SCL_OUT; // ustawienie linii SDA i SCL w tryb wyjściowy
SET_SDA; //
SET_SCL; // ustawienie na liniach SDA i SCL stanu wysokiego
delay(); // opóźnienie
CLR_SDA;
delay();
CLR_SCL;
}
// funkcja generujaca sygnał stop
void i2cstop(void)
{
CLR_SDA;
delay();
SET_SCL;
delay();
SET_SDA;
delay();
}
// funkcja wysyłająca bajt na szynę I2C
void i2cwrite(unsigned char x)
{
unsigned char count = 9;
do
{
CLR_SCL;
if(x & 0x80) SET_SDA; else CLR_SDA;
x <<= 1;
delay();
SET_SCL;
delay();
}while(--count);
CLR_SCL;
}
// funkcja odczytujaca bajt z szyny I2C
unsigned char i2cread(unsigned char ack)
{
unsigned char count = 8, temp = 0;
SET_SDA; SDA_IN;
do
{
delay();
SET_SCL;
delay();
temp <<= 1;
if (GET_SDA) temp++;
CLR_SCL;
} while (--count);
if(ack) SET_SDA;
delay();
SET_SCL;
delay();
CLR_SCL;
return (temp);
}
void WriteADS()
{
int AdressW=0b10011110;
int Register=0b10011111;
i2cstart();
i2cwrite(AdressW);
i2cwrite(Register);
i2cstop();
}
uint16_t ReadADS()
{
uint16_t ADS=0;
int AdressR=0b10011111;
//int Register=0;
unsigned char tmp=0,tmp2=0;
i2cstart();
i2cwrite(AdressR);
tmp2 =i2cread(ACK);
tmp = i2cread(NOACK);
// Register = i2cread(NOACK);
i2cstop();
ADS = tmp*256;
ADS = ADS+tmp2;
//ADS=ADS;
return ADS;
}
int main(void)
{
WriteADS();
for(;;)
{
_delay_ms(50);
unsigned int d,f;
// d=2048*ReadADS()/32768;
f=ReadADS();
.
.
.
.
}
return 0;
}