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

[C] Przy większym kwarcu nie działa EEPROM

aqq 01 Lip 2009 14:44 1386 5
REKLAMA
  • #1 6726088
    aqq
    Poziom 11  
    Siemanko, mam problem z zapisem i odczytem danych z eepromu. Mam Atmegę168 taktowaną kwarcem 16MHz i mam w niej funkcje zapisu do zewnętrznego eepromu 24C64. Jednak program dochodzi tylko do momentu wysyłania 0xA0 i koniec... cisza. Gdy zmieniałem kwarc na 4Mhz Zapis i odczyt ładnie się wykonał.

    
    // procedura transmisji sygnału START
    void TWI_start(void)
    {
    TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT)));
    }
    
    // procedura transmisji sygnału STOP
    void TWI_stop(void)
    {
    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
    while ((TWCR & (1<<TWSTO)));
    }
    
    // procedura transmisji bajtu danych
    void TWI_write(char data)
    {
    TWDR = data;
    TWCR = (1<<TWINT) | (1<<TWEN);
    while (!(TWCR & (1<<TWINT)));
    }
    
    //procedura odczytu bajtu danych
    unsigned char TWI_read(unsigned char ack)
    {
    TWCR = (1<<TWINT) | (ack<<TWEA) | (1<<TWEN);
    while (!(TWCR & (1<<TWINT)));
    return TWDR;
    }
    
    void EEPROM_Write(int adres, unsigned char dane)
    {
    
    	TWI_start();
    	TWI_write(0xA0); 
    	TWI_write((adres & 0xFF00) >> 8); 
    	TWI_write(adres & 0x00FF); 
    	TWI_write(dane); 
    	TWI_stop(); 
    	_delay_ms(15); 
    
    }
    
    unsigned char EEPROM_Read(int adres)
    {
    	
    	unsigned char odczyt; 
    	TWI_start(); 
    	TWI_write(0xA0); 
    	TWI_write((adres & 0xFF00) >> 8); 
    	TWI_write(adres & 0x00FF); 
    	TWI_start();
    	TWI_write(0xA1); 
    
    	odczyt = TWI_read(0);
    	TWI_stop(); 
    	
    	return odczyt;
    }
  • REKLAMA
  • #2 6726363
    piti___
    Poziom 23  
    Pewnie za szybko wysyłasz dane przez I2C przy kwarcu 16MHz i eeprom nie jest wstanie ich odebrać.
  • REKLAMA
  • #3 6726445
    mad81
    Poziom 12  
    Witam
    EEprom zazwyczaj działają do 1Mhz więc, musisz dać inne czasy oczekiwania dla większego kwarcu ;]
  • REKLAMA
  • #4 6727671
    aqq
    Poziom 11  
    Okzało się ze w funkcji TWI_start() zapomniałem o wpisanie początkowej wartości do TWBR :) teraz śmiga tak, że szok :D. Dzięki za pomoc :)
  • REKLAMA
  • #5 7282701
    hessuss
    Poziom 13  
    jak ja to kocham ... "rozwiązałem problem i powiem wam zę go rozwiązałem" ...a może by tak kilka informacji co i jak dla potomnych? właśnie męczę ten sam problem, załatwiłem to dużą ilością delejów po TWI_stop(); ale widzę że nie tędy droga.
  • #6 7282920
    Konto nie istnieje
    Poziom 1  
REKLAMA