- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Merkwürdiges "Stringvariablen" Problem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2006
    Ort
    Münster
    Alter
    62
    Beiträge
    9

    Merkwürdiges "Stringvariablen" Problem

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo, ich bin neu hier, lese schon einige Zeit mit und finde es immer wieder toll, das ich "meine" Probleme (ich bin AVR und µC Anfänger) hier immer wiederfinde, weil andere die auch schon hatten! =D>

    Aber nun habe ich ein Problem, zu dem ich noch keine Lösung gefunden habe.

    Ich habe ein Uhrprogramm für einen ATMega 16 geschrieben, das auch (fast) einwandfrei läuft. Nur beim zusammenstellen der String Variablen für die Zeit und Datumsausgabe taucht ein Fehler auf, den ich mir nicht erklären kann. Hoffentlich könnt ihr mir das erklären. Hier also mal der Ausschnitt des Codes:

    ' Ausgabestrings zusammenstellen


    Strzeit = " Zeit: "

    If Stunde < 10 Then
    Strzeit = Strzeit + "0" + Str(stunde) + ":"
    Else
    Strzeit = Strzeit + Str(stunde) + ":"
    End If

    If Minute < 10 Then
    Strzeit = Strzeit + "0" + Str(minute) + ":"
    Else
    Strzeit = Strzeit + Str(minute) + ":"
    End If

    If Sekunde < 10 Then
    Strzeit = Strzeit + "0" + Str(sekunde) + " "
    Else
    Strzeit = Strzeit + Str(sekunde) + " "
    End If



    Strdatum = "Datum: "

    If Tag < 10 Then
    Strdatum = Strdatum + "0" + Str(tag) + "."
    Else
    Strdatum = Strdatum + Str(tag) + "."
    End If

    If Monat < 10 Then
    Strdatum = Strdatum + "0" + Str(monat) + "."
    Else
    Strdatum = Strdatum + Str(monat) + "."
    End If

    If Jahr < 10 Then
    Strdatum = Strdatum + "0" + Str(jahr) + " "
    Else
    Strdatum = Strdatum + Str(jahr) + " "
    End If


    If Wochentag = 1 Then Strwochentag = "Montag"
    If Wochentag = 2 Then Strwochentag = "Dienstag"
    If Wochentag = 3 Then Strwochentag = "Mittwoch"
    If Wochentag = 4 Then Strwochentag = "Donnerstag"
    If Wochentag = 5 Then Strwochentag = "Freitag"
    If Wochentag = 6 Then Strwochentag = "Samstag"
    If Wochentag = 7 Then Strwochentag = "Sonntag"


    Wenn ich das nun laufen lassen, dann wird der String "strzeit" erstmal einwandfrei zusammengestellt.
    ABER wenn es dann an das zusammenstellen des Strings "strdatum" geht, dann wird der zwar auch normal erstellt, aber alles, was in "Strdatum" steht, steht hinterher auch in "Strzeit".
    Und selbst wenn der Wochentag in "strwochentag" geschrieben wird, steht der Wochentag danach auch am Ende von "Strzeit".

    Da weiss ich nun nicht weiter, was mache ich da falsch!

    Ach so, das Problem besteht sowohl im Simulator als auch in µC.

    Ich ein langer Text geworden, ich hoffe aber ihr versteht trotzdem, was ich meine.

    Danke für eure Hilfe

    Ralf

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Mit welcher Länge hast du deine Strings definiert ? Laß gucken !

    EDIT: und für das stringmassaker braucht er ein wenig "framsize="

    wie sieht's damit aus ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2006
    Ort
    Münster
    Alter
    62
    Beiträge
    9
    Das sieht so bei mir aus:

    Dim Sekunde As Byte
    Dim Minute As Byte
    Dim Stunde As Byte
    Dim Tag As Byte
    Dim Monat As Byte
    Dim Jahr As Byte
    Dim Wochentag As Byte
    Dim Sek As Bit
    Dim Strzeit As String * 16
    Dim Strdatum As String * 16
    Dim Strwochentag As String * 10



    Das der Code noch "verbesserungswürdig" ist, ist mir klar.
    Und "Stringmassaker" ist klasse! =D>

    EDIT:
    Aber was du mit "framsize=" meinst, weiss ich nicht! Kann also keine Auskunft geben!

    Danke

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich hab' da den Bascom noch nicht installiert, sonst würd' ich mir das ansehen.
    Auf Verdacht:
    Schreib vorne sowas wie
    $FRAMESIZE=64

    damit man das als Fehlerquelle ausschließen kann.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2006
    Ort
    Münster
    Alter
    62
    Beiträge
    9
    Danke, hab ich gemacht.

    Hat aber leider nichts geändert!

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    So. Tut mir leid, das Programm läuft im Simulator pipifein. (mit und ohne framesize)

    Eingestellt auf ATMEGA32


    Code:
    Dim Sekunde As Byte
    Dim Minute As Byte
    Dim Stunde As Byte
    Dim Tag As Byte
    Dim Monat As Byte
    Dim Jahr As Byte
    Dim Wochentag As Byte
    Dim Sek As Bit
    Dim Strzeit As String * 16
    Dim Strdatum As String * 16
    Dim Strwochentag As String * 10
    
    
     Sekunde = 55
     Minute = 12
     Stunde = 23
     Tag = 1
     Monat = 12
     Jahr = 6
     Wochentag = 1
    
    
    
    Strzeit = " Zeit: "
    
    If Stunde < 10 Then
    Strzeit = Strzeit + "0" + Str(stunde) + ":"
    Else
    Strzeit = Strzeit + Str(stunde) + ":"
    End If
    
    If Minute < 10 Then
    Strzeit = Strzeit + "0" + Str(minute) + ":"
    Else
    Strzeit = Strzeit + Str(minute) + ":"
    End If
    
    If Sekunde < 10 Then
    Strzeit = Strzeit + "0" + Str(sekunde) + " "
    Else
    Strzeit = Strzeit + Str(sekunde) + " "
    End If
    
    
    
    Strdatum = "Datum: "
    
    If Tag < 10 Then
    Strdatum = Strdatum + "0" + Str(tag) + "."
    Else
    Strdatum = Strdatum + Str(tag) + "."
    End If
    
    If Monat < 10 Then
    Strdatum = Strdatum + "0" + Str(monat) + "."
    Else
    Strdatum = Strdatum + Str(monat) + "."
    End If
    
    If Jahr < 10 Then
    Strdatum = Strdatum + "0" + Str(jahr) + " "
    Else
    Strdatum = Strdatum + Str(jahr) + " "
    End If
    
    
    If Wochentag = 1 Then Strwochentag = "Montag"
    If Wochentag = 2 Then Strwochentag = "Dienstag"
    If Wochentag = 3 Then Strwochentag = "Mittwoch"
    If Wochentag = 4 Then Strwochentag = "Donnerstag"
    If Wochentag = 5 Then Strwochentag = "Freitag"
    If Wochentag = 6 Then Strwochentag = "Samstag"
    If Wochentag = 7 Then Strwochentag = "Sonntag"
    
    End
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2006
    Ort
    Münster
    Alter
    62
    Beiträge
    9
    Danke für den Test.
    Stimmt, nur dieser Programmteil läuft auch bei mir. Gerade getestet.

    Komisch, im Zusammenhang mit dem ganzen Prg. taucht der Fehler auf.

    Aber ich wollte hier das Forum nicht gleich mit dem ganzen, langen Code zumüllen.

    Wenn ich den Code im Einzelschrittmodus im Simulator laufenlasse, dann erscheint schön wie es soll, der Inhalt von strZeit, Schritt für Schritt.
    Und wenn dann die erste Zeite des Datum ausgeführt wird, dann wird auch die strDatum Schritt für schritt ausgefüllt. Aber auch nochmal im strzeit.

    Hmm, mal sehen, ob ich es auch schaffe, den ganzen Code so wir du in einem Fenster hereinzubekommen!

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2006
    Ort
    Münster
    Alter
    62
    Beiträge
    9
    Na geht doch! =D>

    Code:
    $regfile = "m16def.dat"                                     'definieren des verwendeten Chips
    
    $crystal = 8000000                                          'definieren des verwendeten externen Quarz (8MHz)
    
    $framesize = 64
    
    'Timer Config
    Config Timer1 = Timer , Prescale = 256                      'Konfiguriere Timer1
    Enable Timer1                                               'schalte den Timer1 ein
    On Timer1 Isr_von_timer1                                    'verzweige bei Timer1 überlauf zu   Isr_von_Timer1
    Enable Interrupts
    Timer1 = 34285                                              'Timer1 soll schon von 34285 wegzählen
    
    
    
    
    '======================================================
    'Konfigurationen für LCD Modul an Port B
    '======================================================
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
    Config Lcdbus = 4
    Cls
    
    ' Ende LCD Config
    
    
                                                                 'dimensionieren der verwendeten Variablen
    Dim Sekunde As Byte
    Dim Minute As Byte
    Dim Stunde As Byte
    Dim Tag As Byte
    Dim Monat As Byte
    Dim Jahr As Byte
    Dim Wochentag As Byte
    Dim Sek As Bit
    Dim Strzeit As String * 16
    Dim Strdatum As String * 16
    Dim Strwochentag As String * 10
    
    
                                                                  'Alle Variablen auf Null setzen
    Sekunde = 0
    Minute = 12
    Stunde = 10
    Tag = 21
    Monat = 11
    Jahr = 06
    Wochentag = 2
    
    Sek = 0
    
    
    Ddrd = &B11100000                                           'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
    Portd = &B00000000                                          'definieren der einzelnen Pins an einem Port ( 0= low level; 1= high level)
    
    
    
    
    
    ' Hauptprogramm
    
    ' Anfang der Schleife
    Do
    
    
    
    
    ' Überträge
    If Sekunde > 59 Then
       Sekunde = 0
       Minute = Minute + 1
    End If
    
    If Minute > 59 Then
       Minute = 0
       Stunde = Stunde + 1
    End If
    
    If Stunde > 23 Then
       Stunde = 0
       Tag = Tag + 1
    End If
    
    If Tag > 30 Then
       Tag = 0
       Monat = Monat + 1
    End If
    
    If Monat > 11 Then
       Monat = 0
       Jahr = Jahr + 1
    End If
    
    ' Wenn die Sekunde sich ändert hat, alles neu ausgeben
    If Sek = 1 Then
       Sek = 0
       Gosub Ausgabe
    End If
    
    
    
    ' Tastenabfrage zum stellend er Uhr
    Gosub Tastenabfrage
    
    Loop                                                        'zum Anfang der Schleife
    ' Ende Der Hauptschleife
    
    
    
    
    ' Tastenabfrage zum stellen der Uhr
    Tastenabfrage:
    
       If Pind.2 = 1 Then                                       'Wenn an Pin 2 von Port D ein high level anliegt, dann...
          Minute = Minute + 1                                   '...setze Pin 5 von Port D von high auf low oder umgekehrt
          Bitwait Pind.2 , Reset
       End If                                                   'warte bis an Pin 2 von Port D wieder ein low level anliegt
    
    Return
    
    
    
    ' Ausgabe der Uhrzeit
    Ausgabe:
    
    ' Ausgabestrings zusammenstellen
    
    
    Strzeit = " Zeit: "
    
    If Stunde < 10 Then
       Strzeit = Strzeit + "0" + Str(stunde) + ":"
       Else
       Strzeit = Strzeit + Str(stunde) + ":"
    End If
    
    If Minute < 10 Then
       Strzeit = Strzeit + "0" + Str(minute) + ":"
       Else
       Strzeit = Strzeit + Str(minute) + ":"
    End If
    
    If Sekunde < 10 Then
       Strzeit = Strzeit + "0" + Str(sekunde) + "  "
       Else
       Strzeit = Strzeit + Str(sekunde) + "  "
    End If
    
    
    
    Strdatum = "Datum: "
    
    If Tag < 10 Then
       Strdatum = Strdatum + "0" + Str(tag) + "."
       Else
       Strdatum = Strdatum + Str(tag) + "."
    End If
    
    If Monat < 10 Then
       Strdatum = Strdatum + "0" + Str(monat) + "."
       Else
       Strdatum = Strdatum + Str(monat) + "."
    End If
    
    If Jahr < 10 Then
       Strdatum = Strdatum + "0" + Str(jahr) + "  "
       Else
       Strdatum = Strdatum + Str(jahr) + "  "
    End If
    
    
    If Wochentag = 1 Then Strwochentag = "Montag"
    If Wochentag = 2 Then Strwochentag = "Dienstag"
    If Wochentag = 3 Then Strwochentag = "Mittwoch"
    If Wochentag = 4 Then Strwochentag = "Donnerstag"
    If Wochentag = 5 Then Strwochentag = "Freitag"
    If Wochentag = 6 Then Strwochentag = "Samstag"
    If Wochentag = 7 Then Strwochentag = "Sonntag"
    
    
    
    
    'lcd routine und anzeige
    Cls
    Locate 1 , 1
    Lcd Strzeit
    
    Locate 2 , 1
    Lcd Strdatum
    
    
    ' Und nun noch per RS232
    
    Print Stunde ; Minute ; Sekunde
    
    Print Strzeit
    Print Strwochentag
    
    
    'Print Zeit$
    'Print Datum$
    'Print Wochentag$
    Print
    Print
    
    
    Return
    
    
    
    ' Vom Timer jede Sekunde angesprungen
    Isr_von_timer1:                                             'ISR von Timer1
    Timer1 = 34285                                              'Timer1 soll wieder von 34285 wegzählen
    Toggle Portd.6
    Toggle Portd.5                                              'schaltet Portd. im Sekundentakt EIN und AUS
    Sekunde = Sekunde + 1
    Sek = 1
    
    Return
    
    
    
    ' Programm Ende
    End

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    *hehe* die strings sind ein A..lecken zu kurz.

    Das hilft:

    Dim Strzeit As String * 24
    Dim Strdatum As String * 24



    BTW OT: Ist das das Münster, wo's auch den "allwetter-zoo" gibt ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2006
    Ort
    Münster
    Alter
    62
    Beiträge
    9
    Super funktioniert! Danke!!
    So einfach kann das sein! Aber warum macht der dann so komische Sachen? Ich hätte jetzt entweder eine Fehlermeldung erwartet, oder das in der Ausgabe hinten was fehlt bei zu kurzen Variablen.
    Naja, hauptsache es geht!

    Ja das ist das Münster mit dem AllwetterZoo der im TV war!

    Danke für deine schnelle Hilfe, das hat meine Meinung zu diesem Forum mal wieder bestätigt.

    Grüsse am dem (im Moment) sonnigen Münster!

    Ralf

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen