Timer aktivieren über Taster

Neuuser

Mitglied
11. Aug. 2008
465
0
16
Sprachen
Hallo Leute,
im meinen Programm habe ich einen Taster für die Hintergrundbeleuchtung des LCDs für 120 Sekunden.
wen diese nun eingeschaltet wird funktioniert es auch, aber der Timer lauft immer, also wen ich den Taster drücke ist es nur zufällig wie lange die anzeige leuchtet es könnten 10 sec aber auch 110 sec sein weil er immer lauft.
wie kann ich den Timer fürs Licht erst dann aktivieren wen er mit den Tastendruck gebraucht wird ?

hier nur ein kleiner ausschnitt der Zuweisung zum Timer.

Gruß Neuuser

Code:
If Tast2 = 0 Then Licht_an = 1 

Timer1_sprung:

Timer1 = 34286                                              'Dieser Wert bestimmt die Sample Frequenz
   Incr Zeit_zaehler                                        ' Jede Sekunde um   +1
   Incr I
   Incr A

   If Zeit_zaehler = 2 Then                                 '60 = 1 Min -120 = 2 Min usw.
      Ready = 1
      Ready2 = 1
      Ready3 = 1
      Ready4 = 1
      Zeit_zaehler = 0
   End If

   If I = 3600 Then                                         '3600= 1 Stunde in sec.
      Incr Ii
      I = 0
   End If
   If Ii = 96 Then Legionellen = 1                          '24 =1 Tag in Stunden 96= 4 tage


   If A = 120 Then
   Licht_an = 0                                             'Licht in sekunden

   A = 0

 End If
Return
 
Hi Neuuser,

in BASCOM kannst Du das in der regel mit den Kommandos START TimerX bzw. STOP TimerX machen. TimerX steht dabei für den Timer den Du verwendest. In der BASCOM Hilfe findest Du mehr dazu!

Eine andere Lösung wäre z.B. Mit ENABLE TimerX und DISABLE TimerX zu arbeiten. Das hängt dann aber davon ab, ob Du Deinen Timer so konfiguriert hast, dass eine ISR angesprungen wird. Das Anspringen der ISR kannst Du damit unterbinden!

Grüße,
Markus
 
Hi Markus,

der Timer wird zweifach verwendet einmal für die Temperatur als zwischen wert und für die Legionhellen Einschaltung jede 4 Tage und natürlich das Licht.

aber wen ich den DISABLE TimerX verwende ist dann nicht der komplette Timer aus ?

Gruß Neuuser
 
OK OK, so funktioniert es nicht! Denn wenn Du mit Disable oder Stop arbeitest so steht der ganze Timer!

Ich schaus mir nochmal genau an. Heute aber leide rnicht mehr da ich in wenigen Minuten ins Planetarium fahre! Heute haben wie Premiere unserer neuen Multimediashow "Weltbilder der Astronomie".

Ich bin sicher wir finden eine Lösung für Dein Problem!


Grüße,
Markus
 
Hi Markus !

Heute haben wie Premiere unserer neuen Multimediashow "Weltbilder der Astronomie".

WAHNSINN !
neidischguck*

Da wird man ja richtig neidisch!
Schade dass euer Planetarium von mir soooo weit weit ist. :bawling:

Wünsche dir und Knickohr viel Spaß!

Grüße,
Cassio
 
Ja, das hätte mich und mein Sohn auch interessiert, ist wirklich ein wenig weit 554 Km, nah ja.

Gruß Neuuser
 
Hi zusammen,

freut mich, wenn ich Euch neidisch machen konnte. Bevor ich jedoch auch Moderator spiele und zurück zum eigentlichen Thema komme muss ich Euch sagen, die Show war sehr gut, die zugehörige Bilderausstellung auch und der anschließende Wein war auch sehr gut aber die Nacht war dafür sehr sehr kurz. Gääääähn.....

So, doch wie angekündigt nun zurück zum Thema:

@Neuuser; habe mir das Thema mal näher angesehen bzw. überlegt.

Ich glaube das Problem ist, dass Du für das Schalten der Beleuchtung keinen eindeutigen Zeitbezug hast. So ein ähnlihces Problem hatte ich in meiner Wintergartensteuerung auch. Ich erzähle Dir kurz davon und mit etwas "Querdenken" kannst Du die Lösung dafür für Dich ableiten.

Also:

- in meiner Witergartensteuerung verrichtet auch ein Timer bzw. eine SoftClock (auch mit Timer) dahingehend ihre Arbeit, dass ich jede Sekunde einen "Takt" bekomme. Wie Du!

- Ich zähle zunächst in der ISR (SECTICK) nur eine globale Variable vom Typ word hoch.

- Über die globale Variable "sectick_counter" synchronisiere ich alle zetlich gesteuerten Ereignisse.

- Dazu habe ich mir eine Art kleinen "Scheduler" geschrieben (GOSUB Funktion) die ich in der Hauptschleife (DO-LOOP) immer zyklisch mit "GOSUB myscheduler" aufrufe.

- Alle zeitlichen Aktivitäten die ich habe besitzen auch einen eigenen Zeitstempel (auch eine Variable vom Typ word)

- Immer wenn z.B. eine Taste betätigt wird oder ein auslösendes Ereignis eintritt, setzte ich diese speziellen "Überwachungszeitstempel" auf den aktuellen sectick-Counter PLUS die zeit, die sie laufen sollen. z.B. in Deinem Beispiel wären es: "beleuchtung_count = sectick_counter + 120"

- In meinem kleinen Scheduler überprüfe ich dann die einzelnen Überwachungszeitstempel auf gleichheit mit dem sectick_counter weil der ja ständig weiterläuft. Und wenn die Zeit zu den Aktivitätszeiten gleich ist dann löse ich die weitere gewünscht Aktion aus und verriegle die Funktion ggf. duch ein Flag vor erneutem Aufruf.


Sooo, was will Dir meine Werbesendung sagen? Ich würde es so machen:
- in der Sekundenroutine Variable hochzähen
- Wenn Du Taste betätigst Tastenüberwachung auf Sekundenvariable +120 setzen und Licht einschalten
- In If-Schleife auf Gleichheit zwischen Sekundenvariable und Überwachungsvariable prüfen. Wenn Gleichheit dann Licht ausschalten.


Meiner Meinung nach brauchst Du Dir bei Dauerbetrieb zunächst auch keine Gedanken bei Überlauf der Word-Variable machen. Solange Du immer auf GLEICH vergleichst spielt das keine Rolle weil Deine Überwachungszeitvariable den Überlauf ja auch mit macht. Es wird nur dann schwierig, wenn Du auf GRÖSSER oder KLEINER vergleichen möchtest.


Konnte ich Dir mit den Denkanstößen weiterhelfen?

Grüße,
Markus
 
Code:
If Tast2 = 0 Then Licht_an = 1

Dein Programm war ja eh fast Richtig, du hättest nur bei dem Tastendruck auch die Zählvariable für deine 120Sekunden zurücksetzen müssen.


Code:
If Tast2 = 0 Then 
  Licht_an = 1
 
  A=0   'Ich schätzte, jetzt klappts
End If

Ich hoffe ich konnte dir helfen. Bascom mag ich aber trotzdem nicht.
 
@Nomis

Bascom mag ich aber trotzdem nicht

Bitte lass es bleiben ständig Spitzen zu verteilen. JEDEM DAS SEINE, OK!

Markus
 
Hallo Leute,
ich habe vorhin noch eine weile probiert und bin auf den selben Nenner wie Nomis3000 gekommen und muss sagen es geht so, ich habe das selbe gestern schon mal probiert aber an der verkehrten stelle im Programm und daher ging es nicht.
Danke trotzdem für deine Unterstützung Markus, so eine ähnliche Variante hatte ich auch im Sinn wie du mir dort vorschlugst das beim auslösen des Tasters die eingegebene zeit 120s weiter zählt bin ich aber nicht gleich durch gestiegen.

Das hier ist nur fürs Licht, später will ich auch sehen das ich es in einen Solarregler mit integrieren kann, der erst bei einer bestimmten zeit und Volt abschaltet.

Verbinden will ich es noch mit ein bestimmtes Programm, das ist ein Solarumschalter der von Wechsel auf Normmalstrom und zurück umschaltet, funktioniert zur zeit gut, ich habe mir aber gedacht das er mindestens eine bestimmte zeit bei der eingestellten Einschalt Volt bleibt um sicher zu gehen das die Batterien wirklich voll sind.

Gruß Neuuser
 
Habe gedacht das ich hier so integrieren kann, aber es will nicht so richtig ;(
Code:
Schritt2:
Volt_chk = Volt * 10

   If Volt_chk > Aus And Volt_chk > Ein Then I = 0
       If I = 30 Then
       Irf = 0
       Waitms 200
       Relais1 = 1
       Waitms 200
       Relais2 = 1

   Elseif Volt_chk < Ein Then

Schritt3:
      Relais2 = 0
      Waitms 200
      Relais1 = 0
      Waitms 200
      Irf = 1
      End If
 
Wow! Dein letztes Codebeispiel ist für mich ziemlich schwer zu lesen, was aber nicht unbedingt an meiner Bascom-Antipathie liegt.

Schreib doch mal zu allen Variablen dazu, woher du sie hast und was für einen Zweck sie erfüllen sollen. Villeicht verschafft es auch schon etwas mehr Klarheit wenn du einen größeren Codeabschnitt postest.

Im Übrigen: Volt ist die Eniheit von Spannung, du hast in deinem Text oben Volt im falschen Kontext geschrieben.;)
 
Hallo Heuuser,

habe leider das gleiche Problem wie Nomis, leider ist das Codeschnipsel nicht ausreichend. Irgendwie bekomme ich nen Knoten ins Hirn.

- Du vermischt Labels und die dazugehörigen RETURN fehlen oder hast Du vor mit GOTO Sprungziele zu definieren? Oder schreibst Du GOSUB-Routinen mit mehreren Einsprungzielen? Warum hast Du Schritt3: in der IF-Anweisung eingebaut?
=> Auf solche Tricksereien würde ich prinzipiell verzichten und außerdem könnte ich mir vorstellen stort zunächst das End If was ja bei Einsprung über Schritt3 zunächst stört oder? Habe keine Ahnung was der Compiler daraus macht....

- Mir ist nicht klar, welches End If und welches Else nun zu welchem IF gehört bzw. gehören soll. Üblicherweise macht man das mit entsprechenden Einrückungen. Guter Stil ist übrigens, bei IF Anweisungen selbst wenn man nur eine Anweisung hat, diese auch in eine IF - End If zu verpacken. Ja, ich weiss, BASCOM bietet hier die Möglichkeit auf EndIf zu verzichten, wenn man das Kommando gleich in eine Zeile schreibt aber damit wird der Code unleserlich. Habe mal versucht Deinen Code zu interpretieren und die Einrückungen nach den Zuordnungen zu machen. Hast Du es so gemeint:

Code:
Schritt2:
   Volt_chk = Volt * 10

   If Volt_chk > Aus And Volt_chk > Ein Then  ' Umgestellt!!
      I = 0
   End If
   '  Ist das hier so richtig oder war die IF-Schleife von Dir anders gedacht?

   If I = 30 Then
       Irf = 0
       Waitms 200
       Relais1 = 1
       Waitms 200
       Relais2 = 1
   Elseif Volt_chk < Ein Then

Schritt3:                                                   ' was soll das hier????
       Relais2 = 0
       Waitms 200
       Relais1 = 0
       Waitms 200
       Irf = 1
   End If

- Könntest Du etwas mehr Code posten und ggf. die Stelle die Dich interessiert durch einen Kommentar kennzeichnen. Etwas mehr Beschreibung zum Problem und was nicht sor ichtig will wäre auch gut da der gezeigte Code-Teil doch sehr viel Spielraum zur Interpretation lässt.

Grüße,
Markus
 
Hallo Markus und Nomis3000,

du hast in deinem Text oben Volt im falschen Kontext geschrieben.
was meinst du damit Nomis ?

Ja es bringt nicht wirklich was wen man nur ein Code ausschnitt Postet, habe ihn nun vollständig an gehangen.
Aber nun ist der Code so wie er am Anfang war, die Anweisung für den Timer habe ich rausgenommen.
Ich weiß das mit den If und End if hat sich so ergeben, das auch schrit3 damit ein flos und funktioniert ohne Probleme weil Schritt 2 und 3 noch mal übe Sprünge getrennt sind.
Aber wie du schon erwähnst, muss man nicht unbedingt machen ;)

Es sollte ein Timer mitlaufen wen eine Bestimmte eingestellte Voltzahl erreicht ist, aber ich habe mir überlegt das man es so machen müsste wie du es gesagt hattest, Markus, er müsste mit den Timer weiterzählen.
Ist das so das der Timer weiterzählt auch wen er mal kurz unterbrochen wurde ??
Weil wen er nur mal kurz auf die Volt kommt und wieder zurückfällt würde er jedesmal von vorn anfangen und den Timer auf Null setzen.
Das geht nicht dann würde er ewig brauchen das er wieder einschaltet.
Ich hoffe ihr habt es so weit verstanden wie ich das meine.:rolleyes:

Gruß Neuuser

Code:
Schritt2: Volt_chk = Volt * 10 
If Volt_chk > Aus And Volt_chk > Ein Then ' Umgestellt!! 
I = 0 
End If ' na ja, es sollte doch schon alles in einen sein, aber war nur Test es geht ja eh nicht. 
If I = 30 Then 
Irf = 0 
Waitms 200 Relais1 = 1 
Waitms 200 Relais2 = 1 
Elseif Volt_chk < Ein Then 
Schritt3: ' was soll das hier????-- hier schaltet es zurück mit zeitverzögerung. 
Relais2 = 0 
Waitms 200 
Relais1 = 0 
Waitms 200 
Irf = 1 
End If
 

Anhänge

  • test1.bas
    9,1 KB · Aufrufe: 7
Mit "Du hast das Wort "Volt" im falschen Kontext geschrieben" habe ich mich nicht zuletzt auf folgenden Satzausschnitt bezogen.
ich habe mir aber gedacht das er mindestens eine bestimmte zeit bei der eingestellten Einschalt Volt bleibt
Es würde sich viel logischer lesen wenn du statt "Einschalt Volt", "Einschaltspannung" schreiben würdest.

Man sagt auch nicht "Wow! Dein Modellboot hat ja eine wahsinnige METER PRO SEKUNDE drauf" sondern "Dein Modellboot hat ja eine wahsinnige GESCHWINDIGKEIT drauf". Das war nur etwas was mir aufgefallen ist, aber die meisten Menschen nicht weiter stört.

Bei deinem Programm kann ich dir leider nicht mehr weiterhelfen.(too basic)
 
ach sooo, ja gut wen man es so sieht haste recht, könnte man so nennen oder umschreiben.

Gruß Neuuser
 
Hi Neuuser,

ich werde mir morgen Deinen Code mal genauer ansehen. Dazu brauche ich einen klaren Kopf. Aktuell habe ich zu viel Pizza und zu viel Chianti im Bauch :rolleyes:

Aber ein bissle was kann ich Dir doch sagen... ist mir aufgefallen beim ersten Überflug:

Code:
Timer1_sprung:
   Timer1 = 34286                                           'Dieser Wert bestimmt die Sample Frequenz
   Incr Zeit_zaehler                                        ' Jede Sekunde um   +1
   Incr I
   Incr A


   Timer1 = Timerwert                                       ' Jede Sekunde um +1
   If Zeit_zaehler = 5 Then                                 'Dieser Wert bestimmt die Sample Frequenz
      Set Ready                                             ' 60 = 1 Min -120 = 2 Min usw.
      Zeit_zaehler = 0
   End If

'(If I = 30 Then                                            '3600= 1 Stunde in sec.
      Incr Ii
      I = 0
   End If
   If Ii = 1 Then = 0                                       '24 =1 Tag in Stunden 96= 4 tage
')

 If A = 30 Then
 Licht_an = 0                                               'Licht in sekunden
 A = 0
 End If

Return

Warum "Timer1 = 34286" und "Timer1 = Timerwert" in ein und der selben ISR?


Ist das so das der Timer weiterzählt auch wen er mal kurz unterbrochen wurde ??

Wer sollte Deiner Meinung nach den Timer unterbrechen? Du hast Ihn als ISR laufen und damit läuft er als Interrupt "freilaufend". Solange Du den Timer nicht mit STOP oder DISABLE Timer1 anhältst ist es eher so, dass der Timer-Interrupt Dein Hauptprogramm unterbricht.

Auf den ersten Blick - wie gesagt ich habe Deinen Code noch nicht ganz durch was Du nch so alles treibst - würde ich die Frage definitiv mit JA beantworten, der Timer läuft weiter!

Mehr dazu aber morgen. Vielleicht kommt von mir noch die eine oder andere Frage!

Grüße,
Markus
 
Guten Morgen Neuuser,

jetzt habe ich beim Durchschauen des Codes doch gemerkt, dass ich noch nicht ganz begriffen habe was Du nun machen möchtest.

OK, Du hast eine ISR am Laufen (Timer1_sprung) die sekündlich aufgerufen wird und mit der Du die Word-Variablen Zeit_zaehler, I und A jweils um 1 erhöhst.

Dann gibt es noch diesen vermutlich für Dich wichtigen Codeteil:
Code:
Schritt2:
   Volt_chk = Volt * 10

   If Volt_chk > Aus And Volt_chk > Ein Then                ' wen die abschalt volt erreischt ist
       Irf = 0
       Waitms 200                                           ' sachaltet Relais 1 u.2 mit zeitverzögerung ein
       Relais1 = 1
       Waitms 200
       Relais2 = 1
   Elseif Volt_chk < Ein Then ' an sonsten an

Schritt3:
      Relais2 = 0  ' sachaltet Relais 1 u.2 mit zeitverzögerung aus
      Waitms 200
      Relais1 = 0
      Waitms 200
      Irf = 1
End If

   If Relais1 = 1 Then
      Gruen = 1
      Rot = 0
   Elseif Relais1 = 0 Then
      Gruen = 0
      Rot = 1
   End If

Return

Jetzt verrate mir doch nochmal kurz wann, abhängig von welcher Zeit was passieren soll? Ich habs nicht begriffen!

?? Soll Relais 1 und 2 automatisch nach einer bestimmten Zeit (wie groß) wieder abgeschaltet werden oder sollen sie automatisch eingeschaltet werden?


Mir fällt es gerade schwer nachzuvollziehen, was Du gerne umsetzen möchtest und leider wird mir das beim Durchlesen der Posts in diesem Thread auch nicht so richtig klar. Ich hab einen Knoten im Kopf!

Vielleicht kannst Du mir noch etwas mehr darüber erzählen. Als Basis der Erklärung sollte der letzte Anhang gelten den Du angehängt hast weil den habe ich aktuell bei mir in BASCOM offen!

Grüße,
Ma
 
Hallo Markus,
so nun da bin ich wieder.
erst mal das
Warum "Timer1 = 34286" und "Timer1 = Timerwert" in ein und der selben ISR?

ist das nicht gut ? oder nur doppelt gemoppelt !?

Jetzt verrate mir doch nochmal kurz wann, abhängig von welcher Zeit was passieren soll?
es soll nun bei einer bestimmten eingestellten Volt die Relais anziehen, was auch so ist.

Soo
Soll Relais 1 und 2 automatisch nach einer bestimmten Zeit (wie groß) wieder abgeschaltet werden oder sollen sie automatisch eingeschaltet werden?

Ja das sollen sie nach einer bestimmten zeit , die zeit ist noch nicht genau festgelegt ich gehe mal von 30-60 Minuten aus, zum testen reichen erstmal 30 sec aus.

Nun wen ich an meinen Testboard den Poti hochdrehe so das z.B. 13 V am Display erscheinen, sollen die Relais 1u.2 anziehen und es gehen nun auch die Dioden auf den Testboard dafür an.
umgekehrt wen Poti zurückgedreht dann schalltet Relais 1 u.2 bei 11V wieder aus.

so nun soll es, wen ich den Poti wieder auf 13V drehe 1 u.2 nicht sofort angehen sonder erst nach der festgesetzten zeit, 30 Minuten.

Ich hoffe nun hast du mein vorhaben verstanden.

Wie gesagt das Programm funktioniert so, ohne der neuen Idee, mit der zeiteinstellung.

Gruß Neuuser
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)