![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Embedded software Assessment 2
Dependencies: MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed
Diff: Function.h
- Revision:
- 16:0a2138a18f26
- Parent:
- 15:d33c51364fac
- Child:
- 17:dba09fb3f508
diff -r d33c51364fac -r 0a2138a18f26 Function.h --- a/Function.h Wed Feb 26 11:55:20 2014 +0000 +++ b/Function.h Wed Feb 26 22:09:17 2014 +0000 @@ -3,16 +3,25 @@ #include "mbed.h" #include "SDFileSystem.h" -#define uint8_t MCPAddr 0X40 - -MCP23017 Port(p9,p10,MCPAddr) ; // 16-bit parallel I/O 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(p15); DigitalIn Switch1(p17); DigitalIn Switch2(p18); + +DigitalOut ReadDigitalinPin(p21); +DigitalOut ReadAnaloginPin(p22); +DigitalOut FreqMsurPin(p23); +DigitalOut BinaryCounterPin(p24); +DigitalOut InputCheckPin(p25); +DigitalOut DisplayPin(p26); +DigitalOut LogFilePin(p27); +DigitalOut TickerPin(p30); + AnalogIn Analogue_in_1(p19); AnalogIn Analogue_in_2(p20); @@ -23,7 +32,7 @@ uint8_t Bin=0x00; bool Swch1; bool Swch2; -bool Ena_job6=0; +bool Ena_BinCounter=0; bool FreqTimeOutHpn; uint8_t Error_Code; uint16_t Freq; @@ -34,14 +43,7 @@ Timer FreqTimeOut; Timer LogTimer; -Ticker CallFreqMsur; -Ticker CallReadDigitalin; -Ticker CallReadAnalogin; -Ticker CallDisplay; -Ticker CallInputCheck; -Ticker CallBinaryCounter; -Ticker CallLogFile; - +Ticker Cycle; void Init_LCD(); void FreqMsur(); @@ -55,17 +57,21 @@ /******************************************************************************** Functions -###############################################################################*/ +############################################################################### + Small function to writ on the LCD with one instruction +********************************************************************************/ void Write_LCD(const char STR[],int8_t PY,int8_t PX,bool clr){ if(clr) LCD.cls(); LCD.locate(PY,PX); LCD.printf(STR); } -/***************************************************************************/ +/************************************************************************** + Intialise the LCD to be ready to writ on +***************************************************************************/ void Init_LCD(){ Port.write_bit(1,BL_BIT); - Write_LCD("Muaiyd",0,4,1); + Write_LCD("Muaiyd Al-Zandi",0,4,1); Write_LCD("Heriot-Watt Uni.",1,0,0); wait(1.5); Write_LCD("F=",0,0,1); @@ -74,30 +80,59 @@ Write_LCD("S1=",0,7,0); Write_LCD("S2=",0,12,0); Write_LCD("E",1,14,0); - LogTimer.start(); +} +/********************************************************************** + Read TWO digital inputs every 400mS (switch_1 and switch_2) +***********************************************************************/ +void ReadDigitalin(){ + ReadDigitalinPin = !(ReadDigitalinPin); + Swch1=Switch1; + Swch2=Switch2; } - +/******************************************************************* + 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(){ + ReadAnaloginPin = ! (ReadAnaloginPin); + 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; +} /*************************************************************************************** Measure the frequency of a 3.3v square wave signal once every second. The frequency range -is 500Hz to 1000Hz with 50% duty cycle). +is 500Hz to 1000Hz with 50% duty cycle). In this code the on complet cycle is peiod is +masured after detcting the edge also a timeout timer is seting to detect open loop. *****************************************************************************************/ void FreqMsur(){ + FreqMsurPin = ! (FreqMsurPin); FreqTimeOut.start(); + // Ignore first part of the signal to detect the edge if(!FrequencyIn){ while(!FrequencyIn){ - if (FreqTimeOut.read_ms() > 3) + if (FreqTimeOut.read_ms() > 4) break; } } else{ while(FrequencyIn){ - if (FreqTimeOut.read_ms() > 3) + if (FreqTimeOut.read_ms() > 4) break; - } } + } + //This is the begining of the edge start the timer to masure FreqMsurT.start(); - if (FreqTimeOut.read_ms() > 3){ + if (FreqTimeOut.read_ms() > 4){ FreqTimeOutHpn=1; } else{ @@ -129,29 +164,6 @@ FreqMsurT.reset(); } -//Read TWO digital inputs every 400mS (switch_1 and switch_2) -void ReadDigitalin(){ - Swch1=Switch1; - Swch2=Switch2; -} -/******************************************************************* -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) @@ -160,6 +172,7 @@ d. Possible error code **************************************************************/ void Display(){ + DisplayPin = ! (DisplayPin); Write_LCD(" ",0,2,0); if( Freq<1010 && Freq>490){ sprintf(Temp, "%d", Freq); @@ -181,8 +194,11 @@ sprintf(Temp, "%d", Error_Code); Write_LCD(Temp,1,15,0); } -//############################################################ +/************************************************************************* + Cheaking the four input +************************************************************************/ void InputCheck(){ + InputCheckPin = ! (InputCheckPin); if(Swch1&&(Analug1_valu[4]>Analug2_valu[4])){ Error_Code=3; } @@ -190,15 +206,18 @@ Error_Code=0; } if(Swch2){ - Ena_job6=1; + Ena_BinCounter=1; } else{ - Ena_job6=0; + Ena_BinCounter=0; } } - +/*************************************************************** + Binery counter on the four Led +*****************************************************************/ void BinaryCounter(){ - if(Ena_job6){ + BinaryCounterPin = !(BinaryCounterPin); + if(Ena_BinCounter){ BinLed=Bin; Bin++; } @@ -208,12 +227,13 @@ } } /*************************************************************** - + Initialising the SD card file *****************************************************************/ void InitFile(){ fp = fopen( "/sd/LogDir/LogHistory.txt" , "a"); if(fp == NULL) { - error("Could not open file for write\n"); + Write_LCD("SD Card Error",0,0,1); + Write_LCD("Try Reset",1,0,0); } fprintf(fp,"%s","**************************************************************\r\n"); fprintf(fp,"%s","Time Freq Sw1 Sw2 An1 An2 ;\r\n"); @@ -221,25 +241,25 @@ fclose(fp); } /************************************************************** - + Saving the flowing data in a file + a. Frequency value + b. digital input values + c. Filtered analogue values ***************************************************************/ -void LogFile(){ - char* Frq; - fp = fopen("/sd/LogDir/LogHistory.txt", "a"); - if( Freq<1200 && Freq>400){ - sprintf(Temp, "%d", Freq); - Frq = Temp; +void LogFile(){ + LogFilePin = ! (LogFilePin); + fp = fopen( "/sd/LogDir/LogHistory.txt" , "a"); + fprintf(fp,"%i ",(LogTimer.read_ms()/1000)); + if (Freq !=0xffff){ + fprintf(fp," %i ,",Freq); } - else - Frq="Err"; - - fprintf(fp,"%d ,",(LogTimer.read_ms()/1000)); - fprintf(fp," %s ,",Frq); + else{ + fprintf(fp,"Err "); + } fprintf(fp," %i ,",Swch1); fprintf(fp," %i ,",Swch2); fprintf(fp," %d%3 ,",Analug1_valu[4]); fprintf(fp," %d%3 ",Analug2_valu[4]); fprintf(fp," %s","\r\n"); - fclose(fp); - printf("Goodbye World!\n"); + fclose(fp); } \ No newline at end of file