Forum: Compiler & IDEs I2C 24c Code Optimierung Atmega32


von flecko (Gast)


Lesenswert?

Hallo,

ich möchte ein 24C64 Eeprom mit 200-400 aufeinander folgenden Bytes 
beschreiben. Der unten stehende Code funktioniert soweit, jedoch dauert 
das Schreiben um die 2-3s aufgrund dieses Befehls _delay_ms(EWAIT); 
(5ms).
Wenn ich die Zeile weg lasse kommt es zu Fehlern. Kann ich stattdessen 
irgendwie TWINT abfragen?
Achja ich möchte nicht seitenweise beschreiben.

Viele Grüße
1
void i2c_start(void) 
2
  {
3
  TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);   
4
  while ((TWCR & _BV(TWINT)) == 0) ;       
5
  }
6
7
8
void i2c_stop(void) 
9
  {
10
  TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);          
11
  {
12
13
14
void i2c_send(uint8_t DataByte) 
15
  {
16
  TWDR = DataByte;
17
  TWCR = _BV(TWINT) | _BV(TWEN);           // clear interrupt to start transmission
18
  while ((TWCR & _BV(TWINT)) == 0) ;         // wait for transmission
19
  }
20
21
22
void EEPROM_ByteWrite(uint16_t addr, uint8_t wert) 
23
  {
24
  again:
25
    i2c_start();
26
    i2c_send(BASEADR | TW_WRITE);
27
28
    if ((TWSR & 0xF8) != 0x18)
29
      {
30
      i2c_stop();
31
      goto again;
32
      }
33
34
    i2c_send(addr>>8);              
35
    i2c_send(addr);
36
37
    i2c_send(wert);
38
    i2c_stop();
39
    _delay_ms(EWAIT);              // warten fuer 24Cxx
40
  }

von Peter D. (peda)


Lesenswert?

flecko schrieb:
> Achja ich möchte nicht seitenweise beschreiben.

Dann vergiß es.
Es wird nur mit Pagewrite schneller.


Peter

von MWS (Gast)


Lesenswert?

Nimm doch mal das i2c_stop aus der Acknowledge Polling Loop raus. Ein 
Delay sollte mit AP nicht notwendig sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.