PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SD-Karte mit AVR-DOS oder ohne??



brutzler
04.02.2008, 22:50
Hallo,

ich will mir einen kleinen Datenlogger bauen (2 Temperaturen) und die Daten dann auf dem PC weiterverarbeiten.

Da dachte ich an einen AVR mit SD/MMC-Karte als Speichermedium.

Da hab ich ja jetzt 2 Möglichkeiten.

A) Einfach in definierte Speicherbereiche auf der Karte schreiben und dann auf dem PC schauen, wie ich die Daten wieder auslesen kann. Ein passendes Programm dazu hab ich noch nicht gefunden. Kennt ihr eins? :-k

B) Die SD-Karte mit FAT zu beschreiben (Stichwort AVR-DOS). Das ist dann zwar auf dem PC einfacher, aber dazu brauch ich einen "großen" AVR mit mindestens 2K RAM. Ich will nur DIL verbauen. Da hab ich dann nur den ATMEGA32, ATMEGA644(beide DIL40), oder den ATMEGA328P (DIL28) gefunden.
Läuft AVR-DOS auch auf allen? Sonst liest man ja nur auf dem ATMEAG128 oder ATMEGA103. Aber den 128er gibts nich in DIL und den 103er hab ich bei Atmel gar nicht gefunden.

Oder habt ihr noch ne andere Lösung, die ich jetzt nicht sehe?


Mist, glaube falsches Forum. Kann mal jemand den Beitrag ins Bascom verschieben? Glaub da ist er besser aufgehoben

wassermann
05.02.2008, 04:33
Hallo brutzler,

zu A) DriveWriteSector and DriveReadSector.
zu B) Bei mir läufts auf nem ATMega32 mit ner 1GB-SD-Karte. Die Anwendung war ähnlich. 1-wire Sensoren und mitloggen.

Es gibt dazu auch bereits ein paar Threads. Schau mal nach MMC und Bascom.

gruss,
wassermann

brutzler
05.02.2008, 09:55
Moin, danke für die Antwort


zu A) DriveWriteSector and DriveReadSector.
Ich meinte nicht die Basom-Befehle, sondern eine entsprechende Software auf dem PC?

B)
Also heisst das, das AVR-DOS auf jedem Mega läuft, der 2K SRAM hat? Oder gibts da noch andere Einschränkungen?

wassermann
05.02.2008, 12:23
N'abend,

mit Variante A hab ich's mir per Abruf immer über die serielle Schnittstelle auf den PC geschickt und dort wieder zusammengestellt. Nach einem Programm hab ich nie gesucht, da es ja auch B gibt.
Variante B ist halt geschickter. Karte rein, mitschreiben, Karte raus, Daten auslesen, Karte rein, ...
Ich hab nur ATMega8 und 32. Wenn's mit einem anderen auch geht, relativiert sich schnell der Zeitvorteil, wenn man immer das gleiche (Standard)-Board nehmen kann. Deshalb bleib ich eben beim 32.

gruss,
wassermann

Bluesmash
05.02.2008, 12:36
Hallo!

Also ich hab mal testweise ein GPS-Loger gebaut, muss den mal fertigstellen...
Da habe ich auch nen M32 (RN-Control) verwendet und über AVR-Dos die GPS Koordinaten auf die Karte in ein file geschrieben welches dann am PC mit Google Earth geöffnet werden konnte.
funktionierte soweit eigentlich ganz gut... die längste fahrt war mal so ca 30min und die Datei konnte ohne probleme vom PC gelesen werden...

muss mal schauen irgendwo hab ich hier mal das angepasste AVR-Dos veröffentlicht...

gruss bluesmash

--Edit--
hier der link:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=22500&start=44
etwa in der mitte der 3. Seite

cave-rov
05.02.2008, 13:28
Für die Variante A) gibt es hier weitere Tipps:
http://staff.ltam.lu/feljc/electronics/electronics.htm

Robert

stekohl
06.04.2008, 14:12
Also genauso habe ich es bis jetzt auch gemacht (Variante A).

Dann in Delphi die folgende Prozedure genutzt.
Ich lese direkt zwei Sektoren aus!!


Procedure sektorlesen(sektor:longint;var buf);
var readbytes:longint;
buffersize:cardinal;
tt:file of byte;
const bu = 1024;
var av:integer;
begin
DeviceHandle := CreateFile(pchar(sdlw), GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,
FILE_FLAG_RANDOM_ACCESS, 0);
// midicon.JvEdit3.Text:=inttostr(getlasterror);
FileSeek(DeviceHandle, (sektor*1024), 0);
readbytes:=FileRead(DeviceHandle, Buf, bu);
// DeviceIoControl(DeviceHandle, IOCTL_DISK_GET_DRIVE_GEOMETRY, nil, 0,
// @DiskGeometry, sizeof(DiskGeometry), Dummy, nil)
CloseHandle(DeviceHandle);


end;


Auch für das Suchen der SD Karte gibt es eine Funktion.



function sdsuchen:string;
var a2,a3,a5:byte;
laufwerk:pchar;
b1,a4:longint;
testext:string[10];

const bu=1024;
begin
a2:=0;
while testext<>'MIDICONSK' do
begin
seterrormode(SEM_FAILCRITICALERRORS);
laufwerk:=pchar('\\.\PHYSICALDRIVE'+inttostr(a2));
DeviceHandle := CreateFile(laufwerk, GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,
FILE_FLAG_RANDOM_ACCESS, 0);



FileSeek(DeviceHandle, 1024, 0);
a4:=FileRead(DeviceHandle, buffer, bu);
testext:='' ;
a3:=getlasterror;


if a3 <> 0 then
begin
showmessage('Keine MIDICON formatierte SD-Karte gefunden');
exit;
end;
for a5:=1 to 9 do
testext:=testext+buffer[748+a5];
//showmessage('Alles ok');
// midicon.JvEdit3.Text:=inttostr(a3)+' '+inttostr(a2)+' '+inttostr(a4);
// midicon.JvEdit4.Text:='::'+testext+'#'+buffer[700+a5];

CloseHandle(DeviceHandle);
inc(a2);


end;
midicon.Memo1.lines.add('SD-KARTE gefunden');
midicon.Memo1.lines.add('SD-KARTE MIDICON FORMAT');
midicon.Memo1.lines.add('Windows Kennung: '+laufwerk);
result:=laufwerk;
end;


Die Karte habe ich per BASCOM Formatiert und jedem meiner 1000 Datensätze (je 2 Sektoren a 512 Byte) den Text MIDICON in ein Feld geschrieben. So kann ich die Karte sicher an dem Text erkennen.

Es gibt mit Sicherheit elegantere Lösungen, diese klappt jedoch.

!!!!ACHTUNG, per WIN API im und am Laufwerk herumfummel kann relativ unangenehm werden. Also am besten einen alten Rechner nehmen udn wichtige Daten vorher Sichern. Zu Zeiten von 8086 und 80386 habe ich mir nicht nur einmal mit Interruptroutinen meine Platten gelöscht. Es muß nix passieren, aber es kann.!!

Benutzung wie immer auf eigene Gefahr.

Gruß,

Stephan

Besserwessi
06.04.2008, 17:45
Da die Prozessoren sehr ähnlich sind, sollten die einzigen Vorraussetzungen für AVR DOS genügend Flash, 2 K RAM und eventuell eine SPI Schnittstelle sein. Ich würde mal schätzen das man bei 2 K RAM auch SPI und genügend Flash dazu kriegt.

Es gibt verschiedene Versionen von AVR-DOS. Eventuell sogar eine die mit weniger RAM auskommt.
Wenn man immer nur einen Datensatz draufschreiben will, könnte man auch erst die Daten nach Methode A) schreiben und dann nachträglich die FAT dazutun, die sieht dann ja immer fst gleich aus (bis auf die Länge der Datei).