Versuch 02 übernommen und angefangen es für Versuch 03 abzuwandeln
Dependencies: mbed
Revision 5:5c9b508670cf, committed 22 months ago
- Comitter:
- alexander0707
- Date:
- Sun Dec 04 00:14:49 2022 +0000
- Parent:
- 4:ab3f709c4d2e
- Commit message:
- Nur mal grob angepasstes Skript vom Versuch02
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r ab3f709c4d2e -r 5c9b508670cf main.cpp --- a/main.cpp Mon Nov 07 14:48:34 2022 +0000 +++ b/main.cpp Sun Dec 04 00:14:49 2022 +0000 @@ -1,7 +1,7 @@ /*************************************************************************** -* Titel : main.c +* Titel : main.cpp * -* Description : Labormodul "DIBI" +* Description : Labormodul "HAPOA" * * Revision List: -------------------------------------------------------------------------- @@ -10,11 +10,22 @@ 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); @@ -26,6 +37,7 @@ DigitalOut pinSdo(PA_9); DigitalOut pinSck(PA_8); DigitalOut pinLoad(PB_5); +//DigitalOut pinBeep(PB_3); /* ISR */ Ticker stTimer; @@ -33,8 +45,9 @@ /*************************************************************************** * Defines und Makros * ***************************************************************************/ -#define nTastShort 4 /* Taste 50 Millisekunden gedrückt */ -#define nTastLong 150 /* Taste 1.5 Sekunden gedrückt */ +#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 @@ -87,89 +100,78 @@ * 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 +*/ + + 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 +*/ + /* 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}; -/* 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(bIdx > 0) bIdx--; - else bIdx = 16; - } - bS1Timer++; - } - } - else{ /* Taste nicht gedrückt */ - if((bS1Timer >= nTastShort) && (bS1Timer <= nTastLong)){ /* Taste wurde bereits erkannt */ - if(bIdx < 16) bIdx++; - else bIdx = 0; - } - 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 */ - if(bDigit > 0b00000001) bDigit = bDigit>>1; - else bDigit = 0b00001000; - } - bS2Timer++; - } - } - else{ /* Taste nicht gedrückt */ - if((bS2Timer >= nTastShort) && (bS2Timer <= nTastLong)){ /* Taste wurde bereits erkannt */ - if(bDigit < 0b00001000) bDigit = bDigit<<1; - else bDigit = 0b00000001; - } - bS2Timer = 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 */ - bBargraph--; - } - bS3Timer++; - } - } - else{ /* Taste nicht gedrückt */ - if((bS3Timer >= nTastShort) && (bS3Timer <= nTastLong)){ /* Taste wurde bereits erkannt */ - bBargraph++; - } - bS3Timer = 0; - } - } - - - -void vCheckTasten( void ){ - vTasteS1(); - vTasteS2(); - vTasteS3(); - } - -/* Ausschieben der 16 Bits für die Anzeige */ void vShiftLoad(word wLoad){ word wMask = Bit15; pinLoad = 0; @@ -183,19 +185,272 @@ pinLoad = 1; } + +byte abDisplayMemory[] = {16,16,16,16}; /* alle Segmente aus */ + +void vDisplayClock( 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 vSetWaitForStart( void ) +{ + abDisplayMemory[0] = 16; /* 7-Segment-Display ausschalten + abDisplayMemory[1] = 16; + abDisplayMemory[2] = 16; + abDisplayMemory[3] = 16; + bDisplayState = enWaitForStart; + bTimerDot = 0; + bDigit = 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; + bMainState = enPotiAnzeige; + } + 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){ + bDisplayState = enVergleich; + bMainState = enVergleich; + } + 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 */ + //... + } + bS2Timer++; + } + } + else{ /* Taste nicht gedrückt */ + if((bS2Timer >= nTastShort) && (bS2Timer <= nTastLong)){ /* Taste wurde bereits erkannt */ + //... + } + bS2Timer = 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 */ + //... + } + bS3Timer++; + } + } + else{ /* Taste nicht gedrückt */ + if((bS3Timer >= nTastShort) && (bS3Timer <= nTastLong)){ /* Taste wurde bereits erkannt */ + //... + } + bS3Timer = 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 */ + if(bTimerDot == 50) { + bTimerDot = 0; + bDisplayDot = (bDisplayDot + 1) & 0x03; + } + if(bDisplayDot == (bDigit&0x03)) { + wSerial = wSerial & ~nSegH; /* Punktanzeigen */ + } + break; + case enPotiAnzeige: + if((bDigit&0x03) == 0x03){ /* Ablauf von 10 ms */ + wClockTime++; + if(wClockTime > 999) { + wClockTime = 0; + } + vDisplayClock(wClockTime); + } + if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */ + wSerial = wSerial & ~nSegH; + } + break; + case enVergleich: + if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */ + wSerial = wSerial & ~nSegH; + } + break; + } + 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 */ - bIdx = 0; - bDigit = 0b00000001; - bLedShield = 0x00; - while(1){ - vCheckTasten(); - wSerial = abZiffer[bIdx]<<8 | bDigit ; /* 7-Segmentziffer bestimmen */ - vShiftLoad(wSerial); /* Segmente verschieben und Digit festlegen */ - bLedShield = abBargraph[bBargraph & 0x03]; /* Bargraph bestimmen */ - wait_us(10000); + byte bRandomTaste = 0; + word wRandomClock = 0; + bMainState = enWaitForStart; + bDisplayState = enWaitForStart; + pinBeep = 1; + vSetWaitForStart(); + + Seriel.begin(9600); + + while(1) { + bRandomTaste++; + if(bRandomTaste > 2) bRandomTaste = 0; /* zufällige LED/Taste bestimmen */ + wRandomClock++; + if(wRandomClock > 800) wRandomClock = 0; /* Zufallszeit erzeugen */ + switch(bMainState) { + case enWaitForStart: + wDelayGame++; + bLedShield =0b1111; + if(wDelayGame > 1200) { /* 3 Sekundenminimum */ + wDelayGame = wRandomClock; + bMainState = enWaitForRun; + } + 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; + } + 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(); + } + break; } + vSegmentDigit(); + wait_us(n CircleTime); } +} \ No newline at end of file