Archiv verlassen und diese Seite im Standarddesign anzeigen : Speichern auf SD Karte oder USB Stift?
Accenter
01.08.2010, 22:09
Ich suche eine Möglichkeit Variablen dauerhaft abzuspeichern. Kann ich mit Bascom jede SD Karte verwenden oder ist das in der Grösse limitiert? Der Datenspeicher muss extern nicht auslesbar sein in meinem Fall. Ein USB Stift würde auch in Frage kommen falls das einfacher zu handhaben ist.
Habe bisher nur immer im Eeprom Daten abgelegt aber brauche jetzt etwas mehr Platz. Hat jemand für mich einen Beispielcode wie ich Daten in einer SD Karte ablege und anschliessend wieder einlese? Wie ich die SD Karte an den Atmel anschliesse würde mich auch noch interessieren.
USB einfacher zu handhaben? Weiß ich nicht. Ich weiß nur, dass wenn du einen USB-Stick benutzt brauchst du einen USB-Controller sonst klappt das nicht. Zum beschreiben einer SD-Karte solltest du dich hier mal umschauen:
-> http://members.aon.at/voegel/index.html
Wenn du die Daten am PC auslesen willst, also eine Karte mit FAT32 beschreiben willst brauchst du mind. einen Mega128 sonst klappt das von der RAM-Größe her nicht. Es gibt auch eine Möglichkeit AVR-DOS auf einen Mega32 zu quetschen nur dafür musst du 1. das AVR-DOS verstehen und 2. brauchst du zum Auslesen am PC dann spezielle Programme die die Sektoren der SD-Karte lesen können (soweit ich weiß).
Das nächste Problem ist wenn du eine SD-Karte nimmst mit AVR-DOS brauchst du eine Bascom-Lizenz da das AVR-DOS riesig groß ist.
Aber sobald du das alles hast musst du nur 4 Pins vom Controller an die Karte anschließen (mit geeignetem Pegelwandler natürlich, am besten ein IC kein Spannungsteiler das funktioniert nicht super gut) und dann kannst du via Print-Befehl die Daten auf die Karte schreiben.
Wenn du noch weitere Fragen zur SD-Karte hast, frag ruhig hab mir letztens erst selber einen SD-Karten Temperaturlogger gebaut :)
Accenter
01.08.2010, 22:41
Danke für deine Hilfe. Am PC muss ich keine gespeichrte Daten uaswerten. Die SD Karte bleibt dauerhaft am Mega128. Brauch ich bestimmte Ports frei am mega128? Ist nämlich schon ziemlich voll alles :-) Ich möchte einfach vom internen Eeprom des mega128 wegkommen, da es mir nicht gefällt, dass die Speicherungen begrenzt sind und der Speicher dann mal defekt wird.
Nachdem ich jetzt gesehen habe, dass ich bei der SD Karte 4 Datenleitungen benötige überlege ich ob es wohl nicht doch ne andere Möglichkeit (z.B. I2C) zum speichern gibt. Sind die Speicherzyklen da auch begrenzt bei den I2C Eeproms?
Bei einer SD-Karte und einem USB-Stick sind die Zyklen auch begrenzt. Und bestimmte Ports....jein. Du kannst das entweder mit Hardware UART machen was Programmierarbeit spart oder mit Software-UART was mehr Programmierarbeit ist.
hardware.bas
02.08.2010, 08:00
Hallo, Kampi, sorry, wenn ich mich hier mal kurz einklinke, jedoch gehört
das möglicherweise zum Thema. Deine Realisierung eines Temperaturloggers auf SD-Card ist genau das, was ich suche. das
Projekt möchte ich auch mit einem ATmega lösen. Vielen Dank und viele Grüsse. Micha
Kein Problem O:)
Wobei brauchst du den Hilfe bzw. hast du schon einen Realisierungsansatz?
Wenns nur um Variablen geht und eh nicht von aussen gelesen werden muss: Einfach nen I2C-EEPROM hinhängen, z.B. von Reichelt irgend nen "ST 24C".
Vorteil an SD-Karten / I2C-EEPROM (gesockelt!) ist halt der, dass man die am Ende der Lebensdauer einfach austauschen kann. Wobei die aber eigentlich eh "ewig" halten.
Ich hab nen Fahrtenschreiber, der mir pro Sekunde 10x 55 Byte auf die Karte wirft und das seit nem guten halben Jahr; und so zeigt die Karte bisher keine Ausfallerscheinungen.
Für AVR-DOS braucht man am PC kein anderes Programm ausser dem Explorer. Das ist ja der Sinn, dass ein auf FAT basierendes DOS verwendet wird.
Wenn die Hardware aber da ist, würd ich bei ner Karte dann schon FAT(32) verwenden. Das Sektorenweise auslesen/schreiben spart zwar Ressourcen und Zeit am AVR, aber wenn man dann doch mal die Daten am PC anschauen will, wirds eklig.
Mit FAT: Einfach als CSV abspeichern, in Excel aufmachen und auswerten.
Kurz: Wenn du nur wenige Daten hast und dir ein ST24C von der Grösse her reicht: Einfachste Möglichkeit.
Alternativ kannst du es auch so machen das du eine zusätzliche Variable machst die einen Zeiger für die Speicherzelle darstellt. Dann stellst du den Zeiger auf 0 und speicherst die Variable dort. Dann zählst du diese Variable um eins hoch sodass de Variable dann in Zelle 1 gespeichert wird. Und das machst du dann bis zum Ende des EEPROMs (z.B. bei 255 Zellen machst du das 255 mal). Und jedesmal wenn du den Zeiger um Eins addierst und nachdem du die neue Zelle beschrieben hast löscht du die vorherige. Sobald du am Ende vom EEPROM angekommen bist fängst du wieder bei 0 an.
Das Auslesen machst du dann so indem zu eine Zelle ließt und schaust ob der Inhalt 255 (leere Zelle) ist. Wenn ja springst du eine Zelle weiter und wiederholst das. Wenn nicht ließt du die Zelle aus.
So hast du, wenn du das Beispiel mit 255 Zellen nimmst, eine Lebensdauer von 255x100.000 Zyklen und das dürfte denk ich mal dicke ausreichen, vorallem da die meisten EEPROMs mehr als 255 Zellen haben :D
Hallo ich habe einen FDI USB Host für Sticks, klappt ganz gut und wird
per RS232 vom AVR bedient. Ist aber recht teuer. :-( SD Karten lassen
sich recht einfach beschreiben/lesen wenn auf PC Auswertung verzichtet
wird. Das dürfte günstiger werden. Wenn dann die Daten doch am PC
gebraucht werden, auslesen und per RS 232 zum PC schieben das klappt
auch ohne DOS. :-)
Gruß Richard
Der "komplizierte" Teil zum beschreiben einer SD-Karte um sie am PC auswerten zu können ist ja nur das AVR-DOS. Aber wenn man damit nichts großartiges machen will ist das beschreiben der Karten auch ziemlich einfach.....vorrausgesetzt man hat einen passenden Controller dafür 8-[
Der "komplizierte" Teil zum beschreiben einer SD-Karte um sie am PC auswerten zu können ist ja nur das AVR-DOS. Aber wenn man damit nichts großartiges machen will ist das beschreiben der Karten auch ziemlich einfach.....vorrausgesetzt man hat einen passenden Controller dafür 8-[
So etwas... http://www.dosonchip.com/ ..?
Gruß Richard
Accenter
02.08.2010, 14:20
@jaecko
Danke für die Infos. Ich werde mir einen ST24C EEprom besorgen. Ich habe bisher nur Erfahrungen mit dem internen Eeprom vom Mega128. Ganz leihenhaft habe ich hier einfach immer so gespeichert:
writeeeprom , variable1 , 10
writeeeprom , variable2 , 20
Über die Grösse meiner zu speichernden Daten musste ich mir bisher nie sorgen machen drum habe ich die Speicheradresse immer in 10er Schritten erhöht. Wäre aber mal höchste Zeit zu wissen, welche Variablen mir wieviel Speicher belegen.
Wäre toll wenn mir da jemand mal weiter helfen könnte.
Es hängt von der Variable ab wie groß die sind. Eine Zelle im EEPROM kann eine Zahl bis zu 255, oder FF, Bit aufnehmen.
Eine Variable als Bit ist nur 0 und 1 also 1 Bit dementsprechend. Ein Byte hingegen geht bis 255.
Das heißt in 1 Zelle passt 1 Byte.
Wenn du nun ein Integer hast, welcher aus 65536 Bit besteht, brauchst du 2 Byte (256 x 256). Darauf musst du beim auslesen achten. Wenn du einen Integer von 400 abspeicherst, speichert der Controller in die eine Zelle FF und den Rest von 145 dann in eine zweite Zelle. Dementsprechend musst du auch diese beiden Zellen auslesen und die Zahl zusammenflicken.
Hoffe das ist verständlich und schlüssig 8-[
Accenter
02.08.2010, 14:41
Danke für die tolle Erklärung. Wie sieht das bei Strings aus? In meinem Fall werde ich wohl Strings die eine Länge von 20 Zeichen haben speichern. Wie sieht es da mit der Speicheraufteilung aus?
Naja die Grösse der Variablen weisst du ja durch deren Deklaration.
Byte = 1 Byte
Word = 2 Byte
String = Anzahl Zeichen + 1
etc.
Zum Abspeichern auf das ext. EEPROM musst du die Variablen sowieso in einzelne Bytes zerlegen und die dann senden.
z.B.
byteLow = word AND &HFF
byteHigh = word / 256
Beim Laden entsprechend wieder zusammenbauen.
word = byteHigh * 256
word = word + byteLow
In C könnte man einfach ne Struct mit allen nötigen Variablen anlegen und dann nen Byte-Zeiger drüberschieben. Ob das in Bascom geht, wüsst ich jetzt nicht genau. So extrem hab ich Bascom nie betrieben.
Accenter
02.08.2010, 20:25
Hab ich das richtig verstanden, dass man nur bei den grösseren Eeproms das ganze zerlegen muss? Habe das hier gelesen:
http://www.rn-wissen.de/index.php/Bascom_und_I2C_EEprom
Beim 24C16 ist das also nicht nötig, oder? Wie adressiere ich dieses Eeprom richtig? Habe gesehen da gibts A0,A1,A2
Durch mein Platinenlayout habe ich die Adressierung schon vorgegeben. A0 ist bei mir auf +5V, A1 und A2 auf GND. Welche Adresse habe ich dann? Kann mir die Adressierung mit einem DS1307 in die Quere kommen? Fragen über Fragen...
Die EEPROMs haben eine feste Grundadresse. Diese steht im Datenblatt. Dazu kommt dann noch die Adresse durch die Pins und 1 Bit wenn du lesen willst oder eine 0 wenn du schreiben willst.
Normal dürfte das EEPROM nicht mit der RTC in Kontakt kommen von der Adresse her. Und wenn doch änderst du einfach einen Adresspin.
Und die Zahl musst du bei jedem EEPROM zerlegen, weil in ein EEPROM nur eine Zahl reinpasst und wenn die Zahl dann größer als 255 ist passt die nicht in eine Zelle.
Accenter
02.08.2010, 22:30
Wie speichere ich dann einen String mir 20 Zeichen ab? Wäre sehr dankbar für einige Zeilen Code damit ich das verstehe. hab gehofft das geht so einfach wie mit dem internen Eeprom der Atmels.
Das geht auch so einfach wie das interne EEPROM beschreiben, außer das vor dem eigentlichen Schreibvorgang die I2C Routine kommt.
Accenter
02.08.2010, 23:22
Ich habe aber mit dem internen Eeprom ohne irgendwas zerlegen zu müssen immer lange Strings abgespeichert. Ich hab dann einfach (nachdem ich noch nicht wusste wieviel Speicher das belegt Platz gelassen bei der Speicheradresse)
Beispiel:
writeeeprom "abcdefghijklmnopq" , 20
writeeeprom "123456789101112" , 50
Das sollte dann auch beim i2C Eeprom so klappen oder? Wieviel Speicher ein String verbraucht weiss ich ja jetzt schon dank der Erklärung oben :-)
Klar das I2C EEPROM verhält sich wie ein normales EEPROM. Nur wenn du diesen String auslesen willst musst du die Zellen auch richtig rum lesen und zusammensetzen.
Accenter
03.08.2010, 15:13
Ich speichere immer Variablen ab, da kann ich die Variable dann auch wieder ganz leicht einlesen (ohne zusammensetzen):
writeeeprom Variable , 10
readeeprom Variable , 10
Bei einem 24C16 Eeprom habe ich dann 16000 Speicherzellen? Sehe ich das richtig?
Zum schreiben also einfach bei "A" Die Speicheradresse (1-16000) einsetzen?
I2cstart 'Start I2C
I2cwbyte &HA0 'Sende Slave Adresse
I2cwbyte A 'Sende Speicheradresse
I2cwbyte X 'Sende Wert
I2cstop 'Stop I2C
Waitms 10 'warte 10ms
24C16 = 16 kBit Speicher, d.h. 2048 Bytes (16 kBit * 1024 / 8)
In dem Fall musst du etwas mehr senden:
I2cstart
I2cwbyte &HA0 'Slave-Adresse, ausgewählt mit A0/A1/A2
I2cwbyte AH 'Speicherzelle High
I2cwbyte AL 'Speicherzelle Low
I2cwbyte X 'Zu speicherndes Byte
I2cstop
Die Aufteilung mit High und Low ist nötig, da der EEPROM grösser als 255 Byte ist. Bei dem externen bleibt dir aber nichts übrig; da musst du vor dem Speichern zerlegen bzw. nach dem Lesen wieder zusammenbauen.
Aber da kann man sich ja auch Funktionen schreiben, die das übernehmen und die dann einfach aufrufen.
Eigentlich könnte Bascom ja mal ne fertige Funktion dafür Aufnehmen; die I2C-EEPROMS sind ja doch gebräuchlicher als einige Displays, die Bascom schon kennt.
Accenter
04.08.2010, 11:14
Fürchte da muss ich auf die fertige Bascom Funktion warten :-) Das scheint mir dann doch komplizierter zu werden als befürchtet. Ich glaube ich komm da wieder auf die SD Karte zurück. Da funktioniert das ja einfach über "Print" was ich so gesehen habe. Gibts sonst noch Möglichkeiten genau so einfach wie im internen EEprom der Atmels zu speichern?
Der Datenspeicher muss extern nicht auslesbar sein in meinem Fall.
In dem Fall kannst du doch die Befehle
DriveReadSector und DriveWriteSector
benutzen.
Mit DriveWriteSector schreibst du einen bis zu 512-Byte großen Block voll mit Daten und gibst ihn an eine bestimmten Sector der Karte aus. Den Sector kannst du direkt adressieren. Entsprechend kannst du einen Sektor von der Karte einlesen.
Du kannst auch deinen 20 Zeichen längen String in einen Block speichern und den Rest verkommen lassen. hängt halt davon ab, wie groß dein datenaufkommen ist. Ich benutze 2GB große Karten mit knapp 4.000.000 Sektoren. Dann könntest du 4.000.000 Datensätze speichern.
Du solltest dazu aber ein 512-Byte großes Array im SRAM frei haben.
Hat jemand für mich einen Beispielcode wie ich Daten in einer SD Karte ablege und anschliessend wieder einlese? Wie ich die SD Karte an den Atmel anschliesse würde mich auch noch interessieren.
Schau mal in der Hilfe zu den beiden Befehlen.
Zum Anschließen schau mal hier: www.ulrichradig.de
Accenter
10.08.2010, 11:47
danke, werde ich mir ansehen.
hardware.bas
10.08.2010, 19:50
Hab mich jetzt für die Speicherung auf USB-Stick entschlossen.
Verwendung findet der Logger von ELV, bisher hatte ich ihn per RS232 mit
einer C-Control betrieben. Funktionierte ganz gut, leider muss mit einer
Taste die Datenübertragung manuell gestartet und gestoppt werden. Da ich
diesen jetzt mit einem AVR betreiben werde, wir das Start/Stop-Prozedere automatisiert und der MAX232 umgangen. Mal sehen, obs klappt. VG Micha
mat-sche
11.08.2010, 19:59
hi Ihr's,
nun mal nen kleinen Link von mir:
http://mikrocontroller.heldt.eu/index.php?page=atmega324p-sd-card-logger
Warum neu erfinden wenn es schon die "perfekte" Lösung gibt? Schickt dem Thomas nen Dankeschön! und beachtet seine "Lizensierung" :)
MAT
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.