Auf den letzten Metern

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /***************************************************************************
00002 * Titel        : main.cpp
00003 *
00004 * Description  : Labormodul "HAPOA"
00005 *
00006 * Revision List:
00007   --------------------------------------------------------------------------
00008   Date     | Author          | Change
00009   --------------------------------------------------------------------------
00010   24.10.22 | J. Altenburg    | Ersterstellung
00011   --------------------------------------------------------------------------
00012            |                 |
00013   ---------------------------------------------------------------------------
00014   
00015   Editor List:
00016   --------------------------------------------------------------------------
00017   Date     | Author          | Change
00018   --------------------------------------------------------------------------
00019   30.11.22 |Tobias Zinke     | Labor03
00020   --------------------------------------------------------------------------
00021   30.11.22 |Alexander Pitthan| Labor03
00022   ---------------------------------------------------------------------------
00023 ****************************************************************************/
00024 #include "mbed.h"
00025 #include "cdef.h"
00026 
00027 AnalogIn    pinPoti (A0);
00028 
00029 /* Vereinbarungen zu den Tasteneingängen */
00030 DigitalIn   pinS1(A1);
00031 DigitalIn   pinS2(A2);
00032 DigitalIn   pinS3(A3);
00033 
00034 //BusOut      bLedShield(D10, D11, D12, D13);
00035 
00036 /* Anschlüsse der Schieberegister */
00037 DigitalOut  pinSdo(PA_9);
00038 DigitalOut  pinSck(PA_8);
00039 DigitalOut  pinLoad(PB_5);
00040 DigitalOut  pinBeep(PB_3);
00041 
00042 /* ISR */
00043 Ticker      stTimer;
00044 
00045 /***************************************************************************
00046 *   Defines und Makros                                                       *
00047 ***************************************************************************/
00048 #define nTastShort  20      /* Taste 50 Millisekunden gedrückt */    
00049 #define nTastLong   240     /* Taste 0.6 Sekunden gedrückt */ 
00050 #define nCircleTime 2500    /* Laufzeit der Main in us */
00051 
00052 #define nSegA           0x01
00053 #define nSegB           0x02
00054 #define nSegC           0x04
00055 #define nSegD           0x08
00056 #define nSegE           0x10
00057 #define nSegF           0x20
00058 #define nSegG           0x40
00059 #define nSegH           0x80
00060 
00061 #define nZiffer0    ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF)
00062 #define nZiffer1    ~(nSegB | nSegC)
00063 #define nZiffer2    ~(nSegA | nSegB | nSegD | nSegE | nSegG)
00064 #define nZiffer3    ~(nSegA | nSegB | nSegC | nSegD | nSegG)
00065 #define nZiffer4    ~(nSegB | nSegC | nSegF | nSegG)
00066 #define nZiffer5    ~(nSegA | nSegC | nSegD | nSegF | nSegG)
00067 #define nZiffer6    ~(nSegA | nSegC | nSegD | nSegE | nSegF | nSegG)
00068 #define nZiffer7    ~(nSegA | nSegB | nSegC)
00069 #define nZiffer8    ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF | nSegG)
00070 #define nZiffer9    ~(nSegA | nSegB | nSegC | nSegD | nSegF | nSegG)
00071 #define nZifferA    ~(nSegA | nSegB | nSegC | nSegE | nSegF | nSegG)
00072 #define nZifferB    ~(nSegC | nSegD | nSegE | nSegF | nSegG)
00073 #define nZifferC    ~(nSegA | nSegD | nSegE | nSegF)
00074 #define nZifferD    ~(nSegB | nSegC | nSegD | nSegE | nSegG)
00075 #define nZifferE    ~(nSegA | nSegD | nSegE | nSegF | nSegG)
00076 #define nZifferF    ~(nSegA | nSegE | nSegF | nSegG)
00077 #define nZifferOff   (nSegA | nSegB | nSegC | nSegD | nSegE | nSegF | nSegG | nSegH)
00078 
00079 byte bIdx; /*
00080 * Description : Index auf Ausgabe
00081 */
00082 
00083 byte bDigit; /*
00084 * Description : aktives Digit
00085 */
00086 
00087 byte bBargraph; /*
00088 * Description : Bargraph durchschalten
00089 */
00090 
00091 byte bS1Timer; /*
00092 * Description : Timer für Taste S1
00093 */
00094 
00095 byte bS2Timer; /*
00096 * Description : Timer für Taste S2
00097 */
00098 
00099 byte bS3Timer; /*
00100 * Description : Timer für Taste S3
00101 */
00102 
00103 byte bSCounter; /*
00104 * Description : Zähler UART-Auslese für Tasterersatz
00105 */
00106 
00107 byte bDisplayState; /*
00108 * Description : 
00109 */
00110 const byte enSchwellenwert=0x00;
00111 const byte enPotiAnzeige = 0x01;
00112 const byte enVergleich = 0x02;
00113 
00114 
00115 byte bState; /*
00116 * Description : 
00117 */
00118 
00119 byte bHotKey; /*
00120 * Description : Auswahl der Taste
00121 */
00122 
00123 byte bDisplayDot; /*
00124 * Description : 
00125 */
00126 
00127 byte bMainState; /*
00128 * Description : Hauptzustand
00129 */
00130 
00131 byte bBeepTime; /*
00132 * Description : Tondauer 
00133 */
00134 
00135 byte bEinstellungsModus;/*
00136 * Description : Einstellungszustand 
00137 */
00138 
00139 byte bSchwellenwertVergleich;/*
00140 * Description : Einstellungszustand 
00141 */
00142 
00143 byte bTimeLong;/*
00144 * Description : Ob Taste bereits lange gedrückt war 
00145 */
00146 
00147 byte bSizeData;/*
00148 * Description : Größe der Daten
00149 */
00150 byte *pUartData; /*
00151 * Description : pointer to data
00152 */
00153 
00154 byte bComp;
00155 
00156 
00157 word wSerial; /*
00158 * Description : serielles Ausgaberegister
00159 */
00160 
00161 word wClockTime; /*
00162 *Description : Timer für verstrichene Zeit
00163 */
00164 
00165 word wClockShow; /*
00166 *Description : Timer für verstrichene Zeit
00167 */
00168 
00169 word wDelayGame; /*
00170 * Description : Verzögerungstimer
00171 */
00172 
00173 word wPotiWert; /*
00174 * Description : Wert des Potis
00175 */
00176 
00177 word wVorgabeWert; /*
00178 * Description : eingestellter Vorgabewert
00179 */
00180 
00181 int nDiffWert; /*
00182 * Description : Differenz zwischen Vorgabe und Eingang
00183 */
00184 
00185 word wSizeData; /*
00186 * Description : Größe der empfangenen Daten
00187 */
00188 
00189 word wTimerDot; /*
00190 * Description : Zähler für Dots
00191 */
00192 
00193 int zaehler;
00194 
00195 /* Bitmuster */
00196 const byte abZiffer[] = {nZiffer0, nZiffer1, nZiffer2, nZiffer3, nZiffer4, nZiffer5, nZiffer6, nZiffer7, nZiffer8, nZiffer9, nZifferA, nZifferB, nZifferC, nZifferD, nZifferE, nZifferF, nZifferOff};
00197 //const byte abBargraph[] = {~Bit0, ~(Bit0|Bit1), ~(Bit0|Bit1|Bit2), ~(Bit0|Bit1|Bit2|Bit3), 0x0f};
00198 byte abTxBuffer[60];
00199 byte abTxBufferOld[60];
00200 
00201 
00202 
00203 void vShiftLoad(word wLoad){
00204     word wMask = Bit15;
00205     pinLoad = 0;
00206     while(wMask){
00207         if(wMask & wLoad) pinSdo = 1;
00208         else              pinSdo = 0;
00209         pinSck = 1;
00210         wMask >>= 1;
00211         pinSck = 0;
00212         }    
00213     pinLoad = 1;
00214     }
00215 
00216 
00217 byte abDisplayMemory[] = {16,16,16,16}; /* alle Segmente aus */
00218 
00219 void vDisplayVolt( word w )
00220 {
00221     int16 v;
00222     abDisplayMemory[0] = 16; /* Aus */
00223     v = (byte)(w / 1000);
00224     abDisplayMemory[1] = v; /* Hunderter */
00225     w = w - (v * 1000);
00226     v = (byte)(w / 100);
00227     abDisplayMemory[2] = v; /* Zehner */
00228     w = w - (v * 100);
00229     v = (byte)(w / 10);
00230     abDisplayMemory[3] = v; /* Einer */
00231 }
00232 
00233 void vDisplayDiff( word w )
00234 {
00235     int16 v;
00236     abDisplayMemory[0] = 12; /* "C" */
00237     v = (byte)(w / 1000);
00238     abDisplayMemory[1] = v; /* Hunderter */
00239     w = w - (v * 1000);
00240     v = (byte)(w / 100);
00241     abDisplayMemory[2] = v; /* Zehner */
00242     w = w - (v * 100);
00243     v = (byte)(w / 10);
00244     abDisplayMemory[3] = v; /* Einer */
00245 }
00246 
00247 void vSetForStart( void )
00248 {
00249     abDisplayMemory[0] = 16; /* 7-Segment-Display ausschalten */
00250     abDisplayMemory[1] = 16;
00251     abDisplayMemory[2] = 16;
00252     abDisplayMemory[3] = 16;
00253     wTimerDot = 0;
00254     bDigit = 0;
00255     bMainState = enSchwellenwert;
00256     bDisplayState = enSchwellenwert;
00257     pinBeep = 1;
00258     wVorgabeWert = 0;
00259 }
00260 
00261 /* Tastenabfrage */
00262 void vTasteS1( void ){
00263     if(pinS1 == 0){                             /* User-Taste gedrückt */      
00264         if(bS1Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
00265             if(bS1Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
00266                 //...
00267                 }
00268             if(bS1Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
00269                 if(bDisplayState == enSchwellenwert){
00270                     bDisplayState = enVergleich;
00271                     bMainState = enVergleich;
00272                     }
00273                 else{
00274                     bDisplayState = enSchwellenwert;
00275                     bMainState = enSchwellenwert;
00276                     }
00277                 }
00278             bS1Timer++;
00279             }
00280         }
00281     else{                                       /* Taste nicht gedrückt */ 
00282         if(((bS1Timer >= nTastShort) && (bS1Timer <= nTastLong))){             /* Taste wurde bereits erkannt */
00283             if(bDisplayState == enSchwellenwert){
00284                     bDisplayState = enPotiAnzeige; 
00285                     bMainState = enPotiAnzeige;
00286                     }
00287                 else{ 
00288                     bDisplayState = enSchwellenwert;
00289                     bMainState= enSchwellenwert;
00290                     }
00291             }
00292         bS1Timer = 0;
00293         }
00294     } 
00295 
00296 void vTasteS2( void ){
00297     if((pinS2 == 0) && bMainState == enSchwellenwert){                             /* User-Taste gedrückt */    
00298         if(bS2Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
00299             if(bS2Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
00300                 //...
00301                 }
00302             if(bS2Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
00303                 bTimeLong = 1;
00304                 if(wVorgabeWert >=3200) wVorgabeWert = 3300;
00305                 else wVorgabeWert = wVorgabeWert + 100;
00306                 bS2Timer = bS2Timer - 40;
00307                 }
00308             bS2Timer++;
00309             }
00310         }
00311     else{                                       /* Taste nicht gedrückt */ 
00312         if(((bS2Timer >= nTastShort) && (bS2Timer <= nTastLong))){             /* Taste wurde bereits erkannt */
00313             if(bTimeLong==0){
00314                 if(wVorgabeWert >=3290) wVorgabeWert = 3300;
00315                 else wVorgabeWert = wVorgabeWert + 10;
00316             }
00317             }
00318         bS2Timer = 0;
00319         bTimeLong = 0;
00320         }
00321     } 
00322 
00323 void vTasteS3( void ){
00324     if(pinS3 == 0 && bMainState == enSchwellenwert){                             /* User-Taste gedrückt */
00325         if(bS3Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
00326             if(bS3Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
00327                 //...
00328                 }
00329             if(bS3Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
00330                 bTimeLong = 1;
00331                 if(wVorgabeWert <=100) wVorgabeWert = 0;
00332                 else wVorgabeWert = wVorgabeWert - 100;
00333                 bS3Timer = bS3Timer - 40;
00334                 }
00335             bS3Timer++;
00336             }
00337         }
00338     else{                                       /* Taste nicht gedrückt */ 
00339         if((bS3Timer >= nTastShort) && (bS3Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
00340             if(bTimeLong==0){
00341                 if(wVorgabeWert <=10) wVorgabeWert = 0;
00342                 else wVorgabeWert = wVorgabeWert - 10;
00343             }
00344             }
00345         bS3Timer = 0;
00346         bTimeLong = 0;
00347         }
00348     } 
00349 
00350 
00351 
00352 void vCheckTasten( void ){
00353     vTasteS1();
00354     vTasteS2();
00355     vTasteS3();
00356     }
00357 void vSegmentDigit( void ) //wichtig!!
00358 {
00359     bDigit++;
00360     wSerial = abZiffer[abDisplayMemory[bDigit&0x03]];
00361     switch(bDisplayState) {
00362         case enSchwellenwert:
00363             wTimerDot++; /* Zähler für Punktwechsel */
00364             vDisplayVolt(wVorgabeWert);
00365             if(wTimerDot == 400) {
00366                 wDelayGame=200;
00367                 wTimerDot = 0;
00368             }
00369             if(wDelayGame!=0){
00370                 if((bDigit&0x03) == 0x01) {
00371                     wSerial = wSerial & ~nSegH; /* Punktanzeigen */
00372                 }  
00373                 wDelayGame--;
00374             }
00375             break;
00376         case enPotiAnzeige:
00377                 vDisplayVolt(wPotiWert);
00378             if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */
00379                 wSerial = wSerial & ~nSegH;
00380             }
00381             break;
00382         case enVergleich:
00383             vDisplayDiff(nDiffWert);
00384             if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */
00385                 wSerial = wSerial & ~nSegH;
00386                 }
00387             break;
00388     }
00389     vShiftLoad(((wSerial << 8) & 0xfff0)| (1 << (bDigit&0x03)));
00390 }
00391 
00392 
00393 
00394 
00395 
00396 
00397 
00398 
00399 
00400 
00401 Serial stComX(D1,D0); // UART-Kommunikation (Txd(D1)/Rxd(D0)) mit dem PC 
00402  
00403 /*
00404 byte SYS_vStartComX( word wSize, byte *pData ){ // Start einer Übertragung 
00405 byte i;
00406 if(wSizeData) i = False;
00407 else{
00408 wSizeData = wSize; // Anzahl der Sendedaten 
00409 pUartData = pData; // Zeiger auf diese Daten 
00410 stComX.putc(*pUartData); // erstes Zeichen senden 
00411 pUartData++;
00412 wSizeData--;
00413 USART2->CR1 |= USART_CR1_TXEIE; // TXE-Interrupt freigeben 
00414 i = True;
00415 }
00416 return i;
00417 }
00418 
00419 
00420 // Senderoutine zum COM-Port am PC 
00421 void vIsrTxComX( void ){ // Senderoutine 
00422 if(stComX.writeable()){ // Sende-ISR 
00423 if(bSizeData){ // sind Daten vorhanden ? 
00424 stComX.putc(*pUartData); // daten senden 
00425 pUartData++;
00426 bSizeData--;
00427 }
00428 else{
00429 USART2->CR1 &= ~USART_CR1_TXEIE; // Interrupt sperren 
00430 }
00431 }
00432 }
00433 
00434 
00435 // Empfangsroutine vom COM-Port des PC 
00436 void vIsrRxComX( void ){ // Empfangsroutine 
00437 if(stComX.readable()){ // Empfangs-ISR 
00438 for(int i=60; i>0; i--){
00439     abTxBufferOld[i]=abTxBuffer[i];
00440 }
00441 for(int i=60; i>0; i--){
00442     abTxBuffer[i]=abTxBuffer[i-1];
00443 }
00444 abTxBuffer[0] = stComX.getc();
00445 SYS_vStartComX(1, &abTxBuffer[0]);
00446 }
00447 }
00448 */
00449 
00450 
00451 
00452 void vComA(void){
00453     if(abTxBuffer[0]=='a'){
00454         if(bMainState==enSchwellenwert) {
00455             bDisplayState = enPotiAnzeige;
00456             bMainState = enPotiAnzeige;
00457         }
00458         else if(bMainState==enPotiAnzeige) {
00459             bDisplayState = enVergleich;
00460             bMainState = enVergleich;
00461         }
00462         else {
00463             bDisplayState = enSchwellenwert;
00464             bMainState = enSchwellenwert;
00465         }
00466     }
00467 }
00468 
00469 void vComPlus(void){
00470     if(abTxBuffer[0]=='+'){
00471         if(wVorgabeWert >=3290) wVorgabeWert = 3300;
00472         else wVorgabeWert = wVorgabeWert + 10;
00473     }
00474 }
00475 
00476 void vComMinus(void){
00477     if(abTxBuffer[0]=='-'){
00478         if(wVorgabeWert <=10) wVorgabeWert = 0;
00479         else wVorgabeWert = wVorgabeWert - 10;;
00480     }
00481 }
00482 
00483 void vCheckCom(void){
00484     vComA();
00485     vComPlus();
00486     vComMinus();
00487 }
00488 
00489 
00490 
00491 
00492 /***************************************************************************
00493 *   main()
00494 ***************************************************************************/
00495 int main() {
00496     /* Variablen initialisieren */    
00497     vSetForStart();
00498 
00499 
00500     //Seriel.begin(9600);
00501     
00502    
00503     while(1) {    
00504         wPotiWert = pinPoti*3300;  
00505         vCheckTasten();
00506         nDiffWert = wVorgabeWert - wPotiWert;
00507         
00508         if(stComX.readable()) {
00509             abTxBuffer[0]=stComX.getc();
00510         }
00511         
00512         //stComX.attach(&vIsrRxComX, Serial::RxIrq); /* ISR zum Datemempfang vom PC */
00513         //stComX.attach(&vIsrTxComX, Serial::TxIrq); /* Sende-ISR */
00514         
00515         vCheckCom();
00516     
00517     
00518         switch(bMainState) {
00519             case enSchwellenwert:
00520                 pinBeep = 1;
00521                 break;
00522             case enPotiAnzeige:
00523                 pinBeep = 1;
00524                 break;
00525             case enVergleich:
00526                 if(nDiffWert<0) pinBeep=0;
00527                 else pinBeep=1;
00528                 break;
00529         }
00530         vSegmentDigit();
00531         wait_us(nCircleTime);
00532     }
00533 }