PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenlogger mit MMC Karte



Gantenbein
01.10.2007, 13:57
Hallo,

ich möchte Daten auf einer SanDisk RS-MMC Karte abspeichern, am Ende sollen diese Daten in ca 10 Kolumnen abgespeichert werden.

Dummerweise schaffe ich es nur mittels Print#10 Vout1 eine Kolumne abzuspeichern, versuche ich Print#10 Vout1,Vout2 erscheint folgender Fehler: Error 15 Wrong Datatype[0:getclassname]
Die Daten liegen jedoch bereits alle im String Format vor -wie gefordert.
Versuche ich es mit Print#10 Vout1;Vout2 schreibt er zwar immerhin diese beiden Daten (jedenfalls bisher einmal) aber nicht Kolumnenweise sondern fortlaufend in einer Reihe.

Desweiteren habe ich das Problem, dass er gerade gar nichts mehr schreibt und das obwohl ich die Karte mit dem Panasonic SD Formatter Tool formatierte, seltsamerweise funktionierte das vorher immer.
Jetzt erstellt er zwar die Datei in die die Daten abgespeichtert werden sollen -speichert aber nichts mehr ab.

Hat jemand eine Idee wie man diese schöne Kolumnenweise Ausgabe ansonsten programmieren könnte und woran es liegen könnte, dass er zwar auf die Karte zugreifen kann, eine Datei erstellt aber nichts abspeichern kann?

linux_80
01.10.2007, 14:14
Hallo,

wenn das mit ; funktionert, könnte man doch mit chr(9) ein Tab dazwischen machen :-k

wassermann
01.10.2007, 14:32
@Gantenbein

so sollte es eigentlich funktionieren:
Das ; am Ende einer Zeile ist für fortlaufendes Loggen ohne CR/LF; ist keines vorhanden (vorletzte Zeile), wird ein CR/LF gemacht.
Das ";" ist für das separieren z.B. in Excel.
Mehr Spalten --> einfach dranhängen....

Print #ff , Time$;
Print #ff , ";";
Print #ff , Tmp ;
Print #ff , ";"
Close #ff

Eine Zeile in der Datei sieht also folgendermassen aus:
23:59:24;33.1875;

Beim Problem mit dem Zugriff kann ich leider nicht helfen, da ich mich selber grad mit sporadischem "Hängen" beim Datei erzeugen bzw. beim Lesen im PC zu beschäftigen versuche. Aber da könnte ich ja was von dir lernen....

gruss,
wassermann

Gantenbein
01.10.2007, 14:35
Bei AVR DOS müssen sämtliche dinge die mit einem Print Befehl ausgegeben werden ein string sein, ich hatte auch bereits versucht ein ";" dazwischenzusetzen, was seltsamerweise aber nicht funktionierte. Zudem besteht dann noch das Problem, dass ich zwar dann die Daten voneinander getrennt habe aber alles dennoch immer in einer Zeile fortläuft bis sie voll ist. Ich würde mich freuen wenn ich für jeden Schleifendurchlauf das heißt jede Messwertaufnahme eine einzelne Zeile hätte.

Dafür funktioniert nun diese einzeilige Ausgabe eines Wertes wenigstens wieder -warum auch immer.
Ich poste mal meinen code vielleicht findet ihr darinnen ja noch unstimmigkeiten, an denen es liegen könnte.




' Für die Displayansteuerung gilt:
' ------------------------------------------------------------------------------------------------------------
' Software-Grundlagen wurden von Peter Küsters, www.display3000.com ermittelt
' Weitere Displays, Platinen, Spezialstecker und fertige Module: www.display3000.com
' ------------------------------------------------------------------------------------------------------------

'
' ************************ WICHTIG !!!!! *******************************
' * Einstellungen in Bascom unter Options, Compiler, Chip *
' * HWSTACK-64 *
' * SWSTACK-128 *
' * FRAMESIZE-16 *
' ************************************************** **********************


'
$regfile = "m128def.dat" 'ATMega 8, anpassen bei anderen
$crystal = 8000000 '8 MHz Takt, bei höherem Takt muss evtl. die Ausgabegeschwindigkeit der Daten an das
'Display gedrosselt werden. Also erst mit 8 MHz testen um zu sehen, dass alles klappt,

$include "Config_MMC.BAS"
$include "CONFIG_AVR-DOS.BAS"


Dim Temp1 As Byte , Temp2 As Byte , Temp3 As Byte , Temp4 As Byte
Dim Drehung As Byte
Dim Fontbreite As Byte , Fonthoehe As Byte , Xpixel As Byte , Ypixel As Byte
Dim R As Integer , X1 As Byte , X2 As Byte , Y1 As Byte , Y2 As Byte , E As Byte , F As Integer , G As Long , Zeichen As String * 1
Dim A As Byte , B As Byte , C As Integer , D As Integer , T1 As Byte , T2 As Byte
Dim Befehl As Byte , Ausgabe As Byte
Dim Pix As Byte , Gapx As Double , Gapy As Double , S As Byte
Dim X As Byte , Y As Byte , H As Integer , M As Integer , Pixel As Integer , Schleife As Integer , Hx As Integer , Hy As Integer , Xinc As Integer , Yinc As Integer
Dim Temp As Byte
Dim Lcd_command As Byte , Lcd_data As Byte , Lcd_string As String * 22 , Fontsize As Byte , Lcd_fcolor As Byte , Lcd_bcolor As Byte
Dim Lx1 As Byte , Ly1 As Byte , Lx2 As Byte , Ly2 As Byte , Color As Byte , Zeichenarray(6) As Byte




'---------------------------------------------------------------------------------------------------------------------------------------------------
'Übernahme der aktuellen Portbelegung in Variablen bzw. Konstanten. Durch Änderung der folgenden Zeilen kann dass Programm auf jede andere Anschlussbelegung geändert werden,
'wenn man das Display in einer anderen Konfiguration (z.B. einem eigenen Board) nutzt.

Lcd_port Alias Portb 'Port B wird also hier im Programm mittels "LCD_Port" angesprochen.

Ddrb = &B01100110 'Port B: alles display lines: output (1)

Const Rs = 6 'also Port b.6
Const Cs = 5 'also Port b.5
Const Sdata = 2 'also Port b.2
Const Sclk = 1 'also Port b.1
'---------------------------------------------------------------------------------------------------------------------------------------------------

Const Kommando = 0 'Durch eine "0" wird dem Display mitgeteilt, dass nun ein Kommando folgt
Const Parameter = 1 'Durch eine "1" wird dem Display mitgeteilt, dass nun ein Parameter folgt

Const Blau = &B00000011 'Vordefinierte Konstanten für die Farbwerte machen das Programmiererleben leichter:
Const Gelb = &B11111100
Const Rot = &B11100000
Const Gruen = &B00011100
Const Schwarz = &B00000000
Const Weiss = &B11111111
Const Hellgruen = &B00111110
Const Dunkelgruen = &B00010100
Const Dunkelrot = &B10100000
Const Dunkelblau = &B00000010
Const Hellblau = &B00011111
Const Orange = &B11111000


'----------------------------------------------------------------------------------------------------------------------------------------------------



'####----AD-Wandler----#####'

Config Adc = Single , Prescaler = Auto , Reference = Internal

Start Adc

Config Portf.0 = Input 'Portf.0-3 =Input
Config Portf.1 = Input
Config Portf.2 = Input




'####----MMC-Karte----#####'

Config Serialin = Buffered , Size = 20
Config Clock = Soft
Enable Interrupts
Config Date = Dmy , Separator = .
Dim Btemp1 As Byte
Dim Text As String * 10 , Placeholder As String * 5
Placeholder = ";"



'####----Variablen----#####'

'Dim Sensor1(3)as String * 16

Dim Voutxw As Word
Dim Voutx As Single
Dim Voutxstr As String * 16
Dim Voutyw As Word
Dim Vouty As Single
Dim Voutystr As String * 16
Dim Voutzw As Word
Dim Voutz As Single
Dim Voutzstr As String * 16

'####----Switches----#####'



Dim Marker As Bit
Config Pind.4 = Input 'Marker
Portd.4 = 1

Config Pind.5 = Input 'RUN
Portd.5 = 1

Config Pind.6 = Input 'Halt
Portd.6 = 1




Dim Referenzspannung As Word
Referenzspannung = 3.85





'---------------------------------------------------------------------------------------------------------------------------------------------------
'Hauptprogramm
'---------------------------------------------------------------------------------------------------------------------------------------------------
Gosub Lcd_init
Gosub Lcd_cls



'---------------------------SD Anfang---------------------------------------------

If Gbdriveerror <> 0 Then
Lcd_string = "Drive error" : Lx1 = 5 : Ly1 = 50 : Fontsize = 1 : Lcd_fcolor = Rot : Lcd_bcolor = Weiss
Gosub Lcd_print
End If

' scratch byte
Btemp1 = Initfilesystem(1)

If Btemp1 > 0 Then
Lcd_string = "File System Error" : Lx1 = 4 : Ly1 = 51 : Fontsize = 1 : Lcd_fcolor = Rot : Lcd_bcolor = Weiss
Gosub Lcd_print
Lcd_string = Str(btemp1) : Lx1 = 5 : Ly1 = 52 : Fontsize = 1 : Lcd_fcolor = Rot : Lcd_bcolor = Weiss
Gosub Lcd_print

Else
'Else des Hauptprogramms
Lcd_string = "Card setup OK " : Lx1 = 5 : Ly1 = 51 : Fontsize = 1 : Lcd_fcolor = Gruen : Lcd_bcolor = Weiss
Gosub Lcd_print

Wait 5
Gosub Lcd_cls





Anfang:

Lcd_string = "Run" : Lx1 = 2 : Ly1 = 56 : Fontsize = 1 : Lcd_fcolor = Schwarz : Lcd_bcolor = Weiss
Gosub Lcd_print
Lcd_string = "Stop" : Lx1 = 18 : Ly1 = 56 : Fontsize = 1 : Lcd_fcolor = Schwarz : Lcd_bcolor = Weiss
Gosub Lcd_print


If Pind.5 = 0 Then

Lcd_string = "Voutx " : Lx1 = 2 : Ly1 = 50 : Fontsize = 1 : Lcd_fcolor = Dunkelgruen : Lcd_bcolor = Weiss
Gosub Lcd_print
Lcd_string = "Vouty " : Lx1 = 2 : Ly1 = 51 : Fontsize = 1 : Lcd_fcolor = Dunkelgruen : Lcd_bcolor = Weiss
Gosub Lcd_print
Lcd_string = "Voutz " : Lx1 = 2 : Ly1 = 52 : Fontsize = 1 : Lcd_fcolor = Dunkelgruen : Lcd_bcolor = Weiss
Gosub Lcd_print

Open "DATA.txt" For Append As #10

While Pind.6 <> 0


Marker = 0


Voutxw = Getadc(0)
'Waitms 10
Voutyw = Getadc(1)
'Waitms 10
Voutzw = Getadc(2)
'Waitms 10

Voutx = Voutxw / 1024
Vouty = Voutyw / 1024
Voutz = Voutzw / 1024

Voutx = Voutx * Referenzspannung
Vouty = Vouty * Referenzspannung
Voutz = Voutz * Referenzspannung


Voutxstr = Fusing(voutx , "#.####")
Voutystr = Fusing(vouty , "#.####")
Voutzstr = Fusing(voutz , "#.####")



Lcd_string = Voutxstr : Lx1 = 8 : Ly1 = 50 : Fontsize = 1 : Lcd_fcolor = Rot : Lcd_bcolor = Weiss
Gosub Lcd_print

Lcd_string = Voutystr : Lx1 = 8 : Ly1 = 51 : Fontsize = 1 : Lcd_fcolor = Blau : Lcd_bcolor = Weiss
Gosub Lcd_print

Lcd_string = Voutzstr : Lx1 = 8 : Ly1 = 52 : Fontsize = 1 : Lcd_fcolor = Dunkelgruen : Lcd_bcolor = Weiss
Gosub Lcd_print

'Sensor1(1) = Voutxstr
'Sensor1(2) = Voutystr
'Sensor1(3) = Voutzstr



'####----Marker----#####'

If Pind.4 = 0 Then
Marker = 1
End If


Print #10 , Voutxstr 'Sensor1(1), Sensor1(2), Sensor1(3)


Wend

Close #10
Gosub Lcd_cls
Goto Anfang


Else
Goto Anfang
End If


End If '


End









'---------------------------------------------------------------------------------------------------------------------------------------------------
' Steuer- und Ausgaberoutinen für das Display
'---------------------------------------------------------------------------------------------------------------------------------------------------

Gantenbein
01.10.2007, 14:48
@Wassermann
Danke für die Antwort, ich sah sie leider zuvor noch nicht da ich meine Antwort noch am verfassen war. Ich werde das gleich mal ausprobieren.

Also zum einen kann ich dir diesen Panasonic SD Formatter ans Herz legen, dieser ist schonmal wichtig damit die Karte überhaupt erkannt wird. Windows scheint da nicht sonderlich sauber zu formatieren, was zu Problemen führen kann und bei mir auch geführt hat.
Dieses hängen beim Erstellen der Datei kenne ich auch, ich vermute mal,dass es beim letzten Fehler auch etwas daran lag. Das kommt zumeist allerdings auch aus einer Fehlerhaften formatierung der Karte. Also diese muß wirklich absolut sauber sein. Wenn du dann noch alte Daten auf der Karte hast dann lösche diese auch mittels formatieren und nicht durch einfaches löschen -das hinterläßt Datenfragmente die zwar normalerweise reichlich egal sind aber AVR DOS auch erheblich stören können.
Nun vielleicht hilft dir das einw enig, vermutlich nicht aber bei dieser Thematik muß man zuweilen wirklich sehr geduldig sein.

wassermann
02.10.2007, 05:55
Hallo Gantenbein,

ich benutze den ATMega32 mit AVR-DOS und einer 1GB-SD-Karte ... und es funktioniert auch ganz gut. Problematisch wird es, wenn ich vom Controller aus Dateien (datums- bzw. zeitabhängig) erzeugen möchte. Dabei hängt er sich sporadisch auf (d.h. mal erstellt er das neue File und loggt in diesem weiter ... mal macht er nichts mehr) und springt in meine Initialisierung zu Beginn. Dummerweise kann ich dann auch die Karte im PC nicht mehr ansprechen und die bereits geloggten Daten/Files ansehen. Eine Formatierung aus Windows heraus war bisher immer erfolgreich und die Karte im µC verwendbar.

Ich werde mal die Datei abhängig von einem Taster erstellen lassen. So kann ich geziehlt Dateien erstellen lassen.
Weiterhin mal den 32 gegen einen 644 wg. Speicher austauschen (leider erst im Dezember möglich).

gruss,
wassermann

kolisson
10.10.2007, 04:28
hiermal ein auszug aus der config_avr-dos.bas



' Character to separate ASCII Values in WRITE - statement (and INPUT)
' Normally a comma (,) is used. but it can be changed to other values, f.E.
' to TAB (ASCII-Code 9) if EXCEL Files with Tab separated values should be
' written or read. This parameter works for WRITE and INPUT
' Parameter value is the ASSCII-Code of the separator
' 44 = comma [default]
' 9 = TAB ' [default = 44]
Const Cvariableseparator = 44



vielleicht hilft das ja.

ich benutze config_avr-dos.bas ---- version 5.5

Gantenbein
11.10.2007, 13:50
Hallo, inzwischen geht es auch mit:
Print #10 , Voutxstr ; " " ; Voutystr ; " " ; Voutzstr ; " ";

Dummerweise tritt nun ein weiteres Problem auf: die Geschwindigkeit. Denn obwohl ich bereits den Crystal auf 16MHz stellte, sampelt er meine Daten nur mit ca 15Hz was bei weitem zu wenig ist, also 100Hz müßten schon drin sein.
Wüßte da jemand zufälligerweise, wie man das schneller bekommen könnte?

MeckPommER
11.10.2007, 14:04
Ich glaube das Öffen und Schliessen der Datei ist das bremsende Element.
Entweder die Messergebnisse sammeln und nur jedes 10. Mal alle Werte schreiben, oder (vielleicht einfacher und besser) die Datei nicht innerhalb der Hauptsprogrammschleife öffnen und schliessen sondern dort nur das Schreiben erledigen.

nebenbei:

Dim Referenzspannung As Word
Referenzspannung = 3.85

das überleben die Nachkommastellen? ;-)

Gruß MeckPommER

kolisson
13.10.2007, 00:57
euer geschwindikeitsproblem kann durchaus vom regelmässigen "close" kommen.

hier mal meine version:





Open Fl For Output As #ff ' open file for output
' we need to open a file before we can use the file commands
' we open it for OUTPUT, INPUT , APPEND or BINARY
' In this case we open it for OUTPUT because we want to write to the file.
' If the file existed, the file would be overwritten.


Do
Wstr = ""
Start Adc ' starte adc --->>> stromverbrauch steigt
W = Getadc(7) 'nehme messwert
Wstr = Str(w) ' wandle um in string

Stop Adc ' stromverbrauch sinkt wieder


Print #ff , Wstr ' schreibe in puffer von sd karte


Loop Until Jumper = 1

' jumper ist ein alias für die abfrage
' eines portpins als eingang
' jumper kann auch ein taster sein.
' hier weiss die cpu, dass ich die sd-karte haben will
' und er mit close die sache beenden soll.

Close #ff
End


' nachdem jumper 1 wurde wird die datei geschlossen ... also die letzten 512 bytes auf die karte geschrieben.
' wenn ihr ständig "close schreibt, dauert das ewig und ihr schreibt euch die karte platt




gruss klaus

Gantenbein
16.10.2007, 08:58
Nein, daran liegt es leider nicht da diese Befehle schon außerhalb der "while" Hauptprogrammschleife zu finden sind.
Ich werde mal versuchen ob nicht vielleicht doch das Schreiben an sich bereits derart lange dauert und somit Werte sammeln bevor ich sie schreibe, nur fürchte ich fast, dass dadurch die Formatierung in Mitleidenschaft gezogen wird.

Mir ist gerade eingefallen, dass es wohl auch unsinig sein dürfte erst einmal die Daten zu sammeln und sie dann erst zu schreiben, schließlich muß er ja so oder so dann die gleiche Anzahl an Werten schreiben. Versuchen werde ich es wohl dennoch mal, das allerdings nur weil mir gerade nichts besseres einfällt.

Wonach das nun gar nicht gehen wollte, habe ich mal die Ausgabe an das TFT Display herausgeschmissen. Was jedoch noch nicht recht funktionieren wollte. Anschließend wurde ein waitms 10 eingefügt und damit geht es immerhin mit ca 72Hz. wird das waitms weggelassen will die Speicherung nicht mehr recht funktionieren. Nun stehe ich also vor der Problem, dass ich am Ende jedoch nicht nur diese 3 Spannungen abspeichern möchte, sondern insgesamt 9, notfalls könnte man die Zeitausgaben auch weglassen, schöner wäre es natürlich wenn sie da bleiben könnten und auf den Marker kann auch nicht verzichtet werden. Desweiteren brauche ich am Ende eine sample speed von 100 Hz. es sei also nun jeder herzlich eingeladen Ideen zu leifern wie ich das noch erreichen könnte, der code ist sicher hier und da noch recht uneffizient. Allerdings bin ich eigentlich auch der Meinung, dass es auch so wesentlich schneller gehen müßte, ich habe immerhin einen Atmega128 verbaut, so langsam ist dieser ja nicht gerade.

Hier mal mein Code, jedoch noch mit den Ausgaben an das TFT Display:


$regfile = "m128def.dat" 'ATMega 8, anpassen bei anderen
$crystal = 16000000 '8 MHz Takt, bei höherem Takt muss evtl. die Ausgabegeschwindigkeit der Daten an das
'Display gedrosselt werden. Also erst mit 8 MHz testen um zu sehen, dass alles klappt,

$include "Config_MMC.BAS"
$include "CONFIG_AVR-DOS.BAS"


Dim Temp1 As Byte , Temp2 As Byte , Temp3 As Byte , Temp4 As Byte
Dim Drehung As Byte
Dim Fontbreite As Byte , Fonthoehe As Byte , Xpixel As Byte , Ypixel As Byte
Dim R As Integer , X1 As Byte , X2 As Byte , Y1 As Byte , Y2 As Byte , E As Byte , F As Integer , G As Long , Zeichen As String * 1
Dim A As Byte , B As Byte , C As Integer , D As Integer , T1 As Byte , T2 As Byte
Dim Befehl As Byte , Ausgabe As Byte
Dim Pix As Byte , Gapx As Double , Gapy As Double , S As Byte
Dim X As Byte , Y As Byte , H As Integer , M As Integer , Pixel As Integer , Schleife As Integer , Hx As Integer , Hy As Integer , Xinc As Integer , Yinc As Integer
Dim Temp As Byte
Dim Lcd_command As Byte , Lcd_data As Byte , Lcd_string As String * 22 , Fontsize As Byte , Lcd_fcolor As Byte , Lcd_bcolor As Byte
Dim Lx1 As Byte , Ly1 As Byte , Lx2 As Byte , Ly2 As Byte , Color As Byte , Zeichenarray(6) As Byte




'---------------------------------------------------------------------------------------------------------------------------------------------------
'Übernahme der aktuellen Portbelegung in Variablen bzw. Konstanten. Durch Änderung der folgenden Zeilen kann dass Programm auf jede andere Anschlussbelegung geändert werden,
'wenn man das Display in einer anderen Konfiguration (z.B. einem eigenen Board) nutzt.

Lcd_port Alias Portb 'Port B wird also hier im Programm mittels "LCD_Port" angesprochen.

Ddrb = &B01100110 'Port B: alles display lines: output (1)

Const Rs = 6 'also Port b.6
Const Cs = 5 'also Port b.5
Const Sdata = 2 'also Port b.2
Const Sclk = 1 'also Port b.1
'---------------------------------------------------------------------------------------------------------------------------------------------------

Const Kommando = 0 'Durch eine "0" wird dem Display mitgeteilt, dass nun ein Kommando folgt
Const Parameter = 1 'Durch eine "1" wird dem Display mitgeteilt, dass nun ein Parameter folgt

Const Blau = &B00000011 'Vordefinierte Konstanten für die Farbwerte machen das Programmiererleben leichter:
Const Gelb = &B11111100
Const Rot = &B11100000
Const Gruen = &B00011100
Const Schwarz = &B00000000
Const Weiss = &B11111111
Const Hellgruen = &B00111110
Const Dunkelgruen = &B00010100
Const Dunkelrot = &B10100000
Const Dunkelblau = &B00000010
Const Hellblau = &B00011111
Const Orange = &B11111000


'----------------------------------------------------------------------------------------------------------------------------------------------------



'####---------------AD-Wandler--------------#####'

Config Adc = Single , Prescaler = Auto , Reference = Internal ' Prescaler = Auto

Start Adc

Config Portf.0 = Input 'Portf.0-3 =Input
Config Portf.1 = Input
Config Portf.2 = Input




'####--------------MMC-Karte--------------#####'

Config Serialin = Buffered , Size = 20
Config Clock = Soft
Enable Interrupts
Config Date = Dmy , Separator = .
Dim Btemp1 As Byte
Dim Text As String * 10 , Placeholder As String * 5
Placeholder = ";"



'####----------------Eingangs Variablen--------------#####'


Dim Voutxw As Word
Dim Voutx As Single
Dim Voutxstr As String * 16
Dim Voutyw As Word
Dim Vouty As Single
Dim Voutystr As String * 16
Dim Voutzw As Word
Dim Voutz As Single
Dim Voutzstr As String * 16



'####---------------Switches Variablen----------------#####'

Dim Marker As Single
Dim Markerstr As String * 4
Config Pind.4 = Input 'Marker
Portd.4 = 1

Config Pind.5 = Input 'RUN
Portd.5 = 1

Config Pind.6 = Input 'Halt
Portd.6 = 1


'####---------------Time Variablen----------------#####'
Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1
On Timer1 Timer_irq 'schalte den Timer1 ein
Const Timervorgabe = 3036
Enable Timer1
Enable Interrupts 'Timer1 soll schon von 34285 wegzählen
Timer1 = Timervorgabe








Dim Unittime As Long
Unittime = 0
Dim Second As Single
Dim Secondstr As String * 8
Second = 0
Dim Minute As Single
Dim Minutestr As String * 8
Minute = 0
Dim Hour As Single
Dim Hourstr As String * 8
Hour = 0

Dim Milliseconds As Single
Dim Millisecondsstr As String * 8






Dim Referenzspannung As Word
Referenzspannung = 3.85





'---------------------------------------------------------------------------------------------------------------------------------------------------
'Hauptprogramm
'---------------------------------------------------------------------------------------------------------------------------------------------------
Gosub Lcd_init
Gosub Lcd_cls



'---------------------------SD Anfang---------------------------------------------

If Gbdriveerror <> 0 Then
Lcd_string = "Drive error" : Lx1 = 5 : Ly1 = 50 : Fontsize = 1 : Lcd_fcolor = Rot : Lcd_bcolor = Weiss
Gosub Lcd_print
End If

' scratch byte
Btemp1 = Initfilesystem(1)

If Btemp1 > 0 Then
Lcd_string = "File System Error" : Lx1 = 4 : Ly1 = 51 : Fontsize = 1 : Lcd_fcolor = Rot : Lcd_bcolor = Weiss
Gosub Lcd_print
Lcd_string = Str(btemp1) : Lx1 = 5 : Ly1 = 52 : Fontsize = 1 : Lcd_fcolor = Rot : Lcd_bcolor = Weiss
Gosub Lcd_print

Else
'Else des Hauptprogramms
Lcd_string = "Card setup OK " : Lx1 = 5 : Ly1 = 51 : Fontsize = 1 : Lcd_fcolor = Gruen : Lcd_bcolor = Weiss
Gosub Lcd_print

Wait 5
Gosub Lcd_cls


'---------------------------Anfang des Auswahlmenüs---------------------------------------------

Anfang:

Lcd_string = "Run" : Lx1 = 2 : Ly1 = 56 : Fontsize = 1 : Lcd_fcolor = Schwarz : Lcd_bcolor = Weiss
Gosub Lcd_print
Lcd_string = "Stop" : Lx1 = 18 : Ly1 = 56 : Fontsize = 1 : Lcd_fcolor = Schwarz : Lcd_bcolor = Weiss
Gosub Lcd_print


If Pind.5 = 0 Then

Lcd_string = "Voutx " : Lx1 = 2 : Ly1 = 50 : Fontsize = 1 : Lcd_fcolor = Dunkelgruen : Lcd_bcolor = Weiss
Gosub Lcd_print
Lcd_string = "Vouty " : Lx1 = 2 : Ly1 = 51 : Fontsize = 1 : Lcd_fcolor = Dunkelgruen : Lcd_bcolor = Weiss
Gosub Lcd_print
Lcd_string = "Voutz " : Lx1 = 2 : Ly1 = 52 : Fontsize = 1 : Lcd_fcolor = Dunkelgruen : Lcd_bcolor = Weiss
Gosub Lcd_print

Open "DATA.txt" For Append As #10



'---------------------------Start / Stop Bedingung Aufnahme---------------------------------------------
Unittime = 0
Second = 0
Minute = 0
Hour = 0
While Pind.6 <> 0
Marker = 0
Incr Unittime

Voutxw = Getadc(0)
Voutyw = Getadc(1)
Voutzw = Getadc(2)


Voutx = Voutxw / 1024
Vouty = Voutyw / 1024
Voutz = Voutzw / 1024

Voutx = Voutx * Referenzspannung
Vouty = Vouty * Referenzspannung
Voutz = Voutz * Referenzspannung


Voutxstr = Fusing(voutx , "#.####")
Voutystr = Fusing(vouty , "#.####")
Voutzstr = Fusing(voutz , "#.####")



Lcd_string = Voutxstr : Lx1 = 8 : Ly1 = 50 : Fontsize = 1 : Lcd_fcolor = Rot : Lcd_bcolor = Weiss
Gosub Lcd_print

Lcd_string = Voutystr : Lx1 = 8 : Ly1 = 51 : Fontsize = 1 : Lcd_fcolor = Blau : Lcd_bcolor = Weiss
Gosub Lcd_print

Lcd_string = Voutzstr : Lx1 = 8 : Ly1 = 52 : Fontsize = 1 : Lcd_fcolor = Dunkelgruen : Lcd_bcolor = Weiss
Gosub Lcd_print



Millisecondsstr = Fusing(milliseconds , "#######.#")
Lcd_string = Millisecondsstr : Lx1 = 8 : Ly1 = 53 : Fontsize = 1 : Lcd_fcolor = Blau : Lcd_bcolor = Weiss
Gosub Lcd_print


Secondstr = Fusing(second , "#######.#")
Lcd_string = Secondstr : Lx1 = 8 : Ly1 = 54 : Fontsize = 1 : Lcd_fcolor = Blau : Lcd_bcolor = Weiss
Gosub Lcd_print




'####----Marker----#####'

If Pind.4 = 0 Then
Marker = 1
End If
Markerstr = Fusing(marker , "#.#")


Print #10 , Voutxstr ; " " ; Voutystr ; " " ; Voutzstr ; " ";

Print #10 , Hour ; ":" ; Minute ; ":" ; Second ; " ";

Print #10 , Markerstr ;
Print #10 , " " ;

Print #10 , Unittime ;
Print #10 , " "

Wend



Close #10
Gosub Lcd_cls
Goto Anfang


Else
Goto Anfang
End If


End If '


End




Timer_irq:
Timer1 = Timervorgabe
Incr Second
If Second = 60 Then
Incr Minute
Second = 0
End If
If Minute = 60 Then
Incr Hour
Minute = 0
End If


Return

kolisson
16.10.2007, 14:35
hallo,

da ich gerade auch an so ner schaltung arbeite, habe ich das mit der speed mal getestet. meine ergebnisse habe ich als txt im anhang abgelegt.


gruss kolisson

Gantenbein
18.10.2007, 12:24
Vielen Dank, mittlerweile gebe ich 10 string Werte aus , alle mit einem Platzhalter unterteilt und erreiche eine maximale Geschwindigkeit von ca 50Hz. Rechne ich das mal herunter auf einen Wert würde ich also ca 500Hz erreichen können, wenn ich nur einen ausgeben würde. Das ist jedoch immernoch sehr viel langsamer als deine Routine. Nur sehe ich nicht was ich großartig anders gemacht habe. Ich poste nochmal meinen aktuellen Code.


$regfile = "m128def.dat" 'ATMega 8, anpassen bei anderen
$crystal = 16000000 '8 MHz Takt, bei höherem Takt muss evtl. die Ausgabegeschwindigkeit der Daten an das
'Display gedrosselt werden. Also erst mit 8 MHz testen um zu sehen, dass alles klappt,

$include "Config_MMC.BAS"
$include "CONFIG_AVR-DOS.BAS"


Dim Temp1 As Byte , Temp2 As Byte , Temp3 As Byte , Temp4 As Byte
Dim Drehung As Byte
Dim Fontbreite As Byte , Fonthoehe As Byte , Xpixel As Byte , Ypixel As Byte
Dim R As Integer , X1 As Byte , X2 As Byte , Y1 As Byte , Y2 As Byte , E As Byte , F As Integer , G As Long , Zeichen As String * 1
Dim A As Byte , B As Byte , C As Integer , D As Integer , T1 As Byte , T2 As Byte
Dim Befehl As Byte , Ausgabe As Byte
Dim Pix As Byte , Gapx As Double , Gapy As Double , S As Byte
Dim X As Byte , Y As Byte , H As Integer , M As Integer , Pixel As Integer , Schleife As Integer , Hx As Integer , Hy As Integer , Xinc As Integer , Yinc As Integer
Dim Temp As Byte
Dim Lcd_command As Byte , Lcd_data As Byte , Lcd_string As String * 22 , Fontsize As Byte , Lcd_fcolor As Byte , Lcd_bcolor As Byte
Dim Lx1 As Byte , Ly1 As Byte , Lx2 As Byte , Ly2 As Byte , Color As Byte , Zeichenarray(6) As Byte




'---------------------------------------------------------------------------------------------------------------------------------------------------
'Übernahme der aktuellen Portbelegung in Variablen bzw. Konstanten. Durch Änderung der folgenden Zeilen kann dass Programm auf jede andere Anschlussbelegung geändert werden,
'wenn man das Display in einer anderen Konfiguration (z.B. einem eigenen Board) nutzt.

Lcd_port Alias Portb 'Port B wird also hier im Programm mittels "LCD_Port" angesprochen.

Ddrb = &B01100110 'Port B: alles display lines: output (1)

Const Rs = 6 'also Port b.6
Const Cs = 5 'also Port b.5
Const Sdata = 2 'also Port b.2
Const Sclk = 1 'also Port b.1
'---------------------------------------------------------------------------------------------------------------------------------------------------

Const Kommando = 0 'Durch eine "0" wird dem Display mitgeteilt, dass nun ein Kommando folgt
Const Parameter = 1 'Durch eine "1" wird dem Display mitgeteilt, dass nun ein Parameter folgt

Const Blau = &B00000011 'Vordefinierte Konstanten für die Farbwerte machen das Programmiererleben leichter:
Const Gelb = &B11111100
Const Rot = &B11100000
Const Gruen = &B00011100
Const Schwarz = &B00000000
Const Weiss = &B11111111
Const Hellgruen = &B00111110
Const Dunkelgruen = &B00010100
Const Dunkelrot = &B10100000
Const Dunkelblau = &B00000010
Const Hellblau = &B00011111
Const Orange = &B11111000


'----------------------------------------------------------------------------------------------------------------------------------------------------



'####---------------AD-Wandler--------------#####'

Config Adc = Single , Prescaler = Auto , Reference = Internal ' Prescaler = Auto

Start Adc

Config Portf.0 = Input 'Portf.0-3 =Input
Config Portf.1 = Input
Config Portf.2 = Input




'####--------------MMC-Karte--------------#####'

Config Serialin = Buffered , Size = 20
Config Clock = Soft
Enable Interrupts
Config Date = Dmy , Separator = .
Dim Btemp1 As Byte
Dim Text As String * 10 , Placeholder As String * 5
Placeholder = ";"



'####----------------Eingangs Variablen--------------#####'


Dim Vout1xw As Word
Dim Vout1x As Single
Dim Vout1xstr As String * 4
Dim Vout1yw As Word
Dim Vout1y As Single
Dim Vout1ystr As String * 4
Dim Vout1zw As Word
Dim Vout1z As Single
Dim Vout1zstr As String * 4

Dim Vout2xw As Word
Dim Vout2x As Single
Dim Vout2xstr As String * 4
Dim Vout2yw As Word
Dim Vout2y As Single
Dim Vout2ystr As String * 4
Dim Vout2zw As Word
Dim Vout2z As Single
Dim Vout2zstr As String * 4

Dim J As Byte



'####---------------Switches Variablen----------------#####'

Dim Marker As Single
Dim Markerstr As String * 1
Config Pind.4 = Input 'Marker
Portd.4 = 1

Config Pind.5 = Input 'RUN
Portd.5 = 1

Config Pind.6 = Input 'Halt
Portd.6 = 1


'####---------------Time Variablen----------------#####'
Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1
On Timer1 Timer_irq 'schalte den Timer1 ein
Const Timervorgabe = 3036
Enable Timer1
Enable Interrupts 'Timer1 soll schon von 34285 wegzählen
Timer1 = Timervorgabe



Dim Second As Single
Dim Secondstr As String * 4
Second = 0
Dim Minute As Single
Dim Minutestr As String * 4
Minute = 0
Dim Hour As Single
Dim Hourstr As String * 4
Hour = 0



Dim Referenzspannung As Word
Referenzspannung = 3.85





'---------------------------------------------------------------------------------------------------------------------------------------------------
'Hauptprogramm
'---------------------------------------------------------------------------------------------------------------------------------------------------
Gosub Lcd_init
Gosub Lcd_cls



'---------------------------SD Anfang---------------------------------------------

If Gbdriveerror <> 0 Then
Lcd_string = "Drive error" : Lx1 = 5 : Ly1 = 50 : Fontsize = 1 : Lcd_fcolor = Rot : Lcd_bcolor = Weiss
Gosub Lcd_print
End If

' scratch byte
Btemp1 = Initfilesystem(1)

If Btemp1 > 0 Then
Lcd_string = "File System Error" : Lx1 = 4 : Ly1 = 51 : Fontsize = 1 : Lcd_fcolor = Rot : Lcd_bcolor = Weiss
Gosub Lcd_print
Lcd_string = Str(btemp1) : Lx1 = 5 : Ly1 = 52 : Fontsize = 1 : Lcd_fcolor = Rot : Lcd_bcolor = Weiss
Gosub Lcd_print

Else
'Else des Hauptprogramms
Lcd_string = "Card setup OK " : Lx1 = 5 : Ly1 = 51 : Fontsize = 1 : Lcd_fcolor = Gruen : Lcd_bcolor = Weiss
Gosub Lcd_print

Wait 3
Gosub Lcd_cls


'---------------------------Anfang des Auswahlmenüs---------------------------------------------

Anfang:

Lcd_string = "Run" : Lx1 = 2 : Ly1 = 56 : Fontsize = 1 : Lcd_fcolor = Schwarz : Lcd_bcolor = Weiss
Gosub Lcd_print
Lcd_string = "Stop" : Lx1 = 18 : Ly1 = 56 : Fontsize = 1 : Lcd_fcolor = Schwarz : Lcd_bcolor = Weiss
Gosub Lcd_print
Lcd_string = "RAC" : Lx1 = 5 : Ly1 = 49 : Fontsize = 1 : Lcd_fcolor = Hellgruen : Lcd_bcolor = Weiss
Gosub Lcd_print
Lcd_string = "CELLEROMETER" : Lx1 = 8 : Ly1 = 49 : Fontsize = 1 : Lcd_fcolor = Dunkelgruen : Lcd_bcolor = Weiss
Gosub Lcd_print


If Pind.5 = 0 Then

Lcd_string = "Running " : Lx1 = 3 : Ly1 = 52 : Fontsize = 2 : Lcd_fcolor = Blau : Lcd_bcolor = Weiss
Gosub Lcd_print


Open "DATA.txt" For Append As #10



'---------------------------Start / Stop Bedingung Aufnahme---------------------------------------------
Second = 0
Minute = 0
Hour = 0

While Pind.6 <> 0
Marker = 0

'------------------------Über 10 Werte mitteln------------------------------------
Vout1xw = 0
Vout1yw = 0
Vout1zw = 0
Vout2xw = 0
Vout2yw = 0
Vout2zw = 0

For J = 1 To 10
Vout1xw = Vout1xw + Getadc(0)
Vout1yw = Vout1yw + Getadc(1)
Vout1zw = Vout1zw + Getadc(2)
Vout2xw = Vout2xw + Getadc(3)
Vout2yw = Vout2yw + Getadc(4)
Vout2zw = Vout2zw + Getadc(5)
Next

Vout1xw = Vout1xw / 10
Vout1yw = Vout1yw / 10
Vout1zw = Vout1zw / 10
Vout2xw = Vout2xw / 10
Vout2yw = Vout2yw / 10
Vout2zw = Vout2zw / 10


'--------------Umrechnung in Spannung und Umwandlung in String------------------

Vout1x = Vout1xw / 1024
Vout1y = Vout1yw / 1024
Vout1z = Vout1zw / 1024

Vout1x = Vout1x * Referenzspannung
Vout1y = Vout1y * Referenzspannung
Vout1z = Vout1z * Referenzspannung


Vout1xstr = Fusing(vout1x , "#.####")
Vout1ystr = Fusing(vout1y , "#.####")
Vout1zstr = Fusing(vout1z , "#.####")


Vout2x = Vout2xw / 1024
Vout2y = Vout2yw / 1024
Vout2z = Vout2zw / 1024

Vout2x = Vout2x * Referenzspannung
Vout2y = Vout2y * Referenzspannung
Vout2z = Vout2z * Referenzspannung


Vout2xstr = Fusing(vout2x , "#.####")
Vout2ystr = Fusing(vout2y , "#.####")
Vout2zstr = Fusing(vout2z , "#.####")



'####----Marker----#####'

If Pind.4 = 0 Then
Marker = 1
End If
Markerstr = Fusing(marker , "#.#")

Secondstr = Fusing(second , "#.#")


Print #10 , Vout1xstr ; " " ; Vout1ystr ; " " ; Vout1zstr ; " " ; Vout2xstr ; " " ; Vout2ystr ; " " ; Vout2zstr ; " " ; Hour ; ":" ; Minute ; ":" ; Secondstr ; " " ; Markerstr ; " "


Waitms 1 'hier stelle ich ein wie lange das Programm noch warten muß damit
' das Schreiben genügend Zeit hat also waitms + Programmdurchlaufzeit der While Schleife

Wend


Close #10
Gosub Lcd_cls
Goto Anfang


Else

Lcd_string = "Stop" : Lx1 = 4 : Ly1 = 52 : Fontsize = 2 : Lcd_fcolor = Blau : Lcd_bcolor = Weiss
Gosub Lcd_print
Goto Anfang
End If


End If '


End




Timer_irq:
Timer1 = Timervorgabe
Incr Second
If Second = 60 Then
Incr Minute
Second = 0
End If
If Minute = 60 Then
Incr Hour
Minute = 0
End If


Return




'---------------------------------------------------------------------------------------------------------------------------------------------------
' Steuer- und Ausgaberoutinen für das Display

kolisson
18.10.2007, 15:24
nun ja ... du machst sehr viele sachen in der hauptschleife. das muss natürlich erstmal abgearbeitet werden.

eine gute zeitersparnis könntest du wohl erzielen, wenn du auf die fliesskommageschichten verzichtest und nur die word-variablen vom adc speicherst.

es spricht ja nix dagegen, diese dann später bei der auswertung von der sd-karte zu lesen und dann deinen faktor einzurechnen.

ein weiterer nachteil deiner schaltung ist natürlich der softclock-int . der will ja durch den int auch ständig bedient werden. mein ansatz ist ja eher der, das ich uhren-ic autonom laufen lasse, un wenn ich daten speichern will, frage ich dieses ab und speichere den wert mit den daten. da muss der prozessor selber aber sonst nix für tun. meine zeitmarke ist halt einfach da.

es gibt da übrigens auch noch das "secofday" ... bietet sich evt. als zeitmarke an.

dann haste noch die displaysachen in der hauptschleife. meist ist es ja bei displays so, dass man irgeneinen pin abfragt, ob das display neue daten annehmen kann. (polling). das heisst natürlich, dass dein programm stehen bleibt, bis das display wieder bereit ist.


also nimm ne hardware-uhr .... die haben oft einen 1hz ausgang ... damit legst du einen interrupt .... der holt die adc-daten (als word) und sonst nix.

nach 10 mal daten holen, wird der mittelwert berechnet und das ganze mit zeitstempel auf die karte geschrieben.

den display ready ausgang legst du auch auf nen int ... allerdings mit ner kleineren priorität. während zeitkritischer sachen ... wie messwerterfassung, sperrst du dann den display int.
alles was das disp anzeigen soll berechnest du im vorraus (also einen bildschirm voll) und speicherst das in einem array als buffer. wenn dann prozessorzeit verfügbar ist machst du ein display-update... (vielleicht jede 11te sekunde oder so.


das also mal als grobe idee... wie gesagt .. ich bin auch noch dabei... und somit zum teil einfach nur theoretisch.

gruss kolisson

p.s. : was soll den das "Config Serialin = Buffered , Size = 20" bewirken ?
ist doch für den comport ! und dann noch als softwareemulation, wenn ich nicht irre.

kolisson
24.10.2007, 21:37
ich frag mich gerade, ob ganti seine beine in die hand genommen hat und geflüchtet ist...

wo bleibts das feedback .. mein lieber ?

gruss kolisson

wassermann
05.11.2007, 04:54
Das Problem mit meiner SD-Karte lag bei zwei Dingen.
Zum einen sollte man sicherstellen, dass das File auch wirklich geschlossen wird, bevor man die Karte entnimmt/andere Files generiert werden und zum anderen wirkt eben eine Vergößerung der stacks manchmal Wunder. Somit für mich ein kleiner Erfolg der Woche.
Der bestellte 644 wird nun ein bisschen in der Kiste warten dürfen ..;-)

@kolisson
das open/close war nicht in jedem Zyklus.
Was macht deine Lösung mit dem "Standalone-Logger"?

gruss,
wassermann

kolisson
05.11.2007, 23:10
@wassermann
tja .. was macht mein logger ? ich hatte ja schon zu gantenbein einiges geschrieben.
zuletzt hatte ich, nachdem die speicherung perfekt lief eine routine zur ansteuerung der pcf8583 echtzeituhr geschrieben, die direkt auf bascom-routinen für time und date aufsetzt. ich war eigentlich ziemlich sicher, den artikel dazu veröffentlicht zu haben, konnte ihn aber jetzt absolut nicht mehr finden.

danach war ich soweit happy.

da zu meinem gesamtprojekt noch die steuerung der ladung und entladung von mehreren 12 volt batterien über ladegeräte, solarpanels und windrad gehört, bin ich insofern mit der entwicklung des gesamtprojektes noch nicht soviel weiter gekommen.

zwischendurch bestand dann die dringende notwendigkeit unsere ph-messsonde mal wieder zu benutzen. bei der grundlagenforschung dazu, habe ich dann mal einen recht guten "Instrumentation-amplifier" aus einzelnen opamps zusammengebaut. (eingangswiderstand = mehrere teraohm). irgendwie bleibt man bei sowas dann hängen, weil es so interessant ist.

in ansätzen war bein ph-messverstärker dann gleich ein EKG-gerät. vielleicht gehts bald an die hirnströme, die dann mit der compimaus verbunden werden. mal sehen.

nun ja.. etwas abgeschweift... aber so ist es eben.

unser gantenbein ist ja offenbar verschwunden... das find ich in sofern schade, da ich immer gerne wüsste, ob es hilfreich war, was man so beitragen kann.

soweit dann..

gruss kolisson

roboterheld
06.11.2007, 16:37
Dim Abfilehandles(c_filehandlessize) As Byte ....(zuwenig sram)

meine fehlermeldung mit avr-dos und bascom mit einem atmega32.

....ich benutze den ATMega32 mit AVR-DOS und einer 1GB-SD-Karte ... und es funktioniert auch ganz gut...

warum läuft der 32ziger bei dir. was hast du in der avrdos geändert .

mfg

roboterheld
06.11.2007, 17:42
habe den dir-buffer auf 561 byte gestellt.
habe die karte in fat16 formatiert und er liest mit der test-dos.bas die daten der karte richtig ein. zumindest bin ich der meinung.

habe diese änderung gemacht :

Handling of FAT-Buffer in SRAM:
' 0 = FAT- and DIR-Buffer is handled in one SRAM buffer with 561 bytes
' 1 = FAT- and DIR-Buffer is handled in separate SRAM buffers with 1078 bytes
' Parameter 1 increased speed of file-handling
Const Csepfathandle = 0 ' [default = 1]

roboterheld
06.11.2007, 18:16
wie kann ich jetzt daten/dateien anlegen.
wenn ich die interpreter.bas von bascom lage, meckert er das der 32ziger zu wenig sram hat.

muss also doch einen 644 kaufen?
oder hat hier schon jemand daten drauf bekommen als datei (atmega32)?

mfg

wassermann
07.11.2007, 00:55
@roboterheld
...Geduld mein junger Jedi ;-)
Bin in der Arbeit ... abends schreibe ich die ganze Konfiguration/HW/SW zusammen. Sollte dann auch bei dir laufen.

gruss,
wassermann

roboterheld
07.11.2007, 08:57
...Geduld mein junger Jedi \:D/

danke für die blumen, geht runter wie öl als jahrgang 48ziger.

danke für deine hilfe.
mfg

wassermann
07.11.2007, 14:05
sorry wenns jetzt dreimal kommt, aber nach dem Absenden war ich plötzlich ausgeloggt.

@roboterheld

ups ... da ändert sich ja abrupt das Yoda-Jedi-Verhältnis.
- FatHandle=0 (561, jedoch mit FAT32).
- Ich nehme nicht die ganze Test_DOS_Drive.bas, sondern nur teilweise, gekürzt und das ganze direkt als Sub eingebunden.
- Open FileName For Append As #ff bzw. Close #ff
- Interpreter brauchst du nicht.

So, nun aber zur Konfiguration.
Ich betreibe einen ATMega32-16PU (somit lt. Datenblatt für eine Betriebsspg von 4,5V-5,5V ausgelegt) mit einem Spgsregler bei 3,3V. Als Quarz habe ich die krummen 7,3728MHz für den MAX232. Nur dieser und das Display werden mit einem 7805 versorgt. Der Rest ist alles auf 3,3V. Für die Uhr habe ich einen 32768kHz-Quarz. Das ganze befindet sich "wüst" auf einem Steckbrett ohne besondere Vorkehrungen. Für die 1GB-SD-Karte (FAT32) benutze ich HW-SPI.

SW:
Bascom-Vollversion 1.11.8.2 (also nicht die neueste...hab mich noch nicht getraut hochzurüsten :-)).
$include "Config_MMC.bas" (for Version 5.4)
$include "Config_AVR-DOS.BAS" (Einstellung von FileSystemStatus auf FAT32)
Die Initialisierung der Karte mache ich in abgewandelter Form aus der Test_DOS_Drive.bas. Gibt's keinen Fehler, wird das Programm freigegeben und eine definierte Datei geöffnet. Das Entnehmen der Karte wird momentan noch per Tastendruck angefordert (close file). Das Protokollieren nach erneutem Einschieben der Karte ebenfalls per Tastendruck (initialisierung/freigeben/Datei öffnen). Später automatisch über den Schalter im SD-Slot.
Geschrieben wird in eine Datei, wenn sie initialisiert ist, kein Entnehmen angefordert ist, keine neue Datei gerade erzeugt werden soll und bei dem entsprechenden Ereignis (bei mir alle zwei Sekunden Zeitstempel und Werte). Weitere Dateien erzeugen nach dem Schema: Schreibzugriff blockieren, alte Datei schliessen, neue Datei erzeugen/öffnen und Schreibzugriff wieder freigeben).
Der Rest (1-wire, serielle Schnittstelle, Interrupts, ...) ist hierfür nicht wichtig.

Viel Spass mit den ersten erzeugten Dat(ei)en.

gruss,
wassermann

nightflyer50
20.02.2008, 18:05
Hallo!

Super Projekt!
Ich habe ebenfalls vor einen Logger zu basteln :-) Momentan bin ich soweit das ich per soft-spi (avr-dos)die Karte initialisiere eine Datei erstelle.
Doch wie in den Beiträgen zuvor, wurde bei mir nur die Datei erstellt und der Inhalt fehlt.
Ich verwende eine 32MB Karte aus meinem 6230i Nokia Handy. Ist die Karte daran schuld, dass ich nicht ordentlich schreiben kann?

Hat jemand schon Erfahrung mit Karten der Nokia Art?

nightflyer50
03.03.2008, 16:35
:kleines Update:

Die nokia Karte funktioniert einwandfrei.

Ich hatte ein gennerelles Problem mit meinem SourceCode. Jetzt funktionierts einwandfrei!