Auf den letzten Metern
Dependencies: mbed
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 }
Generated on Mon Dec 5 2022 15:47:10 by 1.7.2