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

[ATMEGA16][C]Sprzętowe TWI i DS1302

dturczak 09 Kwi 2009 21:17 3574 5
REKLAMA
  • #1 6394496
    dturczak
    Poziom 19  
    postanowilem odkurzyc uklad i sprobowac na sprzetowym i2c (twi)
    ktos pomoze mnie naprowadzic ? (atmega16)


    
    #define ACK 1
    #define NOACK 0
    #define CE PD2 
    
    // procedura transmisji sygnału START
    void twistart(void)
    {
    TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT)));
    }
    
    // procedura transmisji sygnału STOP
    void twistop(void)
    {
    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
    while ((TWCR & (1<<TWSTO)));
    }
    
    // procedura transmisji bajtu danych
    void twiwrite(char data)
    {
    TWDR = data;
    TWCR = (1<<TWINT) | (1<<TWEN);
    while (!(TWCR & (1<<TWINT)));
    }
    
    //procedura odczytu bajtu danych
    char twiread(char ack)
    {
    TWCR = ack 
    ? ((1 << TWINT) | (1 << TWEN) | (1 << TWEA)) 
    : ((1 << TWINT) | (1 << TWEN)) ;
    while (!(TWCR & (1<<TWINT)));
    return TWDR;
    } 
    
    



    
    main:
    
    DDRD |= _BV(CE);
    char tmp; 
    
    
    PORTD &= ~(_BV(CE)); 
    
    PORTD |= _BV(CE);
    
    	twistart();
    	twiwrite(0x81); //do odczytania sekund
    	tmp = twiread(NOACK);
    	twistop();
    
    PORTD &= ~(_BV(CE)); 
    
    


    RST podpiete pod PD2 , SCLK pod PC0(SCL) ,I/O pod PC1 (SDA)
    scl i scl probowalem z rezystorami podciagajacymi 4,7 k i bez...
    uklad na starym kodzie dziala...

    Utworzyłem nowy temat, ponieważ "nie pasował do starego".
    [zumek]
  • REKLAMA
  • REKLAMA
  • #3 6395139
    dturczak
    Poziom 19  
    fakt ;)


    zaczalem korzystac z kodu kolegi "DosinskY"

    nadal nic ,start() mi przechodzi poprawnie bo nie ma bledu..
    twi_wr zwraca mi 1
    w twi_rd nie chce mi przejsc przez petle
    while (!(TWCR & (1<<TWINT)));
    co to moze oznaczac ?


    
    unsigned char twi_start(void) 
    {      
      TWCR |= 0b11100100; // wysylij warunek startu i ustaw TWEA 
      while (!(TWCR & 0b10000000)); // czekaj na TWRC.TWINT=1 
      TWCR &= 0b01011111; // TWCR.TWSTA=0 
      if (((TWSR & 0xF8) != 0x08) && ((TWSR & 0xF8) != 0x10)) 
        { 
    		USART_Transmit(0x00);
    		USART_Transmit(0x04); //blad
    		USART_Transmit('\n');
    
          return 1; // jezeli status != kod poprawnego startu to zwroc error 
        }; 
      return 0; // zwroc kod !error 
    } 
    //********************************************************* 
    // WARUNEK SOPU TWI 
    //********************************************************* 
    void twi_stop(void) 
    {    
      TWCR |= 0b10010100; // ustaw bit stopu i twint 
    } 
    //********************************************************* 
    // ZAPIS BAJTU DANYCH NA TWI 
    // funkcja zwroci 1 jezeli slave nie wystawi ACK 
    // funkcja zwroci 0 jezeli slave wystawi ACK 
    //********************************************************* 
    unsigned char twi_wr(unsigned char data_byte) 
    {      
      TWDR = data_byte; // zaladuj TWDR danymi 
      TWCR |= 0b10000000; // wyzeruj flage TWCR.TWINT 
      while (!(TWCR & 0b10000000)); // czekaj na TWRC.TWINT=1 oznaczajacy wyslanie TWRD i odebranie ACK/!ACK 
      if (((TWSR & 0xF8) != 0x18) && ((TWSR & 0xF8) != 0x28) && ((TWSR & 0xF8) != 0x40)) 
        { 
    	  	USART_Transmit(0x00);
    		USART_Transmit(0x05); //blad
    		USART_Transmit('\n');
          return 1; // jezeli status != kod odebrania ACK to zwroc error 
        }; 
      return 0; // zwroc kod !error    
    } 
    //********************************************************* 
    // ODCZYT BAJTU DANYCH Z TWI 
    // funkcja zwroci 1 jezeli afery 
    // funkcja zwroci bajt danych jezeli odbior poprawny 
    // jezeli ack=1 master reciver wystawi na szyne ack 
    // jezeli ack=0 master reciver wystawi na szyne no_ack 
    //********************************************************* 
    unsigned char twi_rd(unsigned char ack) 
    { 
      if (ack == 1) 
        { 
          TWCR |= 0b10000000; // wyzeruj flage TWCR.TWINT      
        } 
      else 
        { 
          TWCR &= 0b10111111; // wyzeruj flage TWCR.TWINT & TWCR.TWEA      
        }; 
      while (!(TWCR & 0b10000000)); // czekaj na TWRC.TWINT=1 oznaczajacy odebranie TWRD i odebranie ACK/!ACK 
      if (((TWSR & 0xF8) != 0x50) && ((TWSR & 0xF8) != 0x58)) 
        { 
    	  USART_Transmit(0x00);
    	  USART_Transmit(0x06); //blad
    	  USART_Transmit('\n');	
          return 1; // jezeli status != kod poprawnego startu to zwroc error 
        }; 
      return TWDR; // zwroc dane z i2c 
    }
    
    


    
    
    DDRB |= _BV(CE);
    twiinit();
    
    char tmp; 
    
    
    PORTB &= ~(_BV(CE)); 
    
    PORTB |= _BV(CE);
    /*
    	twistart();
    	twiwrite(0x81);
    	tmp = twiread(NOACK);
    	twistop();
    */
    twi_start(); 
    twi_wr (0x81);  
    tmp=twi_rd(0);      
    twi_stop(); 
    
    PORTB &= ~(_BV(CE)); 
    
    
  • REKLAMA
  • #4 6902334
    kul4
    Poziom 2  
    mi pomogło podciągnięcie portu
    PORTC=0xff;
  • REKLAMA
  • #6 16567108
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA