![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Embedded software Assessment 2
Dependencies: MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed
Diff: Function.h
- Revision:
- 7:d9f86e1b8185
- Parent:
- 4:4bb228d1f6c2
- Child:
- 8:16a77a68e4b4
diff -r 4bb228d1f6c2 -r d9f86e1b8185 Function.h --- a/Function.h Sat Feb 15 18:37:26 2014 +0000 +++ b/Function.h Wed Feb 19 17:33:00 2014 +0000 @@ -1,23 +1,42 @@ #include "MCP23017.h" #include "WattBob_TextLCD.h" #include "mbed.h" +//#include "SDFileSystem.h" -MCP23017 Port(p9,p10,0x40) ; // 16-bit parallel I/O object -WattBob_TextLCD LCD(&Port); // pointer to 2*16 chacater LCD object +MCP23017 Port(p9,p10,0x40) ; // 16-bit parallel I/O object +WattBob_TextLCD LCD(&Port); // Varaible to 2*16 chacater LCD object + + +BusOut BinLed(LED4, LED3, LED2, LED1); +DigitalIn FrequencyIn(p5); +DigitalIn Switch1(p7); +DigitalIn Switch2(p8); +AnalogIn Analogue_in_1(p19); +AnalogIn Analogue_in_2(p20); + +//SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board -Timer TimeA; -Ticker CallFunction1; -Ticker CallFunction2; -Ticker CallFunction3; -Ticker CallFunction4; -Ticker CallFunction5; -Ticker CallFunction6; -Ticker CallFunction7; +uint8_t Analug1_valu[5]={0,0,0,0,0}; +uint8_t Analug2_valu[5]={0,0,0,0,0}; +uint8_t Bin=0x00; +bool Swch1; +bool Swch2; +bool Ena_job6=0; +bool FreqTimeOutE=1; +uint8_t Error_Code; +uint16_t Freq; -DigitalOut led1(LED1); -DigitalOut led2(LED2); -DigitalOut led3(LED3); -DigitalOut led4(LED4); +Timer FreqMsurT; +Timer FreqTimeOut; + +Ticker CallFreqMsur; +Ticker CallReadDigitalin; +Ticker CallReadAnalogin; +Ticker CallDisplay; +Ticker CallInputCheck; +Ticker CallBinaryCounter; +Ticker CallLogFile; + void Write_LCD(const char STR[],int8_t PY,int8_t PX,bool clr){ if(clr) LCD.cls(); @@ -31,34 +50,135 @@ Write_LCD("Heriot-Watt Uni.",1,0,0); } -void job1(){ - Write_LCD("2 S",0,0,1); - led1=!led1; + +/* +Measure the frequency of a 3.3v square wave signal once every second. The frequency range +is 500Hz to 1000Hz with 50% duty cycle). +*/ + +void FreqMsur(){ + FreqTimeOut.start(); + while(!FrequencyIn){ + if (FreqTimeOut.read_ms() > 50) + break; + } + while(FrequencyIn){ + if (FreqTimeOut.read_ms() > 50) + break; + } + if (FreqTimeOut.read_ms() > 50) + FreqTimeOutE=0; + + if(FreqTimeOutE){ + FreqMsurT.start(); + while(!FrequencyIn){ + } + while(FrequencyIn){ + } + FreqMsurT.stop(); + float Period=FreqMsurT.read_us(); + Freq=1/Period*1000000.0+0.5; //Adding 0.5 to round the frequency to nearst int + } + else{ + Freq=0xffff; + } + FreqMsurT.reset(); + FreqTimeOut.stop(); + FreqTimeOut.reset(); + FreqTimeOutE=1; + } -void job2(){ - Write_LCD("4 S",0,5,0); - led2=!led2; -} +//Read TWO digital inputs every 400mS (switch_1 and switch_2) -void job3(){ - Write_LCD("6 S",0,9,0); - led3=!led3; +void ReadDigitalin(){ + Swch1=Switch1; + Swch2=Switch2; } -void job4(){ - Write_LCD("8 S",0,12,0); - led4=!led4; +/* +Read TWO analogue inputs every 800mS (Analogue_in_1 at pin 19 +and Analogue_in_2 at pin 20). Also, averaging the last 4 readings +*/ +void ReadAnalogin(){ + Analug1_valu[4]=0; + Analug2_valu[4]=0; + for(int i=0;i<3;i++){ + Analug1_valu[i]=Analug1_valu[i+1]; + Analug1_valu[4]=Analug1_valu[4]+Analug1_valu[i]/4; + Analug2_valu[i]=Analug2_valu[i+1]; + Analug2_valu[4]=Analug2_valu[4]+Analug2_valu[i]/4; + } + Analug1_valu[3]=Analogue_in_1.read()*255; + Analug2_valu[3]=Analogue_in_2.read()*255; + Analug1_valu[4]=Analug1_valu[4]+Analug1_valu[3]/4; + Analug2_valu[4]=Analug2_valu[4]+Analug2_valu[3]/4; +} +/* +Display the following on the LCD display every 2 seconds +a. Frequency value (show as integer) +b. analogue values (show as integers) +c. digital values +d. Possible error code +*/ +void Display(){ + char Temp[4]; + Write_LCD("F",0,0,1); + if( Freq<1200 && Freq>400){ + sprintf(Temp, "%d", Freq); + Write_LCD(Temp,0,1,0); + } + else{ + Write_LCD("Err",0,1,0); + } + + Write_LCD("A",1,0,0); + sprintf(Temp, "%d", Analug1_valu[4]); + Write_LCD(Temp,1,2,0); + + Write_LCD("A",1,8,0); + sprintf(Temp, "%d", Analug2_valu[4]); + Write_LCD(Temp,1,9,0); + + Write_LCD("S",0,7,0); + sprintf(Temp, "%d", Swch1); + Write_LCD(Temp,0,8,0); + + Write_LCD("S",0,10,0); + sprintf(Temp, "%d", Swch2); + Write_LCD(Temp,0,11,0); + + Write_LCD("E",0,14,0); + sprintf(Temp, "%d", Error_Code); + Write_LCD(Temp,0,15,0); } -void job5(){ - Write_LCD("10 S",1,0,0); +void InputCheck(){ + if(Swch1&&(Analug1_valu[4]>Analug2_valu[4])){ + Error_Code=3; + } + else{ + Error_Code=0; + } + if(Swch2){ + Ena_job6=1; + } + else{ + Ena_job6=0; + } } -void job6(){ - Write_LCD("12 S",1,5,0); +void BinaryCounter(){ + if(Ena_job6){ + BinLed=Bin; + Bin++; + } + else{ + BinLed=0x00; + Bin=0x00; + } } -void job7(){ - Write_LCD("22 S",1,10,0); +void LogFile(){ + } \ No newline at end of file