PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Selektiver Zugriff auf EEPROM Datendatei



Stray_Cat
17.03.2009, 19:27
Hallo allerseits!

Ich suche verzweifelt seit einigen Tagen nach der Lösung für IMHO ein simples Problem bei der Speicherung der Daten in EEPROM der CC.

Zu meinem Projekt. Ich habe mich beriet erklärt, den Codeschloß für unsere Kaffeemaschine (bitte nicht lachen!) zu entwickelt. Der Hintergrund ist, dass ziemlich viele Kollegen es immer wieder vergessen, den Strich nach jedem Kaffeebezug zu machen und wir so im Schnitt ca. 20-25% nicht bezahlte Tassen feststellen müssen.

Dafür habe ich eine alte CC Main Unit mit der Aplicationboard samt LCD und Tastatur ausgekramt und nach kurzer Einarbeitung mir ein Programm gestrickt, was den 4-stelligen Benutzercode über Tastatur abfragt, ihn mit der Tabelle aller Benutzercodes vergleicht und beim Übereinstimmen das Relais für die Bezugstaste der Kaffeemaschine frei schaltet. Das LCD gibt dabei den aktuellen Status wieder (Code OK usw). Dafür bekommt jeder User von mir einen Code über den er auch später bei der Abrechnung identifiziert werden soll. Soweit, so gut. Alles läuft. Nur will ich natürlich an Ende (bei der Abrechnung) wissen, wer wie viele Tassen getrunken hat, sprich wie viel mal sich der jeweilige Benutzer mit seinem Code an der Maschine eingelogt hat. Ich habe bisher keine zufriedenstellende Lösung gefunden, wie man die Kaffeebezüge des jeweiligen Benutzers dauerhaft speichert (auch beim Stromausfall), ständig aktualisiert (nach dem neuen Bezug hoch zählt) und dann nach dem Auslesen der Datei (via RS232) wieder löscht. Die EEPROM Datei Funktionen (READ, WRITE, APPEND...) führen mich nicht zum Ziel, da damit jedes mal nur die komplette Datei und nicht die einzelne Einträge verändert werden können.

Ich würde mich wirklich SEHR über ein Paar konstruktive Vorschlage freuen. Ich muss das Teil auf jeden Fall fertig bekommen, sonst droht mir eine totale Verspottung im Kollegenkreis :)

mfg

Andreas

Jörn Arne
18.03.2009, 19:47
Hallo Andreas!

Reden wir hier von der C-Control 1? Also einer der ersten C-Controls?
Dann hast du schlechte Karten, was dein Vorhaben betrifft. Die Unit unterstützt das Ansprechen einer beliebigen Zelle leider nicht. (Selbst aktuellere können das nicht)
Auch das Auslesen und dann Auswerten (in der C-Control) wird schwierig, da du nur 25bytes Speicher hast, und auch keinen Array zugriff (keine Pointer)

Was aber geht, ist ein kleiner serieller speicher, den du über eine 2 Draht Schnittstelle ansteuern kannst. Zum Beispiel ein 24CXX, 93CXX über I2C. Oder ein Speicher, der sich über eine 4 Draht Schnittstelle bedienen lässt (AT59CXX) Ein kleiner Softwaretreiber für die Schnittstelle und du hasst einen ROM mit beliebigem Zugriff.

Gruß
Jörn

Stray_Cat
19.03.2009, 09:54
Hallo Andreas!

Dann hast du schlechte Karten, was dein Vorhaben betrifft. Die Unit unterstützt das Ansprechen einer beliebigen Zelle leider nicht. (Selbst aktuellere können das nicht)
Auch das Auslesen und dann Auswerten (in der C-Control) wird schwierig, da du nur 25bytes Speicher hast, und auch keinen Array zugriff (keine Pointer)


Danke, Jörn!
So etwas ähnliches habe ich mir fast gedacht. Gibt es denn nicht die Möglichkeit, mittels Assembler die Speicherzellen direkt anzusprechen?

joergm6
19.03.2009, 15:19
Hallo Andreas,

du wolltest doch bestimmt noch mal genau schreiben, welche C-Control du hast und womit du programmierst. :-b

Wenn möglich würde ich 2€ für einen I2C-EEPROM ausgeben (24Cxxx). Sicher abhängig von deiner C-Control, wegen I2C-Unterstützung.

Gruß Jörg

Stray_Cat
19.03.2009, 16:42
Hallo Andreas,

du wolltest doch bestimmt noch mal genau schreiben, welche C-Control du hast und womit du programmierst. :-b


Sorry! Ist mir im Eifer des Programmierens entfallen. Also ich habe als HW den CC-I Main Unit + App.Board (siehe Bild).
Und als IDE benutze ich WORKBENCH++ in der letzten Version.
Den Aufwand mit dem neuen EEPROM wollte ich eigenlich meiden. [-X
http://ccontrol.csslabs.de/images/stories/products/app1app.jpg

joergm6
19.03.2009, 19:25
Hallo Andreas,

ok, überredet, für einfache I2C Nutzung ist die Unit doch zu alt.

Aber beim genauen überlegen, wo ist dein Problem?

Immer wenn Jemand einen richtigen Code eingibt, kannst du diesen Code (Word-Variable) mit
Open# for append
an die vorhandenen Daten anhängen. Damit weist du dieser Kunde hat eine Tasse getrunken. Für jede Tasse werden also 2Byte angehängt. Wenn du z.B. 1k freien Speicher hast, passen da 500 Tassen rein.

Nun kommt deine Auswertung. diese öffnet die Daten mit Open# for read und du liest alle Werte aus und gibst diese auf die serielle mit angeschlossenem PC aus. Die Anzahl jeder Codenummer sind die Tassen und sicher leicht am PC herauszubekommen.
Zum Schluss der Übertragung machst du ein Open# for write, womit die Daten auf Anfang gesetzt werden, also alle Daten "gelöscht".

Um noch mehr Platz zu haben, kannst du natürlich jedem Code auch eine Position zuordnen, z.B. die in der Table und du brauchst nur 1 Byte Datenplatz pro Tasse.

Edit: ne, geht nicht, es werden im 2byte pro Write geschrieben.

Gruß Jörg

Stray_Cat
19.03.2009, 20:43
Immer wenn Jemand einen richtigen Code eingibt, kannst du diesen Code (Word-Variable) mit
Open# for append
an die vorhandenen Daten anhängen. Damit weist du dieser Kunde hat eine Tasse getrunken. Für jede Tasse werden also 2Byte angehängt. Wenn du z.B. 1k freien Speicher hast, passen da 500 Tassen rein.

Nun kommt deine Auswertung. diese öffnet die Daten mit Open# for read und du liest alle Werte aus und gibst diese auf die serielle mit angeschlossenem PC aus. Die Anzahl jeder Codenummer sind die Tassen und sicher leicht am PC herauszubekommen.
Zum Schluss der Übertragung machst du ein Open# for write, womit die Daten auf Anfang gesetzt werden, also alle Daten "gelöscht".

Genau so habe ich das auch letzten Endes gelöst. Aber programmiertechnisch ist das aus meiner Sicht nicht die eleganteste Lösung - den Speicher voll zu schreiben obwohl eigentlich nur wenige Einträge vonnöten wären. Irgendwie lässt das mich nicht zufrieden...
Habe zwar von Assembler keine Ahnung aber mein Bauchgefühl sagt mir, dass die Lösung dort zu finden wäre.

joergm6
19.03.2009, 22:46
Hallo Andreas,

habe noch was gefunden, schaue mal hier.
http://ccintern.dharlos.de/forum/lesen.php?eintrag=3919
Bei cctools gibt es einen multitreiber zum download, womit du so wie hier auf direkte Speicherzellen >8000 zugrefen kannst. Solange dein Programm nicht zu groß wird, würden diese Speicherzellen auch nach einem neuen Programmupload nicht zerstört werden. Probiere mal :-).

Gruß Jörg

Stray_Cat
20.03.2009, 17:04
Danke!
Ich glaube das ist das, wonach ich gesucht habe. Ich werde es bei der Gelegenheit ausprobieren...