1. CAN (Controller Area Network) transmitters (TX) and receivers (RX)
2. MPC3204 board for RTC (Real-Time Clock) functionality
3. LCD display
4. Potentiometer for simulating engine temperature and speed
You're using the RhodoLABZ board to connect and program these components.
Here's a summary of your setup:
- CAN TX:
- Sends data (engine temperature and speed) from pontiometer inputs
- CAN RX:
- Receives data from CAN TX
- Connected to LCD display for showing data
- Connected to MPC3204 board for RTC functionality
I am designing a car dashboard using CAN TX, RX, and MPC3204 board. With the help of CAN TX, I can send data (engine temperature and speed) using potentiometer inputs. On the CAN receiver side, I am connecting an LCD display and MPC3204 board for RTC purposes. This setup is made possible by the RhodoLABZ board.
Connections:
Rydholaz boards - 2 (connect CAN H - CAN H AND CAN L -CAN L)
MPC3204 - 1 (In Rydholabz P0.3 CONNECT DATA PIN IN MPC3204 and P0.2 is CONNECT TO CLK PIN)
/*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.
Comments
Please log in or sign up to comment.