Embedded software Assessment 2
Dependencies: MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed
Function.h
- Committer:
- muaiyd
- Date:
- 2014-02-26
- Revision:
- 15:d33c51364fac
- Parent:
- 14:17be0f2d153f
- Child:
- 16:0a2138a18f26
File content as of revision 15:d33c51364fac:
#include "MCP23017.h" #include "WattBob_TextLCD.h" #include "mbed.h" #include "SDFileSystem.h" #define uint8_t MCPAddr 0X40 MCP23017 Port(p9,p10,MCPAddr) ; // 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); 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 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 FreqTimeOutHpn; uint8_t Error_Code; uint16_t Freq; char Temp[4]; FILE *fp; Timer FreqMsurT; Timer FreqTimeOut; Timer LogTimer; Ticker CallFreqMsur; Ticker CallReadDigitalin; Ticker CallReadAnalogin; Ticker CallDisplay; Ticker CallInputCheck; Ticker CallBinaryCounter; Ticker CallLogFile; void Init_LCD(); void FreqMsur(); void ReadDigitalin(); void ReadAnalogin(); void Display(); void InputCheck(); void BinaryCounter(); void InitFile(); void LogFile(); /******************************************************************************** Functions ###############################################################################*/ 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); } /***************************************************************************/ void Init_LCD(){ Port.write_bit(1,BL_BIT); Write_LCD("Muaiyd",0,4,1); Write_LCD("Heriot-Watt Uni.",1,0,0); wait(1.5); Write_LCD("F=",0,0,1); Write_LCD("A1=",1,0,0); Write_LCD("A2=",1,7,0); Write_LCD("S1=",0,7,0); Write_LCD("S2=",0,12,0); Write_LCD("E",1,14,0); LogTimer.start(); } /*************************************************************************************** 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(); if(!FrequencyIn){ while(!FrequencyIn){ if (FreqTimeOut.read_ms() > 3) break; } } else{ while(FrequencyIn){ if (FreqTimeOut.read_ms() > 3) break; } } FreqMsurT.start(); if (FreqTimeOut.read_ms() > 3){ FreqTimeOutHpn=1; } else{ FreqTimeOutHpn=0; } FreqTimeOut.stop(); FreqTimeOut.reset(); if(!FreqTimeOutHpn){ if(!FrequencyIn){ while(!FrequencyIn){ } while(FrequencyIn){ } } else{ 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; } FreqTimeOut.stop(); 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) b. analogue values (show as integers) c. digital values d. Possible error code **************************************************************/ void Display(){ Write_LCD(" ",0,2,0); if( Freq<1010 && Freq>490){ sprintf(Temp, "%d", Freq); Write_LCD(Temp,0,2,0); } else{ Write_LCD("Err",0,2,0); } sprintf(Temp, "%d", Analug1_valu[4]); Write_LCD(" ",1,3,0); Write_LCD(Temp,1,3,0); sprintf(Temp, "%d", Analug2_valu[4]); Write_LCD(" ",1,10,0); Write_LCD(Temp,1,10,0); sprintf(Temp, "%d", Swch1); Write_LCD(Temp,0,10,0); sprintf(Temp, "%d", Swch2); Write_LCD(Temp,0,15,0); sprintf(Temp, "%d", Error_Code); Write_LCD(Temp,1,15,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 BinaryCounter(){ if(Ena_job6){ BinLed=Bin; Bin++; } else{ BinLed=0x00; Bin=0x00; } } /*************************************************************** *****************************************************************/ void InitFile(){ fp = fopen( "/sd/LogDir/LogHistory.txt" , "a"); if(fp == NULL) { error("Could not open file for write\n"); } fprintf(fp,"%s","**************************************************************\r\n"); fprintf(fp,"%s","Time Freq Sw1 Sw2 An1 An2 ;\r\n"); fprintf(fp,"%s","**************************************************************\r\n"); fclose(fp); } /************************************************************** ***************************************************************/ void LogFile(){ char* Frq; fp = fopen("/sd/LogDir/LogHistory.txt", "a"); if( Freq<1200 && Freq>400){ sprintf(Temp, "%d", Freq); Frq = Temp; } else Frq="Err"; fprintf(fp,"%d ,",(LogTimer.read_ms()/1000)); fprintf(fp," %s ,",Frq); 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"); }