-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Zeitfunktionen in Bascom

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    23.09.2007
    Ort
    Düsseldorf
    Alter
    35
    Beiträge
    5

    Zeitfunktionen in Bascom

    Anzeige

    Hallo Leute.
    Vorweg: Ich bin noch ein Anfänger
    Ich versuche mich gerade an einer automatischen Bewässerungsanlage, bei der einmal am Tag die Pflanzen gegossen werden sollen. Wie schaffe ich es, dass ca. alle 24 Stunden ein H-Pegel für z.B. 10 sec an einem Ausgang anliegt? Geht das nur mit einem DCF-Modul oder auch ohne? Ob mit oder ohne, wäre nett wenn jemand eine BASCOM-Lösung dazu parat hätte. Ich benutze einen Mega8.

    Danke!

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo mafoba,

    das geht auch ohne DCF Modul.
    Dazu solltest du einen Timerinterrupt benutzen.
    Nach einer vorgegebenen Anzahl Prozessortakte springt das Programm dabei in eine extra Routine. Dort wird eine Variable aufsummiert. Erreicht die Variable einen bestimmten Wert, ist z.B. eine Sekunde vergangen.
    Eine weitere variable summiert dann die Sekunden zu Minuten, die Minuten zu Stunden, etc.
    In deinem Hauptprogramm prüfst du dann die Variablen, und schaltest je nach Bedarf deinen Ausgang.

    Gruß, Michael

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo,
    wichtig zu wissen wäre noch, wie du den Mega8 antreibst, über einen externen Quarz oder die interne Zeitbasis.
    Der Quarz ist normalerweise so genau, dass du die Abweichung über einige Tage kaum merkst. Beim internen Oszillator sieht das schon anders aus. Der kann an einem Tag schon eine halbe Stunde abweichen.
    Das DCF Modul würde die Abweichung auch über einen längeren Zeitraum verhindern.
    Ansonsten lässt du einen Timer laufen und zählst du die Überläufe. Nach der geeigneten Anzahl gibst du den Ausgang für 10 Sekunden frei.
    Z.B. so:
    Code:
    $regfile  = "m8def.dat"
    $crystal = 1000000
    Dim Ovfl_count As Long
    Dim Giessen As Byte
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Timer0_isr
    Timer0_startwert Alias 8                                    '1.000.000/1024/(256-8=244)  '~ 0,25 x pro Sekunde, entspricht waitms 250
    Timer0 = Timer0_startwert
    Enable Timer0
    Enable Interrupts
    
    Do
       If Giessen = 1 Then
          Portc.1 = 1                    'bzw =0, je nachdem, wie der Ausgang funktionieren soll, deinen Port angeben
       End If
    Loop
    
    End
    
    Timer0_isr:
       Timer0 = Timer0_startwert
       Incr ovfl_count
       If Ovfl_count = 40 Then               '4 mal pro Sekunde Mal 10 Sekunden = 40
          Giessen = 0
       End If
       If Ovfl_count = 345600 Then       '4 mal pro Sekunde mal 86400 Sekunden in 24 Stunden = 346600
          Ovfl_count=0
          Giessen = 1
       End If
    Return
    Dies sollte 10 Sekunden lang an sein und dann die restliche Zeit des Tages aus.

    Gruß

    Rolf

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    23.09.2007
    Ort
    Düsseldorf
    Alter
    35
    Beiträge
    5
    Hallo Michael,
    schonmal Danke für die Antwort, das würde ich gerne mal testen. Die Sekunden zu Minuten aufsummieren etc. würde ich auch hinbekommen. Aber wie genau programmiere ich die Prozessortaktabfrage? Ich würde 1MHz als Takt benutzen. Also müsste eine Variable alle 1mio Takte hochzählen, oder? Kannst Du mir vielleicht eben den Code dafür posten?
    Danke!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    23.09.2007
    Ort
    Düsseldorf
    Alter
    35
    Beiträge
    5
    Oh, Danke Rolf.
    Das hilft mir weiter. Gut, dann nehme ich einen externen Quarz. =D>

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo mafoba,

    for_ro hat es bereits in ein Programm gepackt.
    Der Timer wird mit einem bestimmten Wert vorgeladen und läuft dann über.
    Die Anzahl der Takte bis zum Überlauf bestimmt die Zeit, die ja dann zu Sekunden, etc. aufsummiert wird.
    Ich hätte es vielleicht etwas anders gelöst, aber da kommst du eines Tages auch noch selber drauf
    1MHz als Takt klingt nach internem Oszillator. Der ist nicht wirklich genau, wie for_ro bereits schrieb.

    Gruß, Michael

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Zitat Zitat von Michael
    Ich hätte es vielleicht etwas anders gelöst, aber da kommst du eines Tages auch noch selber drauf
    Warum hättest du das anders gelöst? Ist da etwas nachteilig dran?

    Gruß

    Rolf

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo for_ro,

    ich hätte einen Prescaler gewählt, der die Taktfrequenz in ganze Zahlen teilt.
    Außerdem hätte ich im Interrupt nur die Sekunden, Minuten, Stunden aufsummiert, mit Abfrage dann im Hauptprogramm. So kannst du später weitere Abfragen und z.B. das Stellen der Uhr im Hauptprogramm unterbringen.

    Dein Programm funktioniert aber für den gewünschten Zweck erstmal, ich wollte mafoba halt kein fertiges Programm präsentieren, das er dann vielleicht nicht versteht.

    Gruß, Michael

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo Michael,
    wieso du die Taktfrequenz in ganze Zahlen teilen willst, verstehe ich nicht. Das ist doch vollkommen egal. Du brauchst doch eh fast nie eine absolut genaue Zeit. Ich bevorzuge immer den höchsten Prescaler der möglich ist. Der Teil wird in Hardware gemacht und da soll er möglichst weit runter kommen. Besonders wenn ich dann bei der ISR nicht noch eine Variable hochzählen muss, um auf die gewünschte Zeit zu kommen.

    Ob Mafoba dann später mal ein Display dranhängen will um dann die Zeit einstellen zu können, damit er dann die Zeit fürs Giessen einstellen kann ist schon möglich. Aber bis dahin würde ich keine Sekunden, Minuten und Stunden addieren.

    Und ja, die Abfrage kann man natürlich auch noch im Hauptprogramm machen, birgt aber die Gefahr, dass du das Ereignis verpasst. Falls möglich, gehe immer so vor, dass in Interrupt Routine der Status so abgelegt wird, dass Zeit genug ist für die Auswertung. Also mit einem Flag, dass die Bedingung in der Routine erfüllt war. Da kann niemand dazwischen kommen.

    Ich denke, das sind unterschiedliche Philosophien und jeder macht es dann so wie es am besten passt.
    Ich fand deinen Kommentar nur ein wenig von oben herab. Aber mit sowas muss man in vielen Foren leben.

    Gruß

    Rolf

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo for_ro,

    Du brauchst doch eh fast nie eine absolut genaue Zeit
    wenn du ganze Zahlen hast, hast du eben keinen Fehler. Sonst kannst du ja gleich mit Wait arbeiten.
    Da mafoba offensichtlich ein Anfänger ist, hätte ich ihn den Begriff Timer nähergebracht und dann die Vorteiler erklärt. Und daß er die Interrupts mit einer Variable aufsummieren kann, bis genau eine Sekunde vorbei ist. (im Rahmen der Quarzgenauigkeit)
    Das geht aber nur mit ganzen Zahlen.

    Ich fand deinen Kommentar nur ein wenig von oben herab.
    ich hab ihn mir nochmal durchgelesen und fand es eher nicht. Sogar ein Smilie hab ich verwendet.

    Gruß, Michael

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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