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

Committer:
valekorenblit
Date:
Wed Aug 06 03:04:02 2014 +0000
Revision:
0:73b3e1c6cf2f
Chronometer Finished

Who changed what in which revision?

UserRevisionLine numberNew contents of line
valekorenblit 0:73b3e1c6cf2f 1 #include "mbed.h"
valekorenblit 0:73b3e1c6cf2f 2 #include <string>
valekorenblit 0:73b3e1c6cf2f 3 #include <Ticker.h>
valekorenblit 0:73b3e1c6cf2f 4
valekorenblit 0:73b3e1c6cf2f 5
valekorenblit 0:73b3e1c6cf2f 6 Ticker cronTimer;
valekorenblit 0:73b3e1c6cf2f 7
valekorenblit 0:73b3e1c6cf2f 8 DigitalOut segH(D15);
valekorenblit 0:73b3e1c6cf2f 9 DigitalOut segG(D14);
valekorenblit 0:73b3e1c6cf2f 10 DigitalOut segF(D13);
valekorenblit 0:73b3e1c6cf2f 11 DigitalOut segE(D12);
valekorenblit 0:73b3e1c6cf2f 12 DigitalOut segD(D11);
valekorenblit 0:73b3e1c6cf2f 13 DigitalOut segC(D10);
valekorenblit 0:73b3e1c6cf2f 14 DigitalOut segB(D9);
valekorenblit 0:73b3e1c6cf2f 15 DigitalOut segA(D7);
valekorenblit 0:73b3e1c6cf2f 16 DigitalOut dig1(D1);
valekorenblit 0:73b3e1c6cf2f 17 DigitalOut dig2(D2);
valekorenblit 0:73b3e1c6cf2f 18 DigitalOut dig3(D3);
valekorenblit 0:73b3e1c6cf2f 19 DigitalOut dig4(D4);
valekorenblit 0:73b3e1c6cf2f 20
valekorenblit 0:73b3e1c6cf2f 21 unsigned char flagUART=0;
valekorenblit 0:73b3e1c6cf2f 22 unsigned char flagCronTimer=0;
valekorenblit 0:73b3e1c6cf2f 23 unsigned char running=0;
valekorenblit 0:73b3e1c6cf2f 24 unsigned int centCron=0;
valekorenblit 0:73b3e1c6cf2f 25 unsigned int segCron=0;
valekorenblit 0:73b3e1c6cf2f 26 unsigned int segCronDec=0;
valekorenblit 0:73b3e1c6cf2f 27 unsigned int segCronUni=0;
valekorenblit 0:73b3e1c6cf2f 28 unsigned int centCronDec=0;
valekorenblit 0:73b3e1c6cf2f 29 unsigned int centCronUni=0;
valekorenblit 0:73b3e1c6cf2f 30 int received;
valekorenblit 0:73b3e1c6cf2f 31
valekorenblit 0:73b3e1c6cf2f 32
valekorenblit 0:73b3e1c6cf2f 33 Serial pc(USBTX, USBRX);
valekorenblit 0:73b3e1c6cf2f 34
valekorenblit 0:73b3e1c6cf2f 35 void writeDigit(int n)
valekorenblit 0:73b3e1c6cf2f 36 {
valekorenblit 0:73b3e1c6cf2f 37
valekorenblit 0:73b3e1c6cf2f 38 switch (n) {
valekorenblit 0:73b3e1c6cf2f 39
valekorenblit 0:73b3e1c6cf2f 40
valekorenblit 0:73b3e1c6cf2f 41 case 0:
valekorenblit 0:73b3e1c6cf2f 42 segG=segH=1;
valekorenblit 0:73b3e1c6cf2f 43
valekorenblit 0:73b3e1c6cf2f 44 segA=segB=segC=segD=segE=segF=0; //LEDS ARE ACTIVE-LOW
valekorenblit 0:73b3e1c6cf2f 45 break;
valekorenblit 0:73b3e1c6cf2f 46 case 1:
valekorenblit 0:73b3e1c6cf2f 47 segA=segD=segE=segF=segG=segH=1;
valekorenblit 0:73b3e1c6cf2f 48 segB=segC=0;
valekorenblit 0:73b3e1c6cf2f 49 break;
valekorenblit 0:73b3e1c6cf2f 50 case 2:
valekorenblit 0:73b3e1c6cf2f 51 segC=segF=segH=1;
valekorenblit 0:73b3e1c6cf2f 52 segA=segB=segD=segE=segG=0;
valekorenblit 0:73b3e1c6cf2f 53 break;
valekorenblit 0:73b3e1c6cf2f 54 case 3:
valekorenblit 0:73b3e1c6cf2f 55 segE=segF=segH=1;
valekorenblit 0:73b3e1c6cf2f 56 segA=segB=segC=segD=segG=0;
valekorenblit 0:73b3e1c6cf2f 57 break;
valekorenblit 0:73b3e1c6cf2f 58 case 4:
valekorenblit 0:73b3e1c6cf2f 59 segA=segD=segE=segH=1;
valekorenblit 0:73b3e1c6cf2f 60 segB=segC=segF=segG=0;
valekorenblit 0:73b3e1c6cf2f 61
valekorenblit 0:73b3e1c6cf2f 62 break;
valekorenblit 0:73b3e1c6cf2f 63 case 5:
valekorenblit 0:73b3e1c6cf2f 64 segB=segE=segH=1;
valekorenblit 0:73b3e1c6cf2f 65 segA=segC=segD=segF=segG=0;
valekorenblit 0:73b3e1c6cf2f 66
valekorenblit 0:73b3e1c6cf2f 67 break;
valekorenblit 0:73b3e1c6cf2f 68 case 6:
valekorenblit 0:73b3e1c6cf2f 69 segB=segH=1;
valekorenblit 0:73b3e1c6cf2f 70 segA=segC=segD=segE=segF=segG=0;
valekorenblit 0:73b3e1c6cf2f 71 break;
valekorenblit 0:73b3e1c6cf2f 72 case 7:
valekorenblit 0:73b3e1c6cf2f 73 segD=segE=segF=segG=segH=1;
valekorenblit 0:73b3e1c6cf2f 74 segA=segB=segC=0;
valekorenblit 0:73b3e1c6cf2f 75
valekorenblit 0:73b3e1c6cf2f 76 break;
valekorenblit 0:73b3e1c6cf2f 77 case 8:
valekorenblit 0:73b3e1c6cf2f 78 segH=1;
valekorenblit 0:73b3e1c6cf2f 79 segA=segB=segC=segD=segE=segF=segG=0;
valekorenblit 0:73b3e1c6cf2f 80 break;
valekorenblit 0:73b3e1c6cf2f 81 case 9:
valekorenblit 0:73b3e1c6cf2f 82
valekorenblit 0:73b3e1c6cf2f 83 segD=segE=segH=1;
valekorenblit 0:73b3e1c6cf2f 84 segA=segB=segC=segF=segG=0;
valekorenblit 0:73b3e1c6cf2f 85 break;
valekorenblit 0:73b3e1c6cf2f 86
valekorenblit 0:73b3e1c6cf2f 87 }
valekorenblit 0:73b3e1c6cf2f 88
valekorenblit 0:73b3e1c6cf2f 89 }
valekorenblit 0:73b3e1c6cf2f 90
valekorenblit 0:73b3e1c6cf2f 91 void updateDisplay(int d1,int d2, int d3, int d4)
valekorenblit 0:73b3e1c6cf2f 92 {
valekorenblit 0:73b3e1c6cf2f 93
valekorenblit 0:73b3e1c6cf2f 94
valekorenblit 0:73b3e1c6cf2f 95 dig2=dig3=dig4=1;
valekorenblit 0:73b3e1c6cf2f 96 dig1=0;
valekorenblit 0:73b3e1c6cf2f 97 writeDigit(d1);
valekorenblit 0:73b3e1c6cf2f 98 wait_ms(1.5);
valekorenblit 0:73b3e1c6cf2f 99
valekorenblit 0:73b3e1c6cf2f 100 dig1=dig3=dig4=1;
valekorenblit 0:73b3e1c6cf2f 101 dig2=segH=0;
valekorenblit 0:73b3e1c6cf2f 102 writeDigit(d2);
valekorenblit 0:73b3e1c6cf2f 103 wait_ms(1.5);
valekorenblit 0:73b3e1c6cf2f 104
valekorenblit 0:73b3e1c6cf2f 105 dig1=dig2=dig4=1;
valekorenblit 0:73b3e1c6cf2f 106 dig3=0;
valekorenblit 0:73b3e1c6cf2f 107 writeDigit(d3);
valekorenblit 0:73b3e1c6cf2f 108 wait_ms(1.5);
valekorenblit 0:73b3e1c6cf2f 109
valekorenblit 0:73b3e1c6cf2f 110 dig1=dig2=dig3=1;
valekorenblit 0:73b3e1c6cf2f 111 dig4=0;
valekorenblit 0:73b3e1c6cf2f 112 writeDigit(d4);
valekorenblit 0:73b3e1c6cf2f 113 wait_ms(1.5);
valekorenblit 0:73b3e1c6cf2f 114 }
valekorenblit 0:73b3e1c6cf2f 115
valekorenblit 0:73b3e1c6cf2f 116 void serialInterruptHandler()
valekorenblit 0:73b3e1c6cf2f 117 {
valekorenblit 0:73b3e1c6cf2f 118 string s;
valekorenblit 0:73b3e1c6cf2f 119 s=pc.getc();
valekorenblit 0:73b3e1c6cf2f 120 received= atoi(s.c_str());
valekorenblit 0:73b3e1c6cf2f 121 flagUART=1;
valekorenblit 0:73b3e1c6cf2f 122 }
valekorenblit 0:73b3e1c6cf2f 123
valekorenblit 0:73b3e1c6cf2f 124 void cronTimerInterruptHandler()
valekorenblit 0:73b3e1c6cf2f 125 {
valekorenblit 0:73b3e1c6cf2f 126 flagCronTimer=1;
valekorenblit 0:73b3e1c6cf2f 127 }
valekorenblit 0:73b3e1c6cf2f 128
valekorenblit 0:73b3e1c6cf2f 129 int main()
valekorenblit 0:73b3e1c6cf2f 130 {
valekorenblit 0:73b3e1c6cf2f 131 pc.attach(&serialInterruptHandler);
valekorenblit 0:73b3e1c6cf2f 132
valekorenblit 0:73b3e1c6cf2f 133 while(1) {
valekorenblit 0:73b3e1c6cf2f 134
valekorenblit 0:73b3e1c6cf2f 135 if (flagUART) {
valekorenblit 0:73b3e1c6cf2f 136
valekorenblit 0:73b3e1c6cf2f 137 if(received==1) { //start
valekorenblit 0:73b3e1c6cf2f 138 if(running==0) {
valekorenblit 0:73b3e1c6cf2f 139
valekorenblit 0:73b3e1c6cf2f 140 if((segCron!=59) && (centCron!=99)) {
valekorenblit 0:73b3e1c6cf2f 141 running=1;
valekorenblit 0:73b3e1c6cf2f 142 cronTimer.attach_us(&cronTimerInterruptHandler,10000);//each 10ms
valekorenblit 0:73b3e1c6cf2f 143 pc.printf("RUNNING\n");
valekorenblit 0:73b3e1c6cf2f 144 }
valekorenblit 0:73b3e1c6cf2f 145 }
valekorenblit 0:73b3e1c6cf2f 146 else
valekorenblit 0:73b3e1c6cf2f 147 pc.printf("ALREADY RUNNING\n");
valekorenblit 0:73b3e1c6cf2f 148 flagUART=0;
valekorenblit 0:73b3e1c6cf2f 149 }
valekorenblit 0:73b3e1c6cf2f 150
valekorenblit 0:73b3e1c6cf2f 151 if(received==2) { //pause
valekorenblit 0:73b3e1c6cf2f 152
valekorenblit 0:73b3e1c6cf2f 153 if (running==1) {
valekorenblit 0:73b3e1c6cf2f 154 cronTimer.detach();
valekorenblit 0:73b3e1c6cf2f 155 if(segCron!=59)
valekorenblit 0:73b3e1c6cf2f 156 running=0;
valekorenblit 0:73b3e1c6cf2f 157 pc.printf("PAUSED\n");
valekorenblit 0:73b3e1c6cf2f 158 }
valekorenblit 0:73b3e1c6cf2f 159 else
valekorenblit 0:73b3e1c6cf2f 160 pc.printf("NOT RUNNING\n");
valekorenblit 0:73b3e1c6cf2f 161 flagUART=0;
valekorenblit 0:73b3e1c6cf2f 162
valekorenblit 0:73b3e1c6cf2f 163 }
valekorenblit 0:73b3e1c6cf2f 164
valekorenblit 0:73b3e1c6cf2f 165 if(received==3) { //reset
valekorenblit 0:73b3e1c6cf2f 166 cronTimer.detach();
valekorenblit 0:73b3e1c6cf2f 167 segCron=0;
valekorenblit 0:73b3e1c6cf2f 168 centCron=0;
valekorenblit 0:73b3e1c6cf2f 169 segCronDec=0;
valekorenblit 0:73b3e1c6cf2f 170 segCronUni=0;
valekorenblit 0:73b3e1c6cf2f 171 centCronDec=0;
valekorenblit 0:73b3e1c6cf2f 172 centCronUni=0;
valekorenblit 0:73b3e1c6cf2f 173 running=0;
valekorenblit 0:73b3e1c6cf2f 174 pc.printf("RESET\n");
valekorenblit 0:73b3e1c6cf2f 175 flagUART=0;
valekorenblit 0:73b3e1c6cf2f 176
valekorenblit 0:73b3e1c6cf2f 177 }
valekorenblit 0:73b3e1c6cf2f 178
valekorenblit 0:73b3e1c6cf2f 179
valekorenblit 0:73b3e1c6cf2f 180
valekorenblit 0:73b3e1c6cf2f 181
valekorenblit 0:73b3e1c6cf2f 182 }
valekorenblit 0:73b3e1c6cf2f 183
valekorenblit 0:73b3e1c6cf2f 184
valekorenblit 0:73b3e1c6cf2f 185 if(flagCronTimer) {
valekorenblit 0:73b3e1c6cf2f 186
valekorenblit 0:73b3e1c6cf2f 187 if(running) {
valekorenblit 0:73b3e1c6cf2f 188
valekorenblit 0:73b3e1c6cf2f 189 centCron++;
valekorenblit 0:73b3e1c6cf2f 190
valekorenblit 0:73b3e1c6cf2f 191 if (centCron == 100) {
valekorenblit 0:73b3e1c6cf2f 192 segCron++;
valekorenblit 0:73b3e1c6cf2f 193 centCron=0;
valekorenblit 0:73b3e1c6cf2f 194 }
valekorenblit 0:73b3e1c6cf2f 195
valekorenblit 0:73b3e1c6cf2f 196 if ((segCron==59) & (centCron==99)) { //TURN OFF CHRONOMETER AT 59.99 SECS
valekorenblit 0:73b3e1c6cf2f 197 running=0;
valekorenblit 0:73b3e1c6cf2f 198 cronTimer.detach();
valekorenblit 0:73b3e1c6cf2f 199
valekorenblit 0:73b3e1c6cf2f 200
valekorenblit 0:73b3e1c6cf2f 201 }
valekorenblit 0:73b3e1c6cf2f 202 }
valekorenblit 0:73b3e1c6cf2f 203
valekorenblit 0:73b3e1c6cf2f 204 //SPLIT NUMBER INTO DIGITS
valekorenblit 0:73b3e1c6cf2f 205
valekorenblit 0:73b3e1c6cf2f 206 segCronDec=segCron/10;
valekorenblit 0:73b3e1c6cf2f 207 segCronUni=segCron%10;
valekorenblit 0:73b3e1c6cf2f 208 centCronDec=centCron/10;
valekorenblit 0:73b3e1c6cf2f 209 centCronUni=centCron %10;
valekorenblit 0:73b3e1c6cf2f 210
valekorenblit 0:73b3e1c6cf2f 211 //CLEAR FLAG
valekorenblit 0:73b3e1c6cf2f 212 flagCronTimer=0;
valekorenblit 0:73b3e1c6cf2f 213 }
valekorenblit 0:73b3e1c6cf2f 214
valekorenblit 0:73b3e1c6cf2f 215 updateDisplay(segCronDec,segCronUni,centCronDec,centCronUni);
valekorenblit 0:73b3e1c6cf2f 216 }
valekorenblit 0:73b3e1c6cf2f 217 }