![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Embedded software Assessment 2
Dependencies: MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed
Function.h@7:d9f86e1b8185, 2014-02-19 (annotated)
- Committer:
- muaiyd
- Date:
- Wed Feb 19 17:33:00 2014 +0000
- Revision:
- 7:d9f86e1b8185
- Parent:
- 4:4bb228d1f6c2
- Child:
- 8:16a77a68e4b4
Add SD card
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 | 7:d9f86e1b8185 | 4 | //#include "SDFileSystem.h" |
muaiyd | 0:86bba6bf9b6f | 5 | |
muaiyd | 7:d9f86e1b8185 | 6 | MCP23017 Port(p9,p10,0x40) ; // 16-bit parallel I/O object |
muaiyd | 7:d9f86e1b8185 | 7 | WattBob_TextLCD LCD(&Port); // Varaible to 2*16 chacater LCD object |
muaiyd | 7:d9f86e1b8185 | 8 | |
muaiyd | 7:d9f86e1b8185 | 9 | |
muaiyd | 7:d9f86e1b8185 | 10 | BusOut BinLed(LED4, LED3, LED2, LED1); |
muaiyd | 7:d9f86e1b8185 | 11 | DigitalIn FrequencyIn(p5); |
muaiyd | 7:d9f86e1b8185 | 12 | DigitalIn Switch1(p7); |
muaiyd | 7:d9f86e1b8185 | 13 | DigitalIn Switch2(p8); |
muaiyd | 7:d9f86e1b8185 | 14 | AnalogIn Analogue_in_1(p19); |
muaiyd | 7:d9f86e1b8185 | 15 | AnalogIn Analogue_in_2(p20); |
muaiyd | 7:d9f86e1b8185 | 16 | |
muaiyd | 7:d9f86e1b8185 | 17 | //SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board |
muaiyd | 0:86bba6bf9b6f | 18 | |
muaiyd | 7:d9f86e1b8185 | 19 | uint8_t Analug1_valu[5]={0,0,0,0,0}; |
muaiyd | 7:d9f86e1b8185 | 20 | uint8_t Analug2_valu[5]={0,0,0,0,0}; |
muaiyd | 7:d9f86e1b8185 | 21 | uint8_t Bin=0x00; |
muaiyd | 7:d9f86e1b8185 | 22 | bool Swch1; |
muaiyd | 7:d9f86e1b8185 | 23 | bool Swch2; |
muaiyd | 7:d9f86e1b8185 | 24 | bool Ena_job6=0; |
muaiyd | 7:d9f86e1b8185 | 25 | bool FreqTimeOutE=1; |
muaiyd | 7:d9f86e1b8185 | 26 | uint8_t Error_Code; |
muaiyd | 7:d9f86e1b8185 | 27 | uint16_t Freq; |
muaiyd | 1:9a3cfeca7ecd | 28 | |
muaiyd | 7:d9f86e1b8185 | 29 | Timer FreqMsurT; |
muaiyd | 7:d9f86e1b8185 | 30 | Timer FreqTimeOut; |
muaiyd | 7:d9f86e1b8185 | 31 | |
muaiyd | 7:d9f86e1b8185 | 32 | Ticker CallFreqMsur; |
muaiyd | 7:d9f86e1b8185 | 33 | Ticker CallReadDigitalin; |
muaiyd | 7:d9f86e1b8185 | 34 | Ticker CallReadAnalogin; |
muaiyd | 7:d9f86e1b8185 | 35 | Ticker CallDisplay; |
muaiyd | 7:d9f86e1b8185 | 36 | Ticker CallInputCheck; |
muaiyd | 7:d9f86e1b8185 | 37 | Ticker CallBinaryCounter; |
muaiyd | 7:d9f86e1b8185 | 38 | Ticker CallLogFile; |
muaiyd | 7:d9f86e1b8185 | 39 | |
muaiyd | 0:86bba6bf9b6f | 40 | void Write_LCD(const char STR[],int8_t PY,int8_t PX,bool clr){ |
muaiyd | 0:86bba6bf9b6f | 41 | if(clr) |
muaiyd | 0:86bba6bf9b6f | 42 | LCD.cls(); |
muaiyd | 0:86bba6bf9b6f | 43 | LCD.locate(PY,PX); |
muaiyd | 0:86bba6bf9b6f | 44 | LCD.printf(STR); |
muaiyd | 0:86bba6bf9b6f | 45 | } |
muaiyd | 0:86bba6bf9b6f | 46 | |
muaiyd | 0:86bba6bf9b6f | 47 | void Init_LCD(){ |
muaiyd | 0:86bba6bf9b6f | 48 | Port.write_bit(1,BL_BIT); |
muaiyd | 0:86bba6bf9b6f | 49 | Write_LCD("Muaiyd",0,4,1); |
muaiyd | 0:86bba6bf9b6f | 50 | Write_LCD("Heriot-Watt Uni.",1,0,0); |
muaiyd | 4:4bb228d1f6c2 | 51 | } |
muaiyd | 4:4bb228d1f6c2 | 52 | |
muaiyd | 7:d9f86e1b8185 | 53 | |
muaiyd | 7:d9f86e1b8185 | 54 | /* |
muaiyd | 7:d9f86e1b8185 | 55 | Measure the frequency of a 3.3v square wave signal once every second. The frequency range |
muaiyd | 7:d9f86e1b8185 | 56 | is 500Hz to 1000Hz with 50% duty cycle). |
muaiyd | 7:d9f86e1b8185 | 57 | */ |
muaiyd | 7:d9f86e1b8185 | 58 | |
muaiyd | 7:d9f86e1b8185 | 59 | void FreqMsur(){ |
muaiyd | 7:d9f86e1b8185 | 60 | FreqTimeOut.start(); |
muaiyd | 7:d9f86e1b8185 | 61 | while(!FrequencyIn){ |
muaiyd | 7:d9f86e1b8185 | 62 | if (FreqTimeOut.read_ms() > 50) |
muaiyd | 7:d9f86e1b8185 | 63 | break; |
muaiyd | 7:d9f86e1b8185 | 64 | } |
muaiyd | 7:d9f86e1b8185 | 65 | while(FrequencyIn){ |
muaiyd | 7:d9f86e1b8185 | 66 | if (FreqTimeOut.read_ms() > 50) |
muaiyd | 7:d9f86e1b8185 | 67 | break; |
muaiyd | 7:d9f86e1b8185 | 68 | } |
muaiyd | 7:d9f86e1b8185 | 69 | if (FreqTimeOut.read_ms() > 50) |
muaiyd | 7:d9f86e1b8185 | 70 | FreqTimeOutE=0; |
muaiyd | 7:d9f86e1b8185 | 71 | |
muaiyd | 7:d9f86e1b8185 | 72 | if(FreqTimeOutE){ |
muaiyd | 7:d9f86e1b8185 | 73 | FreqMsurT.start(); |
muaiyd | 7:d9f86e1b8185 | 74 | while(!FrequencyIn){ |
muaiyd | 7:d9f86e1b8185 | 75 | } |
muaiyd | 7:d9f86e1b8185 | 76 | while(FrequencyIn){ |
muaiyd | 7:d9f86e1b8185 | 77 | } |
muaiyd | 7:d9f86e1b8185 | 78 | FreqMsurT.stop(); |
muaiyd | 7:d9f86e1b8185 | 79 | float Period=FreqMsurT.read_us(); |
muaiyd | 7:d9f86e1b8185 | 80 | Freq=1/Period*1000000.0+0.5; //Adding 0.5 to round the frequency to nearst int |
muaiyd | 7:d9f86e1b8185 | 81 | } |
muaiyd | 7:d9f86e1b8185 | 82 | else{ |
muaiyd | 7:d9f86e1b8185 | 83 | Freq=0xffff; |
muaiyd | 7:d9f86e1b8185 | 84 | } |
muaiyd | 7:d9f86e1b8185 | 85 | FreqMsurT.reset(); |
muaiyd | 7:d9f86e1b8185 | 86 | FreqTimeOut.stop(); |
muaiyd | 7:d9f86e1b8185 | 87 | FreqTimeOut.reset(); |
muaiyd | 7:d9f86e1b8185 | 88 | FreqTimeOutE=1; |
muaiyd | 7:d9f86e1b8185 | 89 | |
muaiyd | 4:4bb228d1f6c2 | 90 | } |
muaiyd | 4:4bb228d1f6c2 | 91 | |
muaiyd | 7:d9f86e1b8185 | 92 | //Read TWO digital inputs every 400mS (switch_1 and switch_2) |
muaiyd | 4:4bb228d1f6c2 | 93 | |
muaiyd | 7:d9f86e1b8185 | 94 | void ReadDigitalin(){ |
muaiyd | 7:d9f86e1b8185 | 95 | Swch1=Switch1; |
muaiyd | 7:d9f86e1b8185 | 96 | Swch2=Switch2; |
muaiyd | 4:4bb228d1f6c2 | 97 | } |
muaiyd | 4:4bb228d1f6c2 | 98 | |
muaiyd | 7:d9f86e1b8185 | 99 | /* |
muaiyd | 7:d9f86e1b8185 | 100 | Read TWO analogue inputs every 800mS (Analogue_in_1 at pin 19 |
muaiyd | 7:d9f86e1b8185 | 101 | and Analogue_in_2 at pin 20). Also, averaging the last 4 readings |
muaiyd | 7:d9f86e1b8185 | 102 | */ |
muaiyd | 7:d9f86e1b8185 | 103 | void ReadAnalogin(){ |
muaiyd | 7:d9f86e1b8185 | 104 | Analug1_valu[4]=0; |
muaiyd | 7:d9f86e1b8185 | 105 | Analug2_valu[4]=0; |
muaiyd | 7:d9f86e1b8185 | 106 | for(int i=0;i<3;i++){ |
muaiyd | 7:d9f86e1b8185 | 107 | Analug1_valu[i]=Analug1_valu[i+1]; |
muaiyd | 7:d9f86e1b8185 | 108 | Analug1_valu[4]=Analug1_valu[4]+Analug1_valu[i]/4; |
muaiyd | 7:d9f86e1b8185 | 109 | Analug2_valu[i]=Analug2_valu[i+1]; |
muaiyd | 7:d9f86e1b8185 | 110 | Analug2_valu[4]=Analug2_valu[4]+Analug2_valu[i]/4; |
muaiyd | 7:d9f86e1b8185 | 111 | } |
muaiyd | 7:d9f86e1b8185 | 112 | Analug1_valu[3]=Analogue_in_1.read()*255; |
muaiyd | 7:d9f86e1b8185 | 113 | Analug2_valu[3]=Analogue_in_2.read()*255; |
muaiyd | 7:d9f86e1b8185 | 114 | Analug1_valu[4]=Analug1_valu[4]+Analug1_valu[3]/4; |
muaiyd | 7:d9f86e1b8185 | 115 | Analug2_valu[4]=Analug2_valu[4]+Analug2_valu[3]/4; |
muaiyd | 7:d9f86e1b8185 | 116 | } |
muaiyd | 7:d9f86e1b8185 | 117 | /* |
muaiyd | 7:d9f86e1b8185 | 118 | Display the following on the LCD display every 2 seconds |
muaiyd | 7:d9f86e1b8185 | 119 | a. Frequency value (show as integer) |
muaiyd | 7:d9f86e1b8185 | 120 | b. analogue values (show as integers) |
muaiyd | 7:d9f86e1b8185 | 121 | c. digital values |
muaiyd | 7:d9f86e1b8185 | 122 | d. Possible error code |
muaiyd | 7:d9f86e1b8185 | 123 | */ |
muaiyd | 7:d9f86e1b8185 | 124 | void Display(){ |
muaiyd | 7:d9f86e1b8185 | 125 | char Temp[4]; |
muaiyd | 7:d9f86e1b8185 | 126 | Write_LCD("F",0,0,1); |
muaiyd | 7:d9f86e1b8185 | 127 | if( Freq<1200 && Freq>400){ |
muaiyd | 7:d9f86e1b8185 | 128 | sprintf(Temp, "%d", Freq); |
muaiyd | 7:d9f86e1b8185 | 129 | Write_LCD(Temp,0,1,0); |
muaiyd | 7:d9f86e1b8185 | 130 | } |
muaiyd | 7:d9f86e1b8185 | 131 | else{ |
muaiyd | 7:d9f86e1b8185 | 132 | Write_LCD("Err",0,1,0); |
muaiyd | 7:d9f86e1b8185 | 133 | } |
muaiyd | 7:d9f86e1b8185 | 134 | |
muaiyd | 7:d9f86e1b8185 | 135 | Write_LCD("A",1,0,0); |
muaiyd | 7:d9f86e1b8185 | 136 | sprintf(Temp, "%d", Analug1_valu[4]); |
muaiyd | 7:d9f86e1b8185 | 137 | Write_LCD(Temp,1,2,0); |
muaiyd | 7:d9f86e1b8185 | 138 | |
muaiyd | 7:d9f86e1b8185 | 139 | Write_LCD("A",1,8,0); |
muaiyd | 7:d9f86e1b8185 | 140 | sprintf(Temp, "%d", Analug2_valu[4]); |
muaiyd | 7:d9f86e1b8185 | 141 | Write_LCD(Temp,1,9,0); |
muaiyd | 7:d9f86e1b8185 | 142 | |
muaiyd | 7:d9f86e1b8185 | 143 | Write_LCD("S",0,7,0); |
muaiyd | 7:d9f86e1b8185 | 144 | sprintf(Temp, "%d", Swch1); |
muaiyd | 7:d9f86e1b8185 | 145 | Write_LCD(Temp,0,8,0); |
muaiyd | 7:d9f86e1b8185 | 146 | |
muaiyd | 7:d9f86e1b8185 | 147 | Write_LCD("S",0,10,0); |
muaiyd | 7:d9f86e1b8185 | 148 | sprintf(Temp, "%d", Swch2); |
muaiyd | 7:d9f86e1b8185 | 149 | Write_LCD(Temp,0,11,0); |
muaiyd | 7:d9f86e1b8185 | 150 | |
muaiyd | 7:d9f86e1b8185 | 151 | Write_LCD("E",0,14,0); |
muaiyd | 7:d9f86e1b8185 | 152 | sprintf(Temp, "%d", Error_Code); |
muaiyd | 7:d9f86e1b8185 | 153 | Write_LCD(Temp,0,15,0); |
muaiyd | 4:4bb228d1f6c2 | 154 | } |
muaiyd | 4:4bb228d1f6c2 | 155 | |
muaiyd | 7:d9f86e1b8185 | 156 | void InputCheck(){ |
muaiyd | 7:d9f86e1b8185 | 157 | if(Swch1&&(Analug1_valu[4]>Analug2_valu[4])){ |
muaiyd | 7:d9f86e1b8185 | 158 | Error_Code=3; |
muaiyd | 7:d9f86e1b8185 | 159 | } |
muaiyd | 7:d9f86e1b8185 | 160 | else{ |
muaiyd | 7:d9f86e1b8185 | 161 | Error_Code=0; |
muaiyd | 7:d9f86e1b8185 | 162 | } |
muaiyd | 7:d9f86e1b8185 | 163 | if(Swch2){ |
muaiyd | 7:d9f86e1b8185 | 164 | Ena_job6=1; |
muaiyd | 7:d9f86e1b8185 | 165 | } |
muaiyd | 7:d9f86e1b8185 | 166 | else{ |
muaiyd | 7:d9f86e1b8185 | 167 | Ena_job6=0; |
muaiyd | 7:d9f86e1b8185 | 168 | } |
muaiyd | 4:4bb228d1f6c2 | 169 | } |
muaiyd | 4:4bb228d1f6c2 | 170 | |
muaiyd | 7:d9f86e1b8185 | 171 | void BinaryCounter(){ |
muaiyd | 7:d9f86e1b8185 | 172 | if(Ena_job6){ |
muaiyd | 7:d9f86e1b8185 | 173 | BinLed=Bin; |
muaiyd | 7:d9f86e1b8185 | 174 | Bin++; |
muaiyd | 7:d9f86e1b8185 | 175 | } |
muaiyd | 7:d9f86e1b8185 | 176 | else{ |
muaiyd | 7:d9f86e1b8185 | 177 | BinLed=0x00; |
muaiyd | 7:d9f86e1b8185 | 178 | Bin=0x00; |
muaiyd | 7:d9f86e1b8185 | 179 | } |
muaiyd | 4:4bb228d1f6c2 | 180 | } |
muaiyd | 4:4bb228d1f6c2 | 181 | |
muaiyd | 7:d9f86e1b8185 | 182 | void LogFile(){ |
muaiyd | 7:d9f86e1b8185 | 183 | |
muaiyd | 0:86bba6bf9b6f | 184 | } |