'-------------------------------------------------------------
' Solaris
' AtMega32 auf Rn Control Umbras
'-------------------------------------------------------------
'Solarnachführung
'Weckzeitgesteuert mit Funkwecker

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
Config Clock = User

$framesize = 100
$swstack = 100
$hwstack = 100

'Sound Portd.7 , 400 , 450 'BEEP









Dim Lsyssec As Long
Dim Lsyssec_old As Long
Dim Strtime As String * 8
Dim _tag As Integer
Dim Zaehler As Long
'Dim W1 As Word ' Workaround to get _DIV16




'W1 = W1 / W1

'Ports für 'horizontal Motor
Config Pinc.6 = Output 'Linker Motor Kanal 1 -> Pins definieren, die für die Drehrichtung verantwortlich sind:
H_1 Alias Portc.6
Config Pinc.7 = Output 'Linker Motor Kanal 2 -> Pins definieren, die für die Drehrichtung verantwortlich sind:
H_2 Alias Portc.7


'Ports für vertikal Motor
Config Pinb.0 = Output 'Rechter Motor Kanal 1 -> Pins definieren, die für die Drehrichtung verantwortlich sind:
V_1 Alias Portb.0
Config Pinb.1 = Output 'Rechter Motor Kanal 2 -> Pins definieren, die für die Drehrichtung verantwortlich sind:
V_2 Alias Portb.1

H_1 = 0
H_2 = 0
V_1 = 0
V_2 = 0





'Hier wird der Timer und der Teiler festgelegt
Config Timer1 = Timer , Prescale = 256

'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer1 Timerinterrupt

'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timervorgabe = 3036


'Hier werden die Timer aktiviert
Enable Timer1


Config Int0 = Rising 'Interrupt bei steigender Flanke
On Int0 Irq0 'Festlegen wo bei externem Interrupt hin gesprungen wird
Enable Int0 'Diesen Interrupt aktivieren

Config Int1 = Falling 'Interrupt bei steigender Flanke
On Int1 Irq1 'Festlegen wo bei externem Interrupt hin gesprungen wird
Enable Int1 'Diesen Interrupt aktivieren




Enable Interrupts 'Alle aktivierten Interrupts einschalten




'Sound Portd.7 , 400 , 450 'BEEP



Do
Do


Lsyssec = Syssec()


Loop Until Lsyssec <> Lsyssec_old



Strtime = Time(lsyssec) ' convert to time string
'Print "Running " ; Strtime
'Print "Tag : " ; _tag
Print "sec : " ; Zaehler
Lsyssec_old = Lsyssec





'Main:

'Motor läuft nach Westen
If Zaehler < 34801 And _sec = 0 Then '34801

Print " Motor läuft nach Westen"
Sound Portd.7 , 400 , 450 'BEEP
H_1 = 1
H_2 = 0


Waitms 340 'Dauer der Nachfuehrung von 8:20 - 18:00

H_1 = 0
H_2 = 0
End If



' Rückfahrt nach Osten
If Zaehler = 35000 Then '35000

'Sound Portd.7 , 400 , 450 'BEEP
Print "Rückfahrt nach Osten"

H_1 = 0
H_2 = 1



End If




If Zaehler = 35500 Then '35500

H_1 = 0
H_2 = 0

End If
'---------------------------------------------------- 'bis heir getestet und lauffähig

If _tag > 182 And Zaehler = 36000 Then '36000

V_1 = 0
V_2 = 1 'Motor abwärts

Waitms 400
V_1 = 0
V_2 = 0

End If

If _tag < 182 And Zaehler = 36000 Then '36000

V_1 = 1
V_2 = 0 'Motor aufwärts

Waitms 400
V_1 = 0
V_2 = 0

End If



Loop










Timerinterrupt:
Incr Zaehler
If Zaehler = 86400 Then
Zaehler = 0
End If
Incr _sec
If _sec = 60 Then
_sec = 0
Incr _min
End If
If _min = 60 Then
_min = 0
Incr _hour
End If
If _hour = 24 Then
_hour = 0
Incr _tag
End If
If _tag = 365 Then
_tag = 0
End If
Return

'Interrupt Routine wird immer ausgelöst wenn der Pegel von 0 auf 1 am
'INT0 (Pin 18 PD2) Eingang wechselt
'Weckzeit auf 8:20 Uhr
Irq0:


Zaehler = 0
_sec = 0
_min = 0
_hour = 0

'Goto Main

Return

'Interrupt Routine wird immer ausgelöst wenn der Pegel von 1 auf 0 am
'INT1 (Pin 18 PD3) Eingang wechselt

Irq1:

'If Zaehler < 1800 Then Disable Int0

Return