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

[ATTINY2313][C] Błąd w odczycie po I2C

mongoł2000 28 Lis 2010 23:38 1278 4
REKLAMA
  • #1 8803067
    mongoł2000
    Poziom 18  
    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;
    }
    
  • REKLAMA
  • REKLAMA
  • #3 8803166
    mongoł2000
    Poziom 18  
    raczej działający ale źle ;P na wyjściu pojawiają się liczby w dziwny sposób: 0, 255,512,65XXX....nie ma żadnego regularnego wzoru
  • REKLAMA
  • #5 8803779
    mongoł2000
    Poziom 18  
    Dostrzegłem że dostaje pierwszy bajt dobrze(zmienna tmp2), natomiast potem (tmp) dostaje ciągle 0. Teraz myśle że coś może być z odbieraniem danych źle...
REKLAMA