The chronometer works receiving orders from a serial port at 9600bps: ASCII 1 for START ASCII 2 for PAUSE ASCII 3 for RESET The display module is a 8550, which has 4 digits, so the chronometer max count is 1 minute. Used Ticker for generating interrupts at 100 Hz frequency

Dependencies:   mbed

Fork of Digital_Chronometer_7_segments_4_digits by Valentin Korenblit

Files at this revision

API Documentation at this revision

Comitter:
valekorenblit
Date:
Wed Aug 06 03:04:02 2014 +0000
Commit message:
Chronometer Finished

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Aug 06 03:04:02 2014 +0000
@@ -0,0 +1,217 @@
+#include "mbed.h"
+#include <string>
+#include <Ticker.h>
+
+
+Ticker cronTimer;
+
+DigitalOut segH(D15);
+DigitalOut segG(D14);
+DigitalOut segF(D13);
+DigitalOut segE(D12);
+DigitalOut segD(D11);
+DigitalOut segC(D10);
+DigitalOut segB(D9);
+DigitalOut segA(D7);
+DigitalOut dig1(D1);
+DigitalOut dig2(D2);
+DigitalOut dig3(D3);
+DigitalOut dig4(D4);
+
+unsigned char flagUART=0;
+unsigned char flagCronTimer=0;
+unsigned char running=0;
+unsigned int centCron=0;
+unsigned int segCron=0;
+unsigned int segCronDec=0;
+unsigned int segCronUni=0;
+unsigned int centCronDec=0;
+unsigned int centCronUni=0;
+int received;
+
+
+Serial pc(USBTX, USBRX);
+
+void writeDigit(int n) 
+{
+
+    switch (n) {
+
+
+        case 0:
+            segG=segH=1;
+
+            segA=segB=segC=segD=segE=segF=0;  //LEDS ARE ACTIVE-LOW
+            break;
+        case 1:
+            segA=segD=segE=segF=segG=segH=1;
+            segB=segC=0;
+            break;
+        case 2:
+            segC=segF=segH=1;
+            segA=segB=segD=segE=segG=0;
+            break;
+        case 3:
+            segE=segF=segH=1;
+            segA=segB=segC=segD=segG=0;
+            break;
+        case 4:
+            segA=segD=segE=segH=1;
+            segB=segC=segF=segG=0;
+
+            break;
+        case 5:
+            segB=segE=segH=1;
+            segA=segC=segD=segF=segG=0;
+
+            break;
+        case 6:
+            segB=segH=1;
+            segA=segC=segD=segE=segF=segG=0;
+            break;
+        case 7:
+            segD=segE=segF=segG=segH=1;
+            segA=segB=segC=0;
+
+            break;
+        case 8:
+            segH=1;
+            segA=segB=segC=segD=segE=segF=segG=0;
+            break;
+        case 9:
+
+            segD=segE=segH=1;
+            segA=segB=segC=segF=segG=0;
+            break;
+
+    }
+
+}
+
+void updateDisplay(int d1,int d2, int d3, int d4) 
+{
+
+
+    dig2=dig3=dig4=1;
+    dig1=0;
+    writeDigit(d1);
+    wait_ms(1.5);
+
+    dig1=dig3=dig4=1;
+    dig2=segH=0;
+    writeDigit(d2);
+    wait_ms(1.5);
+
+    dig1=dig2=dig4=1;
+    dig3=0;
+   writeDigit(d3);
+    wait_ms(1.5);
+
+    dig1=dig2=dig3=1;
+    dig4=0;
+   writeDigit(d4);
+    wait_ms(1.5);
+}
+
+void serialInterruptHandler()
+{
+    string s;
+    s=pc.getc();
+    received= atoi(s.c_str());
+    flagUART=1;
+}
+
+void cronTimerInterruptHandler()
+{
+    flagCronTimer=1;
+}
+
+int main()
+{
+    pc.attach(&serialInterruptHandler);
+
+    while(1) {
+
+        if (flagUART) { 
+
+                    if(received==1) {    //start             
+                        if(running==0) { 
+
+                            if((segCron!=59) && (centCron!=99)) {
+                                running=1;
+                                cronTimer.attach_us(&cronTimerInterruptHandler,10000);//each 10ms
+                                pc.printf("RUNNING\n");
+                                }
+                        }
+                        else
+                            pc.printf("ALREADY RUNNING\n");
+                      flagUART=0;
+                    }
+
+                    if(received==2) { //pause
+
+                        if (running==1) { 
+                            cronTimer.detach();
+                            if(segCron!=59) 
+                                running=0;
+                            pc.printf("PAUSED\n");
+                        } 
+                        else 
+                            pc.printf("NOT RUNNING\n");
+                         flagUART=0;
+                
+                    }
+
+                    if(received==3) { //reset
+                            cronTimer.detach();
+                            segCron=0;
+                            centCron=0;
+                            segCronDec=0;
+                            segCronUni=0;
+                            centCronDec=0;
+                            centCronUni=0;
+                            running=0;
+                            pc.printf("RESET\n");
+                            flagUART=0;
+
+                        }
+
+
+         
+
+            }
+
+
+        if(flagCronTimer) {  
+
+            if(running) { 
+
+                centCron++;
+
+                if (centCron == 100) {  
+                    segCron++;
+                    centCron=0;
+                }
+
+                if ((segCron==59) & (centCron==99)) { //TURN OFF CHRONOMETER AT  59.99 SECS
+                    running=0;
+                    cronTimer.detach();
+
+
+                }
+            }
+
+//SPLIT NUMBER INTO DIGITS
+
+            segCronDec=segCron/10;
+            segCronUni=segCron%10;
+            centCronDec=centCron/10;
+            centCronUni=centCron %10;
+
+            //CLEAR FLAG
+            flagCronTimer=0;
+        }
+
+          updateDisplay(segCronDec,segCronUni,centCronDec,centCronUni);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Aug 06 03:04:02 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/0b3ab51c8877
\ No newline at end of file