Embedded software Assessment 2

Dependencies:   MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed

Committer:
muaiyd
Date:
Fri Feb 28 10:29:29 2014 +0000
Revision:
17:dba09fb3f508
Parent:
16:0a2138a18f26
Child:
18:f485d46a7acb
Finished the Assignment

Who changed what in which revision?

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