- 12V Akku mit 280 Ah bauen         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 29 von 29

Thema: Datei auf SD Karte mit AVR Dos erstellen?

  1. #21
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Anzeige

    E-Bike
    Hallo Tobias,
    sind denn deine Werte für $HWStack, $SWStack und $FrameSize groß genug?
    Ich würde dir empfehlen, sie immer in das Programm zu schreiben. Dann bist du sicher, dass sie nicht verstellt sind und andere können dein Setup genau nachvollziehen.

  2. #22
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    Ein (kleiner) Lichtblick:
    Das Programm oben ist nun ohne Absturz durchgelaufen (test 8Std) Die anderen Versuche sind immer nach 2-3 Std abgestürzt!!

    Wie groß sollte ich die Werte für $HWStack, $SWStack und $FrameSize angeben? Ist das von AVR-Dos abhängig?

  3. #23
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    JAAAA,
    es waren die Werte für $HWStack, $SWStack und $FrameSize! Ich werde sie nun immer in das Programm schreiben!!! Bei meinen bisherigen Programmen war es immer unproblematisch...

    $hwstack = 200
    $swstack = 200
    $framesize = 400

    Framesize 400 - dann hab ich Platz: Der String zum schreiben soll ca 80 Zeichen haben - noch ein bisschen Reserve für den Rest... Oder liege ich da voll daneben?

    Der erste Test war erfolgreich!!! =D>
    keine Datei auf der Karte, Datei mit µC erstellt und Daten rein geschrieben!!! - hat funktioniert!

    JUHUUUUU!!!

    Jetzt lasse ich den µC mal über Nacht im Sekundentakt schreiben! Wenn er nicht abstürzt wie die letzten Male, mache ich einen Luftsprung vor Freude! \/

    Vielen Dank für die unermüdliche Unterstützung!!!

    Mein Datenlogger bis jetzt:
    Code:
    'Funktion:
    'SD Schreiben, Strings zusammensetzen
    'VERSUCH: 8 analog kanäle zu loggen mit Temp umgerechnet 4x pro sekunde
    'led grün dauerleuchten - FEHLER -> neu starten
    'led grün blitzen: bereit (kurz an)
    'led blinken: aufzeichnen (lange an)
    
    
    'ADC0 = Volt - Akku (mal 6)
    'ADC1 = Volt - RC-Empfänger (mal 6)
    'ADC2 = Motor TEMP
    'ADC3 = Ampere - Akku
    'ADC4 = frei
    'ADC5 = frei
    'ADC6 = frei
    'ADC7 = frei
    
    'PC 7 = Sollwert von Empfänger
    'PC 6 = von Empfänger für LOGGING
    
    $regfile = "M644def.dat"
    $crystal = 14745600
    
    $hwstack = 200
    $swstack = 200
    $framesize = 400
    
    $baud = 19200
    
    
    
    $include "config_mmc.bas"
    $include "config_avr-dos.bas"
    
    '-------------------------------------------------------------------------------
    'Ein- Ausgänge:
    
    Ddra = &B00000000                                           '1 Ausgang, 0 Eingang = Pin PA7-0
    'Ddrb = &B00000000                                           '1 Ausgang, 0 Eingang = Pin PB7-0
    Ddrc = &B00000000                                           '1 Ausgang, 0 Eingang = Pin PC7-0
    Ddrd = &B11000000                                           '1 Ausgang, 0 Eingang = Pin PD7-0
    Config Pinb.4 = Output                                      'CS
    Config Pinb.6 = Input                                       'MISO / DO
    
    
    '-------------------------------------------------------------------------------
    
    
    'Timer1 = 16 Bit
    Config Timer1 = Timer , Prescale = 256                      'Teiler 1/8/64/256/1024
    On Timer1 Ontimer1overflow                                  'Unteprogramm aufrufen
    Const Timer1vorgabe = 7936
    Timer1 = Timer1vorgabe
    Enable Timer1                                               'timer einschalten
    
    
    '-------------------------------------------------------------------------------
    
    '-------------------------------------------------------------------------------
    'Analogmessung:
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    'Start Adc                                                   'Starte analog Messung
    
    
    '-------------------------------------------------------------------------------
    'Variablen:
    
    
    Dim Tmpbyte As Byte                                         'zum initialisieren
    Dim Btemp1 As Byte                                          'zum initialisieren
    
    
    Dim K0 As Word                                              'Spannung Akku
    Dim K00 As Single
    Dim K000 As String * 4
    Dim K1 As Word                                              'Spannung Empfänger
    Dim K11 As Single
    Dim K111 As String * 4
    Dim K2 As Integer                                           'MotorTemp
    Dim K22 As String * 3
    Dim K3 As Word                                              'Strom Akku
    Dim K33 As Single
    Dim K333 As String * 4
    Dim K4 As Integer
    Dim K44 As String * 5
    Dim K5 As Integer
    Dim K55 As String * 5
    Dim K6 As Integer
    Dim K66 As String * 5
    Dim K7 As Integer
    Dim K77 As String * 5
    
    'TEMP NTC:
    Dim Ohm As Single
    Dim Temp1 As Single                                         'wegen den negativen Zahlen!!!
    Dim Temp2 As Single
    Dim Temp3 As Single
    Dim Temp As Single
    
    
    'Dim Volt As Single
    
    Dim Anzahl As Long                                          'Zähler für schreiben
    Dim Anzahl_str As String * 6
    
    Dim Zu_schreiben As String * 60
    Dim Rec As Byte                                             'wird von Timer 1 hochgezählt
    
    Dim Led As Byte
    
    'Dim Ltemp As Long                                           'Pointerposition
    
    Dim Pulsbreite1 As Word                                     'Knüppelstellung Knüppel 1
    Dim Pulsbreite2 As Word                                     'Knüppelstellung Knüppel 2
    '-------------------------------------------------------------------------------
    
    Enable Interrupts
    
    
    Waitms 500
    Print "START..."
    
    '_______________________________________________________________________________
    'Init MMC/SD Card
    
    Tmpbyte = Driveinit()
        Print "Init: " ; Str(tmpbyte)
        Print "Trying to read File system..."
        Btemp1 = Initfilesystem(1)                              ' Partition 1
        Print "Btemp1: " ; Btemp1
    
    If Btemp1 <> 0 Then                                         'Wenn Fehler
    Print "Error: " ; Btemp1 ; " beim  Initialisieren des Dateisystems"
    Waitms 500
    Print "SD - FEHLER"
    Goto Fehler
    Else
    Print "SD OK"
    End If
    
    'Wait 1
    
    
    
    
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    'Hauptprogramm Do...Loop
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    Do
    
    
    Incr Led                                                    'led hochzählen
    If Led > 10 Then
       If Pind.5 = 1 Then
          Portd.7 = 1                                           'Grüne LED an für ADC einlesen
       Else
          Portd.7 = 0
       End If
    Led = 0                                                     'Zähler
    End If
    
    
    
    'Empfänger einlesen
    Pulsein Pulsbreite1 , Pinc , 7 , 1                          'Pulsbreite auslesen (1=High Impuls)
    'Knüppel OBEN
       ' If Pulsbreite1 > 146 And Kanal1o = 0 Then               'wenn Knüppel oben und Kanal1oben=0 dann
       ' Toggle Ausgang1                                         'Pin 1 mal schalten (entweder auf Hi oder Low je nach vorherigem zustand)
       ' Kanal1o = 1                                             'Variable Kanal1o setzen damit nicht neu getoggled werden kann
       ' End If
    
    
    'Analogkanäle einlesen
    K0 = Getadc(0)                                              'Wert aus Analogeingang laden
    K1 = Getadc(1)                                              'Wert aus Analogeingang laden
    K2 = Getadc(2)                                              'Wert aus Analogeingang laden
    K3 = Getadc(3)                                              'Wert aus Analogeingang laden
    K4 = Getadc(4)                                              'Wert aus Analogeingang laden
    K5 = Getadc(5)                                              'Wert aus Analogeingang laden
    K6 = Getadc(6)                                              'Wert aus Analogeingang laden
    K7 = Getadc(7)                                              'Wert aus Analogeingang laden
    
    If Led = 0 Then
    Toggle Portd.7                                              'Grüne LED aus für ADC einlesen
    End If
    
    'Analog umrechnen:
    
    'VOLT
    K00 = K0                                                    'Gesamtspannung 3,3*6=19,8V -> 19,8V/1024Stufen= 0,0193...
    K00 = K00 * 0.0193359375
    K000 = Fusing(k00 , "##.#")
    
    'VOLT
    K11 = K1                                                    'Gesamtspannung 3,3*6=19,8V -> 19,8V/1024Stufen= 0,0193...
    K11 = K11 * 0.0193359375
    K111 = Fusing(k11 , "##.#")
    
    'TEMP MESSUNG
    Ohm = 1.9 * K2                                              'Analogeingang bei 1020 Ohm = 504 -> 1020/504=2,0238095(24,5°C)  (Wert kleiner=Temp größer)
    'Temp = 3730 / (Log(1,9*NTC) + 5.59017600439636) - 273
    Temp = Log(ohm)                                             'RECHNEN
    Temp = Temp + 5.59017600439636                              'RECHNEN
    Temp = 3730 / Temp                                          'RECHNEN
    Temp = Temp - 273                                           'RECHNEN Kelvin in Celsius
    K22 = Fusing(temp , "##.#")
    
    'STROM
    K33 = K3                                                    'Gesamtspannung 3,3*6=19,8V -> 19,8V/1024Stufen= 0,0193...
    K33 = K33 * 0.0193359375
    'Analogkanäle formatieren
    K333 = Fusing(k33 , "##.#")
    
    
    
    K44 = Str(k4)
    K44 = Format(k44 , "0000")
    
    K55 = Str(k5)
    K55 = Format(k55 , "0000")
    
    K66 = Str(k6)
    K66 = Format(k66 , "0000")
    
    K77 = Str(k7)
    K77 = Format(k77 , "0000")
    
    
    If Pind.5 = 0 And Rec => 1 Then
    Incr Anzahl
    Anzahl_str = Str(anzahl)
    Anzahl_str = Format(anzahl_str , "000000")
    
    'Alles in einen String fassen
    Zu_schreiben = Anzahl_str + ";" + K000 + "V;" + K111 + "V;" + K22 + "C;" + K333 + "A;" + K44 + ";" + K55 + ";" + K66 + ";" + K77
    
    Gosub Sd_schreiben
    Rec = 0                                                     'Variable von Timer zurücksetzen
    End If
    
    
    
    Loop
    '_______________________________________________________________________________
    
    
    
    
    '_______________________________________________________________________________
    'Daten auf SD - Card schreiben:
    
    
    Sd_schreiben:
    'Datei öffnen / erstellen wenn nicht vorhanden!
    Open "LOG.txt" For Append As #1
    Print #1 , Zu_schreiben                                     'Variable auf SD schreiben
    Print Zu_schreiben                                          'Variable auf COM / PC anzeigen
    
    Close #1
    Return
    
    
    
    'bei SD Fehler
    Do
    Fehler:
    Print "Fehler!!!"
    Portd.7 = 1                                                 'Grüne LED blinken für FEHLER
    Wait 1
    Portd.7 = 0                                                 'Grüne LED blinken für FEHLER
    Wait 1
    Loop
    
    
    Ontimer1overflow:
    Timer1 = Timer1vorgabe
    Incr Rec
    If Pind.5 = 1 Then
    Anzahl = 0
    End If
    
    Toggle Portd.6                                              'rote LED
    
    Return

  4. #24
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    so, der µC lief nun 5 Stunden - also scheint nun alles in Ordnung zu sein.

    nochmals vielen Dank!

  5. #25
    Neuer Benutzer Öfters hier
    Registriert seit
    11.02.2010
    Beiträge
    29
    Na endlich =D>
    An die Stacks hab ich wirklich nicht gedacht....
    Bei mir sind sie wegen dem Rest des Programms sowieso sehr hoch.

  6. #26
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    und was heißt "sehr hoch" in deinem Fall? (mal so als Vergleich)

  7. #27
    Neuer Benutzer Öfters hier
    Registriert seit
    11.02.2010
    Beiträge
    29
    Momentan hab ich
    $hwstack = 200
    $swstack = 400
    $framesize = 600
    eingestellt.
    Wird später wahrscheinlich noch nach unten geschraubt. Aber aufgrund tiefer Verschachtelung, langer Übergabestrings und Interrupts erst mal recht hoch gegriffen.

    Interessant für die Stacks fand ich folgende Seite
    http://halvar.at/elektronik/kleiner_...swstack_frame/

  8. #28
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von reinhars
    ... langer Übergabestrings ...
    Du musst halt sehen, ob du die Strings wirklich übergeben musst, also mit ByVal angibst. Das hat zwar Vorteile in punkto Code Lesbarkeit, aber eben auch den Nachteil, dass du im Frame den ganzen Platz brauchst. Und dazu noch ein wenig im SWStack.

  9. #29
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    toller Link! vielen Dank!

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

Solar Speicher und Akkus Tests