Forum: Mikrocontroller und Digitale Elektronik Schiebetür Steuerung


von Patzi (Gast)


Lesenswert?

Guten Tag,

ich bin gerade dabei eine Elektrische Schiebetür zu Automatisieren , bin 
aber leider noch Anfänger was IQ angeht . Habe es bist jetzt geschafft 
das es Auf/Zu fährt aber jetzt ist meine Frage wie kann ich es mit der 
Zeit steuern wie z.B. wenn innerhalb von 10 sec. der Endschalter nicht 
erreicht wird das Automatisch abschaltet, der ein Klemmschutz ist 
mechanisch realisiert nur ich möchte nicht das der Motor dann durchläuft 
wenn er denn Endschalter nicht erreicht. Leider ist es nicht möglich mit 
einem or und waitms denn da wird ja der komplette Controller gestoppt 
und der Endschalter ist Außerfunktion. Und wie ist es möglich das die 
Öffnungszeit zu Realisieren ohne den ganzen Controller in dieser Zeit zu 
blockieren? Was ich noch gerne wissen möchte ist es gut wenn man als 
Verriegelung die 2 Ausgänge im Start Befehle gibt das nicht erneut 
gestartet werden kann, oder gibt es da bessere alternativen denn  in der 
warte Zeit wäre es ja möglich erneut Zu starten! Was eigentlich egal 
wäre da die Türe durch den Endschalter abgeschaltet wird wenn sie offen 
ist ?(Die Schütze werden Hardwareseitig auch verriegelt.) Als Motor 
dient ein 24v dc Motor der umgepolt wird.

Meinen Code füge ich bei soweit funktioniert er!

würde mich auf verschiedene Lösungsvorschläge freuen

LG

1
avr.device = atmega328p         //Controller-Typ festlegen
2
avr.clock = 8000000          //Dem Compiler mitteilen mit welcher Taktrate der Controller läuft
3
avr.stack = 64            //Den Programmstack einstellen
4
5
6
#define Auf as PortD.5
7
#define Zu as PortD.6
8
#define Autobefehl as PortD.2
9
#define EndschalterOffen as PortD.3
10
#define EndschalterZU as PortD.4
11
#define HandOffen as PortD.1
12
13
14
Auf.mode = output,low                              //Tür Auf als Ausgang
15
Zu.mode   = output,low                           //Tür ZU als Ausgang
16
Autobefehl.mode   = input,pullup                   //Auf/Zu Automaik als Eingang, Pullup einschalten
17
EndschalterOffen.mode   = input,pullup            //Endschalter wenn Türe Offen (NC) als Eingang, Pullup einschalten
18
EndschalterZU.mode   = input,pullup                //Endschalter wenn Türe ZU (NC) als Eingang, Pullup einschalten
19
HandOffen.mode   = input,pullup                    //Handschaltung Tür auf und offen bleiben als Eingang, Pullup einschalten
20
21
22
'Automatik
23
do
24
25
26
if (Autobefehl = 0) and (EndschalterZU = 1) and (EndschalterOffen = 1) then     //Darf nur starten wenn die Tür auch geschlossen ist,
27
                                           //und ein Startbefehel kommt und Endschalteroffen nicht gedrückt ist.
28
Auf = 1
29
endif
30
31
32
if Auf = 1 and (EndschalterOffen = 0)  then            // Soll Stoppen wenn Auf aktiv ist wenn Endschlalteroffen gedrückt ist odernach 10000ms.
33
Auf = 0
34
endif
35
36
37
loop

von Route_66 H. (route_66)


Lesenswert?

Patzi schrieb:
> mit
> einem or und waitms denn da wird ja der komplette Controller gestoppt

Patzi schrieb:
> das die
> Öffnungszeit zu Realisieren ohne den ganzen Controller in dieser Zeit zu
> blockieren?

Die Zauberworte heissen TIMER und INTERRUPT.
Damit baut man einen Zustandsautomaten.
Dein Controller kann so, viele Dinge "scheinbar" gleichzeitig tun!

von Patzi (Gast)


Angehängte Dateien:

Lesenswert?

Danke für deine Antwort leider nimmt er nur waitms die anderen 
funktionieren nicht in der Syntax auch delay nicht!!
Hättest du auch noch eine andere Idee?


lg

von Hubert G. (hubertg)


Lesenswert?

Du solltest schreiben mit welcher Entwicklungsumgebung du arbeitest. 
Dann tut man sich mit hinweisen leichter.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Patzi schrieb:
> Meinen Code füge ich bei soweit funktioniert er!

 Möglich, nur wie ?

Patzi schrieb:
1
 if (Autobefehl = 0) and (EndschalterZU = 1) and (EndschalterOffen = 1) 
2
 then     //Darf nur starten wenn die Tür auch geschlossen ist,
3
          //und ein Startbefehel kommt  und Endschalteroffen nicht gedrückt ist.

 So macht man das aber nicht - Tür soll immer aufgehen können - was
 ist wenn etwas oder jemand dazwischen klemmt ?

Patzi schrieb:
> Danke für deine Antwort leider nimmt er nur waitms die anderen
> funktionieren nicht in der Syntax auch delay nicht!!

 Vielleicht so ?
1
 Dim SysCnt As Word = 0
2
 Dim TuerCnt As Word = 0
3
 Dim TimeOut As Boolean = false
4
5
 SysInit()
6
7
 Avr.Interrupts.enable      '* Enable global Interrupts
8
9
 TuerAuf(100)                '*** 100 * 100ms  = 10000ms = 10sec für die Tür um aufzugehen
10
 
11
 Do
12
   
13
   
14
   if TimeOut Then
15
     ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
16
         '*** 10sec sind ohne Endanschlag vorbei, tu etwas
17
         '...
18
     ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
19
   EndIf
20
   
21
   if Auf = 1 and (EndschalterOffen = 0)  then    '***  Ich nehme an, daß jetzt die Tür zu ist ?
22
     Timer1.CmpA.Disable          '* Timer1 ausschalten
23
     Auf = 0
24
   EndIf
25
 
26
   '...
27
   '...
28
 Loop
29
  
30
31
Procedure SysInit()
32
'*****  Konfig Timer1  *****
33
 Timer1.Clock =  256            '* Clock divider auf 1: 256 (8 Mhz = 125ns * 256 = 32uSec)
34
 Timer1.CmpA.Value = 3124          '* Outputcompare-Register auf 3125 ( 3125 * 32uSec =100mS)
35
 Timer1.CmpA.Isr = timer1_compare        '* Compare-Interrupt aktivieren
36
 Timer1.CmpA.Clear.Enable          '* CTC-Mode aktivieren
37
EndProc
38
39
Procedure TuerAuf(xms As Word)
40
   TuerCnt = xms          '*** xms * 100ms
41
   TimeOut = false
42
   Auf = 1    '*** Tür auf (Beim Endanschlag wird Timer1 ausgeschaltet)
43
   Timer1.CmpA.Enable            '* Timer1 einschalten
44
EndProc
45
46
Isr timer1_compare fastauto    '*** Alle 100ms
47
If TuerCnt > 1 then      '*** Zählt rückwärts bis Null
48
TuerCnt--
49
elseif TuerCnt = 1 then
50
TuerCnt = 0
51
TimeOut = 1
52
endif
53
SysCnt++        '*** Zählt immer vorwärts
54
EndIsr

von Otto (Gast)


Lesenswert?

Bascom?

von fop (Gast)


Lesenswert?

Uff Bascom ist schon zu lange her bei mir. Vielleicht wollte ich es auch 
verdrängen :-)
Timer ist kein Basic Befehl, sondern der Name einer oder mehrerer 
Peripherieeinheiten in Deinem Mikrocontroller.
Diesem Ding kannst Du einen festen Takt vorgeben und der zählt einfach, 
egal was Dein Programm gerade macht. Und wenn Du hin und wieder den 
Zählerstand liest, könntest Du bestimmen, wieviel Zeit vergangen ist.
Da liegt nämlich die Kunst, die Zeit nicht zu vertrödeln, sondern im 
Programmablauf fort zu fahren. So kannst Du auf den Endschalter achten 
und nach einer festgelegten Zeit aufgeben.
Interrupts braucht es für Deine Aufgabe nicht unbedingt. Da Du 
vermutlich noch am Lernen bist, würde ich das Kapitel nach hinten 
verschieben.
Was Du Deinem Programm noch beibringen solltest ist eine sogenannte 
Entprellung der Eingänge. Auch dabei kann Dir ein Timer eine große Hilfe 
sein, um die Frage zu beantworten, ob der Eingang jetzt so richtig in 
einem Zustand ist oder nur so rumkaspert.
Nimm einen Timer mit möglichst vielen Bits. Mach Dich aber trotzdem auf 
einen sogenannten Timerüberlauf gefasst.

von Uwe S. (de0508)


Lesenswert?

Hallo,

es handelt sich um die Entwicklungsumgebung LunaAVR.

TimerN und auch die Entprellung eines Ports (nach Peter Dannegger) kann 
man einfach über eine Hochsprachenimplementierung nutzen.

von Paul B. (paul_baumann)


Lesenswert?

Otto schrieb:
> Bascom?

Das sieht eher pascal-lig aus mit den Proceduren drin. So, wie das hier 
auch:

Procedure Mittagessen
   uses Messer, Gabel, Löffel;
   var Schnitzel, Kartoffel, Möhre: real;

Begin
     Repeat
         Open Mund for Input as Stream #1;
     until Teller leer;
     Writeln (`Ich bin so satt, ich mag kein Blatt!`)
End.

Writeln (`MfG Paul`)

von Uwe S. (de0508)


Lesenswert?

Nein Paul B,

Patzi hat sich schon im LunaAVR Forum mit der selben Fragestellung 
gemeldet und auch Lösungswege aufgezeigt bekommen, teilweise als PN.

Auch findet man hier einen kompletten Lernvorschlag, noch ohne 
Timernutzung.

Als erstes muss ein DEA "erzeugt" werden, der dann über eine "state 
machine" implementiert werden kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.