Friday, 5 June 2015

WEEK 10 (FYP 2)

WEEK 10


Developing Programming to Suit The Hardware Configuration
Figure above show the operation of the whole system. The program for the microcontroller must be configure and referred to this block diagram. When the switch up is press the microcontroller will allow the windows go up only when the current is below 7 ampere. Above 7 ampere current the microcontroller will give signal to the motor driver so that the windows sliding down a little bit. 


Developing program for the MCU using Keil uVision5

Figure  shows the program is constructed using C language and the program is attached at below. the program is need to be read the current sensor output from analog digital converter ADC and if the current of the sensor is read 7A and above the motor drive is need to change direction of the motor so that the power windows is not continue going up.


//main POGRAM
#include <reg52.h>
#include "stdio.h"
#include "delays.c"
#include "usart_header.c"
#include "lcd4bitdriver.c"
#include "adc0804driver.c"

sbit LED0         = P0^0;

//const unsigned char d[]=("                Voltage                ");
const unsigned char d[]=("Voltage");

char buf[20];
signed int val;

void main(void)
{
char i,j,k;
unsigned int Vdig,Vdig_smlm, loop ;
float Vana;
init_ADC0804();
init_usartBR9600();
Initialize_LCD();
printf("\n\r OK PASS");
lcd_gotoxy(1,0);
puts_lcd("current");
delay_1ms(100);
while(1){
  Vdig =           ADC_read();
           
            Vana = (float)Vdig*0.019608;
           
printf("\n\r%u : %1.2f",Vdig, Vana);
           
            if(Vdig!=Vdig_smlm){
                        sprintf(buf,"%u : %1.2f",Vdig,Vana);
                        lcd_gotoxy(2,1);
                        puts_lcd("        ");
                        lcd_gotoxy(2,1);
                        puts_lcd(buf);
                        Vdig_smlm=Vdig;
              }
           
            if(Vana/0.040>7)
                        LED0=0;
  if(Vana/0.040<6.5)
                        LED0=1;
           
}
}


*--------------------------------------------------------------------------
REG52.H

Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __REG52_H__
#define __REG52_H__

/*  BYTE Registers  */
sfr P0    = 0x80;
sfr P1    = 0x90;
sfr P2    = 0xA0;
sfr P3    = 0xB0;
sfr PSW   = 0xD0;
sfr ACC   = 0xE0;
sfr B     = 0xF0;
sfr SP    = 0x81;
sfr DPL   = 0x82;
sfr DPH   = 0x83;
sfr PCON  = 0x87;
sfr TCON  = 0x88;
sfr TMOD  = 0x89;
sfr TL0   = 0x8A;
sfr TL1   = 0x8B;
sfr TH0   = 0x8C;
sfr TH1   = 0x8D;
sfr IE    = 0xA8;
sfr IP    = 0xB8;
sfr SCON  = 0x98;
sfr SBUF  = 0x99;

/*  8052 Extensions  */
sfr T2CON  = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2    = 0xCC;
sfr TH2    = 0xCD;


/*  BIT Registers  */
/*  PSW  */
sbit CY    = PSW^7;
sbit AC    = PSW^6;
sbit F0    = PSW^5;
sbit RS1   = PSW^4;
sbit RS0   = PSW^3;
sbit OV    = PSW^2;
sbit P     = PSW^0; //8052 only

/*  TCON  */
sbit TF1   = TCON^7;
sbit TR1   = TCON^6;
sbit TF0   = TCON^5;
sbit TR0   = TCON^4;
sbit IE1   = TCON^3;
sbit IT1   = TCON^2;
sbit IE0   = TCON^1;
sbit IT0   = TCON^0;

/*  IE  */
sbit EA    = IE^7;
sbit ET2   = IE^5; //8052 only
sbit ES    = IE^4;
sbit ET1   = IE^3;
sbit EX1   = IE^2;
sbit ET0   = IE^1;
sbit EX0   = IE^0;

/*  IP  */
sbit PT2   = IP^5;
sbit PS    = IP^4;
sbit PT1   = IP^3;
sbit PX1   = IP^2;
sbit PT0   = IP^1;
sbit PX0   = IP^0;

/*  P3  */
sbit RD    = P3^7;
sbit WR    = P3^6;
sbit T1    = P3^5;
sbit T0    = P3^4;
sbit INT1  = P3^3;
sbit INT0  = P3^2;
sbit TXD   = P3^1;
sbit RXD   = P3^0;

/*  SCON  */
sbit SM0   = SCON^7;
sbit SM1   = SCON^6;
sbit SM2   = SCON^5;
sbit REN   = SCON^4;
sbit TB8   = SCON^3;
sbit RB8   = SCON^2;
sbit TI    = SCON^1;
sbit RI    = SCON^0;

/*  P1  */
sbit T2EX  = P1^1; // 8052 only
sbit T2    = P1^0; // 8052 only
            
/*  T2CON  */
sbit TF2    = T2CON^7;
sbit EXF2   = T2CON^6;
sbit RCLK   = T2CON^5;
sbit TCLK   = T2CON^4;
sbit EXEN2  = T2CON^3;
sbit TR2    = T2CON^2;
sbit C_T2   = T2CON^1;
sbit CP_RL2 = T2CON^0;

#endif




/*--------------------------------------------------------------------------
STDIO.H

Prototypes for standard I/O functions.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __STDIO_H__
#define __STDIO_H__

#ifndef EOF
 #define EOF -1
#endif

#ifndef NULL
 #define NULL ((void *) 0)
#endif

#ifndef _SIZE_T
 #define _SIZE_T
 typedef unsigned int size_t;
#endif

#pragma SAVE
#pragma REGPARMS
extern char _getkey (void);
extern char getchar (void);
extern char ungetchar (char);
extern char putchar (char);
extern int printf   (const char *, ...);
extern int sprintf  (char *, const char *, ...);
extern int vprintf  (const char *, char *);
extern int vsprintf (char *, const char *, char *);
extern char *gets (char *, int n);
extern int scanf (const char *, ...);
extern int sscanf (char *, const char *, ...);
extern int puts (const char *);

#pragma RESTORE

#endif


/*
Please put
#include "usart_header.c"
    on top of main file.
                       
Call init_usart(); once in your code

Please take notes
USART in MODE1 Fosc = 11.0592 MHz
MODE = 1;
TIMER1 in MODE 2 (Auto reload)
*/


#include <stdio.h>



/*
Call this function once in the main file to work at 2400 b/s
*/
void init_usartBR2400(void){
PCON = 0x00;
SCON  = 0x50;                   /* SCON: mode 1, 8-bit UART, enable rcvr    */
TMOD |= 0x20;                   /* TMOD: timer 1, mode 2, 8-bit reload      */
TH1   = 244;                   /* TH1=244  reload value for 2400 baud         */
TR1   = 1;                      /* TR1:  timer 1 run                        */
TI = 1;
}


/*
Call this function once in the main file to work at 4800 b/s
*/
void init_usartBR4800(void){
PCON = 0x00;
SCON  = 0x50;                   /* SCON: mode 1, 8-bit UART, enable rcvr    */
TMOD |= 0x20;                   /* TMOD: timer 1, mode 2, 8-bit reload      */
TH1   = 250;                   /* TH1=250  reload value for 4800 baud         */
TR1   = 1;                      /* TR1:  timer 1 run                        */
TI = 1;
}


/*
Call this function once in the main file to work at 9600 b/s
*/
void init_usartBR9600(void){
PCON = 0x00;
SCON  = 0x50;                   /* SCON: mode 1, 8-bit UART, enable rcvr    */
TMOD |= 0x20;                   /* TMOD: timer 1, mode 2, 8-bit reload      */
TH1   = 253;                   /* TH1=253  reload value for 9600 baud         */
TR1   = 1;                      /* TR1:  timer 1 run                        */
TI = 1;
}



Filename : lcd4bitdriver.c
Auhor    : ISA
Date     : 28/11/2013
Dependency : delays.c

Please put
#include "lcd4bitdriver.c"
    on top of main file.

2 x 16  LCD Driver - 4 bit interfacing as details below.

The connection of control lines and data should be as below

EN    - P1.0
RS    - P1.1
RW    - P1.2
D4/D7 - P1.4/P1.7


This free codes are provided as is without any guarantees or warranties.

Although the author has attempted to find and correct any bugs in the codes, the author is not
responsible for any damage or losses of any kind caused by the use or misuse of the codes.

The author is under no obligation to provide support, service, corrections,
or upgrades to the programs.

Please email to i.adam.mlk@gmail for any comments and visit my blogspots
(http://maelnotesonmicrocontrollerinterfacing.blogspot.com) for any updates
*/

#include <reg52.h>


//LCD lines
#define D_LCD P2
sbit EN = D_LCD^0;
sbit RW = D_LCD^1;
sbit RS = D_LCD^2;

void Delay_uS(unsigned int x);
unsigned char ADC_read(void);

const unsigned char set_lcd_4bit[7]={0x20, 0x20, 0x80, 0x00, 0xe0, 0x00, 0x60};

void EN2HIGH(void);
void EN2LOW(void);
unsigned char check_busy(void);
char read_data(void);
void send_control(char x, char i);
void send_data(char x);
void Initialize_LCD(void);
void puts_lcd(char *pointer);
void lcd_gotoxy(char line_number,char position);


/*
This function allows the string to be displayed on LCD
example 1:
       puts_lcd("saya");
       puts_lcd(arr1);
       puts_lcd(arr2);
*/
void puts_lcd(char *pointer){
     while(*pointer)                                         // print till null encountered
                                               send_data(*pointer++);  
}


/*
This function directs the cursor to Y and X of LCD.
Note:
     Line_number is 1/2 correspond to upper or lower ROW
     Position is 0-15 correspond to column 0-15

example:
        lcd_gotoxy(2,1);
result:
                                               cursor will be placed at ROW 2, COLUMN 1
*/
void lcd_gotoxy(char line_number,char position){
 char a;

 if(line_number==1)
          a=0x80+position;
 else if(line_number==2)
          a=0xC0+position;
 send_control(a,2);

}


/*
This function returns status of busy flag.

returns:
  0      Not busy
  1      Busy

example:
        while(check_busy());

result:
                                               the statement true if LCD is in its busy state

*/
unsigned char check_busy(void){
            RS = 0;                        // Logic ‘0’
  RW = 1;                                // Logic ‘1’     
            D_LCD|=0xf0;   // Set data line as input
  delay_0dot1ms(1);
            EN2HIGH();
            if(D_LCD&0x80){
                        EN2LOW();
                        EN2HIGH();    
                        EN2LOW();                
                        D_LCD&=0x0f;   // Set data line as output
                        return 1;
                        }
            else{
                        EN2LOW();
                        EN2HIGH();    
                        EN2LOW();                
                        D_LCD&=0x0f;   // Set data line as output
                        return 0;
                        }
}



/*
This function returns data from CGRAM/DDRAM to controller

example:
        x = read_data();
result:
        x contains CGRAM/DDRAM data
*/
char read_data(void){           
  char x;          
  while(check_busy());
           
            D_LCD|=0xf0;   // Set data line as input
  RS = 1;                                  // Logic ‘1’
  RW = 1;                                // Logic ‘1’
            delay_0dot1ms(1);
            EN2HIGH();
            x = D_LCD;
            EN2LOW();
            EN2HIGH();
            x |= D_LCD>>4;
            EN2LOW();
            D_LCD&=0x0f;   // Set data line as output
            return x;
            }


/*
This function sends control to LCD

example 1:
       send_control(x,2);
result:
                 both nibble of x will be sent to LCD
           
example 2:
       send_control(x,1);
result:
                 only lower nibble of x will be sent to LCD
*/       
void send_control(char x, char i){
  while(check_busy());
  D_LCD&=0x0f;  
  RS = 0;      
  RW = 0;     
  switch(i){
     case 2:
            D_LCD&=0x0f;     // clear previous data
            D_LCD |= x&0xf0;
            delay_0dot1ms(1);
            EN2HIGH();
            EN2LOW();
     case 1:
            D_LCD&=0x0f;    
            D_LCD |= x<<4;
            delay_0dot1ms(1);
            EN2HIGH();
            EN2LOW();
            break;
     default:
            break;
           }
}

/*
This function sends data to LCD

example:
        send_data(x);
result:
        x will be sent to LCD
*/
void send_data(char x){
            while(check_busy());
            D_LCD&=0x0f;   // Set data line as output
            RS = 1;                        // Logic ‘0’
  RW = 0;                                // Logic ‘0’
           
            D_LCD&=0x0f;                       // clear previous data
            D_LCD |= x&0xf0;
            delay_0dot1ms(1);
            EN2HIGH();
            EN2LOW();
            D_LCD&=0x0f;                       // clear previous data
            D_LCD |= x<<4;
            delay_0dot1ms(1);
            EN2HIGH();
            EN2LOW();
}

/*
This function initialize the LCD in 4-bit

void Initialize_LCD(void){
            unsigned char i;
  D_LCD = 0x00;    
  delay_0dot1ms(180);       // more than 15 ms @ 12MHz

            for(i=0; i<3; i++){
                        D_LCD &= 0x0f;                     // clear previous data
                        D_LCD |= 0x30;
                        delay_0dot1ms(1);
                        EN2HIGH();
                        EN2LOW();
                        delay_1ms(5);
            }

           
  send_control(0x02,1);
  send_control(0x28,2);                      //         function set
  send_control(0x0e,2);                      //         display ON/OFF
  send_control(0x06,2);                      //         Entry mode set          
}
            */



/*
This function initialize the LCD in 4-bit
must be called once in the main program
*/
void Initialize_LCD(void){
            char i;
            D_LCD = 0x00;                                                                                              // Set data line as output
            delay_0dot1ms(152);                                                                        // 20ms           @ 16MHz
            for(i=0; i<7; i++){
                        D_LCD&=0x0f;                                                                      // clear previous data
                        D_LCD |= set_lcd_4bit[i];
                        delay_0dot1ms(1);
                        EN2HIGH();
                        EN2LOW();
            }
}

void EN2HIGH(void){
            EN=1;
  delay_0dot1ms(1);
}

void EN2LOW(void){
            EN=0;
            delay_0dot1ms(1);
}


/*
Filename : adc0804driver.c
Auhor    : ISA
Date     : 28/11/2013

ADC0804 Driver as details below.

The connection of control lines and data should be as below
EOC   - P3.4
CS    - P3.5
WR    - P3.6
RD    - P3.7
D0/D7 - P1.0/P1.7

Please put
#include "adc0804driver.c"
    on top of main file.
Call init_ADC0804(); once in your code

This free codes are provided as is without any guarantees or warranties.

Although the author has attempted to find and correct any bugs in the codes, the author is not
responsible for any damage or losses of any kind caused by the use or misuse of the codes.

The author is under no obligation to provide support, service, corrections,
or upgrades to the programs.

Please email to i.adam.mlk@gmail for any comments and visit my blogspots
(http://maelnotesonmicrocontrollerinterfacing.blogspot.com) for any updates
*/


#define D_ADC P1
#define C_ADC P3
sbit EOC          = C_ADC^4;
sbit CS             = C_ADC^5;
sbit WRS         = C_ADC^6;
sbit RDS          = C_ADC^7;


void init_ADC0804(void);
unsigned char ADC_read(void);



void init_ADC0804(void){
            D_ADC = 0xFF;       // Set the port to 'read mode'
  EOC=1;
}


/*
unsigned char ADC_read(void)

Returns 8-bit data from ADC
example:
   i=ADC_read();
*/
unsigned char ADC_read(void){
unsigned  char x;
CS=0;delay_10us(1);                                      // select ADC
WRS=0;
WRS=1; delay_10us(1);
CS=1;
while(EOC);     // wait till end of conversion
           
CS=0;delay_10us(1);
RDS=0;delay_10us(1);
x=D_ADC;                                           // read data
RDS=1;
CS=1;
return x;
}


WEEK 9 (FYP 2)

WEEK 9



Etching to complete PCB.
After designing the PCB using Ares it’s time to do the etching process to complete the PCB board. Figure 2.18 below show the etching process using toner transfer method to the board. There are many way to etching the PCB but to cut cost in this final year project used toner transfer method. After finish the etching the board can be solder all the component to the board.
Figure above show the toner have been transferred to the bottom layer that is copper layer using an iron. After transfer the toner, the etching poses can be start. Figure bellow show the etching process to remove uncover copper layer using ferric chloride.









WEEK 8 (FYP 2)

WEEK 8


Circuit Construction PCB using Ares PCB layout.
Ares is a software that is being used to construct printed circuit board (PCB)


Figure  show the construction of PCB using software Ares that already build in the software of proteus. 




Figure above show the PCB design that is constructed can be view in 3D mode. In 3D mode its can be reference in placing the component and the space between component can be adjusted earlier so that is easy to place in real hardware soon








PCB construction of the power supply to the microcontroller with 5 volt output voltage.









PCB construction of the H-bridge as a driver of motor control. 






WEEK 7 (FYP 2)

WEEK 7

                                                           Hardware block diagram 
            


For this project, figure above shows a block diagram on how the system is declare as a input or output. These projects have 1 inputs which are analog signal from current transducer that is being converted to digital signal. The reason why the signal from current transducer is converted to digital signal is because microcontroller understand in digital signal only that is 8 bit. Output for these project is LCD and relay. Relay is used to drive the motor otherwise LCD is to display the current that pass through current traducer.

Design the circuit and programming.

The hardware implementation includes the construction of the circuit design of the system which includes configuration of current transducer, LCD display, and single pole double throw relay and H-bridge motor control.

Design the circuit using ISIS proteus professional 7.



Circuit for micro controller
By referring to the figure above there are stated the important ports description used in this project. The port actually is depending on how to design and which port will be used. It need to follow which port is declare during create the code. It is important to make sure that when compile the simulation each port will be active. Table 2 below show the description of each port at microcontroller atmel 89S52




Circuit for ADC

above figure shows the port used for the ADC and it is connected to atmel 89S52. The voltage reference is set to 2.5V and pin 6 is connected to output of the sensor used.





Circuit for LCD 16x2
figure show the configuration of the LCD 16x2. For the pin no 3 is connected straight to the ground to get maximum contrast.




Circuit for H-Bridge Motor Control

Figure  show the schematic diagram of H bridge motor control. The configuration of the H-bridge is to control forward and reverse of DC motor. And the motor that is used for this project is power windows motor. MOSFET transistor used is P-Channel IRF9540N at the top and N-Channel IRFZ44N on the bottom. IRF9540 has the ability to skip a current of 23A and 40A of IRFZ44N. With a maximum voltage of 24V. The use of a motor driver MOSFET is often applied to the motor driving the world of robotics. The switch above will connected to the port microcontroller and the motor will control by the microcontroller to be forward and reverse.



Circuit for Relay Motor Control Motor Control
Figure  show the schematic relay motor control. Relay is one of the method to control forward and reverse of the motor. Figure 3.9 show there is 2 relay of single pole double throw used to control forward and reverse of the motor. Capacitor C1 and C2 is used to filter the current so that there is no spark and reduced arced when switching the relay off and on.