Auf den letzten Metern
Dependencies: mbed
Diff: main.cpp
- 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