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 ?
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
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.
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
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.
Danke, hab ich gemacht.
Hat aber leider nichts geändert!
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.
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!
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
*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.
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
Lesezeichen