HAPO WS22 / Mbed 2 deprecated HAPO_WS22_Labor2

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /***************************************************************************
00002 * Titel        : main.c
00003 *
00004 * Description  : Labormodul "DIBI"
00005 *
00006 * Revision List:
00007   --------------------------------------------------------------------------
00008   Date     | Author          | Change
00009   --------------------------------------------------------------------------
00010   24.10.22 | J. Altenburg    | Ersterstellung
00011   --------------------------------------------------------------------------
00012            |                 |
00013   ----------------------------------------------------------------------------
00014 ****************************************************************************/
00015 #include "mbed.h"
00016 #include "cdef.h"
00017 
00018 /* Vereinbarungen zu den Tasteneingängen */
00019 DigitalIn   pinS1(A1);
00020 DigitalIn   pinS2(A2);
00021 DigitalIn   pinS3(A3);
00022 
00023 BusOut      bLedShield(D10, D11, D12, D13);
00024 
00025 /* Anschlüsse der Schieberegister */
00026 DigitalOut  pinSdo(PA_9);
00027 DigitalOut  pinSck(PA_8);
00028 DigitalOut  pinLoad(PB_5);
00029 DigitalOut  pinBeep(PB_3);
00030 
00031 /* ISR */
00032 Ticker      stTimer;
00033 
00034 /***************************************************************************
00035 *   Defines und Makros                                                       *
00036 ***************************************************************************/
00037 #define nTastShort    4     /* Taste 50 Millisekunden gedrückt */    
00038 #define nTastLong   150     /* Taste 1.5 Sekunden gedrückt */ 
00039 
00040 #define nSegA           0x01
00041 #define nSegB           0x02
00042 #define nSegC           0x04
00043 #define nSegD           0x08
00044 #define nSegE           0x10
00045 #define nSegF           0x20
00046 #define nSegG           0x40
00047 #define nSegH           0x80
00048 
00049 #define nZiffer0    ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF)
00050 #define nZiffer1    ~(nSegB | nSegC)
00051 #define nZiffer2    ~(nSegA | nSegB | nSegD | nSegE | nSegG)
00052 #define nZiffer3    ~(nSegA | nSegB | nSegC | nSegD | nSegG)
00053 #define nZiffer4    ~(nSegB | nSegC | nSegF | nSegG)
00054 #define nZiffer5    ~(nSegA | nSegC | nSegD | nSegF | nSegG)
00055 #define nZiffer6    ~(nSegA | nSegC | nSegD | nSegE | nSegF | nSegG)
00056 #define nZiffer7    ~(nSegA | nSegB | nSegC)
00057 #define nZiffer8    ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF | nSegG)
00058 #define nZiffer9    ~(nSegA | nSegB | nSegC | nSegD | nSegF | nSegG)
00059 #define nZifferA    ~(nSegA | nSegB | nSegC | nSegE | nSegF | nSegG)
00060 #define nZifferB    ~(nSegC | nSegD | nSegE | nSegF | nSegG)
00061 #define nZifferC    ~(nSegA | nSegD | nSegE | nSegF)
00062 #define nZifferD    ~(nSegB | nSegC | nSegD | nSegE | nSegG)
00063 #define nZifferE    ~(nSegA | nSegD | nSegE | nSegF | nSegG)
00064 #define nZifferF    ~(nSegA | nSegE | nSegF | nSegG)
00065 #define nZifferOff   (nSegA | nSegB | nSegC | nSegD | nSegE | nSegF | nSegG | nSegH)
00066 
00067 byte bIdx; /*
00068 * Description : Index auf Ausgabe
00069 */
00070 
00071 byte bDigit; /*
00072 * Description : aktives Digit
00073 */
00074 
00075 byte bBargraph; /*
00076 * Description : Bargraph durchschalten
00077 */
00078 
00079 byte bS1Timer; /*
00080 * Description : Timer für Taste S1
00081 */
00082 
00083 byte bS2Timer; /*
00084 * Description : Timer für Taste S2
00085 */
00086 
00087 byte bS3Timer; /*
00088 * Description : Timer für Taste S3
00089 */
00090 
00091 byte bDisplayState; /*
00092 * Description : 
00093 */
00094 const byte enWaitForStart=0x00;
00095 const byte enRunClock = 0x01;
00096 const byte enShowResult = 0x02;
00097 const byte enShowError = 0x03;
00098 const byte enWaitForRun = 0x04;
00099 
00100 
00101 byte bState; /*
00102 * Description : 
00103 */
00104 
00105 byte bTimerDot; /*
00106 * Description : Zähler für Dots
00107 */
00108 
00109 byte bHotKey; /*
00110 * Description : Auswahl der Taste
00111 */
00112 
00113 byte bDisplayDot; /*
00114 * Description : 
00115 */
00116 
00117 byte bMainState; /*
00118 * Description : Hauptzustand
00119 */
00120 
00121 byte bBeepTime; /*
00122 * Description : Tondauer 
00123 */
00124 
00125 
00126 word wSerial; /*
00127 * Description : serielles Ausgaberegister
00128 */
00129 
00130 word wClockTime; /*
00131 *Description : Timer für verstrichene Zeit
00132 */
00133 
00134 word wClockShow; /*
00135 *Description : Timer für verstrichene Zeit
00136 */
00137 
00138 word wDelayGame; /*
00139 * Description : Verzögerungstimer
00140 */
00141 
00142 /* Bitmuster */
00143 const byte abZiffer[] = {nZiffer0, nZiffer1, nZiffer2, nZiffer3, nZiffer4, nZiffer5, nZiffer6, nZiffer7, nZiffer8, nZiffer9, nZifferA, nZifferB, nZifferC, nZifferD, nZifferE, nZifferF, nZifferOff};
00144 const byte abBargraph[] = {~Bit0, ~(Bit0|Bit1), ~(Bit0|Bit1|Bit2), ~(Bit0|Bit1|Bit2|Bit3), 0x0f};
00145 
00146 
00147 void vShiftLoad(word wLoad){
00148     word wMask = Bit15;
00149     pinLoad = 0;
00150     while(wMask){
00151         if(wMask & wLoad) pinSdo = 1;
00152         else              pinSdo = 0;
00153         pinSck = 1;
00154         wMask >>= 1;
00155         pinSck = 0;
00156         }    
00157     pinLoad = 1;
00158     }
00159 
00160 
00161 byte abDisplayMemory[] = {16,16,16,16}; /* alle Segmente aus */
00162 
00163 void vDisplayClock( word w )
00164 {
00165     int16 v;
00166     abDisplayMemory[0] = 16; /* Aus */
00167     v = (byte)(w / 100);
00168     abDisplayMemory[1] = v; /* Hunderter */
00169     w = w - (v * 100);
00170     v = (byte)(w / 10);
00171     abDisplayMemory[2] = v; /* Zehner */
00172     w = w - (v * 10);
00173     abDisplayMemory[3] = (byte)w; /* Einer */
00174 }
00175 
00176 void vSetWaitForStart( void )
00177 {
00178     abDisplayMemory[0] = 16; /* 7-Segment-Display ausschalten */
00179     abDisplayMemory[1] = 16;
00180     abDisplayMemory[2] = 16;
00181     abDisplayMemory[3] = 16;
00182     bDisplayState = enWaitForStart;
00183     bTimerDot = 0;
00184     bDigit = 0;
00185 }
00186 
00187 void vSetRunClock( void )
00188 {
00189     wClockTime = 0;
00190     bDigit = 0;
00191     abDisplayMemory[0] = 16; /* 7-Segment-Display ausschalten */
00192     abDisplayMemory[1] = 0;
00193     abDisplayMemory[2] = 0;
00194     abDisplayMemory[3] = 0;
00195     bDisplayState = enRunClock;
00196 }
00197 
00198 byte bCheckTasten( byte bState )
00199 {
00200     if((pinS1 == 0) || (pinS2 == 0) || (pinS3 == 0)) { /* Tastendruck erkannt */
00201         wClockShow = 1200;
00202         if((pinS1 == 0) && (bHotKey == 0)) {
00203             wDelayGame = 0;
00204             bState = enShowResult;
00205             bDisplayState = enShowResult;
00206         } else if((pinS2 == 0) && (bHotKey == 1)) {
00207             wDelayGame = 0;
00208             bState = enShowResult;
00209             bDisplayState = enShowResult;
00210         } else if((pinS3 == 0) && (bHotKey == 2)) {
00211             wDelayGame = 0;
00212             bState = enShowResult;
00213             bDisplayState = enShowResult;
00214         } else {
00215             wDelayGame = 200;
00216             abDisplayMemory[1] = 15;
00217             abDisplayMemory[2] = 15;
00218             abDisplayMemory[3] = 15;
00219             bState = enShowError;
00220             bDisplayState = enShowResult;
00221             pinBeep = 0;
00222         }
00223     }
00224     return bState;
00225 }
00226 
00227 void vSegmentDigit( void )
00228 {
00229     bDigit++;
00230     wSerial = abZiffer[abDisplayMemory[bDigit&0x03]];
00231     switch(bDisplayState) {
00232         case enWaitForStart:
00233             bTimerDot++; /* Zähler für Punktwechsel */
00234             if(bTimerDot == 50) {
00235                 bTimerDot = 0;
00236                 bDisplayDot = (bDisplayDot + 1) & 0x03;
00237             }
00238             if(bDisplayDot == (bDigit&0x03)) {
00239                 wSerial = wSerial & ~nSegH; /* Punktanzeigen */
00240             }
00241             break;
00242         case enRunClock:
00243             if((bDigit&0x03) == 0x03){ /* Ablauf von 10 ms */
00244                 wClockTime++;
00245                 if(wClockTime > 999) {
00246                     wClockTime = 0;
00247                 }
00248                 vDisplayClock(wClockTime);
00249             }
00250             if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */
00251                 wSerial = wSerial & ~nSegH;
00252             }
00253             break;
00254         case enShowResult:
00255             if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */
00256                 wSerial = wSerial & ~nSegH;
00257                 }
00258             //if((bDigit&0x03) == 0x03){
00259                 //wClockMehrzweck++;
00260                 //if(wClockMehrzweck > 1200){
00261                     //bDisplayState= enWaitForStart;
00262                     //}
00263                 //}
00264             break;
00265     }
00266     vShiftLoad(((wSerial << 8) & 0xfff0)| (1 << (bDigit&0x03)));
00267 }
00268 
00269 void vBargraph(byte bTaste){
00270     switch(bTaste){
00271         case 0 :
00272             bLedShield =0b1110;
00273             break;
00274         case 1 :
00275             bLedShield =0b1101;
00276             break;
00277         case 2 :
00278             bLedShield =0b1011;
00279             break;
00280     }
00281 }
00282 
00283 /***************************************************************************
00284 *   main()
00285 ***************************************************************************/
00286 int main() {
00287     /* Variablen initialisieren */    
00288     byte bRandomTaste = 0;
00289     word wRandomClock = 0;
00290     bMainState = enWaitForStart;
00291     bDisplayState = enWaitForStart;
00292     pinBeep = 1;
00293     vSetWaitForStart();
00294     
00295     while(1) {        
00296         bRandomTaste++;
00297         if(bRandomTaste > 2) bRandomTaste = 0; /* zufällige LED/Taste bestimmen */
00298         wRandomClock++;
00299         if(wRandomClock > 800) wRandomClock = 0; /* Zufallszeit erzeugen */
00300         switch(bMainState) {
00301             case enWaitForStart:
00302                 wDelayGame++;
00303                 bLedShield =0b1111;
00304                 if(wDelayGame > 1200) { /* 3 Sekundenminimum */
00305                     wDelayGame = wRandomClock;
00306                     bMainState = enWaitForRun;
00307                 }
00308                 break;
00309             case enRunClock:
00310                 bBeepTime--;
00311                 if(bBeepTime == 0)pinBeep = 1;
00312                 bMainState = bCheckTasten(enRunClock);
00313                 break;
00314             case enWaitForRun:
00315                 wDelayGame--;
00316                 if(wDelayGame == 0){
00317                     bMainState = enRunClock;
00318                     bDisplayState = enRunClock;
00319                     bBeepTime = 20;
00320                     bHotKey = bRandomTaste;
00321                     vBargraph(bRandomTaste);
00322                     vSetRunClock();
00323                     pinBeep = 0;
00324                     }
00325                 break;
00326             case enShowResult:
00327                 wClockShow--;
00328                 if(wClockShow==0){
00329                     bMainState = enWaitForStart;
00330                     bDisplayState = enWaitForStart;
00331                     vSetWaitForStart();
00332                     }
00333                 break;
00334             case enShowError:
00335                 wDelayGame--;
00336                 if(wDelayGame == 0)pinBeep = 1;
00337                 wClockShow--;
00338                 if(wClockShow==0){
00339                     bMainState = enWaitForStart;
00340                     bDisplayState = enWaitForStart;
00341                     vSetWaitForStart();
00342                     }
00343                 break;
00344         }
00345         vSegmentDigit();
00346         wait_us(2500);
00347     }
00348 }