Lehrer Busch / Mbed OS xxx_Garagentor

Dependencies:   LCD_i2c_GSOE

Revision:
0:763fd05f2a27
Child:
1:73315e249185
diff -r 000000000000 -r 763fd05f2a27 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jun 30 12:54:13 2021 +0000
@@ -0,0 +1,192 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2019 ARM Limited
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include "mbed.h"
+#include "platform/mbed_thread.h"
+#include "LCD.h"
+#include <string>
+
+
+// Blinking rate in milliseconds
+#define BLINKING_RATE_MS                                                    500
+
+#define Init 0
+#define Zu 1
+#define Oeffnen 2
+#define Offen 3
+#define Schliessen 4
+#define Gestoppt 5
+lcd mylcd;
+DigitalIn TorAuf(PA_1);
+DigitalIn TorZu(PA_6);
+InterruptIn Stop(PA_10);
+DigitalIn EndschalterOffen(PB_0);
+DigitalIn EndschalterZu(PB_3);
+PwmOut CW(PC_6);
+PwmOut CCW(PC_7);
+AnalogIn Poti(PA_0);
+DigitalOut Leuchte(PC_0);
+
+int Zustand=Init;
+
+string meldung[]={"Tor-auf","Tor-zu","Tor-stop","Tor-faehrt"};
+
+void blinkenEin()
+{
+    TIM6->CR1=1;
+}
+
+void blinkenAus()
+{
+    TIM6->CR1=0;
+    Leuchte=0;
+}
+
+void isr_Timer()
+{
+    Leuchte=!Leuchte;  
+    HAL_NVIC_ClearPendingIRQ(TIM6_IRQn); 
+    TIM6->SR=0;
+}
+
+void Timer_init()
+{
+   RCC->APB1ENR |= 0b10000; //TIM6
+   TIM6->PSC=31999; //1ms 
+   TIM6->ARR=499;   //500ms
+   TIM6->CNT=0;     //Counter startet bei 0
+   TIM6->SR=0;      //UIF =0
+   TIM6->DIER=1;    //Interrupt Freigabe
+   NVIC_SetVector(TIM6_IRQn,(uint32_t)&isr_Timer);
+   HAL_NVIC_EnableIRQ(TIM6_IRQn);
+   __enable_irq();  
+}
+
+void ADC_PWMCW()
+{
+    CCW=0;
+    CW=Poti;
+}
+
+void ADC_PWMCCW()
+{
+    CW=0;
+    CCW=Poti;
+}
+
+void LCDout(int nr)
+{
+  mylcd.clear();
+  mylcd.cursorpos(0);
+  mylcd.printf("%s",meldung[nr].c_str());   
+}
+
+void motorstop()
+{
+    CW=0;
+    CCW=0; 
+}
+
+void normaleFrequenz()
+{
+  TIM6->ARR=499;   //500ms  
+}
+
+void doppelteFrequenz()
+{
+   TIM6->CNT=0;     //Counter startet bei 0  
+   TIM6->ARR=249;   //250ms
+  
+}
+void ISR_EXT_IR()
+{
+    if (Zustand==Schliessen || Zustand==Oeffnen)
+    {
+       Zustand=Gestoppt;
+       motorstop();
+       LCDout(2); 
+       doppelteFrequenz();
+    }
+}
+
+void init()
+{
+    TorAuf.mode(PullDown);
+    TorZu.mode(PullDown);
+    Stop.mode(PullDown);
+    EndschalterOffen.mode(PullDown);
+    EndschalterZu.mode(PullDown);
+    Stop.fall(&ISR_EXT_IR);
+    Stop.enable_irq();
+    CW.period_us(100);
+    CCW.period_us(100);
+    CW=0;
+    CCW=0;
+    Timer_init();
+    Zustand=Zu;
+}
+
+
+int main()
+{
+
+    init();
+    while (true) {
+     switch(Zustand)
+        {
+        case Zu: if (TorAuf==1)
+                {
+                 
+                 Zustand=Oeffnen;
+                 blinkenEin();
+                 LCDout(3);
+                }
+                break;
+        case Oeffnen: 
+              ADC_PWMCCW();
+              if (EndschalterOffen==1)
+              {
+                  blinkenAus();
+                  Zustand=Offen;
+                  motorstop();
+                  LCDout(0);
+              }
+              break;
+        case Offen: if (TorZu==1)
+                {
+                Zustand=Schliessen;
+                blinkenEin();
+                LCDout(3);
+                }
+                break;
+        case Schliessen: 
+                ADC_PWMCW();
+                if (EndschalterZu==1) 
+                {
+                    Zustand=Zu;
+                    LCDout(1);
+                    motorstop();
+                    blinkenAus();
+                }
+                break;
+        case Gestoppt:
+            if (TorAuf==1)
+                {
+                 LCDout(3);
+                 Zustand=Oeffnen;
+                 blinkenEin();
+                 normaleFrequenz();
+                }
+            if (TorZu==1)
+                {
+                LCDout(3);
+                Zustand=Schliessen;
+                blinkenEin();
+                normaleFrequenz();
+                }
+                break;
+        }
+    }
+}