![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Embedded software Assessment 2
Dependencies: MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed
Function.h@18:f485d46a7acb, 2014-03-04 (annotated)
- Committer:
- muaiyd
- Date:
- Tue Mar 04 17:03:38 2014 +0000
- Revision:
- 18:f485d46a7acb
- Parent:
- 17:dba09fb3f508
- Child:
- 20:00a9a95ef083
do it in anothor way
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 | 17:dba09fb3f508 | 6 | MCP23017 Port(p9,p10,0x40) ; // 16-bit object with I2C Chip MCP23017 |
muaiyd | 17:dba09fb3f508 | 7 | WattBob_TextLCD LCD(&Port); // A 2*16 chacater LCD object |
muaiyd | 7:d9f86e1b8185 | 8 | |
muaiyd | 7:d9f86e1b8185 | 9 | |
muaiyd | 7:d9f86e1b8185 | 10 | BusOut BinLed(LED4, LED3, LED2, LED1); |
muaiyd | 16:0a2138a18f26 | 11 | |
muaiyd | 8:16a77a68e4b4 | 12 | DigitalIn FrequencyIn(p15); |
muaiyd | 8:16a77a68e4b4 | 13 | DigitalIn Switch1(p17); |
muaiyd | 8:16a77a68e4b4 | 14 | DigitalIn Switch2(p18); |
muaiyd | 17:dba09fb3f508 | 15 | /* |
muaiyd | 17:dba09fb3f508 | 16 | These pins are used to show the time between every execution. |
muaiyd | 17:dba09fb3f508 | 17 | Because of the execution time is very small I used the pins to flip |
muaiyd | 17:dba09fb3f508 | 18 | high and low with every time the functions are called. Consequently, |
muaiyd | 17:dba09fb3f508 | 19 | the period of high or of low represent the complete time. |
muaiyd | 16:0a2138a18f26 | 20 | |
muaiyd | 17:dba09fb3f508 | 21 | */ |
muaiyd | 18:f485d46a7acb | 22 | DigitalOut TickerPin(p30); |
muaiyd | 18:f485d46a7acb | 23 | |
muaiyd | 16:0a2138a18f26 | 24 | DigitalOut ReadDigitalinPin(p21); |
muaiyd | 16:0a2138a18f26 | 25 | DigitalOut ReadAnaloginPin(p22); |
muaiyd | 16:0a2138a18f26 | 26 | DigitalOut FreqMsurPin(p23); |
muaiyd | 16:0a2138a18f26 | 27 | DigitalOut BinaryCounterPin(p24); |
muaiyd | 16:0a2138a18f26 | 28 | DigitalOut InputCheckPin(p25); |
muaiyd | 16:0a2138a18f26 | 29 | DigitalOut DisplayPin(p26); |
muaiyd | 16:0a2138a18f26 | 30 | DigitalOut LogFilePin(p27); |
muaiyd | 18:f485d46a7acb | 31 | |
muaiyd | 16:0a2138a18f26 | 32 | |
muaiyd | 7:d9f86e1b8185 | 33 | AnalogIn Analogue_in_1(p19); |
muaiyd | 7:d9f86e1b8185 | 34 | AnalogIn Analogue_in_2(p20); |
muaiyd | 7:d9f86e1b8185 | 35 | |
muaiyd | 8:16a77a68e4b4 | 36 | SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board |
muaiyd | 0:86bba6bf9b6f | 37 | |
muaiyd | 7:d9f86e1b8185 | 38 | uint8_t Analug1_valu[5]={0,0,0,0,0}; |
muaiyd | 7:d9f86e1b8185 | 39 | uint8_t Analug2_valu[5]={0,0,0,0,0}; |
muaiyd | 7:d9f86e1b8185 | 40 | uint8_t Bin=0x00; |
muaiyd | 7:d9f86e1b8185 | 41 | bool Swch1; |
muaiyd | 7:d9f86e1b8185 | 42 | bool Swch2; |
muaiyd | 16:0a2138a18f26 | 43 | bool Ena_BinCounter=0; |
muaiyd | 14:17be0f2d153f | 44 | bool FreqTimeOutHpn; |
muaiyd | 7:d9f86e1b8185 | 45 | uint8_t Error_Code; |
muaiyd | 7:d9f86e1b8185 | 46 | uint16_t Freq; |
muaiyd | 9:539c51b7db52 | 47 | char Temp[4]; |
muaiyd | 12:582753a4f1fb | 48 | FILE *fp; |
muaiyd | 12:582753a4f1fb | 49 | |
muaiyd | 7:d9f86e1b8185 | 50 | Timer FreqMsurT; |
muaiyd | 7:d9f86e1b8185 | 51 | Timer FreqTimeOut; |
muaiyd | 9:539c51b7db52 | 52 | Timer LogTimer; |
muaiyd | 7:d9f86e1b8185 | 53 | |
muaiyd | 16:0a2138a18f26 | 54 | Ticker Cycle; |
muaiyd | 12:582753a4f1fb | 55 | |
muaiyd | 12:582753a4f1fb | 56 | void Init_LCD(); |
muaiyd | 12:582753a4f1fb | 57 | void FreqMsur(); |
muaiyd | 12:582753a4f1fb | 58 | void ReadDigitalin(); |
muaiyd | 12:582753a4f1fb | 59 | void ReadAnalogin(); |
muaiyd | 12:582753a4f1fb | 60 | void Display(); |
muaiyd | 12:582753a4f1fb | 61 | void InputCheck(); |
muaiyd | 12:582753a4f1fb | 62 | void BinaryCounter(); |
muaiyd | 12:582753a4f1fb | 63 | void InitFile(); |
muaiyd | 12:582753a4f1fb | 64 | void LogFile(); |
muaiyd | 12:582753a4f1fb | 65 | |
muaiyd | 12:582753a4f1fb | 66 | /******************************************************************************** |
muaiyd | 12:582753a4f1fb | 67 | Functions |
muaiyd | 16:0a2138a18f26 | 68 | ############################################################################### |
muaiyd | 16:0a2138a18f26 | 69 | Small function to writ on the LCD with one instruction |
muaiyd | 16:0a2138a18f26 | 70 | ********************************************************************************/ |
muaiyd | 0:86bba6bf9b6f | 71 | void Write_LCD(const char STR[],int8_t PY,int8_t PX,bool clr){ |
muaiyd | 0:86bba6bf9b6f | 72 | if(clr) |
muaiyd | 0:86bba6bf9b6f | 73 | LCD.cls(); |
muaiyd | 0:86bba6bf9b6f | 74 | LCD.locate(PY,PX); |
muaiyd | 0:86bba6bf9b6f | 75 | LCD.printf(STR); |
muaiyd | 0:86bba6bf9b6f | 76 | } |
muaiyd | 16:0a2138a18f26 | 77 | /************************************************************************** |
muaiyd | 16:0a2138a18f26 | 78 | Intialise the LCD to be ready to writ on |
muaiyd | 16:0a2138a18f26 | 79 | ***************************************************************************/ |
muaiyd | 0:86bba6bf9b6f | 80 | void Init_LCD(){ |
muaiyd | 17:dba09fb3f508 | 81 | Port.write_bit(1,BL_BIT); |
muaiyd | 13:6094b94b3b7c | 82 | Write_LCD("F=",0,0,1); |
muaiyd | 13:6094b94b3b7c | 83 | Write_LCD("A1=",1,0,0); |
muaiyd | 13:6094b94b3b7c | 84 | Write_LCD("A2=",1,7,0); |
muaiyd | 13:6094b94b3b7c | 85 | Write_LCD("S1=",0,7,0); |
muaiyd | 13:6094b94b3b7c | 86 | Write_LCD("S2=",0,12,0); |
muaiyd | 13:6094b94b3b7c | 87 | Write_LCD("E",1,14,0); |
muaiyd | 16:0a2138a18f26 | 88 | } |
muaiyd | 16:0a2138a18f26 | 89 | /********************************************************************** |
muaiyd | 16:0a2138a18f26 | 90 | Read TWO digital inputs every 400mS (switch_1 and switch_2) |
muaiyd | 16:0a2138a18f26 | 91 | ***********************************************************************/ |
muaiyd | 16:0a2138a18f26 | 92 | void ReadDigitalin(){ |
muaiyd | 16:0a2138a18f26 | 93 | ReadDigitalinPin = !(ReadDigitalinPin); |
muaiyd | 16:0a2138a18f26 | 94 | Swch1=Switch1; |
muaiyd | 16:0a2138a18f26 | 95 | Swch2=Switch2; |
muaiyd | 4:4bb228d1f6c2 | 96 | } |
muaiyd | 16:0a2138a18f26 | 97 | /******************************************************************* |
muaiyd | 16:0a2138a18f26 | 98 | Read TWO analogue inputs every 800mS (Analogue_in_1 at pin 19 |
muaiyd | 16:0a2138a18f26 | 99 | and Analogue_in_2 at pin 20). Also, averaging the last 4 readings |
muaiyd | 16:0a2138a18f26 | 100 | ********************************************************************/ |
muaiyd | 16:0a2138a18f26 | 101 | void ReadAnalogin(){ |
muaiyd | 16:0a2138a18f26 | 102 | ReadAnaloginPin = ! (ReadAnaloginPin); |
muaiyd | 16:0a2138a18f26 | 103 | Analug1_valu[4]=0; |
muaiyd | 16:0a2138a18f26 | 104 | Analug2_valu[4]=0; |
muaiyd | 16:0a2138a18f26 | 105 | for(int i=0;i<3;i++){ |
muaiyd | 16:0a2138a18f26 | 106 | Analug1_valu[i]=Analug1_valu[i+1]; |
muaiyd | 16:0a2138a18f26 | 107 | Analug1_valu[4]=Analug1_valu[4]+Analug1_valu[i]/4; |
muaiyd | 16:0a2138a18f26 | 108 | Analug2_valu[i]=Analug2_valu[i+1]; |
muaiyd | 16:0a2138a18f26 | 109 | Analug2_valu[4]=Analug2_valu[4]+Analug2_valu[i]/4; |
muaiyd | 16:0a2138a18f26 | 110 | } |
muaiyd | 16:0a2138a18f26 | 111 | Analug1_valu[3]=Analogue_in_1.read()*255; |
muaiyd | 16:0a2138a18f26 | 112 | Analug2_valu[3]=Analogue_in_2.read()*255; |
muaiyd | 16:0a2138a18f26 | 113 | Analug1_valu[4]=Analug1_valu[4]+Analug1_valu[3]/4; |
muaiyd | 16:0a2138a18f26 | 114 | Analug2_valu[4]=Analug2_valu[4]+Analug2_valu[3]/4; |
muaiyd | 16:0a2138a18f26 | 115 | } |
muaiyd | 13:6094b94b3b7c | 116 | /*************************************************************************************** |
muaiyd | 7:d9f86e1b8185 | 117 | Measure the frequency of a 3.3v square wave signal once every second. The frequency range |
muaiyd | 16:0a2138a18f26 | 118 | is 500Hz to 1000Hz with 50% duty cycle). In this code the on complet cycle is peiod is |
muaiyd | 16:0a2138a18f26 | 119 | masured after detcting the edge also a timeout timer is seting to detect open loop. |
muaiyd | 13:6094b94b3b7c | 120 | *****************************************************************************************/ |
muaiyd | 7:d9f86e1b8185 | 121 | |
muaiyd | 7:d9f86e1b8185 | 122 | void FreqMsur(){ |
muaiyd | 16:0a2138a18f26 | 123 | FreqMsurPin = ! (FreqMsurPin); |
muaiyd | 7:d9f86e1b8185 | 124 | FreqTimeOut.start(); |
muaiyd | 16:0a2138a18f26 | 125 | // Ignore first part of the signal to detect the edge |
muaiyd | 14:17be0f2d153f | 126 | if(!FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 127 | while(!FrequencyIn){ |
muaiyd | 16:0a2138a18f26 | 128 | if (FreqTimeOut.read_ms() > 4) |
muaiyd | 14:17be0f2d153f | 129 | break; |
muaiyd | 14:17be0f2d153f | 130 | } |
muaiyd | 7:d9f86e1b8185 | 131 | } |
muaiyd | 14:17be0f2d153f | 132 | else{ |
muaiyd | 14:17be0f2d153f | 133 | while(FrequencyIn){ |
muaiyd | 16:0a2138a18f26 | 134 | if (FreqTimeOut.read_ms() > 4) |
muaiyd | 14:17be0f2d153f | 135 | break; |
muaiyd | 14:17be0f2d153f | 136 | } |
muaiyd | 16:0a2138a18f26 | 137 | } |
muaiyd | 16:0a2138a18f26 | 138 | //This is the begining of the edge start the timer to masure |
muaiyd | 14:17be0f2d153f | 139 | FreqMsurT.start(); |
muaiyd | 16:0a2138a18f26 | 140 | if (FreqTimeOut.read_ms() > 4){ |
muaiyd | 14:17be0f2d153f | 141 | FreqTimeOutHpn=1; |
muaiyd | 7:d9f86e1b8185 | 142 | } |
muaiyd | 14:17be0f2d153f | 143 | else{ |
muaiyd | 14:17be0f2d153f | 144 | FreqTimeOutHpn=0; |
muaiyd | 14:17be0f2d153f | 145 | } |
muaiyd | 14:17be0f2d153f | 146 | FreqTimeOut.stop(); |
muaiyd | 14:17be0f2d153f | 147 | FreqTimeOut.reset(); |
muaiyd | 14:17be0f2d153f | 148 | if(!FreqTimeOutHpn){ |
muaiyd | 14:17be0f2d153f | 149 | if(!FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 150 | while(!FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 151 | } |
muaiyd | 14:17be0f2d153f | 152 | while(FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 153 | } |
muaiyd | 7:d9f86e1b8185 | 154 | } |
muaiyd | 14:17be0f2d153f | 155 | else{ |
muaiyd | 14:17be0f2d153f | 156 | while(FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 157 | } |
muaiyd | 14:17be0f2d153f | 158 | while(!FrequencyIn){ |
muaiyd | 14:17be0f2d153f | 159 | } |
muaiyd | 7:d9f86e1b8185 | 160 | } |
muaiyd | 7:d9f86e1b8185 | 161 | FreqMsurT.stop(); |
muaiyd | 7:d9f86e1b8185 | 162 | float Period=FreqMsurT.read_us(); |
muaiyd | 14:17be0f2d153f | 163 | Freq=1/Period*1000000.0+0.5; //Adding 0.5 to round the frequency to nearst int |
muaiyd | 7:d9f86e1b8185 | 164 | } |
muaiyd | 7:d9f86e1b8185 | 165 | else{ |
muaiyd | 7:d9f86e1b8185 | 166 | Freq=0xffff; |
muaiyd | 7:d9f86e1b8185 | 167 | } |
muaiyd | 14:17be0f2d153f | 168 | FreqTimeOut.stop(); |
muaiyd | 7:d9f86e1b8185 | 169 | FreqMsurT.reset(); |
muaiyd | 4:4bb228d1f6c2 | 170 | } |
muaiyd | 4:4bb228d1f6c2 | 171 | |
muaiyd | 13:6094b94b3b7c | 172 | /************************************************************* |
muaiyd | 7:d9f86e1b8185 | 173 | Display the following on the LCD display every 2 seconds |
muaiyd | 7:d9f86e1b8185 | 174 | a. Frequency value (show as integer) |
muaiyd | 7:d9f86e1b8185 | 175 | b. analogue values (show as integers) |
muaiyd | 7:d9f86e1b8185 | 176 | c. digital values |
muaiyd | 7:d9f86e1b8185 | 177 | d. Possible error code |
muaiyd | 13:6094b94b3b7c | 178 | **************************************************************/ |
muaiyd | 13:6094b94b3b7c | 179 | void Display(){ |
muaiyd | 16:0a2138a18f26 | 180 | DisplayPin = ! (DisplayPin); |
muaiyd | 13:6094b94b3b7c | 181 | Write_LCD(" ",0,2,0); |
muaiyd | 14:17be0f2d153f | 182 | if( Freq<1010 && Freq>490){ |
muaiyd | 7:d9f86e1b8185 | 183 | sprintf(Temp, "%d", Freq); |
muaiyd | 13:6094b94b3b7c | 184 | Write_LCD(Temp,0,2,0); |
muaiyd | 7:d9f86e1b8185 | 185 | } |
muaiyd | 7:d9f86e1b8185 | 186 | else{ |
muaiyd | 13:6094b94b3b7c | 187 | Write_LCD("Err",0,2,0); |
muaiyd | 7:d9f86e1b8185 | 188 | } |
muaiyd | 7:d9f86e1b8185 | 189 | sprintf(Temp, "%d", Analug1_valu[4]); |
muaiyd | 13:6094b94b3b7c | 190 | Write_LCD(" ",1,3,0); |
muaiyd | 13:6094b94b3b7c | 191 | Write_LCD(Temp,1,3,0); |
muaiyd | 7:d9f86e1b8185 | 192 | sprintf(Temp, "%d", Analug2_valu[4]); |
muaiyd | 13:6094b94b3b7c | 193 | Write_LCD(" ",1,10,0); |
muaiyd | 13:6094b94b3b7c | 194 | Write_LCD(Temp,1,10,0); |
muaiyd | 7:d9f86e1b8185 | 195 | sprintf(Temp, "%d", Swch1); |
muaiyd | 13:6094b94b3b7c | 196 | Write_LCD(Temp,0,10,0); |
muaiyd | 7:d9f86e1b8185 | 197 | sprintf(Temp, "%d", Swch2); |
muaiyd | 13:6094b94b3b7c | 198 | Write_LCD(Temp,0,15,0); |
muaiyd | 7:d9f86e1b8185 | 199 | sprintf(Temp, "%d", Error_Code); |
muaiyd | 13:6094b94b3b7c | 200 | Write_LCD(Temp,1,15,0); |
muaiyd | 4:4bb228d1f6c2 | 201 | } |
muaiyd | 16:0a2138a18f26 | 202 | /************************************************************************* |
muaiyd | 16:0a2138a18f26 | 203 | Cheaking the four input |
muaiyd | 16:0a2138a18f26 | 204 | ************************************************************************/ |
muaiyd | 7:d9f86e1b8185 | 205 | void InputCheck(){ |
muaiyd | 16:0a2138a18f26 | 206 | InputCheckPin = ! (InputCheckPin); |
muaiyd | 7:d9f86e1b8185 | 207 | if(Swch1&&(Analug1_valu[4]>Analug2_valu[4])){ |
muaiyd | 7:d9f86e1b8185 | 208 | Error_Code=3; |
muaiyd | 7:d9f86e1b8185 | 209 | } |
muaiyd | 7:d9f86e1b8185 | 210 | else{ |
muaiyd | 7:d9f86e1b8185 | 211 | Error_Code=0; |
muaiyd | 7:d9f86e1b8185 | 212 | } |
muaiyd | 7:d9f86e1b8185 | 213 | if(Swch2){ |
muaiyd | 16:0a2138a18f26 | 214 | Ena_BinCounter=1; |
muaiyd | 7:d9f86e1b8185 | 215 | } |
muaiyd | 7:d9f86e1b8185 | 216 | else{ |
muaiyd | 16:0a2138a18f26 | 217 | Ena_BinCounter=0; |
muaiyd | 7:d9f86e1b8185 | 218 | } |
muaiyd | 4:4bb228d1f6c2 | 219 | } |
muaiyd | 16:0a2138a18f26 | 220 | /*************************************************************** |
muaiyd | 16:0a2138a18f26 | 221 | Binery counter on the four Led |
muaiyd | 16:0a2138a18f26 | 222 | *****************************************************************/ |
muaiyd | 7:d9f86e1b8185 | 223 | void BinaryCounter(){ |
muaiyd | 16:0a2138a18f26 | 224 | BinaryCounterPin = !(BinaryCounterPin); |
muaiyd | 16:0a2138a18f26 | 225 | if(Ena_BinCounter){ |
muaiyd | 7:d9f86e1b8185 | 226 | BinLed=Bin; |
muaiyd | 7:d9f86e1b8185 | 227 | Bin++; |
muaiyd | 7:d9f86e1b8185 | 228 | } |
muaiyd | 7:d9f86e1b8185 | 229 | else{ |
muaiyd | 7:d9f86e1b8185 | 230 | BinLed=0x00; |
muaiyd | 7:d9f86e1b8185 | 231 | Bin=0x00; |
muaiyd | 7:d9f86e1b8185 | 232 | } |
muaiyd | 4:4bb228d1f6c2 | 233 | } |
muaiyd | 13:6094b94b3b7c | 234 | /*************************************************************** |
muaiyd | 16:0a2138a18f26 | 235 | Initialising the SD card file |
muaiyd | 13:6094b94b3b7c | 236 | *****************************************************************/ |
muaiyd | 12:582753a4f1fb | 237 | void InitFile(){ |
muaiyd | 17:dba09fb3f508 | 238 | fp = fopen( "/sd/LogDir/LogHistory.csv" , "a"); |
muaiyd | 8:16a77a68e4b4 | 239 | if(fp == NULL) { |
muaiyd | 16:0a2138a18f26 | 240 | Write_LCD("SD Card Error",0,0,1); |
muaiyd | 16:0a2138a18f26 | 241 | Write_LCD("Try Reset",1,0,0); |
muaiyd | 12:582753a4f1fb | 242 | } |
muaiyd | 17:dba09fb3f508 | 243 | fprintf(fp,"Time;Freq;Sw1;Sw2;An1;An2\r\n"); |
muaiyd | 12:582753a4f1fb | 244 | fclose(fp); |
muaiyd | 12:582753a4f1fb | 245 | } |
muaiyd | 13:6094b94b3b7c | 246 | /************************************************************** |
muaiyd | 16:0a2138a18f26 | 247 | Saving the flowing data in a file |
muaiyd | 16:0a2138a18f26 | 248 | a. Frequency value |
muaiyd | 16:0a2138a18f26 | 249 | b. digital input values |
muaiyd | 16:0a2138a18f26 | 250 | c. Filtered analogue values |
muaiyd | 13:6094b94b3b7c | 251 | ***************************************************************/ |
muaiyd | 16:0a2138a18f26 | 252 | void LogFile(){ |
muaiyd | 16:0a2138a18f26 | 253 | LogFilePin = ! (LogFilePin); |
muaiyd | 17:dba09fb3f508 | 254 | fp = fopen( "/sd/LogDir/LogHistory.csv" , "a"); |
muaiyd | 17:dba09fb3f508 | 255 | fprintf(fp,"%i;",(LogTimer.read_ms()/1000)); |
muaiyd | 16:0a2138a18f26 | 256 | if (Freq !=0xffff){ |
muaiyd | 17:dba09fb3f508 | 257 | fprintf(fp,"%i;",Freq); |
muaiyd | 11:0b2801513f93 | 258 | } |
muaiyd | 16:0a2138a18f26 | 259 | else{ |
muaiyd | 17:dba09fb3f508 | 260 | fprintf(fp,"%s;","Err"); |
muaiyd | 16:0a2138a18f26 | 261 | } |
muaiyd | 17:dba09fb3f508 | 262 | fprintf(fp,"%i;",Swch1); |
muaiyd | 17:dba09fb3f508 | 263 | fprintf(fp,"%i;",Swch2); |
muaiyd | 17:dba09fb3f508 | 264 | fprintf(fp,"%d%3;",Analug1_valu[4]); |
muaiyd | 17:dba09fb3f508 | 265 | fprintf(fp,"%d%3;",Analug2_valu[4]); |
muaiyd | 11:0b2801513f93 | 266 | fprintf(fp," %s","\r\n"); |
muaiyd | 16:0a2138a18f26 | 267 | fclose(fp); |
muaiyd | 0:86bba6bf9b6f | 268 | } |