Auf den letzten Metern

Dependencies:   mbed

Revision:
6:4e55101c65f4
Parent:
5:5c9b508670cf
Child:
7:94c73e4168d8
--- a/main.cpp	Sun Dec 04 00:14:49 2022 +0000
+++ b/main.cpp	Sun Dec 04 13:08:27 2022 +0000
@@ -37,7 +37,7 @@
 DigitalOut  pinSdo(PA_9);
 DigitalOut  pinSck(PA_8);
 DigitalOut  pinLoad(PB_5);
-//DigitalOut  pinBeep(PB_3);
+DigitalOut  pinBeep(PB_3);
 
 /* ISR */
 Ticker      stTimer;
@@ -142,6 +142,10 @@
 * Description : Einstellungszustand 
 */
 
+byte bTimeLong;/*
+* Description : Ob Taste bereits lange gedrückt war 
+*/
+
 
 word wSerial; /*
 * Description : serielles Ausgaberegister
@@ -167,6 +171,10 @@
 * Description : engestellter Vorgabewert
 */
 
+word wDiffWert; /*
+* Description : Differenz zwischen Vorgabe und Eingang
+*/
+
 /* 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};
@@ -188,7 +196,7 @@
 
 byte abDisplayMemory[] = {16,16,16,16}; /* alle Segmente aus */
 
-void vDisplayClock( word w )
+void vDisplayVolt( word w )
 {
     int16 v;
     abDisplayMemory[0] = 16; /* Aus */
@@ -200,18 +208,34 @@
     w = w - (v * 10);
     abDisplayMemory[3] = (byte)w; /* Einer */
 }
-/*
-void vSetWaitForStart( void )
+
+void vDisplayDiff( word w )
 {
-    abDisplayMemory[0] = 16; /* 7-Segment-Display ausschalten 
+    int16 v;
+    abDisplayMemory[0] = 12; /* "C" */
+    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 vSetForStart( void )
+{
+    abDisplayMemory[0] = 16; /* 7-Segment-Display ausschalten */
     abDisplayMemory[1] = 16;
     abDisplayMemory[2] = 16;
     abDisplayMemory[3] = 16;
-    bDisplayState = enWaitForStart;
     bTimerDot = 0;
     bDigit = 0;
+    bMainState = enSchwellenwert;
+    bDisplayState = enSchwellenwert;
+    pinBeep = 1;
+    wVorgabeWert = 0;
 }
-
+/*
 void vSetRunClock( void )
 {
     wClockTime = 0;
@@ -261,7 +285,21 @@
                 //...
                 }
             if(bS1Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
-                if(bDisplayState = enSchwellenwert){
+                if(bDisplayState = enSchwellenwert || bDisplayState = enPotiAnzeige){
+                    bDisplayState = enVergleich;
+                    bMainState = enVergleich;
+                    }
+                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; 
                     bMainState = enPotiAnzeige;
                     }
@@ -269,20 +307,6 @@
                     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;
         }
@@ -295,16 +319,19 @@
                 //...
                 }
             if(bS2Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
-                //...
+                bTimeLong = 1;
+                wVorgabeWert += 100;
+                bS2Timer -= 40;
                 }
             bS2Timer++;
             }
         }
     else{                                       /* Taste nicht gedrückt */ 
         if((bS2Timer >= nTastShort) && (bS2Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
-            //...
+            if(bTimeLong=1) wVorgabeWert += 10;
             }
         bS2Timer = 0;
+        bTimeLong= 0;
         }
     } 
 
@@ -315,16 +342,19 @@
                 //...
                 }
             if(bS3Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
-                //...
+                bTimeLong = 1;
+                wVorgabeWert -= 100;
+                bS2Timer -= 40;
                 }
             bS3Timer++;
             }
         }
     else{                                       /* Taste nicht gedrückt */ 
         if((bS3Timer >= nTastShort) && (bS3Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
-            //...
+            if(bTimeLong=1) wVorgabeWert += 10;
             }
         bS3Timer = 0;
+        bTimeLong= 0;
         }
     } 
 
@@ -342,27 +372,22 @@
     switch(bDisplayState) {
         case enSchwellenwert:
             bTimerDot++; /* Zähler für Punktwechsel */
-            if(bTimerDot == 50) {
+            vDisplayVolt(wVorgabeWert);
+            if(bTimerDot == 400) {
                 bTimerDot = 0;
-                bDisplayDot = (bDisplayDot + 1) & 0x03;
             }
-            if(bDisplayDot == (bDigit&0x03)) {
+            if((bDigit&0x03) == 0x01) {
                 wSerial = wSerial & ~nSegH; /* Punktanzeigen */
             }
             break;
         case enPotiAnzeige:
-            if((bDigit&0x03) == 0x03){ /* Ablauf von 10 ms */
-                wClockTime++;
-                if(wClockTime > 999) {
-                    wClockTime = 0;
-                }
-                vDisplayClock(wClockTime);
-            }
+                vDisplayVolt(wPotiWert);
             if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */
                 wSerial = wSerial & ~nSegH;
             }
             break;
         case enVergleich:
+            vDisplayDiff(wDiffWert);
             if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */
                 wSerial = wSerial & ~nSegH;
                 }
@@ -371,86 +396,37 @@
     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 */    
-    byte bRandomTaste = 0;
-    word wRandomClock = 0;
-    bMainState = enWaitForStart;
-    bDisplayState = enWaitForStart;
-    pinBeep = 1;
-    vSetWaitForStart();
+    vSetForStart();
     
-    Seriel.begin(9600);
+    //Seriel.begin(9600);
     
-    while(1) {        
-        bRandomTaste++;
-        if(bRandomTaste > 2) bRandomTaste = 0; /* zufällige LED/Taste bestimmen */
-        wRandomClock++;
-        if(wRandomClock > 800) wRandomClock = 0; /* Zufallszeit erzeugen */
+    while(1) {    
+        wPotiWert = analogRead(pinPoti)*3,3;    
+        vCheckTasten();
+        wDiffWert = wVorgabeWert - wPotiWert;
         switch(bMainState) {
-            case enWaitForStart:
-                wDelayGame++;
-                bLedShield =0b1111;
-                if(wDelayGame > 1200) { /* 3 Sekundenminimum */
-                    wDelayGame = wRandomClock;
-                    bMainState = enWaitForRun;
+            case enSchwellenwert:
+                if(wVorgabeWert>3300){
+                    wVorgabeWert=3300;
+                }
+                if(wVorgabeWert<0){
+                    wVorgabeWert=0;
                 }
                 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;
-                    }
+            case enPotiAnzeige:
                 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();
-                    }
+            case enVergleich:
+                if(wDiffWert<0) pinBeep=0;
+                else pinBeep=1;
                 break;
         }
         vSegmentDigit();
-        wait_us(n   CircleTime);
+        wait_us(nCircleTime);
     }
 }
\ No newline at end of file