Embedded software Assessment 2

Dependencies:   MCP23017 SDFileSystem USBDevice WattBob_TextLCD mbed

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