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