www.mikrocontroller.net

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


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
void eeprom_init(void) {
  /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
#if defined(TWPS0)
  /* has prescaler (mega128 & newer) */
  TWSR = 0;
#endif
  TWBR = 6;
  
}

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
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?

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.nongnu.org/avr-libc/user-manual/group__...

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

Autor: Steffen (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
int eeprom_Current_Address_Read(char *buf)
{

begin:

  // send start cond.
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
  while (!(TWCR & (1 << TWINT)));
  if (TW_STATUS == TW_MT_ARB_LOST) goto begin;
  if ( (TW_STATUS != TW_REP_START) && (TW_STATUS != TW_START)) {
    return -1;
  }

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

  // start read transmission
  TWCR = (1 << TWINT) | (1 << TWEN);
  while (!(TWCR & (1 << TWINT)));
       
  switch ((twst = TW_STATUS)) {
    case TW_MR_DATA_NACK:
      // FALLTHROUGH 
    case TW_MR_DATA_ACK:
      *buf = TWDR;
      break;
    default:
      goto error;
  } 

quit:
  //stop condition
  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
  return 1;

error:
  //stop condition
  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
  return -1;
}

Autor: bernie (Gast)
Datum:

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

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

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.