PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serielles EEPROM ST24C16 an Mega8 anschließen



Thomas E.
05.03.2012, 19:45
Hallo!


Ich möchte ein serielles EEPROM vom Typ St24C16 an einen AtMega8 anschließen und unter Bascom ansprechen. Bis jetzte wurde ich allerdings aus dem Datenblatt noch nicht ganz schlau, wie ich richtig vorgehe. Das IC besitzt neben den typischen I2C Pins SCL und SDA auch noch PRE, PB0, PB1 und MODE/WC*.

Hier der Link zum Datenblatt:
http://www.datasheetcatalog.org/datasheets2/12/129921_1.pdf

Vielen Dank für eure Hilfe!

Searcher
06.03.2012, 08:39
Hallo,
will ich mal anfangen, wie ich das Datenblatt hinsichtlich der IC-Anschlüsse verstehe.

Du hast ein ST24C16, der es ermöglicht einen bestimmten Speicherbereich gegen Überschreiben zu schützen. HW mäßig sind die PINs PB0, PB1 und PRE dafür wichtig. Wenn der Schreibschutz nicht genutzt wird, einfach den PRE auf low (GND) legen, damit ist das Feature inaktiv und der gesamte Speicher kann ohne Einschränkung genutzt werden.


Remark: The Write Protection is active if and only if the PRE input pin is driven High and the bit 2 of location 7FFh is set to ’0’. In all the other cases, the memory Block will not be protected. While the PRE input pin is read at ’0’ by the memory, the location 7FFh can be used as a normal EEPROM byte.

PB0 und PB1 haben dann keine Funktion und ich würd sie auch auf definiertes Potential verdrahten zB GND.

Dann gibt es noch den MODE/WC Pin. WC gibt es nur am ST24Wxx. Für Deinen ST24C16 ist also nur die Beschreibung für "Mode" wichtig.


Write Control (WC). An hardware Write Control feature is offered only for ST24W16 and ST25W16 versions on pin 7.


Mit Mode stellt man den Schreibmodus ein. Nicht angeschlossen ist der Chip im "Multibyte Write mode".


Gruß
Searcher

Thomas E.
06.03.2012, 19:39
Du hast ein ST24C16, der es ermöglicht einen bestimmten Speicherbereich gegen Überschreiben zu schützen. HW mäßig sind die PINs PB0, PB1 und PRE dafür wichtig. Wenn der Schreibschutz nicht genutzt wird, einfach den PRE auf low (GND) legen, damit ist das Feature inaktiv und der gesamte Speicher kann ohne Einschränkung genutzt werden.
Ich denke nicht, dass ich einen Schreibschutz benötigen werde.


Dann gibt es noch den MODE/WC Pin. WC gibt es nur am ST24Wxx. Für Deinen ST24C16 ist also nur die Beschreibung für "Mode" wichtig. Mit Mode stellt man den Schreibmodus ein. Nicht angeschlossen ist der Chip im "Multibyte Write mode".

Ja, da habe ich bereits das erste Problem. Ich versuche mich gerade mit dieser Thematik zu befassen. So richtig klar ist mir allerdings noch nicht, was ich benötige.

Grundsätzlich möchte ich auf dem EEPROM Daten mit Zeitstempel speichern. Ansprechen kann ich es, so habe ich das Datenblatt jedenfalls verstanden, per I2C.

So richtig klar ist mir die Sache noch nicht....

Searcher
06.03.2012, 20:23
Ich würde vorschlagen, PB0, PB1, PRE auf GND zu legen, also Schreibschutz Feature nicht benutzen. MODE offen lassen. SCL und SDA mit Mega8 verbinden. (VCC (+) und VSS (GND) nicht vergessen, Pullups für SCL & SDA)

MODE offen bedeutet, daß er intern vom EEPROM als high gelesen wird und sich damit nicht nur im Multibyte Write mode befindet, sondern auch im Byte Write mode.

Im Multibyte Write mode kannst Du bis zu acht Byte hintereinander, beginnend an jeder beliebigen Speicheradresse, schreiben, bevor ein Stop Signal vom Master gesendet werden sollte. In manchen Fällen 20ms Wartezeit statt 10ms vor nächstem I2C Aktivität notwendig.

Byte Write mode ist immer aktiv, egal ob Mode high oder low ist. Da schickt man ein Datenbyte an jede beliebige Speicheradresse gefolgt von einem Stop.

Das sollte für Dein Vorhaben sicher ausreichen.

Für die SW zB: http://www.rn-wissen.de/index.php/Bascom_und_I2C_EEprom

Gruß
Searcher

EDIT: mit Pullups für SCL und SDA sind die externen Widerstände nach VCC gemeint. In der BASCOM Hilfe unter Using the I2C protocol (http://avrhelp.mcselec.com/index.html?using_the_i2c_protocol.htm) ist der Wert von 1kOhm genannt. Die hab ich auch bei meinen Versuchen benutzt. Wenn SDA mit Portd.5 und SCL mit Portd.7 verbunden werden, könnte man das RN-Wissen Beispiel weitgehend übernehmen.

Thomas E.
07.03.2012, 18:57
Hallo!


Vielen Dank für deine Antwort.
Jetzt ist mir einiges klarer. :)


Grüße

Kampi
07.03.2012, 19:01
Vielleicht eine blöde Frage aber die kam mir gerade in den Kopf.....was spricht dagegen die internen Pull-ups zu verwenden?
Sind die vom Wert her zu groß (hab den Wert gerade nicht im Kopf)?

Searcher
08.03.2012, 06:50
Hallo,


.....was spricht dagegen die internen Pull-ups zu verwenden? Sind die vom Wert her zu groß (hab den Wert gerade nicht im Kopf)?
hab ich nicht probiert, könnte mir aber Verwicklungen mit den BASCOM Routinen vorstellen. Um den internen Pullup einzuschalten, müßte SDA bzw SCL vom Master (µC) als Input konfiguriert werden und dann in dem PORT Register das entsprechende Bit auf "1" geschrieben werden. Da die gleichen Leitungen aber auch als Ausgang genutzt werden und dann das Portregister für die Ausgabe wieder überschrieben wird, wäre der Endzustand für mich ungewiß.

Habe deshalb die in der BASCOM Hilfe vorgeschlagene HW Konfiguration genommen.

Der Wert der Pullups mit 1kOhm ist relativ niedrig. Wenn man googelt, findet man, daß die meisten Anwender Werte zwischen 1kOhm und 10kOhm benutzen. Die internen Pullups des Mega8 liegen wohl zwischen 20kOhm und 50kOhm.

Im Datenblatt zum ST24C16 gibt es auf Seite 4 ein Diagramm, das den maximalen Wert des Pullups in Abhängigkeit zur Kapazität der Busleitungen zeigt. Weil der Speicher vermutlich nah am µC liegt, kann man danach ziemlich sicher 10kOhm oder sogar noch höhere Pullups nehmen.

Gruß
Searcher

Kampi
08.03.2012, 07:02
Dank dir für die Antwort.
Stimmt....das hatte ich gar nicht bedacht, das die Pull-ups nur bei Input-Pins geschaltet werden können, aber I²C selber ja Output-Pins braucht.
Vermutlich wird es dann nicht nur im Bascom zu ungereimtheiten kommen sondern auch im AVR Studio.
Ich hab das gestern mal mit PSoCs von Cypress getestet (da kann man im Pinout Editor die "Eigenschaften" jedes Controllerpins verändern). Nur die IDE setzt die Pins für I²C automatisch auf "Strong" ganz egal ob man da vorher High-Z, Pull-down oder Pull-up eingestellt hat.
So einen "Luxus", das sie die Pins passend der eigentlichen Funktion einstellen, haben die IDEs für die Atmel Controller wahrscheinlich nicht ;)

Searcher
08.03.2012, 07:32
Hallo Kampi,
bisher kenne ich nur BASCOM für den µC https://www.roboternetz.de/phpBB2/images/smiles/icon_sad.gif und da ist mir ein Pinout Editor noch nicht aufgefallen :-) Da übernehmen dann bestimmte BASCOM Anweisungen die Konfiguration der Pins. Aufgefallen ist mir das, wenn ich mich recht erinnere, zum erstenmal bei der Konfiguration zum SW-UART mit der OPEN Anweisung. Ist im Nachhinein betrachtet eigentlich klar - aber man erlebt ja jedes mal wenn man was Neues anfängt, immer wieder Überraschungen :confused:

Gruß
Searcher

ePyx
08.03.2012, 08:58
Vielleicht eine blöde Frage aber die kam mir gerade in den Kopf.....was spricht dagegen die internen Pull-ups zu verwenden?
Sind die vom Wert her zu groß (hab den Wert gerade nicht im Kopf)?

Die anderen BUS-Teilnehmer müssen in der Lage sein, die Leitungen auf GND zu ziehen. Die internen Pullups sind dafür zu hochohmig und die meisten IO-Stufen versagen dann. Daher findet man in allen TWI-Schaltungen auch Pullups von 1 bis 10k.

EDIT:
Gab shcon eine Antwort.

Searcher
08.03.2012, 16:08
Die anderen BUS-Teilnehmer müssen in der Lage sein, die Leitungen auf GND zu ziehen. Die internen Pullups sind dafür zu hochohmig und die meisten IO-Stufen versagen dann. Daher findet man in allen TWI-Schaltungen auch Pullups von 1 bis 10k

@ePyx: Bist Du sicher. Ich denke eher so, daß große Werte für den Pullup das auf GND ziehen erleichtern. Wenn die Busteilnehmer den GND wegnehmen, müssen die Pullups die Leitungen nach VCC ziehen und das gegen die Leitungskapazität - müssen die Leitungskapazität aufladen. Damit das schnell geht und damit die Signalform gut bleibt, sollten die Widerstände nicht zu groß sein.

Gruß
Searcher

ePyx
08.03.2012, 16:21
Naja jeder Busteilnehmer der senden will, muss sda auf low ziehen. Sprich nach GND.

Die Eingangs- und Ausgangskreise von Master- und Slave-Bausteinen werden als Wired-AND-Schaltung bezeichnet. Im Ruhezustand sind die als Open-Collector ausgeführen Transistoren gesperrt und der Bus befindet sich auf High-Pegel. Zur Ausgabe einer logischen 0 wird der Transistor leitend und zieht die entsprechende Leitung auf Masse. Im umgekehrten Fall bleibt die Basis des Transitors stromlos und die Leitung liegt, bedingt durch den Pull-up-Widerstand auf logisch 1. Die Eingangskreise erkennen die Pegeländerungen auf den Busleitungen und können sie dann entprechend auswerten.

Umso größer die Widerstände umso weniger Strom. Sprich die Tranistoren der Eingangs-/Ausgangsstufen schalten eventuell nicht richtig. Konkrete Werte dafür gibt es nicht. Die einen behaupten 1kOhm tut es, andere nehmen die goldene Mitte von 4,7 kOhm. Da 10 kOhm bei 5 Volt 500µA entspricht, ist das wohl eine Grenze aus der Praxis. Man hat damit einfach sichergestellt, dass nahezu jeder Transistor durchsteuert. Egal wie schlecht er ist.

Searcher
08.03.2012, 16:50
Danke für die Erklärung und ich dachte schon es wär einfach :-)

Gruß
Searcher

ePyx
08.03.2012, 16:54
Bzgl. der Leitungskapzität gibt man ja die Maximallänge der Busleitung an, da dort dann der Kapazitätsbelag/Länge relevant wird. Ansonsten kann man aber auch ein akives Glied zwischen schalten. Im einfachsten Fall wären das 2 Mosfets und 4 Widerstände.

Halt sone Art Verstärker/Repeater.