Jagan Singilesu
Published

Implementation of dashboard using CAN protocol

I am designing a car dashboard using CAN TX, RX, and MPC3204 board. This setup is made possible by the RhodoLABZ board.

AdvancedFull instructions provided2 hours251
Implementation of dashboard using CAN protocol

Things used in this project

Hardware components

rhydolabz
×1
mpc3204
×1

Software apps and online services

keil version 4 or 5

Story

Read more

Custom parts and enclosures

Debugging With the help of Flash Magic

Schematics

BASIC SINGILE LINE DIAGRAM

Best View

Code

NODE A and NODE B

C/C++
/*MAKE SURE CREATE A SEPERATE FILES NODE A IS TX AND NODE B IS RX */




                                ////////NODE A//////////




typedef  unsigned int u32;
typedef   int s32;
typedef unsigned char u8 ;
typedef  char s8;
typedef  unsigned short int u16;
typedef  short int s16;

#define sw1 ((IOPIN0>>14)&1)
 
 typedef struct can1_frame
 {
 	u32 id;
	u32 rtr;
	u32 dlc;
	u32 byteA;
	u32 byteB;
 }CAN1;

 extern void can1_init(void);
 extern void can1_tx(CAN1 );

 extern void timer2_config(void);
 void timer2_disable(void);

 extern unsigned short int adc_read(unsigned char );
 extern void adc_init(void);
 extern void uart0_init(unsigned int );
 extern void uart0_tx(unsigned char );
 extern unsigned char uart0_rx(void);
 extern void uart0_tx_string(char *);
 extern void uart0_tx_hexa(unsigned char );
 extern void uart0_rx_string(char *, unsigned int );
 extern void uart0_tx_int(int );
 extern int uart0_rx_int(void);
 extern void uart0_tx_float(float );

 extern void delay_sec(unsigned int );
 extern void delay_ms(unsigned int );

 void eint0_config(void);



#include <lpc21xx.h>
#include "header.h"

extern int flag,flag1,flag2;
extern CAN1 v1,v2;

void eint0_handler(void)__irq
{
flag++;
if(flag==1)
{
IOCLR0=1<<19;
flag1=1;
}
else if(flag==2)
{
IOSET0=1<<19;
flag2=1;
flag=0;
}
EXTINT=1;
VICVectAddr=0;
}

void eint0_config(void)
{
    PINSEL1|=0x1;
	VICIntSelect = 0;
	VICIntEnable|=(1<<14);
	VICVectCntl1=14|(1<<5);
	VICVectAddr1=(unsigned int)eint0_handler;
	EXTMODE=1;
	EXTPOLAR=0;
}


#include <lpc21xx.h>
#include "header.h"
extern int temp1,temp2;
extern CAN1 v1,v2;
extern int flag4;

void timer1_handler(void)__irq
{
float vout;
   if(flag4)
   {
		v2.id=0x501;
		v2.rtr=0;
		v2.dlc=4;
		vout=((((temp1*3.3)/1023)-0.5)/0.01);
		v2.byteA=vout;
	can1_tx(v2);
	}
	T1IR = 1;
	T1TC=T1PC=0;
	VICVectAddr= 0;
}

void timer2_config(void)
{
	VICIntSelect = 0;
	VICIntEnable|=(1<<5);
	VICVectCntl0=5|(1<<5);
	VICVectAddr0=(unsigned int)timer1_handler;

	T1PC=0;
	T1PR=15000000-1;
	T1TC=0;
	T1MCR=3;	   //reset
	T1MR0=1;	  //1sec
	T1TCR=1;
}

#include <LPC21xx.H>
#include "header.h"
CAN1 v1,v2;
int temp1,temp2,flag=0,flag1,flag2,flag4;

main()
{
IODIR0=7<<17;
IOSET0=7<<17;

uart0_init(9600);
can1_init();
adc_init();
timer2_config();
eint0_config();

while(1)
{ 
if(flag1)
{
flag1=0;
v1.id=0x502;
v1.rtr=0;
v1.dlc=1;
v1.byteA=1;
delay_ms(200);
can1_tx(v1);
delay_ms(200);
flag4=1;
}
if(flag2)
{
flag2=0;
v1.id=0x503;
v1.rtr=0;
v1.dlc=1;
v1.byteA=2;
delay_ms(200);
can1_tx(v1);
delay_ms(200);
flag4=0;
}
if(flag4)
{
temp1=adc_read(2);
temp2=adc_read(1); 
delay_ms(200);
IOCLR0=1<<17;
v1.id=0x500;
v1.rtr=0;
v1.dlc=4;
v1.byteA=((temp2/3.65)-32);
can1_tx(v1);
delay_ms(200);
IOSET0=1<<17;
}
}
}

		  #include <LPC21xx.H>
#include "header.h"
#define TCS ((C2GSR>>3)&1)

void can1_init(void)
{
VPBDIV=1;	          // P60MHZ
PINSEL1|=0X00014000;  // P0.25(RD1)
C2MOD=1;		      // RESET  ON
C2BTR=0X001C001D;	  // SPEED 125Kbps
AFMR=2;			      // ACCEPT INCOMING MESSAGE
C2MOD=0;		      // RESET  OFF
}


void can1_tx(CAN1 v)
{
C2TID1=v.id;
C2TFI1=(v.dlc<<16);

	if(v.rtr==0)
	{
	C2TDA1=v.byteA;
	C2TDB1=v.byteB;
	}
	else
	{
	 C2TFI1|=(1<<30);

	}
	C2CMR=1|(1<<5);
	while(((C2GSR>>3)&1)==0);
}

#include <LPC21xx.H>
#include "header.h"
#define RS 1<<17
#define RW 1<<18
#define EN 1<<19
#define LED ((0xfe)<<16)
void lcd_data(unsigned char data)
{

	IOCLR1=LED;
	IOSET1=((data & 0xf0)<<16);
	IOSET1=RS;
	IOCLR1=RW;
	IOSET1=EN;
	delay_ms(2);
	IOCLR1=EN;

	IOCLR1=LED;
	IOSET1=((data & 0x0f)<<20);
	IOSET1=RS;
	IOCLR1=RW;
	IOSET1=EN;
	delay_ms(2);
	IOCLR1=EN;
}

void lcd_cmd(unsigned char cmd)
{
 	IOCLR1=LED;
	IOSET1=((cmd & 0xf0)<<16);
	IOCLR1=RS;
	IOCLR1=RW;
	IOSET1=EN;
	delay_ms(2);
	IOCLR1=EN;

	IOCLR1=LED;
	IOSET1=((cmd & 0x0f)<<20);
	IOCLR1=RS;
	IOCLR1=RW;
	IOSET1=EN;
	delay_ms(2);
	IOCLR1=EN;
}

void lcd_init(void)
{
 IODIR1=LED;
 PINSEL2=0X0;
 IOCLR1=EN;
 lcd_cmd(0x02);
 lcd_cmd(0x28);
 lcd_cmd(0x0e);
}

void lcd_string(char *ptr)
{
while(*ptr)
lcd_data(*ptr++);
}

void lcd_int(int num)
{
int a[16],i;

if(num==0)
{
lcd_data('0');
return;
}

if(num<0)
{
num=-num;
lcd_data('-');
}

while(num>0)
{
a[i]=num%10+48;
num=num/10;
i++;
}

for(i=i-1 ; i>=0 ; i--)
lcd_data(a[i]);

}

#include<lpc21xx.h>
void delay_sec(unsigned int sec)
{
int a[]={15,60,30,15,15};
unsigned int pclk;
	pclk=a[VPBDIV]*1000000;
	T0PC=0;
	T0PR=pclk-1;
	T0TC=0;
	T0TCR=1;
	while(T0TC<sec);
	T0TCR=0;
}
void delay_ms(unsigned int ms)
{
int a[]={15,60,30,15,15};
unsigned int pclk;
VPBDIV=0;
pclk=a[VPBDIV]*1000;
T0PC=0;
T0PR=pclk-1;
T0TC=0;
T0TCR=1;
while(T0TC<ms);
T0TCR=0;
}


#include <lpc21xx.h>
#include "header.h"

void adc_init(void)
{
	PINSEL1|=0x15400000;
	ADCR=0x00200400;
}

unsigned short int adc_read(unsigned char ch_num)
{

unsigned short int result=0;
ADCR|=(1<<ch_num);

ADCR|=(1<<24);

while(((ADDR>>31)&1)==0);

ADCR^=(1<<24);

ADCR^=(1<<ch_num);

result=(ADDR>>6)& 0X3FF;

return result;
}


#include <lpc21xx.h>
#include "header.h"
#define THRE ((U0LSR>>5)&1)
#define RDR (U0LSR &1)

void uart0_init(unsigned int baud)
{
	unsigned int result;
	int a[]={15,60,30,15,15};
	int pclk=a[VPBDIV]*1000000;
	result=pclk/(16*baud);

	PINSEL0=0x5;
	U0LCR=0X83;
	U0DLL=result & 0xff;
	U0DLM=(result>>8) & 0xff;
	U0LCR=0X3;
}

void uart0_tx(unsigned char data)
{
 	U0THR=data;

	while(THRE==0);
}

unsigned char uart0_rx(void)
{
	 while(RDR==0);
	 return U0RBR;
}
 void uart0_tx_string(char *p)
 {
   while(*p)
   {
   	U0THR=(*p++);
   	while(THRE==0);
   }
 }

 void uart0_tx_hexa(unsigned char data)
 {
 char i,j;
 uart0_tx_string("0x");
 
 i=((data>>4)&0xf);
 if(i<=9)
 uart0_tx(i+48);
 else
 uart0_tx(i+55);

 j=(data & 0xf);
 if(j<=9)
 uart0_tx(j+48);
 else
 uart0_tx(j+55);
 }

 void uart0_rx_string(char *p, unsigned int len)
 {
  int i;
  for(i=0 ; i<len ; i++)
  {
  	while(RDR==0);
	p[i]=U0RBR;
	uart0_tx(p[i]);

		if(p[i] == '\r')
		break;
  }
   p[i]='\0';
 }

void uart0_tx_int(int n)
{
	char a[20];
	int i;
	if(n==0)
	{
	uart0_tx('0');
	return;
	}
	else if(n<0)
	{
		n=-n;
		uart0_tx('-');
	}
	for(i=0 ; n ; i++,n=n/10)
		a[i]=((n%10)+48);
	a[i]='\0';	



	for(i=i-1 ; i>=0 ; i--)
		uart0_tx(a[i]);
}

int uart0_rx_int(void)
{
	char p[20];
	int flag=0,l,i=0,n=0;
	uart0_rx_string(p,19);
	for(l=0 ; p[l] ; l++);
	
	if(p[i]=='-')
	{
	flag=1;
	i=1;
	}
	for( ; i<l ; i++)
	{
		if(p[i]>='0' && p[i]<='9')
		  n=(n*10)+(p[i]-48);
	}

	if(flag==1)
	{
		n=-n;
		flag=0;
	}
	return n;
}

void uart0_tx_float(float f)
 {
 	int i;
 	if(f==0)
	{
	uart0_tx('0');
	return;
	}
	else if(f<0)
	{
		uart0_tx('-');
		f=-f;
	}
	uart0_tx_int(f);
	
	uart0_tx('.');
		   i=f;
 		  f=(f-i)*1000000;
	uart0_tx_int(f);
 }
                             ////////NODE B//////////
                             
                             
#include <lpc21xx.h>
#include "header.h"
#define THRE ((U0LSR>>5)&1)
#define RDR (U0LSR &1)

void uart0_init(unsigned int baud)
{
	unsigned int result;
	int a[]={15,60,30,15,15};
	int pclk=a[VPBDIV]*1000000;
	result=pclk/(16*baud);

	PINSEL0=0x5;
	U0LCR=0X83;
	U0DLL=result & 0xff;
	U0DLM=(result>>8) & 0xff;
	U0LCR=0X3;
}

void uart0_tx(unsigned char data)
{
 	U0THR=data;

	while(THRE==0);
}

unsigned char uart0_rx(void)
{
	 while(RDR==0);
	 return U0RBR;
}
 void uart0_tx_string(char *p)
 {
   while(*p)
   {
   	U0THR=(*p++);
   	while(THRE==0);
   }
 }

 void uart0_tx_hexa(unsigned char data)
 {
 char i,j;
 uart0_tx_string("0x");
 
 i=((data>>4)&0xf);
 if(i<=9)
 uart0_tx(i+48);
 else
 uart0_tx(i+55);

 j=(data & 0xf);
 if(j<=9)
 uart0_tx(j+48);
 else
 uart0_tx(j+55);
 }

 void uart0_rx_string(char *p, unsigned int len)
 {
  int i;
  for(i=0 ; i<len ; i++)
  {
  	while(RDR==0);
	p[i]=U0RBR;
	uart0_tx(p[i]);

		if(p[i] == '\r')
		break;
  }
   p[i]='\0';
 }

void uart0_tx_int(int n)
{
	char a[20];
	int i;
	if(n==0)
	{
	uart0_tx('0');
	return;
	}
	else if(n<0)
	{
		n=-n;
		uart0_tx('-');
	}
	for(i=0 ; n ; i++,n=n/10)
		a[i]=((n%10)+48);
	a[i]='\0';	



	for(i=i-1 ; i>=0 ; i--)
		uart0_tx(a[i]);
}

int uart0_rx_int(void)
{
	char p[20];
	int flag=0,l,i=0,n=0;
	uart0_rx_string(p,19);
	for(l=0 ; p[l] ; l++);
	
	if(p[i]=='-')
	{
	flag=1;
	i=1;
	}
	for( ; i<l ; i++)
	{
		if(p[i]>='0' && p[i]<='9')
		  n=(n*10)+(p[i]-48);
	}

	if(flag==1)
	{
		n=-n;
		flag=0;
	}
	return n;
}

void uart0_tx_float(float f)
 {
 	int i;
 	if(f==0)
	{
	uart0_tx('0');
	return;
	}
	else if(f<0)
	{
		uart0_tx('-');
		f=-f;
	}
	uart0_tx_int(f);
	
	uart0_tx('.');
		   i=f;
 		  f=(f-i)*1000000;
	uart0_tx_int(f);
 }



#include <LPC21xx.H>
#include "header.h"

CAN1 v1,v2;
extern int flag1,flag2,flag3,flag4;	 \
int temp;
main()
{
unsigned char hr,min,dd,mm,yy;
IODIR0=7<<17;
IOSET0=7<<17;
uart0_init(9600);
can1_init();

config_vic_for_can1();
lcd_init();
i2c_init();
//	lcd_string(" NODE B");
	i2c_byte_write_frame(0xD0,0x2,0x42);//hr
	i2c_byte_write_frame(0xD0,0x1,0x13);//min
	i2c_byte_write_frame(0xD0,0x4,0x05);//dd
	i2c_byte_write_frame(0xD0,0x5,0x07);//mm
	i2c_byte_write_frame(0xD0,0x6,0x24);//yyyy
	i2c_byte_write_frame(0xD0,0x0,0x50); //ss	  NOT IN TASK
while(1)
{
		hr=i2c_byte_read_frame(0xD0,0x2);
		min=i2c_byte_read_frame(0xD0,0x1);
		dd=i2c_byte_read_frame(0xD0,0x4);
		mm=i2c_byte_read_frame(0xD0,0x5);
		yy=i2c_byte_read_frame(0xD0,0x6);
	//	ss=i2c_byte_read_frame(0xD0,0x0);  NOT IN TASK

			if((hr>>6)&1)
			hr=hr^(1<<6);
			if((hr>>5)&1)
			hr=hr^(1<<5);
		lcd_cmd(0x80);
		lcd_data((hr/0x10)+48);
		lcd_data((hr%0x10)+48);
		lcd_data(':');
		lcd_data((min/0x10)+48);
		lcd_data((min%0x10)+48);
		lcd_data(' ');
		lcd_data((dd/0x10)+48);
		lcd_data((dd%0x10)+48);
	   	lcd_data(':');
		lcd_data((mm/0x10)+48);
		lcd_data((mm%0x10)+48);
		lcd_data(':');
		lcd_data('2');
		lcd_data('0');
		lcd_data((yy/0x10)+48);
		lcd_data((yy%0x10)+48);
		
		if(flag3)
		{
		flag3=0;
		IOCLR0=7<<17;
		lcd_cmd(0x01);
		lcd_string("Engine start");
		delay_ms(500);
		}
		if(flag4)
		{
		flag4=0;
		IOSET0=7<<17;
		lcd_cmd(0x01);
		lcd_string("Engine stop");
		delay_ms(500);
		}
		if(flag1==1)
		{
		flag1=0;
		lcd_cmd(0xc0);
		lcd_string("Tem:");
		lcd_data(((v1.byteA)/10)+48);
		lcd_data(((v1.byteA)%10)+48);
		lcd_data('C');
		
		}
		if(flag2==1)
		{
		flag2=0;
		lcd_cmd(0xc8);
		lcd_string("Kmph:");
		lcd_data(((v1.byteA)/100)+48);
		lcd_data((((v1.byteA)/10)%10)+48);
		lcd_data(((v1.byteA)%10)+48);
		} 
	}
}


#include <LPC21xx.H>
#include "header.h"
#define RS 1<<17
#define RW 1<<18
#define EN 1<<19
#define LED ((0xfe)<<16)
void lcd_data(unsigned char data)
{

	IOCLR1=LED;
	IOSET1=((data & 0xf0)<<16);
	IOSET1=RS;
	IOCLR1=RW;
	IOSET1=EN;
	delay_ms(2);
	IOCLR1=EN;

	IOCLR1=LED;
	IOSET1=((data & 0x0f)<<20);
	IOSET1=RS;
	IOCLR1=RW;
	IOSET1=EN;
	delay_ms(2);
	IOCLR1=EN;
}

void lcd_cmd(unsigned char cmd)
{
 	IOCLR1=LED;
	IOSET1=((cmd & 0xf0)<<16);
	IOCLR1=RS;
	IOCLR1=RW;
	IOSET1=EN;
	delay_ms(2);
	IOCLR1=EN;

	IOCLR1=LED;
	IOSET1=((cmd & 0x0f)<<20);
	IOCLR1=RS;
	IOCLR1=RW;
	IOSET1=EN;
	delay_ms(2);
	IOCLR1=EN;
}

void lcd_init(void)
{
 IODIR1=LED;
 PINSEL2=0X0;
 IOCLR1=EN;
 lcd_cmd(0x02);
 lcd_cmd(0x28);
 lcd_cmd(0x0e);
 lcd_cmd(0x01);
}

void lcd_string(char *ptr)
{
while(*ptr)
lcd_data(*ptr++);
}

void lcd_int(int num)
{
int a[16],i;

if(num==0)
{
lcd_data('0');
return;
}

if(num<0)
{
num=-num;
lcd_data('-');
}

while(num>0)
{
a[i]=num%10+48;
num=num/10;
i++;
}

for(i=i-1 ; i>=0 ; i--)
lcd_data(a[i]);

}


#include <lpc21xx.h>
#include "header.h"

void adc_init(void)
{
	PINSEL1|=0x15400000;
	ADCR=0x00200400;
}

short int adc_read(unsigned char ch_num)
{

short int result=0;
ADCR|=(1<<ch_num);

ADCR|=(1<<24);

while(((ADDR>>31)&1)==0);

ADCR^=(1<<24);

ADCR^=(1<<ch_num);

result=(ADDR>>6)& 0X3FF;

return result;
}


#include <LPC21xx.H>
#include "header.h"
#define TCS ((C2GSR>>3)&1)

int flag1,flag2,flag3,flag4;
extern CAN1 v1,v2;

void can1_init(void)
{
VPBDIV=1;	          // 60MHZ
PINSEL1|=0X00014000;  // P0.25(RD1)
C2MOD=1;		      // RESET ON MODE
C2BTR=0X001C001D;	  // SPEED125Kbps
AFMR=2;			      // ACCEPTING MESSAGE
C2MOD=0;		      // RESET OFF MODE
}

void can1_rx_handler(void)__irq
{
 v1.id=C2RID;
 v1.rtr=((C2RFS>>30)&1);
 v1.dlc=((C2RFS>>16)&0xf);

// v2.id=C2RID;
// v2.rtr=((C2RFS>>30)&1);
// v2.dlc=((C2RFS>>16)&0xf);
 
 	if(v1.rtr==0)
 	{
		if(v1.id==0x500)
		{
		flag1=1;
		 v1.byteA=C2RDA;
		 v1.byteB=C2RDB;
	    }
   }
    	
   if(v1.rtr==0)
 	{	
		if(v1.id==0x501)
		{
		flag2=1;
		 v1.byteA=C2RDA;
		 v1.byteB=C2RDB;
	    }
   }
   if(v1.rtr==0)
 	{
		if(v1.id==0x502)
		{
		  flag3=1;
		// v1.byteA=C2RDA;
	//	 v1.byteB=C2RDB;
	    }
  }
if(v1.rtr==0)
{
	if(v1.id==0x503)
	{
	flag4=1;
//	 v1.byteA=C2RDA;
//	 v1.byteB=C2RDB;
    }
}
 C2CMR=(1<<2);
 VICVectAddr=0;
}

void config_vic_for_can1(void)
{
VICIntSelect=0;
VICVectAddr1=(unsigned int)can1_rx_handler;
VICVectCntl1=27|(1<<5);
VICIntEnable|=(1<<27);
C2IER=1;  // EN CAN1 RX INTRRUPT
}


#include<lpc21xx.h>
void delay_sec(unsigned int sec)
{
int a[]={15,60,30,15,15};
unsigned int pclk;
	pclk=a[VPBDIV]*1000000;
	T0PC=0;
	T0PR=pclk-1;
	T0TC=0;
	T0TCR=1;
	while(T0TC<sec);
	T0TCR=0;
}
void delay_ms(unsigned int ms)
{
int a[]={15,60,30,15,15};
unsigned int pclk;
VPBDIV=0;
pclk=a[VPBDIV]*1000;
T0PC=0;
T0PR=pclk-1;
T0TC=0;
T0TCR=1;
while(T0TC<ms);
T0TCR=0;
}


#include <lpc21xx.h>
#include "header.h"
#define THRE ((U0LSR>>5)&1)
#define RDR (U0LSR &1)

void uart0_init(u32 baud)
{
	u32 result;
	int a[]={15,60,30,15,15};
	int pclk=a[VPBDIV]*1000000;
	result=pclk/(16*baud);

	PINSEL0=0x5;
	U0LCR=0X83;
	U0DLL=result & 0xff;
	U0DLM=(result>>8) & 0xff;
	U0LCR=0X3;
}

void uart0_tx(u8 data)
{
...

This file has been truncated, please download it to see its full contents.

Credits

Jagan Singilesu
4 projects • 2 followers
Research and Development in Embedded
Contact

Comments

Please log in or sign up to comment.