ATMega8 mit AT24C64 EEPROM erweitern?

Gast #1903545
Lesenswert?

super vielen dank.

Nun habe ich noch eine Frage zu der TWI Clock und Bit Rate.

Wo kann ich feststellen wie ich Prescaler und Bitrate setze?
lt den Infos aus dem Netz sollte die Bitrate beim Mega8 11 - 255 sein.
Nach was richtet sich der Prescaler?

In dem Beispiel ist Prescaler 0 und Bitrate 6
1
void eeprom_init(void) {
2
  /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
3
#if defined(TWPS0)
4
  /* has prescaler (mega128 & newer) */
5
  TWSR = 0;
6
#endif
7
  TWBR = 6;
8
  
9
}
Gast #1903617
Lesenswert?

Hallo Steffen,
ich gehe mal davon aus das Du einen anderen Quarz einsetzen willst und 
den neuen Wert für TWBR suchst oder?
Im Datenblatt des ATMega8 auf Seite 170 gibt es die Formel dafür.
Wenn ich mich nicht verrechnet habe ist die TWI Taktfrequenz bei 
2457600Hz Quarz und TWBR=6 87,771kHz. Bei 8MHz Quarz und  TWBR=32 wäre 
der TWI-Takt genau 100kHz.

Berichtigt mich wenn ich falsch liege...

...
hp-freund
Gast #1903640
Lesenswert?

Hallo hp-freund,

naja mir sind die Werte für TWSR und TWBR nicht klar. Woher nehme ich 
die Bitrate? lege ich die selber fest?

Wenn ich in der Formel mit 8Mhz rechne und einer TWSR von 1 und TWBR von 
32 komme ich auf 29kHz

hm irgendwie stell ich mich hier doof an oder hab einen Denkfehler :-(

Danke & Gruß
Gast #1903677
Lesenswert?

Wenn ich TWSR=1 nehme komme ich auch auf 29,411kHz. Im Beispiel ist 
TWSR=0 dann sind es 100kHz.
TWSR=0 bedeutet Vorteiler=1 also ohne. Im Beispiel ist TWPS=TWSR=0.
In der Formel wird (4 hoch TWPS(=0)) also 4hoch0=1 verwendet.
Gast #1903716
Lesenswert?

hey danke :-) ja das ist mein Gedankenfehler gewesen :-) Hatte mir ne 
Excel Tabelle gemacht und da einen Fehler in der Potenzrechnung :-)

Nun habe ich das verstanden. :-)

Nun hab ich nur noch eine Frage zu dem EEPROM.
1
eeprom_write_byte(10, buffer);

Das erste ist die Adresse. Das zweiter der Wert der gespeichert wird 
oder?
Wie kann ich es machen das ich die die nächste Freie Adresse finde? Geht 
das nur über eine Schleife oder kann ich das aus dem EEPROM direkt 
abfragen?
Gast #1908054
Lesenswert?

hello,

ich muss diesen Thread noch mal auf machen :-) lt Datenblatt kann man 
doch die aktuelle Adresse auslesen. Das hab ich auch so versucht, 
bekomme aber nichts zurück. Wo habe ich den fehler gemacht? Hier der 
Code:
1
int eeprom_Current_Address_Read(char *buf)
2
{
3

4
begin:
5

6
  // send start cond.
7
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
8
  while (!(TWCR & (1 << TWINT)));
9
  if (TW_STATUS == TW_MT_ARB_LOST) goto begin;
10
  if ( (TW_STATUS != TW_REP_START) && (TW_STATUS != TW_START)) {
11
    return -1;
12
  }
13

14
  // send 0xa1
15
  // 0xa0 = 1010 000 1
16
  // 4 bits:   <a..device-indentifier>
17
  // 3 bits:   <device-address set with chip pins>
18
  // last bit: <1..read>
19
  TWDR = 0xa1;
20
  TWCR = (1 << TWINT) | (1 << TWEN);
21
  while (!(TWCR & (1 << TWINT)));
22
  if (TW_STATUS == TW_MR_SLA_NACK) goto quit;
23
  if (TW_STATUS == TW_MR_ARB_LOST) goto begin;
24
  if (TW_STATUS != TW_MR_SLA_ACK) goto error;
25

26
  // start read transmission
27
  TWCR = (1 << TWINT) | (1 << TWEN);
28
  while (!(TWCR & (1 << TWINT)));
29
       
30
  switch ((twst = TW_STATUS)) {
31
    case TW_MR_DATA_NACK:
32
      // FALLTHROUGH 
33
    case TW_MR_DATA_ACK:
34
      *buf = TWDR;
35
      break;
36
    default:
37
      goto error;
38
  } 
39

40
quit:
41
  //stop condition
42
  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
43
  return 1;
44

45
error:
46
  //stop condition
47
  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
48
  return -1;
49
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren