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
main.cpp@0:73b3e1c6cf2f, 2014-08-06 (annotated)
- Committer:
- valekorenblit
- Date:
- Wed Aug 06 03:04:02 2014 +0000
- Revision:
- 0:73b3e1c6cf2f
Chronometer Finished
Who changed what in which revision?
User | Revision | Line number | New 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 | } |