Forum: Mikrocontroller und Digitale Elektronik Countdown Timer EEprom


von Kai B. (tekasiko)


Angehängte Dateien:

Lesenswert?

Hallo,

Bascom Programm und schaltpläne sind angehängt.

In diesem Programm läuft ein Timer ab, nach ablauf wird ein Relais 
geschaltet und ein Alarmton ausgegeben.

Soweit funktioniert alles.

Im Programm gint es eine Vartiable " C " je nachdem welchen Wert ich für 
C eingebe, wird dieser im Internen EEprom des Atmega 8 gespeichert, 
dieser Wert wird nach dem Reset aus dem EEprom geholt und der Timer 
starte von vorne.

Programm funktioniert Tadelos, falls es jemand Brauchen kann Prog ist im 
Anhang.


So nun zu meinem Problem, ich möchte diesen Wert nicht im Internen 
EEprom sondern im Externen I²C EEprom abspeichern,
hat jemand evtl eine Idee wie ich das bewerksteligen Kann?

EEprom ist ein 24C02

Lg Kai

von Helfer (Gast)


Lesenswert?


von Kai B. (tekasiko)


Lesenswert?

Hallo Helfer,

dieser Beitrag ist auch von mir,

ist nun gelöst.

Also auf das externe EEprom schreiben geht, aber wie binde ich das in 
das oben vorgestellte Programm ein?

von Kai B. (tekasiko)


Angehängte Dateien:

Lesenswert?

Hallo habe den Bascom Code angehängt, Hardware ist die selbe.

Habe das Programm geschrieben, weis aber nicht mehr weiter.

Wie kann ich den Wert aus dem EEprom auslesen und als Variable C 
benutzen?

Weis jemand wo das Problem im Programm liegt??

Fehlermeldungen habe ich keine.

von H.Joachim S. (crazyhorse)


Lesenswert?

statt
I2crbyte Lesen , Nack                        'Lese Wert aus EEprom
so
I2crbyte C , Nack

Was versprichst du dir aber davon, externes EEPROM zu verwenden?

von Kai B. (tekasiko)


Lesenswert?

Hallo Joachim,

versuch gleich mal aus.

Das wird eine art Timer der jede minute den wert auf dem eeprom 
zurückschreiben soll bzw. abziehen.

Da ich den Internen eeprom nur 100.000 mal sprich 100.000 Minuten 
beschreiben kann und den Externen 1.000.000 mal bietet sich das 
natürlich an diesen zu verwenden.

Danke werd es mal testen.

von Kai B. (tekasiko)


Lesenswert?

Ja hattest recht,

so funktioniert es jetzt.

Vielen Dank

von Falk B. (falk)


Lesenswert?

@  Kai Burghart (tekasiko)

>Da ich den Internen eeprom nur 100.000 mal sprich 100.000 Minuten

Das sind 70 Tage, etwas mehr als 2 Monate.

>beschreiben kann und den Externen 1.000.000 mal bietet sich das

Das sind 700 Tage, knapp zwei Jahre.

Und wenn man es richtig macht, reicht auch der interne EEPROM ewig.

http://www.mikrocontroller.net/articles/Speicher#EEPROM_Schreibzugriffe_minimieren

MFG
Falk

von Kai B. (tekasiko)


Lesenswert?

Hallo Falk,

ja das würde wohl gehen,

aber der externe EEprom ist eine SmartCard die von Benutzer zu Benutzer 
unterschiedliche Werte hat, daher fällt der interne Speicher aus.

Aber vielen Dank für den Tipp

von Kai B. (tekasiko)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

So der EEprom läuft.

Nun möchte ich statt dem 24C02 EEprom einen 14C02 EEprom (Chipkarte)
Beschreiben und lesen.

Das funktioniert nicht mit dem oben genannten Programm.

Ich denke das die Adressen &HA0 und HA1 in diesem Fall nicht korekt 
sind, da ich als Ausgabe immer 255 habe, das bedeutet ja die Karte ist 
leer.

Weis jemand von euch was die korekte adresse ist?

Datenblatt der Karte habe ich angehängt.

Vielen Dank schon mal.

von holger (Gast)


Lesenswert?

>Weis jemand von euch was die korekte adresse ist?

Steht auf der ersten Seite: Es ist 0xA0

von Kai B. (tekasiko)


Lesenswert?

Halo Holger,

wenn ich aber

I2cstart                                              'Start I2C
I2cwbyte &0XA0                                        'Sende Slave 
adresse
I2cwbyte A
I2cwbyte X                                            'Sende Wert
I2cstop                                               'Stop I2C
Waitms 10

eingebe, habe ich immer eine Fehlermeldung

Invalid Datatype [[0011]0[&0XA0]]
Variable not dimensioned [0->0]

von holger (Gast)


Lesenswert?

>wenn ich aber
>
>I2cwbyte &0XA0                                        'Sende Slave
>
>eingebe, habe ich immer eine Fehlermeldung

>Invalid Datatype [[0011]0[&0XA0]]
>Variable not dimensioned [0->0]

Nimm halt

I2cwbyte &HA0                                        'Sende Slave

Wenns damit nicht geht schliess die Karte richtig an;)

von Kai B. (tekasiko)


Lesenswert?

Hallo,

habe die Karte richtig angeschlossen,

SCL und SDA auf SCL und SDA

VCC auf VCC

Gnd auf Gnd

und die anderen 2 auf Gnd

Ist richtig oder?

Karte hat 6 Kontakte die mittleren 2 sin nicht belegt daher auf Gnd

Klappt nicht, bekomme immer 255

von Kai B. (tekasiko)


Lesenswert?

So nun funktioniert es,

habe alles nochmal überprüft, war tatsächlich falsch angeschlossen.

Vielen Dank

von Kai B. (tekasiko)


Angehängte Dateien:

Lesenswert?

Hallo nochmal,

so das Schreiben funktioniert jetzt,

Code ist angehängt, Datenblatt in meinem vorherigen Beitrag.

Jetzt möchte Ich C als Variable Haben (irgend ein Wert zwischen 0-99)

Zudem möchte ich noch einen Namen einfügen.

Sprich wenn ich die Karte einschiebe, start drücke sollte er die Karte 
beschreiben mit

Bsp:

Kai Burghart
60

Momentan kann ich ja nur den Wert "60" schreiben, und diesen wieder 
auslesen.

Wenn ich aber "Kai Burghart" schreiben will und die "60" in einen 
anderen Block und den wieder auslesen will, wie kann ich das machen?

Die Adresse &HA0 und &HA1 sind für die Variable belegt in diesem Fall 
"60"

Jetzt brauche ich eine andere Adresse für "Kai Burghart"

Bitte helft mir ich verzweifle hier.

Vielen dank schon mal für eure mühe.

von H.Joachim S. (crazyhorse)


Lesenswert?

Mir scheint, du hast die Funktionsweise noch nicht verstanden...
0xA0 und 0xA1 sind die Adressen des Bausteins, nicht die der einzelnen 
Speicherplätze.
Sinnvollerweise drehst du die Sache rum, da die Zeit eine feste Breite 
(Integer, 2 Byte?) hat.
Anschliessend kommt der string mit dem Namen, die Länge ist naturgemäss 
variabel.
Also den Zahlenwert schreibst/liest du aus Adresse 0 und 1 (oder nur 0, 
falls nur ein Byte.
Der string beginnt entsprechend bei Adresse 1 (oder 2) und wird mit 
einer 0 beendet.
Für den Namen schreibst du einfach die ASCII-Codes der Zeichenkette ins 
EEPROM, anschliessend eine 0 (Stringende).
Lesen beginnt dann bei 1 (oder 2), solange bis die 0 erreicht wird.
Bei der Stringverarbeitung von Bascom muss ich jetzt allerdings passen.

von Kai B. (tekasiko)


Lesenswert?

Hallo Joachim,

ich gebe zu, ich versteh das ganze EEprom nicht wirklich.

köntest du mir das bitte ein bischen genauer erklären?

Wäre dir sehr dankbar dafür.

von H.Joachim S. (crazyhorse)


Lesenswert?

Stell die eine Schublade mit 256 Fächern vor, an eine bestimmte Stelle 
willst du was legen oder herausnehmen.
Blöderweise gibt es mehrere solche Schubladen - und nun stehst du dumm 
da. Ohne zu wissen, welche Schublade und welches Fach kannst du damit 
nichts anfangen.
Auch wenn es bei dir nur eine Schublade (dein EEPROM) gibt, es könnten 
sich noch andere Dinge dort befinden.
Der übliche Weg: gehe zur richtigen Schublade (0xA0) und lege was in das 
richtige Fach (Byteadresse), wie im richtigen Leben. Für den Fall, dass 
du etwas herausnehmen möchtest, heisst die Adresse nicht mehr 0xA0, 
sondern 0xA1, um dem Baustein mitzuteilen, dass du lesen willst.

Jetzt gibt es oft die Fälle, dass du nicht nur eine Sache schreiben oder 
lesen willst, sondern mehrere hintereinander. Dazu muss dann nicht jedes 
Mal die ganze Prozedur (gehe in den Raum, suche die Schublade, suche das 
Fach, lege oder nimm was aus dem Fach) gemacht werden, sondern es kann 
hintereinander mehreres getan werden. Das geht sowohl beim Schreiben 
(page write) als auch beim Lesen.

von Kai B. (tekasiko)


Lesenswert?

@ALL

Wollte mich noch bei euch allen bedanken,

hat alles soweit funktioniert dank eurer Hilfe.

Danke.

Liebe Grüße

Kai

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.