Embedded software Assessment 2

Dependencies:   MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed

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?

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 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 }