'IntervallSchaltuhr
' Zur Ansteuerung einer Kamera für Zeitreihenaufnahmen (Zeitraffer)
' Es kann  ein Intervall und das Ende der Aufnahmen (Stoppzeit)
' eingestellt werden.
'
' Copyright (C) 2010, Friedrich Lischeck
'
' Version 1.0
'
' Dieses Programm ist eine frei kopierbare Software. Sie können es weiter-
' vertreiben und/oder verändern, wenn Sie die Bedingungen der GNU General
' Public License wie sie in der Free Software Foundation, Version 2, oder
' späterer Ausgabe beschrieben sind, einhalten.

' Dies Programm wurde in der Hoffung entwickelt, das es Ihnen nützt.
' Ich übernehme jedoch keine Garantie oder Gewährleistung auf die Funktion
' des Programmes. Insbesondere hafte ich nicht für eventuelle Schäden
' und/oder Folgeschäden, die sich aus der Anwendung dieses Programmes
' ergeben.

$regfile = "m88def.dat"
$crystal = 8000000


Dim A As String * 16
Dim Preload As Word
Dim Sekunde As Long
Dim Cnt As Long
Dim Vorgabestart As Long
Dim Vorgabestop As Long
Dim Vorgabeintervall As Long
Dim Verzeit As Long
Dim Laeuft As Byte
Dim Starttimer As Long
Dim Zeit As String * 8
Dim B As String * 4
Dim H As String * 4
Dim Hilfsvar1 As Long
Dim Hilfsvar2 As Long

'menue
Dim Taste As Byte
Dim Stu As Byte
Dim Mnu As Byte
Dim Sek As Byte
Dim Menue(5) As String * 16
Dim Auswahl As Byte

Schlafen Alias Portd.7
Config Schlafen = Output
Reset Schlafen

Led Alias Portd.0
Config Led = Output
'Die Led blinkt nach Ablauf des Intervalls auf.

Kamera Alias Portd.1
Config Kamera = Output
Set Kamera

Rot Alias Pind.2
Config Rot = Input
Portd.= 1

Schwarz Alias Pind.3
Config Schwarz = Input
Portd.= 1

' Wenn die LCD - Konfiguraton nicht unter Options eingestellt ist:
'Config Lcdbus = 4
'Config Lcd = 16 * 2
'Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
'Cls

'Sekundentimer
Preload = &HE17C
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
Timer1 = Preload
On Timer1 Mtimer
Enable Interrupts

Config Debounce = 100

'Alle Zeitangaben in Sekunden

Vorgabestop = 120
Vorgabeintervall = 30
Vorgabeintervall = Vorgabeintervall - 1

Neustart:
Cnt = 0
Vorgabestart = 0
Disable Timer1

Menue(1) = "  Dauer setzen  "
Menue(2) = "Intervall setzen"
Menue(3) = " Timer starten  "

Auswahl = 1

Hmenue:
   Cls
   'Locate 1 , 1
   'Lcd "   Hauptmenue   "

   Decr Auswahl : If Auswahl < 1 Then Auswahl = 3
   Locate 2 , 1
   Lcd Menue(auswahl)
   Cursor Off Noblink
Warten1:
   Debounce Schwarz , 0 , Hmenue
   Debounce Rot , 0 , Menue2
Goto Warten1


Menue2:
Cls
Cursor Off
If Auswahl = 3 Then Goto Hauptprogramm
Locate 1 , 1
Lcd Menue(auswahl)

Select Case Auswahl
Case Is = 1
   Sekunde = Vorgabestop
   Gosub Sekunde_in_zeit
   Locate 2 , 4
   Lcd Zeit
   Gosub Zeiteingabe
   Vorgabestop = Sekunde
Case Is = 2
   Sekunde = Vorgabeintervall
   Gosub Sekunde_in_zeit
   Locate 2 , 4
   Lcd Zeit
   Gosub Zeiteingabe
   Vorgabeintervall = Sekunde
   Vorgabeintervall = Vorgabeintervall - 1
Case Is = 3
   Goto Hauptprogramm
Case Else
End Select
Goto Hmenue

Hauptprogramm:
Cursor Off Noblink
Enable Timer1
Cls

Laeuft = 0

Do

'StartZeit erreicht?
If Cnt < Vorgabestart Then
   Sekunde = Vorgabestart
   Gosub Sekunde_in_zeit
   Locate 2 , 4
   Lcd Zeit
Else
   If Cnt < Vorgabestop Then
      Sekunde = Vorgabestop
      Gosub Sekunde_in_zeit
      Locate 2 , 4
      Lcd Zeit
      Gosub Intervallschalter

   Else
   'PROGRAMM BEENDEN ODER ZURUECK INS MENUE
      Reset Led
      Set Kamera
      Exit Do
   End If
End If

Wait 1
' sonst kommt das LCD nicht mit.
Loop
Standby:
Display Off

Set Schlafen
Waitms 500
Reset Schlafen

Powerdown

Waitms 500
Display On

Goto Neustart

End

Mtimer:
   Timer1 = Preload
   Incr Cnt
   If Cnt > 356400 Then Cnt = 0
   'max. 99 Stunden
   Sekunde = Cnt
   Gosub Sekunde_in_zeit
   Locate 1 , 4
   Lcd Zeit
   If Led = 1 Then
      Reset Led
      Set Kamera
   End If
Return

Zeiteingabe:
Gosub Sekunde_in_zeit
= Left(zeit , 2)
Stu = Val(h)
= Mid(zeit , 4 , 2)
Mnu = Val(h)
= Right(zeit , 2)
Sek = Val(h)
Cursor On
Seingabe:
   B = "00" + Str(stu)
   B = Right(, 2)
   Mid(zeit , 1 , 2) = B
   Locate 2 , 4
   Lcd Zeit
   Locate 2 , 5
Warten2:
   Debounce Schwarz , 0 , Weiter1
   Debounce Rot , 0 , Meingabe
   Goto Warten2
Weiter1:
Incr Stu : If Stu > 24 Then Stu = 0
Goto Seingabe

Meingabe:
   B = "00" + Str(mnu)
   B = Right(, 2)
   Mid(zeit , 4 , 2) = B
   Locate 2 , 4
   Lcd Zeit
   Locate 2 , 8
Warten3:
   Debounce Schwarz , 0 , Weiter2
   Debounce Rot , 0 , Seeingabe
   Goto Warten3
Weiter2:
Incr Mnu : If Mnu > 59 Then Mnu = 0
Goto Meingabe

Seeingabe:
   B = "00" + Str(sek)
   B = Right(, 2)
   Mid(zeit , 7 , 2) = B
   Locate 2 , 4
   Lcd Zeit
   Locate 2 , 11
Warten4:
   Debounce Schwarz , 0 , Weiter3
   Debounce Rot , 0 , Verlassen1
   Goto Warten4
Weiter3:
Incr Sek
If Sek > 59 Then Sek = 0
Goto Seeingabe

Verlassen1:
Cursor Off
Gosub Zeit_in_sekunde
Return

Sekunde_in_zeit:

Hilfsvar1 = Sekunde
Hilfsvar2 = Hilfsvar1
Hilfsvar1 = Hilfsvar1 / 3600
Zeit = "00" + Str(hilfsvar1)
Zeit = Right(zeit , 2)
Zeit = Zeit + ":"
Hilfsvar1 = Hilfsvar1 * 3600
Hilfsvar1 = Hilfsvar2 - Hilfsvar1

Hilfsvar2 = Hilfsvar1
Hilfsvar1 = Hilfsvar1 / 60
= "00" + Str(hilfsvar1)
= Right(, 2)
Zeit = Zeit + B + ":"
Hilfsvar1 = Hilfsvar1 * 60
Hilfsvar1 = Hilfsvar2 - Hilfsvar1

Hilfsvar2 = Hilfsvar1
Hilfsvar1 = Hilfsvar1
= "00" + Str(hilfsvar1)
= Right(, 2)
Zeit = Zeit + B

Return

Zeit_in_sekunde:
'Stunden
= Left(zeit , 2)
Hilfsvar1 = Val(b)
Hilfsvar2 = Hilfsvar1 * 3600
'Minuten
= Mid(zeit , 4 , 2)
Hilfsvar1 = Val(b)
Hilfsvar1 = Hilfsvar1 * 60
Hilfsvar2 = Hilfsvar2 + Hilfsvar1
'Sekunden
= Right(zeit , 2)
Hilfsvar1 = Val(b)
Hilfsvar2 = Hilfsvar2 + Hilfsvar1

Sekunde = Hilfsvar2

Return

Intervallschalter:
'zeit laeuft
If Laeuft = 0 Then
   Laeuft = 1
   Starttimer = Cnt
Else
   Do
   Verzeit = Cnt - Starttimer
   If Verzeit < Vorgabeintervall Then
   Else
      Starttimer = Cnt
      Laeuft = 0
      Set Led
      Reset Kamera
   End If
   Loop Until Laeuft = 0
End If
Return