Versuch 02 übernommen und angefangen es für Versuch 03 abzuwandeln

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
alexander0707
Date:
Sun Dec 04 00:14:49 2022 +0000
Parent:
4:ab3f709c4d2e
Commit message:
Nur mal grob angepasstes Skript vom Versuch02

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Mon Nov 07 14:48:34 2022 +0000
+++ b/main.cpp	Sun Dec 04 00:14:49 2022 +0000
@@ -1,7 +1,7 @@
 /***************************************************************************
-* Titel        : main.c
+* Titel        : main.cpp
 *
-* Description  : Labormodul "DIBI"
+* Description  : Labormodul "HAPOA"
 *
 * Revision List:
   --------------------------------------------------------------------------
@@ -10,11 +10,22 @@
   24.10.22 | J. Altenburg    | Ersterstellung
   --------------------------------------------------------------------------
            |                 |
-  ----------------------------------------------------------------------------
+  ---------------------------------------------------------------------------
+  
+  Editor List:
+  --------------------------------------------------------------------------
+  Date     | Author          | Change
+  --------------------------------------------------------------------------
+  30.11.22 |Tobias Zinke     | Labor03
+  --------------------------------------------------------------------------
+  30.11.22 |Alexander Pitthan| Labor03
+  ---------------------------------------------------------------------------
 ****************************************************************************/
 #include "mbed.h"
 #include "cdef.h"
 
+AnalogIn    pinPoti (A0);
+
 /* Vereinbarungen zu den Tasteneingängen */
 DigitalIn   pinS1(A1);
 DigitalIn   pinS2(A2);
@@ -26,6 +37,7 @@
 DigitalOut  pinSdo(PA_9);
 DigitalOut  pinSck(PA_8);
 DigitalOut  pinLoad(PB_5);
+//DigitalOut  pinBeep(PB_3);
 
 /* ISR */
 Ticker      stTimer;
@@ -33,8 +45,9 @@
 /***************************************************************************
 *   Defines und Makros                                                       *
 ***************************************************************************/
-#define nTastShort    4     /* Taste 50 Millisekunden gedrückt */    
-#define nTastLong   150     /* Taste 1.5 Sekunden gedrückt */ 
+#define nTastShort  20      /* Taste 50 Millisekunden gedrückt */    
+#define nTastLong   600     /* Taste 1.5 Sekunden gedrückt */ 
+#define nCircleTime 2500    /* Laufzeit der Main in us */
 
 #define nSegA           0x01
 #define nSegB           0x02
@@ -87,89 +100,78 @@
 * Description : Timer für Taste S3
 */
 
+byte bDisplayState; /*
+* Description : 
+*/
+const byte enSchwellenwert=0x00;
+const byte enPotiAnzeige = 0x01;
+const byte enVergleich = 0x02;
+//const byte enShowError = 0x03;
+//const byte enWaitForRun = 0x04;
+
+
+byte bState; /*
+* Description : 
+*/
+
+byte bTimerDot; /*
+* Description : Zähler für Dots
+*/
+
+byte bHotKey; /*
+* Description : Auswahl der Taste
+*/
+
+byte bDisplayDot; /*
+* Description : 
+*/
+
+byte bMainState; /*
+* Description : Hauptzustand
+*/
+
+byte bBeepTime; /*
+* Description : Tondauer 
+*/
+
+byte bEinstellungsModus;/*
+* Description : Einstellungszustand 
+*/
+
+byte bSchwellenwertVergleich;/*
+* Description : Einstellungszustand 
+*/
+
+
 word wSerial; /*
 * Description : serielles Ausgaberegister
 */
 
+word wClockTime; /*
+*Description : Timer für verstrichene Zeit
+*/
+
+word wClockShow; /*
+*Description : Timer für verstrichene Zeit
+*/
+
+word wDelayGame; /*
+* Description : Verzögerungstimer
+*/
+
+word wPotiWert; /*
+* Description : Wert des Potis
+*/
+
+word wVorgabeWert; /*
+* Description : engestellter Vorgabewert
+*/
+
 /* Bitmuster */
 const byte abZiffer[] = {nZiffer0, nZiffer1, nZiffer2, nZiffer3, nZiffer4, nZiffer5, nZiffer6, nZiffer7, nZiffer8, nZiffer9, nZifferA, nZifferB, nZifferC, nZifferD, nZifferE, nZifferF, nZifferOff};
 const byte abBargraph[] = {~Bit0, ~(Bit0|Bit1), ~(Bit0|Bit1|Bit2), ~(Bit0|Bit1|Bit2|Bit3), 0x0f};
 
 
-/* Tastenabfrage */
-void vTasteS1( void ){
-    if(pinS1 == 0){                             /* User-Taste gedrückt */
-        if(bS1Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
-            if(bS1Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
-                //...
-                }
-            if(bS1Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
-                if(bIdx > 0) bIdx--;
-                else bIdx = 16;
-                }
-            bS1Timer++;
-            }
-        }
-    else{                                       /* Taste nicht gedrückt */ 
-        if((bS1Timer >= nTastShort) && (bS1Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
-            if(bIdx < 16) bIdx++;
-            else bIdx = 0;
-            }
-        bS1Timer = 0;
-        }
-    } 
-
-void vTasteS2( void ){
-    if(pinS2 == 0){                             /* User-Taste gedrückt */
-        if(bS2Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
-            if(bS2Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
-                //...
-                }
-            if(bS2Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
-                if(bDigit > 0b00000001) bDigit = bDigit>>1;
-                else bDigit = 0b00001000;
-                }
-            bS2Timer++;
-            }
-        }
-    else{                                       /* Taste nicht gedrückt */ 
-        if((bS2Timer >= nTastShort) && (bS2Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
-            if(bDigit < 0b00001000) bDigit = bDigit<<1;
-            else bDigit = 0b00000001;
-            }
-        bS2Timer = 0;
-        }
-    } 
-
-void vTasteS3( void ){
-    if(pinS3 == 0){                             /* User-Taste gedrückt */
-        if(bS3Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
-            if(bS3Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
-                //...
-                }
-            if(bS3Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
-                bBargraph--;
-                }
-            bS3Timer++;
-            }
-        }
-    else{                                       /* Taste nicht gedrückt */ 
-        if((bS3Timer >= nTastShort) && (bS3Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
-            bBargraph++;
-            }
-        bS3Timer = 0;
-        }
-    } 
-
-
-
-void vCheckTasten( void ){
-    vTasteS1();
-    vTasteS2();
-    vTasteS3();
-    }
-
-/* Ausschieben der 16 Bits für die Anzeige */
 void vShiftLoad(word wLoad){
     word wMask = Bit15;
     pinLoad = 0;
@@ -183,19 +185,272 @@
     pinLoad = 1;
     }
 
+
+byte abDisplayMemory[] = {16,16,16,16}; /* alle Segmente aus */
+
+void vDisplayClock( word w )
+{
+    int16 v;
+    abDisplayMemory[0] = 16; /* Aus */
+    v = (byte)(w / 100);
+    abDisplayMemory[1] = v; /* Hunderter */
+    w = w - (v * 100);
+    v = (byte)(w / 10);
+    abDisplayMemory[2] = v; /* Zehner */
+    w = w - (v * 10);
+    abDisplayMemory[3] = (byte)w; /* Einer */
+}
+/*
+void vSetWaitForStart( void )
+{
+    abDisplayMemory[0] = 16; /* 7-Segment-Display ausschalten 
+    abDisplayMemory[1] = 16;
+    abDisplayMemory[2] = 16;
+    abDisplayMemory[3] = 16;
+    bDisplayState = enWaitForStart;
+    bTimerDot = 0;
+    bDigit = 0;
+}
+
+void vSetRunClock( void )
+{
+    wClockTime = 0;
+    bDigit = 0;
+    abDisplayMemory[0] = 16; /* 7-Segment-Display ausschalten 
+    abDisplayMemory[1] = 0;
+    abDisplayMemory[2] = 0;
+    abDisplayMemory[3] = 0;
+    bDisplayState = enRunClock;
+}
+*/
+/*
+byte bCheckTasten( byte bState )
+{
+    if((pinS1 == 0) || (pinS2 == 0) || (pinS3 == 0)) { /* Tastendruck erkannt 
+        wClockShow = 1200;
+        if((pinS1 == 0) && (bHotKey == 0)) {
+            wDelayGame = 0;
+            bState = enShowResult;
+            bDisplayState = enShowResult;
+        } else if((pinS2 == 0) && (bHotKey == 1)) {
+            wDelayGame = 0;
+            bState = enShowResult;
+            bDisplayState = enShowResult;
+        } else if((pinS3 == 0) && (bHotKey == 2)) {
+            wDelayGame = 0;
+            bState = enShowResult;
+            bDisplayState = enShowResult;
+        } else {
+            wDelayGame = 200;
+            abDisplayMemory[1] = 15;
+            abDisplayMemory[2] = 15;
+            abDisplayMemory[3] = 15;
+            bState = enShowError;
+            bDisplayState = enShowResult;
+            pinBeep = 0;
+        }
+    }
+    return bState;
+}
+*/
+/* Tastenabfrage */
+void vTasteS1( void ){
+    if(pinS1 == 0){                             /* User-Taste gedrückt */
+        if(bS1Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
+            if(bS1Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
+                //...
+                }
+            if(bS1Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
+                if(bDisplayState = enSchwellenwert){
+                    bDisplayState = enPotiAnzeige; 
+                    bMainState = enPotiAnzeige;
+                    }
+                else{ 
+                    bDisplayState = enSchwellenwert;
+                    bMainState= enSchwellenwert;
+                    }
+                }
+            bS1Timer++;
+            }
+        }
+    else{                                       /* Taste nicht gedrückt */ 
+        if((bS1Timer >= nTastShort) && (bS1Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
+            if(bDisplayState = enSchwellenwert || bDisplayState = enPotiAnzeige){
+                bDisplayState = enVergleich;
+                bMainState = enVergleich;
+                }
+            else{
+                bDisplayState = enSchwellenwert;
+                bMainState = enSchwellenwert;
+                }
+            }
+        bS1Timer = 0;
+        }
+    } 
+
+void vTasteS2( void ){
+    if(pinS2 == 0){                             /* User-Taste gedrückt */
+        if(bS2Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
+            if(bS2Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
+                //...
+                }
+            if(bS2Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
+                //...
+                }
+            bS2Timer++;
+            }
+        }
+    else{                                       /* Taste nicht gedrückt */ 
+        if((bS2Timer >= nTastShort) && (bS2Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
+            //...
+            }
+        bS2Timer = 0;
+        }
+    } 
+
+void vTasteS3( void ){
+    if(pinS3 == 0){                             /* User-Taste gedrückt */
+        if(bS3Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
+            if(bS3Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
+                //...
+                }
+            if(bS3Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
+                //...
+                }
+            bS3Timer++;
+            }
+        }
+    else{                                       /* Taste nicht gedrückt */ 
+        if((bS3Timer >= nTastShort) && (bS3Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
+            //...
+            }
+        bS3Timer = 0;
+        }
+    } 
+
+
+
+void vCheckTasten( void ){
+    vTasteS1();
+    vTasteS2();
+    vTasteS3();
+    }
+void vSegmentDigit( void ) //wichtig!!
+{
+    bDigit++;
+    wSerial = abZiffer[abDisplayMemory[bDigit&0x03]];
+    switch(bDisplayState) {
+        case enSchwellenwert:
+            bTimerDot++; /* Zähler für Punktwechsel */
+            if(bTimerDot == 50) {
+                bTimerDot = 0;
+                bDisplayDot = (bDisplayDot + 1) & 0x03;
+            }
+            if(bDisplayDot == (bDigit&0x03)) {
+                wSerial = wSerial & ~nSegH; /* Punktanzeigen */
+            }
+            break;
+        case enPotiAnzeige:
+            if((bDigit&0x03) == 0x03){ /* Ablauf von 10 ms */
+                wClockTime++;
+                if(wClockTime > 999) {
+                    wClockTime = 0;
+                }
+                vDisplayClock(wClockTime);
+            }
+            if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */
+                wSerial = wSerial & ~nSegH;
+            }
+            break;
+        case enVergleich:
+            if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */
+                wSerial = wSerial & ~nSegH;
+                }
+            break;
+    }
+    vShiftLoad(((wSerial << 8) & 0xfff0)| (1 << (bDigit&0x03)));
+}
+
+void vBargraph(byte bTaste){
+    switch(bTaste){
+        case 0 :
+            bLedShield =0b1110;
+            break;
+        case 1 :
+            bLedShield =0b1101;
+            break;
+        case 2 :
+            bLedShield =0b1011;
+            break;
+    }
+}
+
 /***************************************************************************
 *   main()
 ***************************************************************************/
 int main() {
     /* Variablen initialisieren */    
-    bIdx = 0;
-    bDigit = 0b00000001;
-    bLedShield = 0x00;
-    while(1){
-        vCheckTasten();
-        wSerial = abZiffer[bIdx]<<8 | bDigit ;            /* 7-Segmentziffer bestimmen */
-        vShiftLoad(wSerial);          /* Segmente verschieben und Digit festlegen */
-        bLedShield = abBargraph[bBargraph & 0x03];          /* Bargraph bestimmen */
-        wait_us(10000);
+    byte bRandomTaste = 0;
+    word wRandomClock = 0;
+    bMainState = enWaitForStart;
+    bDisplayState = enWaitForStart;
+    pinBeep = 1;
+    vSetWaitForStart();
+    
+    Seriel.begin(9600);
+    
+    while(1) {        
+        bRandomTaste++;
+        if(bRandomTaste > 2) bRandomTaste = 0; /* zufällige LED/Taste bestimmen */
+        wRandomClock++;
+        if(wRandomClock > 800) wRandomClock = 0; /* Zufallszeit erzeugen */
+        switch(bMainState) {
+            case enWaitForStart:
+                wDelayGame++;
+                bLedShield =0b1111;
+                if(wDelayGame > 1200) { /* 3 Sekundenminimum */
+                    wDelayGame = wRandomClock;
+                    bMainState = enWaitForRun;
+                }
+                break;
+            case enRunClock:
+                bBeepTime--;
+                if(bBeepTime == 0)pinBeep = 1;
+                bMainState = bCheckTasten(enRunClock);
+                break;
+            case enWaitForRun:
+                wDelayGame--;
+                if(wDelayGame == 0){
+                    bMainState = enRunClock;
+                    bDisplayState = enRunClock;
+                    bBeepTime = 20;
+                    bHotKey = bRandomTaste;
+                    vBargraph(bRandomTaste);
+                    vSetRunClock();
+                    pinBeep = 0;
+                    }
+                break;
+            case enShowResult:
+                wClockShow--;
+                if(wClockShow==0){
+                    bMainState = enWaitForStart;
+                    bDisplayState = enWaitForStart;
+                    vSetWaitForStart();
+                    }
+                break;
+            case enShowError:
+                wDelayGame--;
+                if(wDelayGame == 0)pinBeep = 1;
+                wClockShow--;
+                if(wClockShow==0){
+                    bMainState = enWaitForStart;
+                    bDisplayState = enWaitForStart;
+                    wDelayGame = 0;
+                    vSetWaitForStart();
+                    }
+                break;
         }
+        vSegmentDigit();
+        wait_us(n   CircleTime);
     }
+}
\ No newline at end of file