Embedded software Assessment 2

Dependencies:   MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed

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?

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