PROGRAMMING NOTES
INCLUDE FILES:
#include <hidef.h> #include "derivative.h"
USART GLOBAL FUNCTION DECLARATIONS:
void uart0_9600_init(void);unsigned char uart0_rx(void);void uart0_tx(unsigned char a);void uart0_tx_string(char *s) ;void uart0_tx_number(unsigned char a);void uart0_tx_int(unsigned int a);void uart0_tx_newline(void);
FUNCTION DEFINITIONS:void uart0_9600_init(void)//INITIALISE THE BAUD RATE{ SCI0BDL=13; SCI0CR1=0; SCI0CR2=12; }
void uart0_tx_int(unsigned int a) //TRANSMITS AN INTEGER{unsigned int temp;temp=a/10000;uart0_tx (temp + 0x30);a=a-temp*10000;temp=a/1000;uart0_tx(temp + 0x30);a=a-temp*1000;temp=a/100;uart0_tx(temp + 0x30);a=a-temp*100;temp=a/10;uart0_tx(temp + 0x30);a=a-temp*10;uart0_tx(a + 0x30);}
void uart0_tx_number(unsigned char a) //TRANSMITS AN ALPHABET{unsigned char temp;temp=a/100;uart0_tx(temp + 0x30);a=a-temp*100;temp=a/10;uart0_tx(temp + 0x30);a=a-temp*10;uart0_tx(a + 0x30);}
void uart0_tx_string (char *s) //TRANMITS A STRING{ while (*s)
{uart0_tx(*s);s++;
}}
void uart0_tx_newline(void) //NEW LINE FEEDING{ uart0_tx (0x0A);uart0_tx (0x0D);}
unsigned char uart0_rx (void) //RECEIVING INPUT FROM HYPERTERMINAL{ while(SCI0SR1_RDRF==0); return SCI0DRL;}
void uart0_tx(unsigned char a) //USED AS SUBROUTINE IN ALL TX FUNCTIONS{ SCI0DRL=a; while(SCI0SR1_TC==0);}
PARTS CONNECTED:
LED CONTROL:
o DDRT=0xF0;//DATA DIRECTION CONTROL REGISTER FOR SETTING O/P PINS-4 TO 7 AS O/P PINS
o PTT=0x0F; //0 TO TURN ON ALL LEDS CONNECTED IN 4 TO 7 PINSo PTT=0xFF; //Turning Off all LEDso PTT_PTT4=0;//TURN ON FIRST LED1o PTT_PTT4=1;//TURN OFF FIRST LED1o uart0_tx(0x0D);//USE THIS FUNCTION BEFORE CALLING ANY UART FUNCTIONS
SWITCH CONTROL:
o DDRP_DDRP5=0; //Port P Pin 5 & 7 set to input o DDRP_DDRP7=0;o PERP_PERP5=1; //Port P Pin 5 & 7 Pull-up Enableo PERP_PERP7=1;o if(PTP_PTP5==0) ; //SWITCH PRESS CHECKINGo for (cnt=0;cnt<=550000;cnt++); //MAXIMUM SWITCH DETECTION TIMEo if(PTP_PTP7==0); //SWITCH PRESS CHECKING
DC MOTOR CONTROL:
o DDRE_DDRE2=1; // Port E pin 2 & 3 set to outputo DDRE_DDRE3=1;o DDRP_DDRP0=1; //PORT P PIN 0 & 1 AS OUTPUTo DDRP_DDRP1=1;o PORTE_PE2=0; //H BRIDGE ENABLE BY SUPPLY o PORTE_PE3=1;o PWMPOL_PPOL0=1; //PWM pulse High at beginning of Periodo PWMPOL_PPOL1=1; //PWM pulse High at beginning of Periodo PWMCLK_PCLK0=1; // clock SA as clock source for PWMo PWMCLK_PCLK1=1; // clock SB as clock source for PWMo PWMPRCLK =0x00; //PWM Prescale Clock Select-NO PRESCALAR- CLOCK A=CLOCK B=2MHZo PWMSCLA =5; //PWM SCALE A REG clock SA = clock A / (2 * 5) = 200KHzo PWMSCLB =5; //PWM SCALE B REG clock SB = clock B / (2 * 5) = 200KHzo PWMPER0 = 200; // PWM Channel Period 0 Register PWM Period 1KHzo PWMPER1 = 200; // PWM Channel Period 1 Register PWM Period 1KHzo PWMDTY0 = 50; // PWM Channel Duty 0 Register H BRIDGE CONTROLo PWMDTY1 = 0; // PWM Channel Duty 0 Register H BRIDGE CONTROLo PWME_PWME0=1; //PWM channel 0 Enableo PWME_PWME1=1; //PWM channel 1 Enable, NOW MOTOR STARTSo PORTE_PE2=0; //H BRIDGE DISABLES BY SAME POLARITY SUPPLY o PORTE_PE3=0; o PWMDTY0 = 50; //H BRIDGE CONTROL FET FORWARD DIRECTIONo PWMDTY1 = 0;
o PWMDTY0 = 0; //H BRIDGE CONTROL FET REVERSE DIRECTION o o PWMDTY1 = 50;o PORTE_PE3=1;//ENABLES THE H BRIDGE SUPPLY AFTER THE DELAY WE SPECIFYo PORTE_PE3=0;//DISBALES THE H BRIDGE SUPPLY AFTER THE DELAY WE SPECIFYo PTP_PTP0=0;//PORT P OUTPUT o PTP_PTP1=0;o PWME_PWME0=0; //PWM channel disableo PWME_PWME1=0;
SERVO MOTOR CONTROL:
o PWMCTL_CON23=1;//PWM CONTROL REGISTERo PWME_PWME2=1; //PWM channel 2 Enableo PWME_PWME3=1; //PWM channel 3 Enableo PWMPOL_PPOL2=1; //PWM pulse High at begining of Periodo PWMPOL_PPOL3=1; //PWM pulse High at begining of Periodo PWMCLK_PCLK2=1; // clock SA as clock source for PWMo PWMCLK_PCLK3=1; // clock SB as clock source for PWMo PWMPRCLK =0x00; //clock A = 2MHz clockB = 2MHzo PWMSCLA =1; //clock SA = clock A / (2 * 100) = 10KHzo PWMSCLB =1; //clock SB = clock B / (2 * 100) = 10KHz o PWMPER2 = 0x4E; // PWM Period 20ms 50Hzo PWMPER3 = 0x20; // PWM Period 20ms 50Hzo PWMDTY2 = 0x05; // Pulse Width 1.5ms: Center Positiono PWMDTY3 = 0x87; //1.415mso PWMDTY2 = 0x04; //Pulse Width: Left Positiono PWMDTY3 = 0x6A; //1.1mso PWMDTY2 = 0x06; //Pulse Width 1.7 ms: Right Positiono PWMDTY3 = 0xA4;o PWMDTY2 = 0x05; // Pulse Width: Center Positiono PWMDTY3 = 0x87; //1.415mso PWME_PWME2=0; //Stoping PWMo PWME_PWME3=0;
SENSOR CONTROL:
o ATD0CTL1=0x87; // no external triggero ATD0CTL2_ADPU=1; // ATD Enableo ATD0CTL2_ETRIGE=0; // no external triggero ATD0CTL3_S8C=1; // 8 adc channels sequenceo ATD0CTL4_SRES8=1; // 8-bit Resolutiono ATD0CTL5=0x10; // multisequenceo uart0_tx_number(ATD0DR7H); //Analog value channel 7o uart0_tx_number(ATD0DR6H); //Analog value channel 6
o uart0_tx_number(ATD0DR5H); //Analog value channel 5o uart0_tx_number(ATD0DR4H); //Analog value channel 4o uart0_tx_number(ATD0DR3H); //Analog value channel 3o uart0_tx_number(ATD0DR2H); //Analog value channel 2o uart0_tx_number(ATD0DR1H); //Analog value channel 1o uart0_tx_number(ATD0DR0H); //Analog value channel 0
DELAY ROUTINE:
void Delay(unsigned char a);//PROTOTYPEvoid Delay(unsigned char a) //GENERATES DELAY{unsigned int i,j;for(j=1;j<=a;j++) //Delay for(i=0;i<=60000;i++);}
PULSE COUNT:
PWM CONTROL