- 3D-Druck Einstieg und Tipps         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Datenlogger mit MMC Karte

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.05.2007
    Beiträge
    26

    Datenlogger mit MMC Karte

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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?

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    24.01.2006
    Ort
    Kirchdorf a. Inn
    Alter
    53
    Beiträge
    81
    @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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    15.05.2007
    Beiträge
    26
    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.


    Code:
    ' 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
    '---------------------------------------------------------------------------------------------------------------------------------------------------

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    15.05.2007
    Beiträge
    26
    @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.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    24.01.2006
    Ort
    Kirchdorf a. Inn
    Alter
    53
    Beiträge
    81
    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

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.11.2006
    Ort
    olargues
    Beiträge
    776
    hiermal ein auszug aus der config_avr-dos.bas

    Code:
    ' 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

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    15.05.2007
    Beiträge
    26
    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?

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    59
    Beiträge
    1.080
    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
    Mein Hexapod im Detail auf www.vreal.de

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.11.2006
    Ort
    olargues
    Beiträge
    776
    euer geschwindikeitsproblem kann durchaus vom regelmässigen "close" kommen.

    hier mal meine version:

    Code:
    
    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

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test