Archiv verlassen und diese Seite im Standarddesign anzeigen : Uhr: wait-Anweisung im Hauptprogramm und sectic
Hallo,
ich habe eine Uhrzeit mit externem Uhrenquarz laufen.
Zudem lasse ich eine Variable S am Tag im Sekundentakt hochzählen und um 0:00 Uhr wieder auf 0 stellen:
Sectic:
S = S + 1 'Sekunden-Tageszähler
If Time$ = "00:00:00"then
S = 0
Time$ = "00:00:03" 'Kompensation Uhrenquarz
End If
ReturnIm Hauptprogramm benutze ich auch eine "waitms 500" Anweisung.
Nun funktioniert mein Programm nicht, weil das Nullstellen von S nicht funktioniert, soviel habe ich nun herausgefunden.
Ich habe den Verdacht, dass mir die waitms Anweisung verhindert, dass S um 0:00 auf 0 gestellt wird.
Kann das sein oder wird das waitms zwangsweise immer unterbrochen wenn sectic fällig ist?
Darf ich überhaupt eine wait Anweisung im Hauptprogramm haben, und ist gleichzeitig gewährleistet dass sectic ausgeführt wird?
Holger
Im Prinzip dürfte die Sectic und die Waitms sich praktisch nicht gegeneinader stören.
In seltenen Fällen wenn der Interrupt in die waitms fällt würde die ein paar µs länger werden, sonst nix.
Ob der Stringvergleich mit Time$ einfach so funktioniert bin ich mir jetzt aber nicht sicher ...
Also der Stringvergleich funktioniert.
Die waitms brauche ich eigentlich nur um das Display flackerfrei zu haben.
Und ich habe praktisch 2 Display "Seiten".
Per Knopfdruck kann ich von "Seite 1" auf "Seite 2" wechseln.
Eine Seite bleibt solange bestehen, bis wieder ein Knopfdruck kommt..
Und jetzt das seltsame: bei Seite 1 habe ich nur 50ms Wartezeit - dann funktioniert mein Programm (und auch die Sekunden-Nullstellung).
Wenn ich Seite 2 stehen lasse, welche die 500ms Wartezeit hat, dann funktioniert es nicht.
Soweit sind jedenfalls meine derzeitigen Ergebnisse.
Ist doch komisch, oder.
Und da dachte ich es ist wichtig zu wissen, ob wait das sectic behindert.
Denn dann dürfte auch waitms 50 kritisch sein, es könnte ja sein dass diese Behinderung dann nur eben seltener stattfindet (1/10 mal so häufig).
Ich hab jetzt für seite 2 die 500ms in 50 ms umgewandelt, mal sehen , was das Programm jetzt macht.
Das dumme ist nur dass sich das Ergebnis immer einen Tag später herausstellt, also die Fehlersuche dauert da ganz schön lang.
Ich kann auch nicht 100%ig sagen ob das alles ist aber wir werden sehen...
Hallo!
Das dumme ist nur dass sich das Ergebnis immer einen Tag später herausstellt, also die Fehlersuche dauert da ganz schön lang.
Du kannst doch zu Debuggen die Uhrzeit auf z.B. 23:59:55 setzen und nur 5 sek warten,
anstelle eines Tages, oder sehe ich das falsch?
MfG
Rone
Ich seh in dem Code oben kein "WAIT".
Ohne (original) Programm ist über Programmprobleme schwer zu befinden
Vergiss nicht, das Problem sitzt meistens VOR dem Bildschirm :-)
Hallo!
Du kannst doch zu Debuggen die Uhrzeit auf z.B. 23:59:55 setzen und nur 5 sek warten,
anstelle eines Tages, oder sehe ich das falsch?
MfG
Rone
ja, hast schon recht das muss ich wohl so machen. Es liegt wohl tatsächlich nicht an den waitms, weil heute ging es wieder nicht.
Ich muss jetzt weiter suchen und das werde ich so machen.
Ich seh in dem Code oben kein "WAIT".
Ohne (original) Programm ist über Programmprobleme schwer zu befinden
Vergiss nicht, das Problem sitzt meistens VOR dem Bildschirm :-)
Das Programm sieht sehr sehr schlimm aus. Ich bin Anfänger.
Das Programm hat eine längere Geschichte, und ist kompliziert, laienhaft und herumgebastelt, ich denke das würde großes Haarsträuben bei den Profis auslösen.
Das wollte ich euch erstmal ersparen :)
Ich müsste da schon noch wenigstens etwas Kosmetik betreiben dass ich es hier reinstelle, was ich vielleicht noch machen werde.
radbruch
14.06.2011, 09:29
Versuche das nötigste zu einem kleinen Testprogramm zusammenzufügen.
So, jetzt kommen wir der Lösung näher.
Ich hab den Teil isolieren können und den Fehler reproduziert:
Do
Cls
Locate 1 , 1
Lcd S
Locate 2 , 1
Lcd "Zeit " ; Time$
Cursor Off
Waitms 50
Loop
Sectic:
S = S + 1 'Sekunden-Tageszähler
If Time$ = "00:00:00"then
S = 0
Time$ = "00:00:03" 'Kompensation Uhrenquarz
End If
Return
So funktioniert die Rückstellung.
Allerdings, wenn ich im Display die Anzeige von time$ weglasse, dann funktioniert es nicht mehr!
Das ist der springende Punkt!
Aber erklären kann ichs nicht. Es muss wohl tatsächlich wie Vitis schon geschrieben hat mit dem Stringvergleich zu zun haben.
Er funktioniert, wenn gleichzeitig time$ im Display angezeigt wird und ansonsten funktioniert es nicht !?!
Wie kann ich diese Problem lösen, ohne time$ im Display anzeigen zu müssen?
hmmm ... wenn du über einen zweiten String gehst könnts gehen, aber das ist nur ne Spekulation ... also
dim tempstring as string*8
tempstring=time$
if tempstring="00:00:00" then
' irgendwas
endif
peterfido
14.06.2011, 17:18
Wozu jedesmal Cursor off?
Am besten ohne waitms arbeiten.
Du kannst S in einer anderen Variablen zwischenspeichern und wenn S geändert wurde das Display aktualisieren. Außerdem zählst Du jede Sekunde S hoch, da brauchst Du nicht Time$ vergleichen
Cursor Off
dim s_alt as long
const sTag =60*60*24
Do
if s <> salt then
salt=s
Cls
Locate 1 , 1
Lcd S
Locate 2 , 1
Lcd "Zeit " ; Time$
end if
Loop
Sectic:
incr s 'Sekunden-Tageszähler
if s=stag then
S = 0
Time$ = "00:00:03" 'Kompensation Uhrenquarz
End If
Return
hmmm ... wenn du über einen zweiten String gehst könnts gehen, aber das ist nur ne Spekulation ... also
dim tempstring as string*8
tempstring=time$
if tempstring="00:00:00" then
' irgendwas
endif
Ja, genau so geht es , ich danke dir.
Da kann man mal sehen, wie man fehlgeleitet werden kann. Weil ich für die Displayanzeige Seite 2 statt 50ms 500ms hatte, glaubte ich dass dies der Grund sein müsste.
Aber dass ein anderer Displayinhalt (genauer: ob time$ angezeigt wird oder nicht) doch tatsächlich die Ursache war, dass es einmal ging und einmal nicht, das hätte ich doch wirklich nicht vermutet.
Wozu jedesmal Cursor off?
Am besten ohne waitms arbeiten.
Du kannst S in einer anderen Variablen zwischenspeichern und wenn S geändert wurde das Display aktualisieren. Außerdem zählst Du jede Sekunde S hoch, da brauchst Du nicht Time$ vergleichen
Cursor Off
dim s_alt as long
const sTag =60*60*24
Do
if s <> salt then
salt=s
Cls
Locate 1 , 1
Lcd S
Locate 2 , 1
Lcd "Zeit " ; Time$
end if
Loop
Sectic:
incr s 'Sekunden-Tageszähler
if s=stag then
S = 0
Time$ = "00:00:03" 'Kompensation Uhrenquarz
End If
Return
danke für die tolle Anregung. Da ich aber noch mehrere Variablen anzeigen lasse, wird es mir zu kompliziert.
Ich bin jetzt schon froh dass es überhaupt zuverlässig funktioniert :)
Nur das Wort "zuverlässig" muss sich noch bestätigen...
ja, das sind die Probleme die mitunter mit Bascom Highlevelbefehlen entstehen ... man sucht sich den Wolf wenns klemmt, daher verwende ich die nur sehr selten und kann auch nur dazu raten so einfache Funktionen wie Uhrzeit oder Stringoperationen zu Fuß zu machen. Der Code wird zwar idR nen Tick größer, das Programm ggf ne Spur langsamer aber man weiß was der Controller macht.
Wobei die wirksamste Waffe dabei die Overlayvariablen sind mMn.
Ich vermute, dass Time$ n Konstrukt ist aus ner internen Sekundenzählung im Timer Interrupt, sprich, intern werden nur Sekunden gezählt und bei der Abfrage von Time$ wird aus der Sekundenzahl der String gebildet. Dass das nur bei einer Stringzuweisung und nicht bei einer If-Abfrage passiert ist nervig, scheint aber so. :confused:
peterfido
15.06.2011, 18:46
Time$ wird sekündlich aktuell gehalten. Jedoch benötigt ein String vergleich mehr Ressourcen als "zu Fuß" die Systemvariablen _sec, _min und _hour abzufragen. Die Zeitkorrektur von 3 Sekunden lässt sich auch mit _sec=3 erledigen. Besser wäre es, wenn die Zeit erst gar nicht so weit abschweift. Ich nutze in meinen Projekten auf verschiedene Arten Datum und Uhrzeit. In einem Projekt habe ich die Uhr-routine komplett selbst geschrieben. config clock nutze ich selten. Und bei Config DCF lässt sich jeder Quarz nehmen (man braucht keinen Uhrenquarz, jedoch wird eine Timer belegt), selbst wenn gar kein DCF Empfänger angeschlossen ist, läuft die Uhrzeit weiter...
Auch ein CLS würde ich nicht in jedem Durchlauf nehmen. Ich schicke immer Strings fester Länge zum Display. So flackert es nicht, wenn der selbe Text wieder erscheinen soll.
Das const sTag = lässt sich auch vorher berechnen und als Zahl (86400) eingeben. Sollte so aber auch funktionieren, da rechnet dann halt der Compiler.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.