Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Diff: main.cpp
- Revision:
- 5:5c9b508670cf
- Parent:
- 4:ab3f709c4d2e
- Child:
- 6:4e55101c65f4
--- 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