Auf den letzten Metern
Dependencies: mbed
main.cpp
- Committer:
- alexander0707
- Date:
- 22 months ago
- Revision:
- 7:94c73e4168d8
- Parent:
- 6:4e55101c65f4
- Child:
- 8:6f91c39dbabc
File content as of revision 7:94c73e4168d8:
/*************************************************************************** * Titel : main.cpp * * Description : Labormodul "HAPOA" * * Revision List: -------------------------------------------------------------------------- Date | Author | Change -------------------------------------------------------------------------- 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); DigitalIn pinS3(A3); BusOut bLedShield(D10, D11, D12, D13); /* Anschlüsse der Schieberegister */ DigitalOut pinSdo(PA_9); DigitalOut pinSck(PA_8); DigitalOut pinLoad(PB_5); DigitalOut pinBeep(PB_3); /* ISR */ Ticker stTimer; /*************************************************************************** * Defines und Makros * ***************************************************************************/ #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 #define nSegC 0x04 #define nSegD 0x08 #define nSegE 0x10 #define nSegF 0x20 #define nSegG 0x40 #define nSegH 0x80 #define nZiffer0 ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF) #define nZiffer1 ~(nSegB | nSegC) #define nZiffer2 ~(nSegA | nSegB | nSegD | nSegE | nSegG) #define nZiffer3 ~(nSegA | nSegB | nSegC | nSegD | nSegG) #define nZiffer4 ~(nSegB | nSegC | nSegF | nSegG) #define nZiffer5 ~(nSegA | nSegC | nSegD | nSegF | nSegG) #define nZiffer6 ~(nSegA | nSegC | nSegD | nSegE | nSegF | nSegG) #define nZiffer7 ~(nSegA | nSegB | nSegC) #define nZiffer8 ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF | nSegG) #define nZiffer9 ~(nSegA | nSegB | nSegC | nSegD | nSegF | nSegG) #define nZifferA ~(nSegA | nSegB | nSegC | nSegE | nSegF | nSegG) #define nZifferB ~(nSegC | nSegD | nSegE | nSegF | nSegG) #define nZifferC ~(nSegA | nSegD | nSegE | nSegF) #define nZifferD ~(nSegB | nSegC | nSegD | nSegE | nSegG) #define nZifferE ~(nSegA | nSegD | nSegE | nSegF | nSegG) #define nZifferF ~(nSegA | nSegE | nSegF | nSegG) #define nZifferOff (nSegA | nSegB | nSegC | nSegD | nSegE | nSegF | nSegG | nSegH) byte bIdx; /* * Description : Index auf Ausgabe */ byte bDigit; /* * Description : aktives Digit */ byte bBargraph; /* * Description : Bargraph durchschalten */ byte bS1Timer; /* * Description : Timer für Taste S1 */ byte bS2Timer; /* * Description : Timer für Taste S2 */ byte bS3Timer; /* * 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 */ byte bTimeLong;/* * Description : Ob Taste bereits lange gedrückt war */ 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 */ 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}; void vShiftLoad(word wLoad){ word wMask = Bit15; pinLoad = 0; while(wMask){ if(wMask & wLoad) pinSdo = 1; else pinSdo = 0; pinSck = 1; wMask >>= 1; pinSck = 0; } pinLoad = 1; } byte abDisplayMemory[] = {16,16,16,16}; /* alle Segmente aus */ void vDisplayVolt( 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 vDisplayDiff( word w ) { 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; bTimerDot = 0; bDigit = 0; bMainState = enSchwellenwert; bDisplayState = enSchwellenwert; pinBeep = 1; wVorgabeWert = 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){ 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; } 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 */ 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; } } 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 */ 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; } } 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 */ vDisplayVolt(wVorgabeWert); if(bTimerDot == 400) { if((bDigit&0x03) == 0x01) { wSerial = wSerial & ~nSegH; /* Punktanzeigen */ } bTimerDot = 0; } break; case enPotiAnzeige: 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; } break; } vShiftLoad(((wSerial << 8) & 0xfff0)| (1 << (bDigit&0x03))); } /*************************************************************************** * main() ***************************************************************************/ int main() { /* Variablen initialisieren */ vSetForStart(); //Seriel.begin(9600); while(1) { wPotiWert = pinPoti*3,3; vCheckTasten(); wDiffWert = wVorgabeWert - wPotiWert; switch(bMainState) { case enSchwellenwert: if(wVorgabeWert>3300){ wVorgabeWert=3300; } if(wVorgabeWert<0){ wVorgabeWert=0; } break; case enPotiAnzeige: break; case enVergleich: if(wDiffWert<0) pinBeep=0; else pinBeep=1; break; } vSegmentDigit(); wait_us(nCircleTime); } }