Forum: Mikrocontroller und Digitale Elektronik ATMega8 mit AT24C64 EEPROM erweitern?


von Steffen (Gast)


Lesenswert?

Hallo,

ich möchte ADC Daten aufzeichnen und haben mehrere AT24C64 EEPROMS in 
der Bastelkiste gefunden. Kann ich diese an eine ATMega8 anschließen? 
Wenn ja, hat jemande eine Beispielschaltung und wie muss ich diesen 
EEPROM im C ansprechen?

mfg

von hp-freund (Gast)


Lesenswert?


von Steffen (Gast)


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
}

von hp-freund (Gast)


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

von Steffen (Gast)


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ß

von hp-freund (Gast)


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.

von Steffen (Gast)


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?

von hp-freund (Gast)


Lesenswert?

http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html

Was ist die nächste freie Adresse? 0xFF? Und wenn der Messwert 0xFF ist?
Ich würde einen Index im RAM halten, der beim herunterfahren an einer 
festen Position mit in den EEPROM geschrieben und beim Start wieder 
eingelesen wird.

...
hp-freund

von Steffen (Gast)


Lesenswert?

ja ok, das leuchtet mit ein :-)
vielen Dank und schönen Abend.

von Steffen (Gast)


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
}

von bernie (Gast)


Lesenswert?

hp-freund schrieb:
> http://www.captain.at/electronic-atmega-eeprom.php

hallo,
weiß jemand, wohin der link verschwunden ist? (geht bei mir nicht)

von hp-freund (Gast)


Lesenswert?


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.