PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Merkwürdiges "Stringvariablen" Problem



RogerMS
21.11.2006, 10:56
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

PicNick
21.11.2006, 11:11
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 ?

RogerMS
21.11.2006, 11:13
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

PicNick
21.11.2006, 11:27
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.

RogerMS
21.11.2006, 11:36
Danke, hab ich gemacht.

Hat aber leider nichts geändert!

PicNick
21.11.2006, 11:40
So. Tut mir leid, das Programm läuft im Simulator pipifein. (mit und ohne framesize)

Eingestellt auf ATMEGA32




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

RogerMS
21.11.2006, 11:49
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!

RogerMS
21.11.2006, 11:52
Na geht doch! =D>


$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

PicNick
21.11.2006, 12:23
*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 ?

RogerMS
21.11.2006, 12:59
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

PicNick
21.11.2006, 13:06
.. eine Fehlermeldung erwartet..

Nein, sowas wär hübsch, is aber nich
Das könnte er erst zur Laufzeit kontrollieren, und dieses Memory-Management würde keiner in einem Controller haben wollen.
Was sollte er auch tun ? Blue-Screen :mrgreen:

Laß' die Zooleute schön grüßen, unbekannterweise. Schad' nix.

RogerMS
21.11.2006, 13:14
Ja bei µC ist das schon klar, aber im Simulator hätte ich ne Meldung erwartet!

Ob wohl, nen BlueScreen auf meinen einfarbigen LCD wäre auch mal ganz Schön! :D

Gibt es denn eine Regel wie lang die String Var. sein sollte? Denn ich geb' ja max. 15 Zeichen in einen String und hatte den mit 16 (wegen 2 x 16 LCD) definiert! Wieso war das dann noch zuwenig?

Von den Zoo Leuten kann ich nur einen Grüssen, den ich persönlich kenne.

Das werde ich dann tun! :D

PicNick
21.11.2006, 13:48
Schau'n wir mal:


Strzeit = " Zeit: " '7 Zeichen
Strzeit = Strzeit + Str(stunde) + ":" '3 Zeichen
Strzeit = Strzeit + Str(minute) + ":" '3 Zeichen
Strzeit = Strzeit + Str(sekunde) + " " '4 Zeichen
---------------------------
17 Tschinn-Bumm !!!@(/%


Du gibts bei der sekunde am Ende 2 LEERZEICHEN aus .

Genaugenommen würde also reichen

DIM STRZEIT as STRING * 17

Ich sag's ja, ein A..lecken.

RogerMS
21.11.2006, 13:51
Danke, also doch kein Denkfehler, nur ein Tipfehler. Da sollte nur 1 Leerzeichen hin.

OK, dann hab ich das verstanden und ja auch prinzipiell richtig gedacht!

Dann bin ich beruhigt!

Danke

Ralf

PicNick
21.11.2006, 13:55
..Da sollte nur 1 Leerzeichen hin..

Jaja, die sch... proportional Schrift. Sowas fällt einfach nicht auf.

prinzipiell richtig, praktisch daneben !
So isses, kleine Sünden straft der liebe Gott sofort.