Witam po zmianie procka nie mogę się skomunikować z ADS110 ,kod wcześniej działał z Atmega32.
Obecnie używam Atmega644P wg schematu
Link
niestety program zatrzymuje się w przy :
Poniżej cały kod:
Obecnie używam Atmega644P wg schematu
Link
niestety program zatrzymuje się w przy :
while(!(TWCR&(1<<TWINT))){};Poniżej cały kod:
#define F_CPU 1000000L
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "ks0108.h"
#include "arial_bold_14.h"
#include "corsiva_12.h"
#include "pcf8583.c"
#include <avr/interrupt.h>
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
#define Wait() {while(!(TWCR&(1<<TWINT)));}
#define TestAck() (TWSR&0xf8)
#define SetAck() (TWCR|=(1<<TWEA))
#define SetNoAck() (TWCR&=~(1<<TWEA))
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
#define adr_r (0b10011100)
#define adr_w (0b10011111)
unsigned char I2C_start(void)
{
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR&(1<<TWINT))){};
return 1;
}
/*************?????????,??????????(ACK)******************/
unsigned char I2C_write(unsigned char data)
{
unsigned char ack=1;
unsigned char TW_MT=0x18;
TWDR=data;
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR&(1<<TWINT))){};
if((TWSR&0xF8)!=TW_MT)
ack=1;
return ack;
}
/*****************?????????,???????????(ACK)************/
unsigned char I2C_read(unsigned char ack)
{
if(ack) //ack?1,???????(ack)
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA); //ack?0,????????(nack)
else
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR&(1<<TWINT))){};
return TWDR;
}
unsigned char volt_high,volt_low,define;
unsigned int i2c_volate_Read(void)
{
unsigned int volate; //????
I2C_start(); //I2C??
I2C_write(adr_w);
//?I2C?????????
volt_high = I2C_read(1); //??ADS1100????8?
volt_low = I2C_read(1); //??ADS1100????8?
define = I2C_read(0); //??ADS1100????
Stop(); //I2C??
volate=volt_high; //??????????????
volate=(volate<<8);
volate+=volt_low;
return volate; //?????
}
void init_ADS1100(void)
{
I2C_start(); //I2C??
I2C_write(adr_r); //?I2C?????????
I2C_write(0b00001100); //??ADS1100??????????16??8???
Stop(); //I2C??
}
int main(void) {
volatile float wynik;
volatile float wynik2;
char buf[10];
int datarate;
int pga;
int vdd;
int vs;
char mini[8];
datarate=16384;
pga=2;
vdd=5;
vs=5;
// Wait a little while the display starts up
for(volatile uint16_t i=0; i<15000; i++);
// Initialize the LCD
ks0108Init(0);
// Select a font
// ks0108SelectFont(Arial_Bold_14, ks0108ReadFontData, BLACK);
ks0108SelectFont(Corsiva_12, ks0108ReadFontData, BLACK);
// Set a position
ks0108GotoXY(5,10);
// Print some text
// ks0108Puts_P(PSTR("KS0108-Treiber"));
// a nice little round rect
// ks0108DrawRoundRect(5, 5, 117, 20, 8, BLACK);
ks0108Puts_P(PSTR("Witamn"));
init_ADS1100(); //inicjalizacja
ks0108Puts_P(PSTR("ADS Initn"));
_delay_us(100);
wynik=i2c_volate_Read(); //odczytaj
ks0108Puts_P(PSTR("ADS readn"));
wynik=(float)(wynik/datarate)*5;
wynik=(float)((wynik/vs)+0.095)/0.009;
dtostrf(wynik,6,1,buf);//konwersja float to string
ks0108Puts_P(buf);
// Once again :)
// Select a font
// ks0108SelectFont(Corsiva_12, ks0108ReadFontData, BLACK);
// Set a position
// ks0108GotoXY(5,30);
// Print some text
while(1);
}