Hallo,
ich habe vor kurzer Zeit mein STK500 bekommen und wollte natürlich etwas aus den neuen Möglichkeiten machen, die man mit uCs so hat. Als Einstiegsprojekt habe ich mir gedacht, ich könnte doch unsere Schiebetür vom Wohnzimmer zur Küche motorisieren. Da gibt es nämlich zwei Mankos:

1. Steht die Tür immer auf wenn man es mal gemütlich habe will (und niemand will sie zumachen)
2. Geht die Tür nicht auf, wenn man die Hände voll hat

Das erste Problem wurde teilweise durch Anbringen eines Gewichts, das über eine Rolle und ein Stahlseil die Tür automatisch zuzieht, gelöst. Allerdings wurde eine Art Haltefeder, die die Tür im ganz geöffneten Zustand aufhält, dringelassen. Darum stand die Tür trotzdem noch oft genug auf.

Gut, ich wollte also alles automatisieren, dazu habe ich

- zuerst mal ein paar Kabel verlegt und den Motor angebracht.
- dann Endschalter an den Endpunkten angebracht
- einen Reedkontakt angebracht, der dafür sorgt, dass die Tür vorm erreichen des Endschalters per PWM abgebremst wird
- zwei Aluminiumplättchen als Taster angebracht
- nach dem erfolgreichen Testen der Schaltung auf dem Experimentierbrett alles auf eine Platine gebracht

Es ergeben sich zwei Probleme:

1. Als besondere Funktion sollte die Tür zugehen, wenn man zweimal vernehmlich Klatscht. Denn was bringt eine motorisierte Tür, wenn man im Sessel sitzt und die Tür aufsteht? Die ungefähre Schaltung ist hier zu finden. Das Ganze wurde über die beiden Analog Comparatoren realisert und hat bestens funktioniert. Jetzt ist es aber so, dass die Schaltung hinten in der Ecke in der Küche angebracht ist und auch da bleiben muss. Das heißt, ich müsste lange Kabel legen, um die Mikrofonsignale zur Schaltung zu transportieren. Das Signal verliert sich aber scheinbar, denn es geht so nicht mehr. Was kann man dagegen machen?

2. Die Aluminiumplättchen als Taster sind zwar schön flach und dezent und schalten auch gut, aber irgendwie stimmt da was im Programm nicht. Veilleicht kennt sich auch in diesem Unterfroum jemand mit Bascom aus:

Code:
$regfile = "m8515.dat"
 $framesize = 32
 $swstack = 32
 $hwstack = 32
 $crystal = 2500000
 $baud = 9600
 ' Definieren der allgemeinen Einstellungen

Led1 Alias Portb.0
Config Led1 = Output
Led2 Alias Porta.4
Config Led2 = Output
' Anzeige: LED1 = Tür ist auf / zu; LED2 = Zeit zum zweiten Klatscher

Endschalter_auf Alias Pina.0
Config Endschalter_auf = Input
Endschalter_zu Alias Pina.1
Config Endschalter_zu = Input
' Definieren des absoluten Endschalters

Reedkontakt Alias Pina.2
Config Reedkontakt = Input
' Definieren der Vorabschaltung

Taster Alias Pina.3
Config Taster = Input
' Definieren der Taster zum Türöffnen / Türschließen

Porta.0 = 1
Porta.1 = 1
Porta.2 = 1
Porta.3 = 1
' Interne Pullups einschalten

Config Portd.5 = Output
Config Porte.2 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
' Definieren der PWM - Ports

Dim X As Integer
Dim Y As Integer
Dim K As Integer
Dim A As Bit
Dim B As Bit
Dim C As Integer
Dim D As Integer
Dim E As Integer
Dim F As Integer
Dim G As Integer
Dim H As Integer
Dim I As Integer
Dim J As Integer
A = 0
B = 0
K = 0
X = 0
Led2 = 0
Led1 = 0
' Definieren der Variablen
Do
   If Acsr.aco = 1 Then
      Led2 = 1
      Do : Loop Until Acsr.aco = 0
      Waitms 50
      For Y = 1 To 20000
         If Acsr.aco = 1 Then
            C = 1
            Exit For
         End If
      Next
      Do : Loop Until Acsr.aco = 0
      If C = 1 Then
         K = K + 1
         If K = 2 Then K = 0
         C = 0
         Led1 = K
      End If
      Led2 = 0
   End If
   ' Doppelklatschabfrage: Bei zweimaligem Klatschen wird zu K immer 1 dazuaddiert

   If Pina.3 = 0 Then
      For Y = 1 To 450 : Next
      For Y = 1 To 30
         If Pina.3 = 0 Then J = 1
      Next
      If J = 1 Then
         J = 0
         K = K + 1
         If K = 2 Then K = 0
         Led1 = K
      End If
      Waitms 10
   End If
   ' Tasterabfrage: Beim Betätigen eines Tasters wird zu K immer 1 dazuaddiert

   If K = 0 And Endschalter_zu = 1 And A = 0 Then
      Compare1b = 0
      X = 0
      Do
         Compare1a = X
         X = X + 1
         Waitms 4
      Loop Until X = 256
      Do
         If Reedkontakt = 0 Then Exit Do
      Loop
      Do
         Compare1a = X
         X = X - 2
         Waitus 1000
      Loop Until X = 0
      If Endschalter_zu = 1 Then
         Do
            Compare1a = 63
         Loop Until Endschalter_zu = 0
      End If
      Compare1a = 0
      A = 1
      B = 0
      Waitms 200
   End If
   ' Abfrage zum Türschließen auf Schalterdruck bzw. Klatschen hin

   If K = 1 And Endschalter_auf = 1 And B = 0 Then
      Compare1a = 0
      X = 19
      Do
         Compare1b = X
         X = X + 1
         Waitms 100
      Loop Until X = 33
      Do
         Compare1b = X
         X = X + 1
         For Y = 1 To 6850
            If Reedkontakt = 0 Then Exit For
         Next
         If Reedkontakt = 0 Then Exit Do
      Loop
      For Y = 1 To 9
         Compare1b = X
         X = X + 1
         Waitms 65
      Next
      Do
         Compare1b = X
         X = X - 1
         Waitms 18
      Loop Until X = 23
      If Endschalter_auf = 1 Then
         Do
            Compare1b = 23
         Loop Until Endschalter_auf = 0
      End If
      Compare1b = 0
      B = 1
      A = 0
      Waitms 200
   End If
   ' Abfrage zum Türöffnen auf Schalterdruck bzw. Klatschen hin

   If Endschalter_zu = 1 And A = 1 Then
      Compare1a = 0
      X = 18
      Do
         Compare1b = X
         X = X + 1
         Waitms 95
      Loop Until X = 33
      Do
         Compare1b = X
         X = X + 1
         For Y = 1 To 6850
            If Reedkontakt = 0 Then Exit For
         Next
         If Reedkontakt = 0 Then Exit Do
      Loop
      For Y = 1 To 10
         Compare1b = X
         X = X + 1
         Waitms 65
      Next
      Do
         Compare1b = X
         X = X - 1
         Waitms 18
      Loop Until X = 23
      If Endschalter_auf = 1 Then
         Do
            Compare1b = 23
         Loop Until Endschalter_auf = 0
      End If
      Compare1b = 0
      B = 1
      A = 0
      K = 1
      Led1 = K
      Waitms 200
   End If
   ' Abfrage zum manuellen Türöffnen

   If Endschalter_auf = 1 And B = 1 Then
      Compare1b = 0
      X = 16
      Do
         Compare1a = X
         X = X + 1
         Waitms 2
      Loop Until X = 256
      Do
         If Reedkontakt = 0 Then Exit Do
      Loop
      Do
         Compare1a = X
         X = X - 2
         Waitus 1000
      Loop Until X = 0
      If Endschalter_zu = 1 Then
         Do
            Compare1a = 63
         Loop Until Endschalter_zu = 0
      End If
      Compare1a = 0
      A = 1
      B = 0
      K = 0
      Led1 = K
      Waitms 200
   End If
   ' Abfrage zum manuellen Türschließen

Loop
Das mit dem manuellen Türöffnen/schließen ist so zu verstehen, dass, wenn man die Tür so bewegt, dass der Endschalter nicht mehr betätigt wird, die Tür auf/zu geht, je nach vorheriger Stellung. Die Tür geht allgemein so schnell wie möglich auf und sehr langsam zu, damit sich das Seil nicht von der Rolle rollt, denn dann steht alles und wenn niemand den Stecker zieht, löst sich die H-Brücke in Qualm auf.

Sorry, das es so lange geworden ist, aber ich denke, dass man nur so alles Nötige versteht. Wäre cool, wenn mir jemand da helfen könnte.

MFG Manuel