Hallo,
ich habe meine Stromstoßschalter (Eltakos) auch durch AVR's abgelöst.
Zunächst ging es mir nur um die reine Stromstoßfunktion. Dann kam die Zeitschaltfunktion dazu und jetzt sind alle über einen CAN Bus vernetzt und vom PC aus programmierbar!
Im angehängten Programm ist eine der ersten "funktionierenden" Versionen mit Eltako und Zeitschaltfunktion enthalten.
Bei Bedarf kann ich dir weitere Unterlagen zukommen lassen
Code:
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 4800
'------------------------------------
Config Pinc.0 = Input ' Schaltport
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input
Config Pinc.5 = Input
'Config Pind.5 = Input
Config Portb.0 = Output ' Schaltport
Config Portb.1 = Output
Config Portb.2 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portb.5 = Output ' Kontrollport
Dim T1 As Long
Dim T2 As Long
Dim T3 As Long
Dim T4 As Long
Dim T5 As Long
Dim Rtime As Long
Dim Minute As Long
Rtime = 0
Minute = 0
Dim Ablaufzeit1 As Long
Dim Ablaufzeit2 As Long
Dim Ablaufzeit3 As Long
Dim Ablaufzeit4 As Long
Dim Ablaufzeit5 As Long
Ablaufzeit1 = 0
Ablaufzeit2 = 0
Ablaufzeit3 = 0
Ablaufzeit4 = 0
Ablaufzeit5 = 0
Dim Zeit1 As Long
Dim Zeit2 As Long
Dim Zeit3 As Long
Dim Zeit4 As Long
Dim Zeit5 As Long
Dim Sz As Long 'Sendezeit
Zeit1 = 30 'Terasse
Zeit2 = 240 'Esstisch
Zeit3 = 60 '
Zeit4 = 10 'Treppenhaus
Zeit5 = 30 'Dachterasse / Treppe
Dim Db1_ As Byte ' db1 zur Aufnahme des Modulzustandes in Hex
T1 = 0
T2 = 0
T3 = 0
T4 = 0
T5 = 0
Sz = 0
Config Debounce = 50
Dim I As Byte
Dim Key As Byte
Dim S As String * 10
Dim B(10) As Byte 'At S Overlay
Dim N As Byte
' Protokoll ---------------------------------------------------------
On Timer0 Ontimer0
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
'---------- Programm ----------
Prog_start:
N = 0
Do
If Portd.6 = 1 Then
Ablaufzeit1 = Minute - T1
If Zeit1 < Ablaufzeit1 Then
Portd.6 = 0
T1 = 0
Else
End If
Else
End If
If Portb.0 = 1 Then
Ablaufzeit2 = Minute - T2
If Zeit2 < Ablaufzeit2 Then
Portb.0 = 0
Else
End If
Else
End If
If Portb.2 = 1 Then
Ablaufzeit3 = Minute - T3
If Zeit3 < Ablaufzeit3 Then
Portb.2 = 0
Else
End If
Else
End If
If Portd.7 = 1 Then
Ablaufzeit4 = Minute - T4
If Zeit4 < Ablaufzeit4 Then
Portd.7 = 0
Else
End If
Else
End If
If Portb.1 = 1 Then
Ablaufzeit5 = Minute - T5
If Zeit5 < Ablaufzeit5 Then
Portb.1 = 0
Else
End If
Else
End If
Debounce Pinc.0 , 0 , Key_o1 , Sub 'Port 1.
Debounce Pinc.1 , 0 , Key_o2 , Sub 'Port 2
Debounce Pinc.2 , 0 , Key_o3 , Sub 'Port 3
Debounce Pinc.3 , 0 , Key_o4 , Sub 'Port 4
Debounce Pinc.4 , 0 , Key_o5 , Sub 'Port 5
Loop
End
Key_o1:
Toggle Portb.0 'Buchse 1
If T2 = 0 Then
T2 = Minute
Else
T2 = 0
End If
Return
Key_o2:
Toggle Portb.1 'Buchse 2
If T5 = 0 Then
T5 = Minute
Else
T5 = 0
End If
Return
Key_o3:
Toggle Portb.2 'Buchse 3
If T3 = 0 Then
T3 = Minute
Else
T3 = 0
End If
Return
Key_o4:
Toggle Portd.7 'Buchse 5
If T4 = 0 Then
T4 = Minute
Else
T4 = 0
End If
Return
Key_o5:
Toggle Portd.6 'Buchse 4
If T1 = 0 Then
T1 = Minute
Else
T1 = 0
End If
Return
Key_o6: 'Buchse 7 (Garagentor)
Return
'---------- Timer -----------
Ontimer0:
Rtime = Rtime + 1 ' variable wird bei jedem Interrupt um 1 erhöht
Gosub Minutenzaehler
Return
' ----Minutenauswertung -----------------------------------------
Minutenzaehler:
If Rtime = 1700 Then ' Teilungsfaktor bei 7372800 Hz und Prescale um auf 1 Minute zu kommen
Minute = Minute + 1
Rtime = 0
Else
End If
Return
Lesezeichen