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

I2C Atmega16 i AT24C04 w C – konfiguracja SCL/SDA, adresowanie, zapis TWDR

greg84 13 Wrz 2007 21:29 1230 7
REKLAMA
  • #1 4280759
    greg84
    Poziom 15  
    Posty: 193
    Ocena: 1
    Czesc

    Proboje zrealizowac trasmisje miedzy Atmega16 a EEPROM at24C04, mam kilka watpliwosci:
    a) jak ustawic porty SCL i SDA jezeli mam je zewnetrzenie podciagniete przez rezystory do VCC? Ja ustawilem DDRC=(0<<DDC0)|(0<<DDC1)
    oraz PORTC=(1<<PD0)|(1<<PD1)
    b) jezeli ostatni bit adresu harwarowego tego EEPROMa jest bitem A8 adresu slowa to jaka wartosc mu nadac?
    c) jak zapisac adres komorki pamieci w eepromie gdzie maja byc przeslane dane, TWDR=..?

    Prosze o podpowiedz
  • REKLAMA
  • #2 4280885
    Samuraj
    Poziom 35  
    Posty: 2792
    Pomógł: 286
    Ocena: 615
    ad a) Wszystko ustawione prawidłowo piny jako wyjście + podciągnięcie do +
    ad b) Adresy możesz ustawiać nóżkami A0 do A2 EEpromu
    W przypadku podpięcia wszystkich do masy adres odczytu to A0 a zapisu to A1.
    ad c) Nie do EEpromu tylko do rejestru TWDR ale przedtem trzeba ustawić odpowiednie bity (TWINT i TWEN) w rejestrze TWCR.

    Np tak:
    
    void i2c_init(void) 
    { 
    	TWBR = 0x01;//0x04;                  
    } 
    
    void i2c_start(void)
    {
    	TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    	while (!(TWCR & (1<<TWINT))); 
    }
    
    void i2c_write(unsigned char data ) 
    {    
    	TWDR = data; 
    	TWCR = (1<<TWINT) | (1<<TWEN); 
    	while (!(TWCR & (1<<TWINT))); 
    }
    
    unsigned char i2c_read(void) 
    {
    	TWCR = (1<<TWINT) | (1<<TWEN);
     	while (!(TWCR & (1<<TWINT)))
    	return TWDR; 
    }
    
    void i2c_stop(void) 
    { 
    	TWCR= (1<<TWINT) | (0<<TWEN) | (1<<TWSTO); 
    	while (!(TWCR & (1<<TWSTO))); 
    }
    


    A korzystasz z tego tak:
    Zapis
    	i2c_start();
    	i2c_write(0xA0);
    	i2c_write(addr);
    	i2c_write(data);
    	i2c_stop();
    
    

    Odczyt
    
    	i2c_start();
    	i2c_write(0xA0);
    	i2c_write(addr);
    	i2c_start();
    	i2c_write(0xA1);
    	dane=i2c_read();
    	i2c_stop();
    
  • REKLAMA
  • REKLAMA
  • #5 4282568
    Ch.M.
    Poziom 27  
    Posty: 1009
    Pomógł: 62
    Ocena: 15
    Taki zapis w zasadzie obywa się bez komentarza, ob jest przejrzysty, ale ilość cykli maszynowych potrzebnych do niego jest spora. Mogą później wyniknąć jeszcze inne problemy, także trzeba być świadomym działania danej funkcji
  • #6 4282968
    mxmxmxmxmx
    Poziom 16  
    Posty: 318
    Pomógł: 8
    Ocena: 12
    Mad Bekon napisał:
    Przesunięcie bitowe jedynki w lewo o PD1 miejsc.
    A PD1 = 1 czyli :
    0 0 0 0 0 0 0 1 << 1 =
    0 0 0 0 0 0 1 0


    Tylko dlaczego do ustawiania PORTC używać PD?

    Ch.M. napisał:
    Taki zapis w zasadzie obywa się bez komentarza, ob jest przejrzysty, ale ilość cykli maszynowych potrzebnych do niego jest spora. Mogą później wyniknąć jeszcze inne problemy, także trzeba być świadomym działania danej funkcji


    Nie mam nic przeciwko takiemu zapisowi, jezeli jest poprawny, co więcej przy włączonej optymalizacji przesunięcia i | wykona kompilator i nie będzie męczył tym uC.
  • REKLAMA
  • #7 4289873
    greg84
    Poziom 15  
    Posty: 193
    Ocena: 1
    probuje teraz napisac prosty program, ktory najpierw przesyla bajt do tej zewnetrzej pamieci EEPROM at24C04 a potem chce odczytac ten bajt i wyswietlic na na 7seg - jest to litera H. Nie wyswietla nic, co tu moze byc nie tak? adres hardwarowy zapisu/odczyty kosci pamieci jest raczej ok, bo 1010-A2A1A0-0/1 gdzie A2=VCC A1=VCC A0=GND czyli to powinno byc 1010-110-0/1. Moze cos z procedurami zapisu i odczytu? szczegolnie mam watpliwosci w ktorym momencie moge juz odczytac pobrany bajt z TWDR.
    Załączniki:
    • seep1.c (2.4 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 4291379
    Ch.M.
    Poziom 27  
    Posty: 1009
    Pomógł: 62
    Ocena: 15
    Nie znam sie na C, zadam proste pytanie: ile czasu po wysłaniu komendy zapisz, wysyłasz komende odczyt?
    Magistrala i2c ma pewne ograniczenia, miedzy innymi czas od komendy Stop do komendy Start. Wymagane opoznienie to wg dokumentacji ATMELA i np Philipsa to 4,7us, i uwierz mi, że jeśli go zaniedbasz to w TWI CONTROL REGISTER wystąpi TWWC - flaga kolizji zapisu (program utknie jesli nie przewidziałeś obsługi błędów)

    Edit:
    Z tego co widze to masz Deley 3000, nie wiem ile to w przeliczeniu na mikorsekundy, ale jak wyzej musisz odczekac te 5us dla swietego spokoju. Inna sprawa to pullupy... u mnie wszystko działa na 1kOhm, na 4,7kOhm u niektórych nie chciało działać.

Podsumowanie tematu

✨ Dyskusja dotyczy konfiguracji i komunikacji I2C między mikrokontrolerem Atmega16 a pamięcią EEPROM AT24C04 w języku C. Poruszono kwestie ustawienia portów SCL i SDA przy zewnętrznych rezystorach podciągających do VCC, gdzie prawidłowo należy ustawić piny jako wejścia (DDR=0) i ustawić porty z podciągnięciem (PORT=1). Omówiono adresowanie EEPROM, gdzie ostatni bit adresu sprzętowego odpowiada bitowi A8 adresu słowa, a adresy A0-A2 są ustalane przez nóżki podłączone do masy lub VCC, co wpływa na adres odczytu i zapisu (np. 1010-110-0/1). Wyjaśniono, że zapis adresu komórki pamięci odbywa się przez rejestr TWDR, ale przed tym należy ustawić odpowiednie bity w rejestrze TWCR (TWINT, TWEN). Przedstawiono przykładowe funkcje inicjalizacji i obsługi I2C (i2c_init, i2c_start, i2c_write, i2c_read) z wykorzystaniem rejestrów TWI. Zwrócono uwagę na poprawność przesunięć bitowych i użycie odpowiednich nazw bitów (PD vs DDC). Podkreślono konieczność zachowania minimalnego opóźnienia (ok. 4,7 µs) między komendami Stop i Start na magistrali I2C, aby uniknąć błędów zapisu (flaga TWWC). Wskazano, że rezystory podciągające o wartości 1 kΩ działają stabilniej niż 4,7 kΩ w tym układzie. Autor zgłaszał problem z odczytem i wyświetlaniem danych na wyświetlaczu 7-segmentowym, co może wynikać z błędów w procedurach odczytu lub niewłaściwego momentu odczytu rejestru TWDR.
Wygenerowane przez model językowy.
REKLAMA