Social Icons

Thứ Ba, 12 tháng 11, 2013

PIC16F Giao Tiếp CAN BUS

                                             SOURCE
*******************************
Project : PIC16F Giao Tiếp Mạng CAN
Date    : 11-Nov-2013
Author  : quinguyen
Company : Vinasemiconductor
Chip type               : PIC16F876
Program type            : Application

Core Clock frequency: 20.000000 MHz
*******************************

                                             TRẠM 1

#include <16F876.h>
#fuses HS,NOPROTECT,NOLVP,WDT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define CAN_DO_DEBUG TRUE
#define PIN_LED1  PIN_B1
#define PIN_LED2  PIN_B2
#define LED1_HIGH output_high(PIN_LED1)
#define LED1_LOW  output_low(PIN_LED1)
#define LED2_HIGH output_high(PIN_LED2)
#define LED2_LOW  output_low(PIN_LED2)
int16 ms;
#int_timer2
void isr_timer2(void) {
   ms++;        
}

#define ASK_TO_ID_AD   0x201
#define ASK_TO_ID_LED  0x202

void main() {
   struct rx_stat rxstat;
   int32 rx_id;
   int buffer[8];
   int rx_len;
   int i,k=10,x=99;
   setup_wdt(WDT_2304MS);
   setup_port_a(RA0_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   setup_timer_2(T2_DIV_BY_4,53,3);
   can_init();
   enable_interrupts(INT_TIMER2);                       //Cho phép ngắt Timer2
   enable_interrupts(GLOBAL);                             //Cho phép tất cả ngắt
   LED1_HIGH;
   LED2_HIGH;
   delay_ms(1000); 
   LED1_LOW;
   LED2_LOW;
   while(TRUE)
   {
restart_wdt();
i=read_adc();                                                                   // Đọc ADC
can_putd(ASK_TO_ID_LED, &i, 1,1,1,0);                   //Đưa dữ liệu vào bộ đệm
      if ( can_kbhit() )   //if data is waiting in buffer...
       restart_wdt();
         if(can_getd(rx_id, &buffer[0], rx_len, rxstat)) {      // Lấy dữ liệu từ bộ đệm
            if (rx_id == ASK_TO_ID_LED) {
            LED1_HIGH;
            LED2_LOW;
            }
            if (rx_id == ASK_TO_ID_AD) {
               LED2_HIGH;
               LED1_LOW;
            }
         }
      }
      
   }

}
                                                                      TRẠM 2

#include <16F876.h>
#fuses HS,NOPROTECT,NOLVP,WDT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define CAN_DO_DEBUG TRUE
#define PIN_LED1  PIN_B1
#define PIN_LED2  PIN_B2
#define LED1_HIGH output_high(PIN_LED1)
#define LED1_LOW  output_low(PIN_LED1)
#define LED2_HIGH output_high(PIN_LED2)
#define LED2_LOW  output_low(PIN_LED2)
#define LCD_RS PIN_A3                      
#define LCD_RW PIN_A2
#define LCD_EN PIN_A1
#define LCD_D4 PIN_B4              
#define LCD_D5 PIN_B5
#define LCD_D6 PIN_B6
#define LCD_D7 PIN_B7

#include "lcd_qui.c"

int16 ms;
   int8 str[20];
   int8 x;
 
#int_timer2
void isr_timer2(void) {
   ms++;              
}
#define RESPOND_TO_ID_AD   0x201
#define RESPOND_TO_ID_LED  0x202
void khoitaoLCD(void)
{
 restart_wdt();
   LCD_Init();
   delay_ms(10);
   sprintf(str,"CAN DEMO");
   LCD_Gotoxy(4,0);
   LCD_Puts(str);
   delay_ms(1000);
   LCD_Clear();
   LCD_Gotoxy(1,0);
   sprintf(str,"CAN INTERFACE");
   LCD_Puts(str);
   LCD_Gotoxy(1,1);
   sprintf(str,"CAN DATA :");
   LCD_Puts(str);
}
void main() {
   struct rx_stat rxstat;
   int32 rx_id;
   int buffer[8];
   int rx_len;
   int i,k=10,w=22;
   setup_wdt(WDT_2304MS);
   setup_port_a(RA0_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   for(i=0;i<8;i++) {
      buffer[i]=0;
   }
   LED1_HIGH;
   LED2_HIGH;
   delay_ms(100);
   LED1_LOW;
   LED2_LOW;
 khoitaoLCD();
   setup_timer_2(T2_DIV_BY_4,53,3);
   delay_ms(100);
   can_init();
   enable_interrupts(INT_TIMER2);        //Cho phép ngắt Timer2
   enable_interrupts(GLOBAL);              //Cho phép tất cả ngắt
   while(TRUE)
   {
LED2_HIGH;
delay_ms(50);
LED2_LOW;
delay_ms(50);
 restart_wdt();
      if ( can_kbhit() )                             //Nếu có dữ liệu đợi trong bộ đệm
      { LED1_HIGH;
         if(can_getd(rx_id, &buffer[0], rx_len, rxstat)) {    //...Lấy dữ liệu từ bộ đệm
            if (rx_id == RESPOND_TO_ID_LED) {
                  LCD_Gotoxy(11,1);                                 // Hiển thị lên LCD
                  sprintf(str,"%u",buffer[0]);
                  LCD_Puts(str);
              LED1_HIGH;
              LED2_LOW;
            }
         }
      }
   
   }

}

                                     SƠ ĐỒ MẠCH ĐIỆN VÀ KẾT QUẢ




Mô tả: Trạm 1 đọc ADC được chỉnh từ biến trở sau đó gửi đến Trạm 2 theo giao thức CAN

Sơ đồ mạch cho 2 Trạm như nhau hết, mình đã làm và hoạt động rất tốt, chúc các bạn thành công! Phần lý thuyết các bạn tìm hiểu trên các diễn đàn khác nhé, ai ko rõ có thể liên hệ mình.

Thanks and Best Regards 

Nguyễn Ngọc Qui
Automation Engineer
Email: quinguyentgvn@gmail.com
Phone: 0938 430 305

0 nhận xét:

Đăng nhận xét

 

Sample text

Sample Text

Sample Text