logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega644p+ADS1100 problem z komunikacją

jaca_76 08 Wrz 2010 22:05 1006 0
REKLAMA
  • #1 8490457
    jaca_76
    Poziom 12  
    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 :
        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);
    }
    
  • REKLAMA
REKLAMA