Forum: Mikrocontroller und Digitale Elektronik Bascom I2C Eeprom


von ich (Gast)


Lesenswert?

Hallo,
ich habe ein 24C256 und versuche dies anzusteuern allerdings 
funktioniert das nicht. Ich habe den Code aus dem Internet war aber auf 
allen Seiten gleich (bedeutet für mich das dass der einzig richtige ist) 
ich benutze ein 8mhz Quarz und habe einen Atmega 32. Ich habe alles auf 
dem Avr Evaluationsboard von Pollin (Version:2.0.0).

Hier der Code:
1
'============I2C EEprom schreiben/lesen ==================================
2
3
 ' =========== Für 24C256 EEprom =====================
4
 ' 8MHz Quarz
5
 ' LCD auf Port B ,
6
 '
7
$regfile = "m32def.dat"
8
$crystal = 8000000
9
$baud = 9600
10
11
12
'SDA und SCL definieren
13
Config Sda = Portc.1
14
Config Scl = Portc.0
15
16
17
Dim X As Byte
18
Dim A As Byte
19
Dim B As Byte
20
Dim Lesen As Byte
21
Cls
22
23
Do
24
'---- schreibe in EEprom ----
25
For A = 1 To 10
26
Incr X                                                      '1 bis Überlauf zählen
27
28
I2cstart                                                    'Start I2C
29
I2cwbyte &HA0                                               'Sende Slave Adresse
30
I2cwbyte 1                                                  'Sende Speicheradresse High
31
I2cwbyte A                                                  'Sende Speicheradresse LOw
32
I2cwbyte X                                                  'Sende Wert
33
I2cstop                                                     'Stop I2C
34
Waitms 10                                                   'warte 10ms
35
36
Locate 1 , 1
37
Print "ins EEprom = " ; X ; "  "                            ' Ausgabe der geschriebenen Werte am LCD
38
Waitms 500
39
Next A
40
41
42
'--- lesen vom EEprom ----
43
For B = 1 To 10
44
45
I2cstart                                                    'Start I2C
46
I2cwbyte &HA0                                               'sende Slave Adresse
47
I2cwbyte 1                                                  'sende Speicheradresse High
48
I2cwbyte B                                                  'sende Speicheradresse Low
49
50
I2cstart                                                    'Start I2C
51
I2cwbyte &HA1                                               'sende Slave Adresse +1 für Lesen
52
I2crbyte Lesen , Nack                                       'lese Adresse vom EEprom
53
I2cstop                                                     'Stop I2C
54
55
Locate 2 , 1
56
Print "Lese  EEprom= " ; Lesen ; "  "                       'Ausgabe der EEprom Werte
57
Waitms 500
58
Next B
59
60
Loop
61
End
LG

: Bearbeitet durch User
von Paul Baumann (Gast)


Lesenswert?

Hast Du Jumper 9 und 10 gesetzt, damit SDA und SCL auch mit den Pins
PC0 und PC1 des Kontrollers verbunden sind?

ich schrieb:
> allerdings
> funktioniert das nicht.

Wie äußert sich das?

MfG Paul

von ich (Gast)


Lesenswert?

Hallo Paul,
ich habe die Jumper gesetzt aber das Eeprom spuckt unter jeder 
Speicheradresse 255 aus. Ich möchte gerne wissen was falsch ist und wie 
ich es verbessern kann

LG

von Paul Baumann (Gast)


Lesenswert?

ich schrieb:
> Ich möchte gerne wissen was falsch ist und wie
> ich es verbessern kann

Das wahrscheinlich:
$crystal = 8000000

Normalerweise ist der Quarz dort einer mit 16MHz. (Q3 heißt der auf der 
Platine)

Wenn dadurch die Zeiten nicht stimmen, kommt auch nur Mumpitz raus.
MfG Paul

von ich (Gast)


Lesenswert?

Hallo Paul,
ich habe wie im Code geschrieben ein 16mhz Quarz und die Fuses sind auch 
richtig habe mal ein anderes Board genommen und getestet aber dort das 
selbe!

LG

von Peter X. (peter_x)


Lesenswert?

Hallo Paul,
Deinem Einwand mit dem "Freibier" stimme ich dir zu. Aber wo gips das?

Michael Hardmann

von Pater Noster (Gast)


Lesenswert?

ich schrieb:
> ich habe wie im Code geschrieben ein 16mhz Quarz und die Fuses sind auch
> richtig

ich schrieb im Eingangspost:
> ich benutze ein 8mhz Quarz und habe einen Atmega 32.

Zitat aus dem o.g. Code:

Hier der Code:
'============I2C EEprom schreiben/lesen
==================================

 ' =========== Für 24C256 EEprom =====================
 ' 8MHz Quarz
 ' LCD auf Port B ,
 '
$regfile = "m32def.dat"
$crystal = 8000000

Das war's dann: Verarsche Dich selbst!

von ich (Gast)


Lesenswert?

Ich habe mich verschrieben sorry aber so ist das auch keine lösung

LG

von Joachim R. (bastelbaer)


Lesenswert?

Hi, hier mal der Code den ich benutze. Allerdings in einer Schaltung, 
nicht im Pollin-Board. Bei mir wird noch der Schreibschutz benutzt, der 
ist beim Pollinboard ja fest auf High. Vielleicht hilft es ja.
1
'### Config EEPROM-Variablen
2
Const Eeprom_w = &HA0                                       'slave write address
3
Const Eeprom_r = &HA1                                       'slave read address
4
Dim Eeprom_count As Byte                                    ' Zähler
5
Dim Eeprom_anz As Byte
6
Dim Eeprom_adr As Word                                      ' Die Adresse als Word-Variable
7
Dim Eeprom_high_adr As Byte At Eeprom_adr + 1 Overlay       ' Zeiger auf das High-Byte
8
Dim Eeprom_low_adr As Byte At Eeprom_adr Overlay            ' Zeiger auf das Low-Byte
9
Dim Eeprom_data As String * 20                              ' Daten als String
10
Dim Eeprom_data_array(20) As Byte At Eeprom_data Overlay    ' Daten als Array
11
12
Eeprom_data = "Dies ist ein Test"
13
Eeprom_anz = 18                                             ' 18 Zeichen
14
Eeprom_adr=&H0000                                           ' ab Adresse 0 schreiben
15
Gosub Write_eeprom
16
17
Wait 1
18
19
Eeprom_anz = 7                                              ' 7 Zeichen einlesen
20
Eeprom_adr=&H0005                                           ' Ab Adresse 5
21
Gosub Read_eeprom                                           ' Nur "ist ein" einlesen
22
Print Eeprom_data
23
24
End
25
26
'#########################################################################
27
'# Allgemeine Routine zum Lesen aus EEPROM
28
Read_eeprom:
29
    For Eeprom_count = 1 To 19                              'Daten löschen
30
        Eeprom_data_array(eeprom_count) = 0
31
    Next Eeprom_count
32
33
    I2cstart                                                ' Generate start code
34
    I2cwbyte Eeprom_w                                       ' send address
35
    I2cwbyte Eeprom_high_adr
36
    I2cwbyte Eeprom_low_adr
37
38
    I2cstart                                                ' Generate start code
39
    I2cwbyte Eeprom_r                                       ' send address
40
    For Eeprom_count = 1 To Eeprom_anz
41
        If Eeprom_count = Eeprom_anz Then
42
            I2crbyte Eeprom_data_array(eeprom_count) , Nack
43
        Else
44
            I2crbyte Eeprom_data_array(eeprom_count) , Ack
45
        End If
46
    Next Eeprom_count
47
    I2cstop
48
Return
49
50
51
'#########################################################################
52
'# Allgemeine Routine zum Schreiben in EEPROM
53
Write_eeprom:
54
'    Reset Eeprom_wp                                         ' Schreibschutz aufheben
55
'    Waitms 1
56
    I2cstart                                                ' Generate start code
57
    I2cwbyte Eeprom_w                                       ' send address
58
    I2cwbyte Eeprom_high_adr
59
    I2cwbyte Eeprom_low_adr
60
    For Eeprom_count = 1 To Eeprom_anz
61
        I2cwbyte Eeprom_data_array(eeprom_count)
62
    Next Eeprom_count
63
    I2cstop
64
    Waitms 1
65
    Set Eeprom_wp                                           ' Schreibdschutz wieder setzen
66
Return

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

ich schrieb:
> ich habe die Jumper gesetzt aber das Eeprom spuckt unter jeder
> Speicheradresse 255 aus

Das stammt nicht vom EEPROM, das liefert der leere Bus, die Pullups 
ziehen ihn auf high. ACKed das EEPROM überhaupt seine Adresse?

MfG Klaus

von Joachim R. (bastelbaer)


Lesenswert?

Gerade im Datenblatt gelesen. Der WP-Pin muss auf LOW zum Schreiben. 
Wenn er High ist kann man nur lesen. Das Pollinboard hat einen festen 
High auf dem WP-Pin. Das kann nie klappen mit dem Schreiben.

von Paul B. (paul_baumann)


Lesenswert?

Joachim R. schrieb:
> Das Pollinboard hat einen festen
> High auf dem WP-Pin.

Das ist nicht wahr. Der WP-Pin (Pin7) liegt fest auf Masse.
A0,A1, A2 ebenso.

MfG Paul

von ich (Gast)


Lesenswert?

Hallo Paul,
doch ich habe dieses Board hier und der liegt auf 5V aber funktionieren 
will es immer noch nicht bin aber gerade am Basteln.

LG

von ich (Gast)


Lesenswert?

Hallo Zusammen,
ich habe es zum laufen bekommen:D.
Mein altes Eeprom war kaputt, der WS war auf HIGH und nicht auf LOW und 
die PullUP Widerstände sind mit 10k zu hoch. Aber dank eurer Hilfe und 
ein bisschen suchen im Datenblatt läuft es jetzt.

Unterm Strich bedeutet das also die Widerstände 9 & 10 auf dem Pollin 
Board mit zwei 1k Widerständen tauschen und WS irgendwie auf LOW legen 
dann läufts!
Vielen Dank!!!!

LG

von Kai M. (kai_mauer)


Angehängte Dateien:

Lesenswert?

ich schrieb:
> der WS war auf HIGH und nicht auf LOW

Dann hast Du ein anderes Board als alle Anderen, siehe Bild.

von ich (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Kai,
nein habe ich nicht (siehe Anhang).
Pollin hat den richtigen Schaltplan aber nicht die richtige Tabelle oder 
das Board. Kann sein dass das Problem bei der 2.0.1 Version behoben 
wurde habe nämlich ein 2.0.0.

LG

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.