EEPROM und Chipkarten per TWI / I2C ansteuern

Cassio

Aktives Mitglied
29. Okt. 2008
4.027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Dieser Thread entstand aus einzelnen Beiträgen innerhalb DIESEM THEMA !

Da es hier primär um die Ansteuerung (und Probleme) der TWI / I2C EEPROMs geht (die auch in den Chipkarten verbaut sind) und nicht um die Sockel und dess Kontaktierung, wurde dieser Thread vom Startthema separiert.





Hallo Tommy!

Ich habe zwar gerade nicht viel Zeit (nur Mittagspause).....
Bevor du aber Reichelt weiter nerven solltest ( :wink: ) kann ich dir schon mal berichten, dass ich gestern Abend einen ersten und erfolgreichen Test mit den Chipkarten gemacht habe. :wink:

Deine Beschreibung mit den Kontakten passt also! :)

Vcc---> C1 | C4 <---GND
n.c.---> C2 | C5 <---n.c.
SCL---> C3 | C6 <---SDA

(Blick AUF die Kontaktflächen)

Mangels Zeit und der späten Stunde, hatte ich gestern Abend lediglich die Karte mit der I2C-Adresse angesprochen und geschaut, ob sie erkannt wird.
Dieser Test war gestern noch positiv verlaufen, allerdings nur bei einer Bus-Geschwindigkeit von 100kHz.
Bei ca. 400kHz habe ich den Chip aber nicht mehr ansprechen können.

Die Chip-Adresse ist wie im Datenblatt angegeben: &B1010_000_R/W , also &HA0 zum Schreiben und &HA1 zum lesen.


Wenn alles klappt werde ich heute Abend mal Daten auf die Karte schreiben und auch wieder zurück lesen.
Ein kleines Programm bereite ich nebenbei gerade dafür vor, damit es heute Abend etwas schneller voran geht. :wink:


Danke noch mal und Grüße,
Cassio
 
Hallo Tommy!

Kurzer Zwischenbericht mit Teilerfolg.

Ich kann die Karte mit Daten beschreiben und auch wieder auslesen. :)
Das klappt soweit ganz gut.

Allerdings gibt es einen komischen Effekt, den ich mir noch nicht erklären kann. :hmmmm:
Wenn ich z.B. an der Adresse des ersten Speicher-Byte-Platzes einen Wert angebe, dann haben alle 255 nachfogenden Speicher-Bytes ebenfalls diesen Wert. :eek:

Die Datenübertragung habe ich mit dem LA schon überprüft und es funktioniert alles so, wie im Programm angegeben:
I2C-Start -> Write-Adresse -> Adress-High-Byte -> Adress-Low-Byte -> Bytewert -> I2C-Stop

Trotz der Angabe der direkten Speicheradresse und der Übermittlung von nur einem Daten-Byte sind hinterher alle nachfolgenden 255 Bytes im Chipspeicher mit dem selben Wert belegt. :hmmmm:


Scheint so, als hätte ich ein Verständnisproblem mit der Ansteuerung des 24LC64.
Mir will sich aber gerade nicht erschließen wo das Problem sein soll. :p
Also werde ich mir das Datenblatt wohl noch mal in Ruhe ansehen müssen.


Grüße,
Cassio
 
Klingt ja schon mal gut, zumindest erste Ansätze :)
Ich hatte im Datenblatt auch was gesehen von Byte und Page Mode?!
Wenn ich die Karte hab tacker ich die mal an mein RasPi dran und experimentier selber mal etwas.

By the way, Reichelt hat sich gemeldet.
reichelt elektronik @reichelt_el schrieb:
@TightDev Hiho! Nun solltest du am Artikel ein erschöpfendes Datenblatt finden. Wir hoffen, dass dir das weiterhilft. - Grüße!
Thomas Baumann @TightDev schrieb:
@reichelt_el Das Datenblatt des Chips selbst hatte ich schon, aber es sagt ja nichts über die Pins auf der Karte aus, das ist das Problem >
@reichelt_el gewesen :) Mittlerweile durch vieles Suchen bin ich darauf gestoßen: mikrocontroller.net/topic/208951#2… Das war so ungefähr das was ich >
@reichelt_el als Datenblatt gesucht hatte. Halt das von der Karte selbst, nicht vom Chip dahinter. Aber trotzdem danke :)
reichelt elektronik @reichelt_el schrieb:
@TightDev Wooka, sauber recherchiert. Sorry, dass wir deinen Kernwunsch nicht direkt erkannt haben. - Viel Erfolg beim Einsatz!
Schade. Naja wenigstens ist das Datenblatt des Controllers nun da drin. Die Pinbelegung haben wir ja mittlerweile.


Edit:
Wie hast du die Karte denn verbunden? Hast du ein von deinen Kartenlesern verwendet oder einen gekauft oder gar selber gebastelt?
 
Hallo Tommy!

Das Reichelt nun keine Unterlagen zur Kontaktbelegung der Karte mehr liefern kann ist ja nicht so schlimm.
Dank deiner Suche haben wir ja die passende Belegung gefunden.

Die beiden n.c.-Kontakte könnten ja höchstens noch den WP-Pin (Write Protect) enthalten.
Brauchen wird man ihn aber sowieso nicht, von daher ist es auch egal. :wink:



Die Kontaktierung habe ich über den bereits gezeigten Kartenleser realisiert. Kartenleser_2.jpg
Einfach hinten an der Folienplatine einen passenden FPC aufgesteckt und dort die vier Drähte angelötet.
Damit kann ich die Chipkarte fest einstecken und die Kontaktierung ist optimal.
Wenn ich zu Hause bin und mir etwas Zeit bleibt, kann ich davon ja mal ein Foto machen.


Zum Programmierproblem.....
Ich habe mir das Datenblatt vom 24LC64 noch mal angeschaut, aber ich finde da keinen Hinweis auf einen Fehler.
Es gibt zwar den Page-Write-Mode, allerdings nur für 32 Byte hintereinander.
Ein Ansprechen von 255 Byte wäre damit gar nicht möglich.
Außerdem wiederspricht sich das mit meiner aufgezeichneten Ansteuerung. :hmmmm:


Hier mal ein paar aufgezeichnete Beispiele daraus....
(Signalfolge: Start | Chip-Adresse | Mem-Adresse-High | Mem-Adresse-Low | Data | Stop)

Hier wird an Speicheradresse 256 (&H01_&H00) der Wert &H50 geschrieben:
chipkarte_wr_256.png

Hier frage ich anschließend den Inhalt des Speichersplatzes 256 wieder ab:
chipkarte_rd_256.png
Es werden dann die gespeicherten &H50 auch wieder ausgelesen.


Allerdings haben nun alle Speicheradressen bis 511 den gleichen Inhalt.
Siehe hier, Speicheradresse 511 (&H01_&HFF):
chipkarte_rd_511.png
Hier wird plötzlich auch eine &H50 ausgelesen.

Erst ab Speicher 512 ist dann wieder &HFF (unbeschriebener Zustand) zu sehen:
chipkarte_rd_512.png


Ich habe momentan keinen Schimmer, warum das so ist?
Wenn jemand noch eine gute Idee, oder die Lösung hat, dann her damit. :wink:

Grüße,
Cassio
 
Hallo zusammen!

Also irgendwie verstehe ich jetzt die Welt nicht mehr....... :confused:


Ich habe eben mal den Aufbau und das Programm um einen 24LC512 erweitert.
Die Schreib- und Leseroutinen habe ich nur dupliziert und angepasst, damit sie vergleichbar sind......
und was soll ich sagen?
Das 512k EEPROM macht die selben Zicken! :mad:

Wie kann das sein?

Ich stelle hier mal mein Testprogramm mit ein.
Vielleicht habe ich ja irgend etwas übersehen? :hmmmm:

Testprogramm:
Code:
' CASSIO at AVR-Praxis.de
$regfile = "m1284pdef.dat"
$crystal = 16000000                                         'extern

$hwstack = 128
$swstack = 128
$framesize = 128

$baud = 38400

'(
                  ----------------------------
                  -------AVR44MDL-Modul-------
                  ----------------------------
RxD >-------------o--PD0/RxD   |    SCK/PB7--o
Txd <-------------o--PD1/TxD   |   MISO/PB6--o
                  o--PD2/Int0  |   MOSI/Pb5--o
                  o--PD3/INT1  |        PB4--o
                  o--PD4       |        PB3--o
                  o--PD5       |        PB2--o
LED <-------------o--PD6       |        PB1--o
                  o--PD7       |        PB0--o
SCL <>------------o--SCL/PC0---|--------PA0--o
SDA <>------------o--SDA/PC1   |        PA1--o
                  o--PC2       |        PA2--o
                  o--PC3       |        PA3--o
                  o--PC4       |        PA4--o
                  o--PC5       |        PA5--o
                  o--PC6   --16MHz--    PA6--o
Taster >----------o--PC7   Resonator    PA7--o
                  o--Vcc       |       ARef--o
                  o--GND       |        GND--o
                  ----------------------------
')


' ==============================================================================

' Bestimme die Ein und Ausgänge
Ddra = &B_000_01000                                         '1 ist Ausgang 0 ist Eingang
Porta = &B111_10111                                         'auf Hi oder Low setzen

'Ddrb = &B_00000000                                         '1 ist Ausgang 0 ist Eingang
'Portb = &B11111111                                         'auf Hi oder Low setzen

Ddrc = &B_0000_0011                                         '1 ist Ausgang 0 ist Eingang
Portc = &B1111_1100                                         'auf Hi oder Low setzen

Ddrd = &B_0111_0010                                         '1 ist Ausgang 0 ist Eingang
Portd = &B1000_1101                                         'auf Hi oder Low setzen


' ==============================================================================
' I2C-Config
$lib "i2c_twi.lbx"
Config Twi = 100000                                         'BUS-Takt

' #############################################################################

Const Ck_w = &HA0                                           'Chipkarte write
Const Ck_r = &HA1                                           'Chipkarte read

Const 512w = &HA2
Const 512r = &HA3


Enable Interrupts


' #############################################################################


Led Alias Portd.6
Taster Alias Pinc.7

Dim I1 As Byte
Dim Temp As Word
Dim Temp_l As Byte At Temp Overlay
Dim Temp_h As Byte At Temp + 1 Overlay

Dim In_s As String * 5

Dim Adresse As Word
Dim Adresse_l As Byte At Adresse Overlay
Dim Adresse_h As Byte At Adresse + 1 Overlay

Dim Adresse2 As Word
Dim Adresse2_l As Byte At Adresse2 Overlay
Dim Adresse2_h As Byte At Adresse2 + 1 Overlay

Dim Wert As Byte



' #############################################################################

Do

Print ""
Print "Bitte waehlen:"
Print "0 = 64k Karte testen"
Print "3 = 512k EEPROM testen"
Print ""

Input "Eingabe= " , I1

Select Case I1
   Case 0 : Gosub Karte
   Case 3 : Gosub 512k
End Select

Loop

End                                                         'end program

' #############################################################################
' #############################################################################
512k:

I2cstart
I2cwbyte 512w
I2cstop

If Err = 1 Then
   Led = 1
   Print "Kein 512k-EEPROM erkannt!"
   Wait 1
Else
   Led = 0
   Print ""
   Print "Bitte waehlen:"
   Print "0 = EEPROM lesen"
   Print "3 = EEPROM schreiben"
   Print "5 = EE-Speicher nummerieren (1-255)"
   Print "7 = EE-Speicher komplett loeschen (&HFF)"
   Print "9 = EE-Speicherbereich anzeigen"
   Print ""
   Input "Eingabe= " , I1
End If


Select Case I1
   Case 0 : Gosub 512_read
   Case 3 : Gosub 512_write
   Case 5 : Gosub 512_fuellen
   Case 7 : Gosub 512_loeschen
   Case 9 : Gosub 512_anzeige
End Select


Return


' #############################################################################
512_read:
Print ""
Print ""
Print ""
Print "EEPROM auslesen..."
Print ""
Input "Speicherbereich angeben: " , In_s

Adresse = Val(in_s)

I2cstart
I2cwbyte 512w
I2cwbyte Adresse_h
I2cwbyte Adresse_l
I2cstart
I2cwbyte 512r
I2crbyte Wert , Nack
I2cstop

Print ""
Print ""
Print Spc(10) ; "Adresse >" ; Adresse ; "< ist mit >" ; Wert ; "< belegt!"
Print ""
Print ""
Print ""

Wert = 255

Wait 1
Return


' #############################################################################
512_write:
Print ""
Print ""
Print ""
Print "EEPROM beschreiben..."
Print ""
Input "Speicherzelle eingeben: " , In_s
Adresse = Val(in_s)
Print ""
Input "Byte-Wert eingeben: " , In_s
Wert = Val(in_s)

I2cstart
I2cwbyte 512w
I2cwbyte Adresse_h
I2cwbyte Adresse_l
I2cwbyte Wert
I2cstop

Print ""
Print ""
Print Spc(10) ; "Adresse >" ; Adresse ; "< wurde mit >" ; Wert ; "< belegt!"
Print ""
Print ""
Print ""

Wert = 255

Wait 1
Return


' #############################################################################
512_fuellen:

Print ""
Print "EEPROM-Speicherbereich nummerieren (max. 255)..."
Print ""

Input "EEPROM-Speicher-Startadresse= " , In_s
Adresse = Val(in_s)

Input "Anzahl Speicher-Zellen= " , Wert


For Temp = 1 To Wert
   I2cstart
   I2cwbyte 512w
   I2cwbyte Adresse_h
   I2cwbyte Adresse_l
   I2cwbyte Wert
   I2cstop

   Incr Adresse
Next Temp


Wait 1
Return


' #############################################################################
512_loeschen:

Print ""
Print ""
Print ""
Print "Gesamter EEPROM-Speicher wird geloescht (&HFF)!!!"
Print "7= Ja oder 0= NEIN"

Input "Eingabe= " , I1

Select Case I1
   Case 7
      Wert = &HFF
      For Adresse = 0 To 63999
         I2cstart
         I2cwbyte 512w
         I2cwbyte Adresse_h
         I2cwbyte Adresse_l
         I2cwbyte Wert
         I2cstop
      Next Adresse
      Print "Speicher geloescht!"
      Print ""
      Waitms 250
Case Else
      Print "Vorgang abgebrochen!"
      Print ""
      Print ""
      Print ""
      Waitms 500
End Select


Return


' #############################################################################
512_anzeige:

Print ""
Print "EEPROM-Speicherbereich anzeigen..."
Print ""

Input "EEPROM-Speicher Start= " , In_s
Adresse = Val(in_s)

Input "EEPROM-Speicher Ende= " , In_s
Adresse2 = Val(in_s)

Waitms 250

For Temp = Adresse To Adresse2
   I2cstart
   I2cwbyte 512w
   I2cwbyte Temp_h
   I2cwbyte Temp_l
      I2cstart
      I2cwbyte 512r
      I2crbyte Wert , Nack
      I2cstop

   If Wert < 255 Then
      Print Spc(10) ; "Speicher " ; Temp ; " = " ; Wert
   Else
   End If

   Wert = 255
Next Temp


Print ""
Print "ENDE"
Print ""
Print ""
Print ""
Print ""
Print ""

Wert = 255

Wait 1
Return




' #############################################################################
' #############################################################################
Karte:

I2cstart
I2cwbyte Ck_w
I2cstop

If Err = 1 Then
   Led = 1
   Print "Keine Chipkarte erkannt!"
   Wait 1
Else
   Led = 0
   Print ""
   Print "Bitte waehlen:"
   Print "0 = Karte lesen"
   Print "3 = Karte schreiben"
   Print "5 = Speicher nummerieren (1-255)"
   Print "7 = Speicher komplett loeschen (&HFF)"
   Print "9 = Speicherbereich anzeigen"
   Print ""
   Input "Eingabe= " , I1
End If


Select Case I1
   Case 0 : Gosub Ck_read
   Case 3 : Gosub Ck_write
   Case 5 : Gosub Speicher_fuellen
   Case 7 : Gosub Speicher_loeschen
   Case 9 : Gosub Speicher_anzeige
End Select


Return


' #############################################################################
Ck_read:
Print ""
Print ""
Print ""
Print "Chipkarte auslesen..."
Print ""
Input "Speicherbereich angeben: " , In_s

Adresse = Val(in_s)

I2cstart
I2cwbyte Ck_w
I2cwbyte Adresse_h
I2cwbyte Adresse_l
I2cstart
I2cwbyte Ck_r
I2crbyte Wert , Nack
I2cstop

Print ""
Print ""
Print Spc(10) ; "Adresse >" ; Adresse ; "< ist mit >" ; Wert ; "< belegt!"
Print ""
Print ""
Print ""

Wert = 255

Wait 1
Return


' #############################################################################
Ck_write:
Print ""
Print ""
Print ""
Print "Chipkarte beschreiben..."
Print ""
Input "Speicherzelle eingeben: " , In_s
Adresse = Val(in_s)
Print ""
Input "Byte-Wert eingeben: " , In_s
Wert = Val(in_s)

I2cstart
I2cwbyte Ck_w
I2cwbyte Adresse_h
I2cwbyte Adresse_l
I2cwbyte Wert
I2cstop

Print ""
Print ""
Print Spc(10) ; "Adresse >" ; Adresse ; "< wurde mit >" ; Wert ; "< belegt!"
Print ""
Print ""
Print ""

Wert = 255

Wait 1
Return


' #############################################################################
Speicher_fuellen:

Print ""
Print "Speicherbereich nummerieren (max. 255)..."
Print ""

Input "Speicher-Startadresse= " , In_s
Adresse = Val(in_s)

Input "Anzahl Speicher-Zellen= " , Wert


For Temp = 1 To Wert
   I2cstart
   I2cwbyte Ck_w
   I2cwbyte Adresse_h
   I2cwbyte Adresse_l
   I2cwbyte Wert
   I2cstop

   Incr Adresse
Next Temp


Wait 1
Return


' #############################################################################
Speicher_loeschen:

Print ""
Print ""
Print ""
Print "Gesamter Speicher wird geloescht (&HFF)!!!"
Print "7= Ja oder 0= NEIN"

Input "Eingabe= " , I1

Select Case I1
   Case 7
      Wert = &HFF
      For Adresse = 0 To 7999                               'oder 1 bis 8000 ?
         I2cstart
         I2cwbyte Ck_w
         I2cwbyte Adresse_h
         I2cwbyte Adresse_l
         I2cwbyte Wert
         I2cstop
      Next Adresse
      Print "Speicher geloescht!"
      Print ""
      Waitms 250
Case Else
      Print "Vorgang abgebrochen!"
      Print ""
      Print ""
      Print ""
      Waitms 500
End Select


Return


' #############################################################################
Speicher_anzeige:

Print ""
Print "Speicherbereich anzeigen..."
Print ""

Input "Speicher-Start= " , In_s
Adresse = Val(in_s)

Input "Speicher-Ende= " , In_s
Adresse2 = Val(in_s)

Waitms 250

For Temp = Adresse To Adresse2
   I2cstart
   I2cwbyte Ck_w
   I2cwbyte Temp_h
   I2cwbyte Temp_l
      I2cstart
      I2cwbyte Ck_r
      I2crbyte Wert , Nack
      I2cstop

   If Wert < 255 Then
      Print Spc(10) ; "Speicher " ; Temp ; " = " ; Wert
   Else
   End If

   Wert = 255
Next Temp


Print ""
Print "ENDE"
Print ""
Print ""
Print ""
Print ""
Print ""

Wert = 255

Wait 1
Return


Grüße,
Cassio
 
Hallo Tommy!

Ich habe gestern Abend mal die Ansteuerroutinen in BASCOM geändert....

Anstatt jetzt alles einzeln auszuführen (I2CStart , I2CwByte usw.), habe ich alles auf I2Csend und I2Creceive geändert und sende alle Daten über ein Array.
Leider hat das auch nichts gebracht. :(

Auch die Pullups an SCL und SDA von 4k7 habe ich einfach mal halbiert..... wieder nix.

Menno, das kann doch wohl nicht wahr sein! :mad:


Warum speichern die EEPROMs teilweise nur Unsinn ab? :hmmmm:


Grüße,
Cassio
 
Ist ja echt merkwürdig 0.o

Ich mach meine Bestellung heute noch fertig, werd die Karte(n) (ich hab mir die 8k und 64k bestellt) wohl morgen haben und denn selber mal testen. Du bist also nicht mehr lange ohne Unterstützung :)
Ich werds allerdings am RasPi machen, also mit Python. Ich bin aus Bascom schon viel zu lange raus. (später kommts in Assembler auf 'nen ATmega).

Wie "befeuerst" du denn die Karte? (jaja, Dampfer-Slang ^^)
Also 5V, 3,3V, ...?
Die sollte ja eigentlich beides können.

Die Bus Geschwindigkeit sollte eigentlich kein Problem sein, würde ich aber jetzt nicht komplett ausschließen. Eigentlich sollten sowohl AVR alsauch die Karte 400kHz abkönnen. Aber wer weiß.


Kurze generelle I²C Frage:
Die Pull-Up's, die müssen doch nur am Ende der Leitung sein, oder? Also wenn man mehrere Slaves hat.
 
Hallo Tommy!

Warum bestellst du die Sachen bei Reichelt denn?
Ich denke, du musst nur mal schnell um die Ecke laufen und schon stehst du mitten im verlängerten Wohnzimmer, also dem Reichelt-Shop. :D

Die Karten und das einzelne EEPROM werden mit 5V versorgt.
Die 24LC-Variante kann ab 2,5V betrieben werden, damit sollte es bei 3,3V auch keine Probleme geben.


Was die BUS-Geschwindigkeit betrifft, da hatte ich bis jetzt nur bei Volldampf Probleme bekommen.
Momentan teste ich alles mit 100kHz......
habe es aber auch mal mit 250kHz probiert. Klappte damit aber auch.
Auf Grund lockerer Verkabelung bleibe ich aber lieber bei den 100kHz.


Die Pullups müssen nicht ans "Ende". Es sind ja keine Terminatoren sondern sie sollen lediglich die Spannungslevel auf High halten.
Ich habe z.B. bei meinen selbstgebauten AVR-Modulen zwei 4k7 Pullups mit drauf...... also am "Anfang" wenn du so willst. Bei Bedarf kann ich diese dann austauschen, oder einfach ein weiteres 4k7 Widerstandspaar am Slave parallel schalten.


Mometan weiß ich wirklich nicht mehr, woran es liegen könnte.
Ich habe StevieL schon eine PN geschickt. Vielleicht fällt dem ja noch etwas ein.

Die Karten sind jedenfalls in Ordnung. Zur Vorsicht habe ich aber auch schon eine Andere ausprobiert. :wink:
Seltsam ist ja auch, dass es bei den baugleichen 24LC512 ebenfalls nicht funktioniert.

Ich habe hier aber auch noch 24LC16 liegen.
Vielleicht sollte ich die mal ausprobieren. Zur Speicher-Adressierung benötigen die jedenfalls nur ein Byte und kein Word mehr.
Kann mir aber nicht vorstellen, dass es damit Probleme geben soll. :hmmmm:
Auf den Bildern vom LA kann man ja sehen, dass erst MSB und dann LSB der Speicheradresse gesendet wird...... genauso, wie es im Datenblatt steht.



Mit der Himbeere bin ich "baulich" noch nicht soweit, um sie für solche Zwecke zu benutzen.
Mir fehlt da immer noch ein passender Adapter für die GPIOs, so wie ich ihn gerne hätte. :wink:
Bei Zeiten werde ich mir die Platine dafür aber mal erstellen und dann geht es damit auch weiter.


Grüße,
Cassio
 
Natürlich bestell ich :)
Ich geh da ja nicht hin und sag was ich will. Muss ich ja noch erst da warten bis das da durch das ganze Lager läuft und vorne ankommt.
So muss ich nur da rein, Kundenkarte in's Terminal und (idR) hab ich spätestens 5min später die Ware. Aber ich bestell da auch so mal wenn ich mal was brauch und da nicht grade dran vorbei komme (sind immerhin 10KM und ohne Auto ist das schon recht viel ;)).

Was möchtest du denn an die GPIO dran hängen? Also was für ein Adapter. Ich hab alles direkt angeschlossen.
 
Hi Tommy!

Nun ja, an die GPIO`s möchte ich gar nichts besonderes dran hängen.

Ich möchte meine externe Hardware eben nicht einfach direkt an die ARM-Pins hängen (wie es LogiLink vermutlich produzieren würde :cool: ).
Zum Weiteren möchte ich gleich ein paar Leveltranslater verwenden, damit ich mit der externen Spannung flexibel bin.

Natürlich gibt es so eine Platine schon fertig zu kaufen, aber der Preis ist unverschämt hoch!
Ich sehe nämlich nicht ein, für ein Pi-Zubehör mindestens noch einmal soviel zu bezahlen, wie für den Pi selbst.

Da gönne ich mir lieber die Freiheit einer eigenen Platine, die dann auch so layoutet ist wie ich sie für sinnvoll halte.
Obendrein kosten die paar benötigten IC`s nicht gerade die Welt.

Am Ende habe ich dann einfach eine günstigere und persönlich perfekte Lösung. :)



Nun aber noch mal zurück zum Thema..... :wink:
Ich habe heute extra noch die neue BASCOM 2.0.7.7 Version installiert (update) und dann wieder versucht die Chipkarte und das EEPROM zu beschreiben.....
Wieder nix!
Es werden die tollsten Werte abgespeichert, aber nicht das was ich möchte. :mad:

Ich hatte beim Schreiben auch schon bis zu 10ms Pausen ins Programm eingefügt, aber das brachte auch nichts.
Langsam gehen mir echt die Ideen aus. :(


Grüße,
Cassio
 
Um mal wieder zum Topic zu kommen.
Hast du mal versucht mit einem CardReader Daten drauf zu schreiben und die denn so zu überprüfen? Sprich dass du sagen kannst dass das Lesen oder das Schreiben das Problem ist?

Meine Bestellung ist in letzter Sekunde auf Dienstag verschoben worden. Ein Bekannter wollte auch noch was und der fährt gleich netterweise :)
Ich muss mir eh erst noch einen Sockel improvisieren
 
Hi Tommy!

Ich würde mal sagen, dass es am Schreiben liegt.
Ausgelesen werden die Daten immer wieder identisch.

Schreibe ich z.B. in das erste Byte eine Zahl, dann wird diese auch richtig abgelegt.
Schreibe ich danach aber eine weitere Zahl in das zweite, dritte, oder dem 255. Byte, dann wird das erste Byte plötzlich verändert. :eek:
So ist das mit allen Bytes, innerhalb von "255 Byte-Blöcken".
Die gespeicherten Werte kommen mir immer wie Zufall vor.


Grüße,
Cassio
 
Diese 255 irritiert mich jetzt mal aber ganz gewaltig. Weil die Page Size war ja 16 (oder 32?) Bytes groß, passt also nicht. Und 255 ist ja die Byte Grenze. Kann das eventuell sein dass die bei der Adressierung was verändert haben? High und Low Byte vertauscht zum Beispiel. Das ist jetzt aber wirklich nur ganz in's Blaue geraten und eigentlich nicht ernst zu nehmen, aber das waren grade so meine Gedanken.
Schade dass ich nicht weiß was für ein Chip in Krankenkassen Karten drin steckt, weil ich hab hier noch eine abgelaufene. Sollte eine identische Karte sein, aber in welcher Größe...
Naja morgen bastel ich mir den provisorischen Reader und Dienstag kommt die Karte, denn teste ich selber :)
Jetzt wird erstmal StockCar zu Ende geschaut und dann kommt X-Treme Kopfkissen-Horchën ;)
 
Hallo Tommy!

Ich finde es ja auch seltsam, dass immer genau 255 Bytes eine Veränderung erfahren.
Die Page-Size ist beim 64K nur 32Byte groß. Es kann also eigentlich nichts damit zu tun haben.

Mir kam auch schon in den Sinn grundsätzlich nur 32Byte am Stück zu senden.
Vielleicht klappt es dann besser, aber der Test steht noch aus.



Offtopic:
Ich überlege gerade den Thread zu teilen.
Es geht hier durch die Probleme mit dem Speicher inzwischen mehr um die EEPROMs, als um den Sockel. :wink:
Vielleicht koppel ich das Thema hier mal ab und separiere es.
Also nicht wundern, wenn das "Problem-Thema" plötzlich einen anderen Namen trägt.


Grüße,
Casio
 
Kannst du von mir aus gern machen. Das Problem ist nur wo kommt der Cut, das war ja irgendwie etwas fließend ;)
Wäre aber schön wenn du in den 2 Threads denn ein Hinweis / Link zu dem anderen hinzufügst :)
 
Hallo Tommy!

Ich habe den "Problemen" nun mal ein eigenes Thema spendiert. :wink:


Heute kann ich dafür auch mal eine positive Nachricht verkünden. :D
Ich habe meinen Testaufbau jetzt mal geändert und ein 24LC16 verwendet.

Die Software habe ich entsprechend angepasst, weil die Adressierung eine völlig andere ist:
Code:
$regfile = "m1284pdef.dat"
$crystal = 16000000                                         'extern

$hwstack = 128
$swstack = 128
$framesize = 128

$baud = 38400

'(
                  ----------------------------
                  -------AVR44MDL-Modul-------
                  ----------------------------
RxD >-------------o--PD0/RxD   |    SCK/PB7--o
Txd <-------------o--PD1/TxD   |   MISO/PB6--o
                  o--PD2/Int0  |   MOSI/Pb5--o
                  o--PD3/INT1  |        PB4--o
                  o--PD4       |        PB3--o
                  o--PD5       |        PB2--o
LED <-------------o--PD6       |        PB1--o
                  o--PD7       |        PB0--o
SCL <>------------o--SCL/PC0---|--------PA0--o
SDA <>------------o--SDA/PC1   |        PA1--o
                  o--PC2       |        PA2--o
                  o--PC3       |        PA3--o
                  o--PC4       |        PA4--o
                  o--PC5       |        PA5--o
                  o--PC6   --16MHz--    PA6--o
Taster >----------o--PC7   Resonator    PA7--o
                  o--Vcc       |       ARef--o
                  o--GND       |        GND--o
                  ----------------------------
')


' ==============================================================================

' Bestimme die Ein und Ausgänge
Ddra = &B_000_01000                                         '1 ist Ausgang 0 ist Eingang
Porta = &B111_10111                                         'auf Hi oder Low setzen

'Ddrb = &B_00000000                                         '1 ist Ausgang 0 ist Eingang
'Portb = &B11111111                                         'auf Hi oder Low setzen

Ddrc = &B_0000_0011                                         '1 ist Ausgang 0 ist Eingang
Portc = &B1111_1100                                         'auf Hi oder Low setzen

Ddrd = &B_0111_0010                                         '1 ist Ausgang 0 ist Eingang
Portd = &B1000_1101                                         'auf Hi oder Low setzen


' ==============================================================================
' I2C-Config
$lib "i2c_twi.lbx"
Config Twi = 100000                                         'BUS-Takt


' #############################################################################


Const 16kw = &HA0                                           '16k EEPROM write
Const 16kr = &HA1                                           '16k EEPROM read

Dim 16k_w As Byte
Dim 16k_r As Byte

Enable Interrupts


' #############################################################################


Led Alias Portd.6
Taster Alias Pinc.7

Dim I1 As Byte
Dim Temp As Byte

Dim In_s As String * 5

Dim Block As Byte
Dim Adresse As Byte
Dim Adresse2 As Byte


Dim Daten(3) As Byte
Dim Wert As Byte



' #############################################################################

Do

   Print ""
   Print "Bitte waehlen:"
   Print "0 = 16k EEPROM lesen"
   Print "3 = 16k EEPROM schreiben"
   Print "5 = 16k EEPROM Speicher nummerieren (1-255)"
   Print "7 = 16k EEPROM Speicher komplett loeschen (&HFF)"
   Print "9 = 16k EEPROM Speicherbereich anzeigen"
   Print ""
   Input "Eingabe= " , I1

Select Case I1
   Case 0 : Gosub 16k_read
   Case 3 : Gosub 16k_write
   Case 5 : Gosub 16k_fuellen
   Case 7 : Gosub 16k_loeschen
   Case 9 : Gosub 16k_anzeige
End Select


Loop

End                                                         'end program



' #############################################################################
' #############################################################################


' #############################################################################
16k_read:
Print ""
Print ""
Print ""
Print "EEPROM auslesen..."
Print ""

Input "Block angeben: " , In_s
Block = Val(in_s)

Shift Block , Left , 1
16k_w = 16kw + Block
16k_r = 16kr + Block

Input "Speicherbyte angeben: " , In_s
Adresse = Val(in_s)


I2cstart
I2cwbyte 16k_w
I2cwbyte Adresse
I2cstart
I2cwbyte 16k_r
I2crbyte Wert , Nack
I2cstop

Print ""
Print ""
Print Spc(10) ; "Adresse >" ; Adresse ; "< ist mit >" ; Wert ; "< belegt!"
Print ""
Print ""
Print ""

Wert = 255

Wait 1
Return


' #############################################################################
16k_write:
Print ""
Print ""
Print ""
Print "EEPROM beschreiben..."
Print ""

Input "Block angeben: " , In_s
Block = Val(in_s)

Shift Block , Left , 1
16k_w = 16kw + Block

Input "Speicherbyte eingeben: " , In_s
Adresse = Val(in_s)

Print ""
Input "Byte-Wert eingeben: " , In_s
Wert = Val(in_s)

I2cstart
I2cwbyte 16k_w
I2cwbyte Adresse
I2cwbyte Wert
I2cstop

Print ""
Print ""
Print Spc(10) ; "Adresse >" ; Adresse ; "< wurde mit >" ; Wert ; "< belegt!"
Print ""
Print ""
Print ""

Wert = 255

Wait 1
Return


' #############################################################################
16k_fuellen:

Print ""
Print "EEPROM-Speicherbereich nummerieren (max. 255)..."
Print ""

Input "Block angeben: " , In_s
Block = Val(in_s)

Shift Block , Left , 1
16k_w = 16kw + Block


Input "Speicher-Startadresse= " , In_s
Adresse = Val(in_s)


Input "Anzahl Speicher-Zellen= " , Wert


For Temp = 0 To Wert
   I2cstart
   I2cwbyte 16k_w
   I2cwbyte Adresse
   I2cwbyte Temp
   I2cstop
Waitms 5
   Incr Adresse
Next Temp


Wait 1
Return


' #############################################################################
16k_loeschen:

Print ""
Print ""
Print ""
Print "Gesamter EEPROM-BLOCK-Speicher wird geloescht (&HFF)!!!"
Print "7= Ja oder 0= NEIN"

Input "Eingabe= " , I1

Input "Block angeben: " , In_s
Block = Val(in_s)

Shift Block , Left , 1
16k_w = 16kw + Block



Select Case I1
   Case 7
      Wert = &HFF
      For Adresse = 0 To 255                                'oder 1 bis 8000 ?
         I2cstart
         I2cwbyte 16k_w
         I2cwbyte Adresse
         I2cwbyte Wert
         I2cstop
Waitms 5
      Next Adresse
      Print "Speicher geloescht!"
      Print ""
      Waitms 250
Case Else
      Print "Vorgang abgebrochen!"
      Print ""
      Print ""
      Print ""
      Waitms 500
End Select


Return


' #############################################################################
16k_anzeige:

Print ""
Print "Speicherbereich anzeigen..."
Print ""

Input "Block angeben: " , In_s
Block = Val(in_s)

Shift Block , Left , 1
16k_w = 16kw + Block
16k_r = 16kr + Block

Input "Speicher-Start= " , In_s
Adresse = Val(in_s)

Input "Speicher-Ende= " , In_s
Adresse2 = Val(in_s)

Waitms 250

For Temp = Adresse To Adresse2
   I2cstart
   I2cwbyte 16k_w
   I2cwbyte Temp
      I2cstart
      I2cwbyte 16k_r
      I2crbyte Wert , Nack
      I2cstop

   If Wert < 255 Then
      Print Spc(10) ; "Speicher " ; Temp ; " = " ; Wert
   Else
   End If

   Wert = 255
Next Temp


Print ""
Print "ENDE"
Print ""
Print ""
Print ""
Print ""
Print ""

Wert = 255

Wait 1
Return


Tja und was soll ich sagen....
Mit einer Pause von mindestens 5ms zwischen den einzelnen Schreibzugriffen, klappt das Beschreiben des EEPROMs dann auch problemlos. :victory:
Beim Auslesen ist diese Pause nicht notwendig und beim Page-Write kann darauf vermutlich auch verzichtet werden.


Stellt sich also die Frage, warum klappt es bei der Chipkarte und dem 24LC512 nicht?
Müssen die Pausen vielleicht noch größer sein? :hmmmm:
Liegt es vielleicht doch an dem High- und Low-Byte bei der Adressierung? :hmmmm:


Grüße,
Cassio
 
Hallo Cassio,

ich hab mal gestöbert und im Datenblatt des 24LC16 steht folgendes ...
Write cycle time TWR — 10 — 10 ms Byte or Page mode

Dann hab ich nochmal das Datenblatt des 24LC512 geholt ...
17 TWC Write cycle time (byte or page) — 5 ms

Sollte also sogar schneller sein :rolleyes:

Gruß
Dino
 
Hallo Dino!

Also in meinem Datenblatt steht bei beiden IC`s eine TWC von 5ms. :hmmmm:

Ist aber auch egal, weil mir nach dem Schreiben des letzten Beitrages eingefallen ist, dass es kein Zeitproblem sein kann.
Wenn ich z.B. an Speicheradresse 1 den Wert "11" sende, dann klappt das auch.

Sende ich danach manuell (also zig Sekunden später!) an Speicheradresse 2 eine "22", dann funktioniert dies ebenfalls.....
allerdings ist die "11" im Speicherbereich 1 "weg" und es steht ein anderer Wert drin. :hmmmm:
Das kann also absolut nichts mit den 5ms oder 10ms zu tun haben. :wink:


Aus dem o.g. Grund konzentriere ich mich gerade auf die Word-Adresse.
Wenn ich den LA nicht hätte, dann würde ich an der ordnungsgemäßen Übermittlung zweifeln.
Wie aber schon einige Beiträge zuvor zu sehen war (Snapshots vom LA), wird die Word-Adresse richtig übermittelt.
Erst das High-byte und dann das Low-Byte der Speicheradresse.

Soll ich da einfach mal eine Pause einbauen? :hmmmm:
Kann ich ja mal probieren, denn sonst gehen mir die Ideen sowieso langsam aus. :cool:


Grüße,
Cassio
 
Soll ich da einfach mal eine Pause einbauen? :hmmmm:

Hallo Dino!

Das muss es gewesen sein. :dance3:

Ich habe jetzt testweise einfach mal "Zwangspausen" eingebaut und siehe da, es funktioniert! :D :D :D

Guckst du:
Code:
I2cstart
I2cwbyte 512w
  [B][COLOR="#FF0000"] Waitms 1[/COLOR][/B]
I2cwbyte Adresse_h
   [B][COLOR="#FF0000"]Waitms 1[/COLOR][/B]
I2cwbyte Adresse_l
   [B][COLOR="#FF0000"]Waitms 1[/COLOR][/B]
I2cwbyte Wert
I2cstop


Jetzt muss ich nur noch prüfen, welche Pause dringend erforderlich ist und wie lang sie mindestens sein muss. ;)


Grüße,
Cassio
 
Hi Cassio,
gratuliere :)

Komisch dass es an den Delays liegt. soweit ich weiß ist doch der Slave in der Lage durch runter ziehen der Clock Leitung selber Wartezeiten zu setzen bis er das Byte verarbeitet hat. Warum macht er das nicht? 0.o
Naja, Erfahrungswerte sind eh zig mal besser als Datenblätter :)

Schade dass ich, wo ich das Thema eigentlich angestoßen habe, erst morgen dazu komme.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)