Embedded software Assessment 2

Dependencies:   MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed

Revision:
7:d9f86e1b8185
Parent:
4:4bb228d1f6c2
Child:
8:16a77a68e4b4
--- 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