![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Embedded software Assessment 2
Dependencies: MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed
Function.h
- Committer:
- muaiyd
- Date:
- 2014-02-20
- Revision:
- 8:16a77a68e4b4
- Parent:
- 7:d9f86e1b8185
- Child:
- 9:539c51b7db52
File content as of revision 8:16a77a68e4b4:
#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); // 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 FreqTimeOutE=1; uint8_t Error_Code; uint16_t Freq; 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(); 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); //LCD.cls(); } /* 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; } //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(){ 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 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 LogFile(){ printf("Hello World!\n"); mkdir("/sd/mydir", 0777); FILE *fp = fopen("/sd/mydir/sdtest.txt", "w"); if(fp == NULL) { error("Could not open file for write\n"); } fprintf(fp, "Hello fun SD Card World!"); fclose(fp); printf("Goodbye World!\n"); }