![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Embedded software Assessment 2
Dependencies: MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed
Function.h@15:d33c51364fac, 2014-02-26 (annotated)
- Committer:
- muaiyd
- Date:
- Wed Feb 26 11:55:20 2014 +0000
- Revision:
- 15:d33c51364fac
- Parent:
- 14:17be0f2d153f
- Child:
- 16:0a2138a18f26
1st Try One tricker
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
muaiyd | 0:86bba6bf9b6f | 1 | #include "MCP23017.h" |
muaiyd | 0:86bba6bf9b6f | 2 | #include "WattBob_TextLCD.h" |
muaiyd | 0:86bba6bf9b6f | 3 | #include "mbed.h" |
muaiyd | 8:16a77a68e4b4 | 4 | #include "SDFileSystem.h" |
muaiyd | 0:86bba6bf9b6f | 5 | |
muaiyd | 15:d33c51364fac | 6 | #define uint8_t MCPAddr 0X40 |
muaiyd | 15:d33c51364fac | 7 | |
muaiyd | 15:d33c51364fac | 8 | MCP23017 Port(p9,p10,MCPAddr) ; // 16-bit parallel I/O object |
muaiyd | 7:d9f86e1b8185 | 9 | WattBob_TextLCD LCD(&Port); // Varaible to 2*16 chacater LCD object |
muaiyd | 7:d9f86e1b8185 | 10 | |
muaiyd | 7:d9f86e1b8185 | 11 | |
muaiyd | 7:d9f86e1b8185 | 12 | BusOut BinLed(LED4, LED3, LED2, LED1); |
muaiyd | 8:16a77a68e4b4 | 13 | DigitalIn FrequencyIn(p15); |
muaiyd | 8:16a77a68e4b4 | 14 | DigitalIn Switch1(p17); |
muaiyd | 8:16a77a68e4b4 | 15 | DigitalIn Switch2(p18); |
muaiyd | 7:d9f86e1b8185 | 16 | AnalogIn Analogue_in_1(p19); |
muaiyd | 7:d9f86e1b8185 | 17 | AnalogIn Analogue_in_2(p20); |
muaiyd | 7:d9f86e1b8185 | 18 | |
muaiyd | 8:16a77a68e4b4 | 19 | SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board |
muaiyd | 0:86bba6bf9b6f | 20 | |
muaiyd | 7:d9f86e1b8185 | 21 | uint8_t Analug1_valu[5]={0,0,0,0,0}; |
muaiyd | 7:d9f86e1b8185 | 22 | uint8_t Analug2_valu[5]={0,0,0,0,0}; |
muaiyd | 7:d9f86e1b8185 | 23 | uint8_t Bin=0x00; |
muaiyd | 7:d9f86e1b8185 | 24 | bool Swch1; |
muaiyd | 7:d9f86e1b8185 | 25 | bool Swch2; |
muaiyd | 7:d9f86e1b8185 | 26 | bool Ena_job6=0; |
muaiyd | 14:17be0f2d153f | 27 | bool FreqTimeOutHpn; |
muaiyd | 7:d9f86e1b8185 | 28 | uint8_t Error_Code; |
muaiyd | 7:d9f86e1b8185 | 29 | uint16_t Freq; |
muaiyd | 9:539c51b7db52 | 30 | char Temp[4]; |
muaiyd | 12:582753a4f1fb | 31 | FILE *fp; |
muaiyd | 12:582753a4f1fb | 32 | |
muaiyd | 7:d9f86e1b8185 | 33 | Timer FreqMsurT; |
muaiyd | 7:d9f86e1b8185 | 34 | Timer FreqTimeOut; |
muaiyd | 9:539c51b7db52 | 35 | Timer LogTimer; |
muaiyd | 7:d9f86e1b8185 | 36 | |
muaiyd | 7:d9f86e1b8185 | 37 | Ticker CallFreqMsur; |
muaiyd | 7:d9f86e1b8185 | 38 | Ticker CallReadDigitalin; |
muaiyd | 7:d9f86e1b8185 | 39 | Ticker CallReadAnalogin; |
muaiyd | 7:d9f86e1b8185 | 40 | Ticker CallDisplay; |
muaiyd | 7:d9f86e1b8185 | 41 | Ticker CallInputCheck; |
muaiyd | 7:d9f86e1b8185 | 42 | Ticker CallBinaryCounter; |
muaiyd | 7:d9f86e1b8185 | 43 | Ticker CallLogFile; |
muaiyd | 7:d9f86e1b8185 | 44 | |
muaiyd | 12:582753a4f1fb | 45 | |
muaiyd | 12:582753a4f1fb | 46 | void Init_LCD(); |
muaiyd | 12:582753a4f1fb | 47 | void FreqMsur(); |
muaiyd | 12:582753a4f1fb | 48 | void ReadDigitalin(); |
muaiyd | 12:582753a4f1fb | 49 | void ReadAnalogin(); |
muaiyd | 12:582753a4f1fb | 50 | void Display(); |
muaiyd | 12:582753a4f1fb | 51 | void InputCheck(); |
muaiyd | 12:582753a4f1fb | 52 | void BinaryCounter(); |
muaiyd | 12:582753a4f1fb | 53 | void InitFile(); |
muaiyd | 12:582753a4f1fb | 54 | void LogFile(); |
muaiyd | 12:582753a4f1fb | 55 | |
muaiyd | 12:582753a4f1fb | 56 | /******************************************************************************** |
muaiyd | 12:582753a4f1fb | 57 | Functions |
muaiyd | 12:582753a4f1fb | 58 | ###############################################################################*/ |
muaiyd | 0:86bba6bf9b6f | 59 | void Write_LCD(const char STR[],int8_t PY,int8_t PX,bool clr){ |
muaiyd | 0:86bba6bf9b6f | 60 | if(clr) |
muaiyd | 0:86bba6bf9b6f | 61 | LCD.cls(); |
muaiyd | 0:86bba6bf9b6f | 62 | LCD.locate(PY,PX); |
muaiyd | 0:86bba6bf9b6f | 63 | LCD.printf(STR); |
muaiyd | 0:86bba6bf9b6f | 64 | } |
muaiyd | 13:6094b94b3b7c | 65 | /***************************************************************************/ |
muaiyd | 0:86bba6bf9b6f | 66 | void Init_LCD(){ |
muaiyd | 0:86bba6bf9b6f | 67 | Port.write_bit(1,BL_BIT); |
muaiyd | 0:86bba6bf9b6f | 68 | Write_LCD("Muaiyd",0,4,1); |
muaiyd | 0:86bba6bf9b6f | 69 | Write_LCD("Heriot-Watt Uni.",1,0,0); |
muaiyd | 13:6094b94b3b7c | 70 | wait(1.5); |
muaiyd | 13:6094b94b3b7c | 71 | Write_LCD("F=",0,0,1); |
muaiyd | 13:6094b94b3b7c | 72 | Write_LCD("A1=",1,0,0); |
muaiyd | 13:6094b94b3b7c | 73 | Write_LCD("A2=",1,7,0); |
muaiyd | 13:6094b94b3b7c | 74 | Write_LCD("S1=",0,7,0); |
muaiyd | 13:6094b94b3b7c | 75 | Write_LCD("S2=",0,12,0); |
muaiyd | 13:6094b94b3b7c | 76 | Write_LCD("E",1,14,0); |
muaiyd | 13:6094b94b3b7c | 77 | LogTimer.start(); |
muaiyd | 4:4bb228d1f6c2 | 78 | } |
muaiyd | 4:4bb228d1f6c2 | 79 | |
muaiyd | 13:6094b94b3b7c | 80 | /*************************************************************************************** |
muaiyd | 7:d9f86e1b8185 | 81 | Measure the frequency of a 3.3v square wave signal once every second. The frequency range |
muaiyd | 7:d9f86e1b8185 | 82 | is 500Hz to 1000Hz with 50% duty cycle). |
muaiyd | 13:6094b94b3b7c | 83 | *****************************************************************************************/ |
muaiyd | 7:d9f86e1b8185 | 84 | |
muaiyd | 7:d9f86e1b8185 | 85 | void FreqMsur(){ |
muaiyd | 7:d9f86e1b8185 | 86 | FreqTimeOut.start(); |
muaiyd | 14:17be0f2d153f | 87 | if(!FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 88 | while(!FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 89 | if (FreqTimeOut.read_ms() > 3) |
muaiyd | 14:17be0f2d153f | 90 | break; |
muaiyd | 14:17be0f2d153f | 91 | } |
muaiyd | 7:d9f86e1b8185 | 92 | } |
muaiyd | 14:17be0f2d153f | 93 | else{ |
muaiyd | 14:17be0f2d153f | 94 | while(FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 95 | if (FreqTimeOut.read_ms() > 3) |
muaiyd | 14:17be0f2d153f | 96 | break; |
muaiyd | 14:17be0f2d153f | 97 | } |
muaiyd | 14:17be0f2d153f | 98 | } |
muaiyd | 14:17be0f2d153f | 99 | FreqMsurT.start(); |
muaiyd | 14:17be0f2d153f | 100 | if (FreqTimeOut.read_ms() > 3){ |
muaiyd | 14:17be0f2d153f | 101 | FreqTimeOutHpn=1; |
muaiyd | 7:d9f86e1b8185 | 102 | } |
muaiyd | 14:17be0f2d153f | 103 | else{ |
muaiyd | 14:17be0f2d153f | 104 | FreqTimeOutHpn=0; |
muaiyd | 14:17be0f2d153f | 105 | } |
muaiyd | 14:17be0f2d153f | 106 | FreqTimeOut.stop(); |
muaiyd | 14:17be0f2d153f | 107 | FreqTimeOut.reset(); |
muaiyd | 14:17be0f2d153f | 108 | if(!FreqTimeOutHpn){ |
muaiyd | 14:17be0f2d153f | 109 | if(!FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 110 | while(!FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 111 | } |
muaiyd | 14:17be0f2d153f | 112 | while(FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 113 | } |
muaiyd | 7:d9f86e1b8185 | 114 | } |
muaiyd | 14:17be0f2d153f | 115 | else{ |
muaiyd | 14:17be0f2d153f | 116 | while(FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 117 | } |
muaiyd | 14:17be0f2d153f | 118 | while(!FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 119 | } |
muaiyd | 7:d9f86e1b8185 | 120 | } |
muaiyd | 7:d9f86e1b8185 | 121 | FreqMsurT.stop(); |
muaiyd | 7:d9f86e1b8185 | 122 | float Period=FreqMsurT.read_us(); |
muaiyd | 14:17be0f2d153f | 123 | Freq=1/Period*1000000.0+0.5; //Adding 0.5 to round the frequency to nearst int |
muaiyd | 7:d9f86e1b8185 | 124 | } |
muaiyd | 7:d9f86e1b8185 | 125 | else{ |
muaiyd | 7:d9f86e1b8185 | 126 | Freq=0xffff; |
muaiyd | 7:d9f86e1b8185 | 127 | } |
muaiyd | 14:17be0f2d153f | 128 | FreqTimeOut.stop(); |
muaiyd | 7:d9f86e1b8185 | 129 | FreqMsurT.reset(); |
muaiyd | 4:4bb228d1f6c2 | 130 | } |
muaiyd | 4:4bb228d1f6c2 | 131 | |
muaiyd | 7:d9f86e1b8185 | 132 | //Read TWO digital inputs every 400mS (switch_1 and switch_2) |
muaiyd | 7:d9f86e1b8185 | 133 | void ReadDigitalin(){ |
muaiyd | 7:d9f86e1b8185 | 134 | Swch1=Switch1; |
muaiyd | 7:d9f86e1b8185 | 135 | Swch2=Switch2; |
muaiyd | 4:4bb228d1f6c2 | 136 | } |
muaiyd | 13:6094b94b3b7c | 137 | /******************************************************************* |
muaiyd | 7:d9f86e1b8185 | 138 | Read TWO analogue inputs every 800mS (Analogue_in_1 at pin 19 |
muaiyd | 7:d9f86e1b8185 | 139 | and Analogue_in_2 at pin 20). Also, averaging the last 4 readings |
muaiyd | 13:6094b94b3b7c | 140 | ********************************************************************/ |
muaiyd | 7:d9f86e1b8185 | 141 | void ReadAnalogin(){ |
muaiyd | 7:d9f86e1b8185 | 142 | Analug1_valu[4]=0; |
muaiyd | 7:d9f86e1b8185 | 143 | Analug2_valu[4]=0; |
muaiyd | 7:d9f86e1b8185 | 144 | for(int i=0;i<3;i++){ |
muaiyd | 7:d9f86e1b8185 | 145 | Analug1_valu[i]=Analug1_valu[i+1]; |
muaiyd | 7:d9f86e1b8185 | 146 | Analug1_valu[4]=Analug1_valu[4]+Analug1_valu[i]/4; |
muaiyd | 7:d9f86e1b8185 | 147 | Analug2_valu[i]=Analug2_valu[i+1]; |
muaiyd | 7:d9f86e1b8185 | 148 | Analug2_valu[4]=Analug2_valu[4]+Analug2_valu[i]/4; |
muaiyd | 7:d9f86e1b8185 | 149 | } |
muaiyd | 7:d9f86e1b8185 | 150 | Analug1_valu[3]=Analogue_in_1.read()*255; |
muaiyd | 7:d9f86e1b8185 | 151 | Analug2_valu[3]=Analogue_in_2.read()*255; |
muaiyd | 7:d9f86e1b8185 | 152 | Analug1_valu[4]=Analug1_valu[4]+Analug1_valu[3]/4; |
muaiyd | 7:d9f86e1b8185 | 153 | Analug2_valu[4]=Analug2_valu[4]+Analug2_valu[3]/4; |
muaiyd | 7:d9f86e1b8185 | 154 | } |
muaiyd | 13:6094b94b3b7c | 155 | /************************************************************* |
muaiyd | 7:d9f86e1b8185 | 156 | Display the following on the LCD display every 2 seconds |
muaiyd | 7:d9f86e1b8185 | 157 | a. Frequency value (show as integer) |
muaiyd | 7:d9f86e1b8185 | 158 | b. analogue values (show as integers) |
muaiyd | 7:d9f86e1b8185 | 159 | c. digital values |
muaiyd | 7:d9f86e1b8185 | 160 | d. Possible error code |
muaiyd | 13:6094b94b3b7c | 161 | **************************************************************/ |
muaiyd | 13:6094b94b3b7c | 162 | void Display(){ |
muaiyd | 13:6094b94b3b7c | 163 | Write_LCD(" ",0,2,0); |
muaiyd | 14:17be0f2d153f | 164 | if( Freq<1010 && Freq>490){ |
muaiyd | 7:d9f86e1b8185 | 165 | sprintf(Temp, "%d", Freq); |
muaiyd | 13:6094b94b3b7c | 166 | Write_LCD(Temp,0,2,0); |
muaiyd | 7:d9f86e1b8185 | 167 | } |
muaiyd | 7:d9f86e1b8185 | 168 | else{ |
muaiyd | 13:6094b94b3b7c | 169 | Write_LCD("Err",0,2,0); |
muaiyd | 7:d9f86e1b8185 | 170 | } |
muaiyd | 7:d9f86e1b8185 | 171 | sprintf(Temp, "%d", Analug1_valu[4]); |
muaiyd | 13:6094b94b3b7c | 172 | Write_LCD(" ",1,3,0); |
muaiyd | 13:6094b94b3b7c | 173 | Write_LCD(Temp,1,3,0); |
muaiyd | 7:d9f86e1b8185 | 174 | sprintf(Temp, "%d", Analug2_valu[4]); |
muaiyd | 13:6094b94b3b7c | 175 | Write_LCD(" ",1,10,0); |
muaiyd | 13:6094b94b3b7c | 176 | Write_LCD(Temp,1,10,0); |
muaiyd | 7:d9f86e1b8185 | 177 | sprintf(Temp, "%d", Swch1); |
muaiyd | 13:6094b94b3b7c | 178 | Write_LCD(Temp,0,10,0); |
muaiyd | 7:d9f86e1b8185 | 179 | sprintf(Temp, "%d", Swch2); |
muaiyd | 13:6094b94b3b7c | 180 | Write_LCD(Temp,0,15,0); |
muaiyd | 7:d9f86e1b8185 | 181 | sprintf(Temp, "%d", Error_Code); |
muaiyd | 13:6094b94b3b7c | 182 | Write_LCD(Temp,1,15,0); |
muaiyd | 4:4bb228d1f6c2 | 183 | } |
muaiyd | 13:6094b94b3b7c | 184 | //############################################################ |
muaiyd | 7:d9f86e1b8185 | 185 | void InputCheck(){ |
muaiyd | 7:d9f86e1b8185 | 186 | if(Swch1&&(Analug1_valu[4]>Analug2_valu[4])){ |
muaiyd | 7:d9f86e1b8185 | 187 | Error_Code=3; |
muaiyd | 7:d9f86e1b8185 | 188 | } |
muaiyd | 7:d9f86e1b8185 | 189 | else{ |
muaiyd | 7:d9f86e1b8185 | 190 | Error_Code=0; |
muaiyd | 7:d9f86e1b8185 | 191 | } |
muaiyd | 7:d9f86e1b8185 | 192 | if(Swch2){ |
muaiyd | 7:d9f86e1b8185 | 193 | Ena_job6=1; |
muaiyd | 7:d9f86e1b8185 | 194 | } |
muaiyd | 7:d9f86e1b8185 | 195 | else{ |
muaiyd | 7:d9f86e1b8185 | 196 | Ena_job6=0; |
muaiyd | 7:d9f86e1b8185 | 197 | } |
muaiyd | 4:4bb228d1f6c2 | 198 | } |
muaiyd | 4:4bb228d1f6c2 | 199 | |
muaiyd | 7:d9f86e1b8185 | 200 | void BinaryCounter(){ |
muaiyd | 7:d9f86e1b8185 | 201 | if(Ena_job6){ |
muaiyd | 7:d9f86e1b8185 | 202 | BinLed=Bin; |
muaiyd | 7:d9f86e1b8185 | 203 | Bin++; |
muaiyd | 7:d9f86e1b8185 | 204 | } |
muaiyd | 7:d9f86e1b8185 | 205 | else{ |
muaiyd | 7:d9f86e1b8185 | 206 | BinLed=0x00; |
muaiyd | 7:d9f86e1b8185 | 207 | Bin=0x00; |
muaiyd | 7:d9f86e1b8185 | 208 | } |
muaiyd | 4:4bb228d1f6c2 | 209 | } |
muaiyd | 13:6094b94b3b7c | 210 | /*************************************************************** |
muaiyd | 13:6094b94b3b7c | 211 | |
muaiyd | 13:6094b94b3b7c | 212 | *****************************************************************/ |
muaiyd | 12:582753a4f1fb | 213 | void InitFile(){ |
muaiyd | 13:6094b94b3b7c | 214 | fp = fopen( "/sd/LogDir/LogHistory.txt" , "a"); |
muaiyd | 8:16a77a68e4b4 | 215 | if(fp == NULL) { |
muaiyd | 8:16a77a68e4b4 | 216 | error("Could not open file for write\n"); |
muaiyd | 12:582753a4f1fb | 217 | } |
muaiyd | 13:6094b94b3b7c | 218 | fprintf(fp,"%s","**************************************************************\r\n"); |
muaiyd | 13:6094b94b3b7c | 219 | fprintf(fp,"%s","Time Freq Sw1 Sw2 An1 An2 ;\r\n"); |
muaiyd | 13:6094b94b3b7c | 220 | fprintf(fp,"%s","**************************************************************\r\n"); |
muaiyd | 12:582753a4f1fb | 221 | fclose(fp); |
muaiyd | 12:582753a4f1fb | 222 | } |
muaiyd | 13:6094b94b3b7c | 223 | /************************************************************** |
muaiyd | 13:6094b94b3b7c | 224 | |
muaiyd | 13:6094b94b3b7c | 225 | ***************************************************************/ |
muaiyd | 12:582753a4f1fb | 226 | void LogFile(){ |
muaiyd | 12:582753a4f1fb | 227 | char* Frq; |
muaiyd | 14:17be0f2d153f | 228 | fp = fopen("/sd/LogDir/LogHistory.txt", "a"); |
muaiyd | 11:0b2801513f93 | 229 | if( Freq<1200 && Freq>400){ |
muaiyd | 11:0b2801513f93 | 230 | sprintf(Temp, "%d", Freq); |
muaiyd | 11:0b2801513f93 | 231 | Frq = Temp; |
muaiyd | 11:0b2801513f93 | 232 | } |
muaiyd | 9:539c51b7db52 | 233 | else |
muaiyd | 11:0b2801513f93 | 234 | Frq="Err"; |
muaiyd | 11:0b2801513f93 | 235 | |
muaiyd | 11:0b2801513f93 | 236 | fprintf(fp,"%d ,",(LogTimer.read_ms()/1000)); |
muaiyd | 13:6094b94b3b7c | 237 | fprintf(fp," %s ,",Frq); |
muaiyd | 13:6094b94b3b7c | 238 | fprintf(fp," %i ,",Swch1); |
muaiyd | 13:6094b94b3b7c | 239 | fprintf(fp," %i ,",Swch2); |
muaiyd | 13:6094b94b3b7c | 240 | fprintf(fp," %d%3 ,",Analug1_valu[4]); |
muaiyd | 13:6094b94b3b7c | 241 | fprintf(fp," %d%3 ",Analug2_valu[4]); |
muaiyd | 11:0b2801513f93 | 242 | fprintf(fp," %s","\r\n"); |
muaiyd | 8:16a77a68e4b4 | 243 | fclose(fp); |
muaiyd | 8:16a77a68e4b4 | 244 | printf("Goodbye World!\n"); |
muaiyd | 0:86bba6bf9b6f | 245 | } |