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

ATMEGA32 i EEPROM AT24C04 I2C - brak ACK, odczyt 255 zamiast 123

WielkiElektron 28 Gru 2010 18:49 1388 1
REKLAMA
  • #1 8925291
    WielkiElektron
    Poziom 10  
    Posty: 6
    Ocena: 3
    Dzień dobry,

    Prosze o pomoc w wyjasnieniu w czym tkwi bląd.
    Napisałem prosty program w c do ATMEGA32, ktory powinien najpierw zapisac, a nastepnie odczytac wartosc 123 z adresu 2 w eeprom AT24C04 (po I2C). Niestety za kazdym razem wartosc odczytana wynosi 255, a zmienna status ma wartosc 32 (brak ACK). Wyprowadzenia A0, A1 i A2 sa podpiete do GND. Mikrokontroler jest taktowany 1Mhz (wewn. gen. RC). Rezystory podciagające linie SDA i SCL mają wartość 10k. Eeprom jest sprawny, poniewaz sprawdzilem dla kilku układów.

    Kod:

    
    #define F_CPU 1000000UL  // 1 MHz
    #include <avr/io.h>
    #include <stdio.h>
    #include <util/delay.h>
    #include <string.h>
    #include <util/twi.h>
    
    // START
    void twistart(void)
    {
    	TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    	while (!(TWCR & (1<<TWINT)));
    }
    
    // STOP
    void twistop(void)
    {
    	TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
    	while ((TWCR & (1<<TWSTO)));
    }
    
    // transmisja bajtu danych
    void twiwrite(unsigned char data)
    {
    	TWDR = data;
    	TWCR = (1<<TWINT) | (1<<TWEN);
    	while (!(TWCR & (1<<TWINT)));
    }
    
    //odczyt bajtu danych
    int twiread(int ack)
    {
    	TWCR = ack ? 
    	((1 << TWINT) | (1 << TWEN) | (1 << TWEA))
    	: 
    	((1 << TWINT) | (1 << TWEN)) ;
    	while (!(TWCR & (1<<TWINT)));
    	return TWDR;
    }
    
    int main (void)
    {
    int j = 0;	
    TWBR = 255;
    
    //zapis do eeprom
    twistart();
    twiwrite(0b1010000);
    int status = (TWSR & 0xF8); 
    twiwrite(2);		//adres  	
    twiwrite(123); 	//wartosc	  
    twistop();		
    _delay_ms(200);
    
    //odczyt z eeprom uprzednio zapisanej wartosci
    twistart();
    twiwrite(0b10100000);  
    twiwrite(2);
    twistart();
    twiwrite(0b10100001);  
    j = twiread(0);		//O - NOACK
    twistop();
    
    //... dalej wyswietlam j na LCD 2x16
    
    
  • REKLAMA
  • #2 8934300
    WielkiElektron
    Poziom 10  
    Posty: 6
    Ocena: 3
    Przyczyną był brak jednej cyfry w argumencie twiwrite, po ktorym sprawdzalem status. Zmienilem i dziala.
REKLAMA