Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 09.06.2020, 14:00   #1
alex_new_2030
Senior Member
 
Аватар для alex_new_2030
 
Регистрация: 26.02.2007
Адрес: Deutschland
Возраст: 41
Сообщений: 207
Вес репутации: 105/54
alex_new_2030 will become famous soon enoughalex_new_2030 will become famous soon enough
Отправить сообщение для alex_new_2030 с помощью ICQ
По умолчанию Мониторинг сообщения по CAN в авто pic18f25k80

Здравствуйте!
Имеется задача читать сообщения с ид 0х201 из кан шины машины со скоростью 125 кбод/с. Само устройство хочу сделать из китайского шнурка elm327 с 25к80. Пока шнурок не пришел, пишу программу для него. С кан в пиках еще ни разу не работал. К тому же узнал , что ни в протеусе ни в мплаб х работу кан не просимулировать.
После чтения разной литературы и примеров набросал код для чтения сообщений с ид 0х201. Я так понимаю что салонный кан использует стандартную 11бит идентификацию. Гляньте пожалуйста мой получившийся код. Я не уверен в настройках кан: скорость, буфера, маски и фильтры.

Код:
#include <p18cxxx.h>
#include "ECAN.h"
#define SIM 1//для отладки раcкоментировать

/*********************************************************************
*
*                            Global Variables 
*
*********************************************************************/
unsigned char temp_EIDH;    //Extended Identifier, high byte
unsigned char temp_EIDL;    //Extended Identifier, low byte
unsigned char temp_SIDH;    //Standard Identifier, high byte
unsigned char temp_SIDL;    //Standard Identifier, low byte
unsigned char temp_DLC;     //Data Length Control value, 0 to 8
unsigned char temp_D0;      //Data byte 0 through...
unsigned char temp_D1;
unsigned char temp_D2;
unsigned char temp_D3;
unsigned char temp_D4;
unsigned char temp_D5;
unsigned char temp_D6;
unsigned char temp_D7;      //Data byte 7



/*********************************************************************
*
*     Function: Initialize the CAN Module
*
*********************************************************************/
void InitECAN(void)
{
    //настройка порта для кан
    TRISBbits.TRISB3 = 1;
	TRISBbits.TRISB2 = 0;

    // Place CAN module in configuration mode, see CANCON register data
    CANCON = 0x80;    //REQOP bits <2:0> = 0b100
    //while(!(CANSTATbits.OPMODE ==0x04));    //Wait for op-mode bits in the
                                            //CANSTAT register to = 0b100
                                            //to indicate config mode OK
#ifndef SIM
    while (!(CANSTAT & 0b10000000));
#endif
    // Enter CAN module into Mode 0, standard legacy mode; see ECANCON register
    ECANCON = 0x00;
        //  1/125000*=*0,000008us=Tbit кол-во выборок(SJW =1
//                                                      + PHSEG1 8
//                                                      + PHSEG2 6
//                                                      +PROPSEG 1
//                                                       )= (1+8+6+1)=16
//        // Tq=Tbit/16=0,000008/16=0,0000005s= 0.5us
    //  TQ=2*(BRP+1)/Fosc
    //  BRP=Tq*Fosc/2-1     =0,0000005*16000000/2-1=3
    //  2*(b+1)=tq*f
    //b+1=tq*f/2
    //b=tq*f/2-1

    BRGCON1 = 0b00000011; //0000 0011     //SJW=1     BRP  3
    BRGCON2 = 0b10111000; //10 111 000     //SEG2PHTS 1    sampled once  PS1=8TQ  PropagationT 1TQ  
    BRGCON3 = 0b10000101; //10000 101     //PS2  6TQ 

    // Initialize Receive Masks, see registers RXMxEIDH, RXMxEIDL, etc...
    // Mask 0 (M0) will accept NO extended addresses, but any standard address
    RXM0EIDH = 0x00;    // Extended Address receive acceptance mask, high byte 
    RXM0EIDL = 0x00;    // Extended Address receive acceptance mask, low byte
    RXM0SIDH = 0x07;    // Standard Address receive acceptance mask, high byte
    RXM0SIDL = 0xFF;    // Standard Address receive acceptance mask, low byte
    
    // Mask 1 (M1) will accept NO extended addresses, but any standard address
    RXM1EIDH = 0x00;    // Extended Address receive acceptance mask, high byte    
    RXM1EIDL = 0x00;    // Extended Address receive acceptance mask, low byte
    RXM1SIDH = 0x07;    // Standard Address receive acceptance mask, high byte
    RXM1SIDL = 0xFF;    // Standard Address receive acceptance mask, low byte
    
    // Mode 0 allows use of receiver filters RXF0 through RXF5. Enable filters
    // RXF0 and RXF1, all others disabled. See register RXFCONn.
    //  Only using two filters
    RXFCON0 = 0x01;     //Enable Filter-0 and Filter-1; disable others 
    RXFCON1 = 0x00;     //Disable Filters 8 through 15
    
  //получаем только 0x0201 
    RXF0EIDH = 0x00;    //Extended Address Filter-0 unused, set high byte to 0
    RXF0EIDL = 0x00;    //Extended Address Filter-0 unused, set low byte to 0
    RXF0SIDH = 0x02;    //Standard Address Filter-0 high byte set to 0x02
    RXF0SIDL = 0x01;    //Standard Address Filter-0 low byte set to 0x01

//    RXF2EIDH = 0x00;    //Extended Address Filter-0 unused, set high byte to 0
//    RXF2EIDL = 0x00;    //Extended Address Filter-0 unused, set low byte to 0
//    RXF2SIDH = 0x33;    //Standard Address Filter-0 high byte set to 0x33
//    RXF2SIDL = 0xC0;    //Standard Address Filter-0 low byte set to 0xC0
    
    // After configuring CAN module with above settings, return it
    // to Loop mode
    CANCON = 0b01100000;//режим монитрора шины
    //while(CANSTATbits.OPMODE==0x02);        //Wait for op-mode bits in the
                                            //CANSTAT register to = 0b010
                                            //to indicate Loop mode OK
#ifndef SIM
    while (!(CANSTAT & 0b01100000));//ждем переключения режима
#endif
    
    // Set Receiving Modes for receiver buffers 0 and 1
    RXB0CON = 0x00;     // See register RXB0CON
    RXB1CON = 0x00;     // See register RXB1CON    
    
    
}

/*********************************************************************
*
*     Function: Check the buffers to determine if they have messages
*               if so, transfer the info to the temporary-storage
*               variables. Note: Messages to receiver 0 or 1 get saved in
*               the same variables.  This id done for simplicity in
*               this example. You could save messages to separate
*               variables, or in separate arrays, if you wish. 
*
*********************************************************************/
unsigned char ECAN_Receive(void)
{
    unsigned char RXMsgFlag;    // Temporary storage for message flag
    RXMsgFlag = 0x00;           // Set message flag to zero to start
    
    if (RXB0CONbits.RXFUL)      // Check RXB0CON bit RXFUL to see if RX Buffer 0
                                // has received a message, if so, get the
                                // associated data from the buffer and save it.
    {
        temp_EIDH = RXB0EIDH;
        temp_EIDL = RXB0EIDL;
        temp_SIDH = RXB0SIDH;
        temp_SIDL = RXB0SIDL;
        temp_DLC =  RXB0DLC;
        temp_D0 =   RXB0D0;
        temp_D1 =   RXB0D1;
        temp_D2 =   RXB0D2;
        temp_D3 =   RXB0D3;
        temp_D4 =   RXB0D4;
        temp_D5 =   RXB0D5;
        temp_D6 =   RXB0D6;
        temp_D7 =   RXB0D7;
        RXB0CONbits.RXFUL = 0;      // Reset buffer-0-full bit to show "empty"
        RXMsgFlag = 0x01;           // Set message flag to 1
    }
    else if (RXB1CONbits.RXFUL) // Check RXB1CON bit RXFUL to see if RX Buffer 1
                                // has received a message, if so, get the
                                // associated data from the buffer and save it.
    {
        temp_EIDH = RXB1EIDH;
        temp_EIDL = RXB1EIDL;
        temp_SIDH = RXB1SIDH;
        temp_SIDL = RXB1SIDL;
        temp_DLC =  RXB1DLC;
        temp_D0 =   RXB1D0;
        temp_D1 =   RXB1D1;
        temp_D2 =   RXB1D2;
        temp_D3 =   RXB1D3;
        temp_D4 =   RXB1D4;
        temp_D5 =   RXB1D5;
        temp_D6 =   RXB1D6;
        temp_D7 =   RXB1D7;
        RXB1CONbits.RXFUL = 0;      //Reset buffer-1-full bit to show "empty"
        RXMsgFlag = 0x01;           // Set message flag to 1
    }
    else if (B0CONbits.RXFUL) //CheckB0
    {
        temp_EIDH = B0EIDH;
        temp_EIDL = B0EIDL;
        temp_SIDH = B0SIDH;
        temp_SIDL = B0SIDL;
        temp_DLC = B0DLC;
        temp_D0 = B0D0;
        temp_D1 = B0D1;
        temp_D2 = B0D2;
        temp_D3 = B0D3;
        temp_D4 = B0D4;
        temp_D5 = B0D5;
        temp_D6 = B0D6;
        temp_D7 = B0D7;
        
        B0CONbits.RXFUL = 0;
        RXMsgFlag = 0x01;
    }
    
    if  (RXMsgFlag == 0x01)     // Test message flag.
                                // if message flag is a 1...
    {
        RXMsgFlag = 0x00;       // Clear the message flag
        PIR5bits.RXB1IF = 0;    // Clear the Buffer-1 interrupt bit (if used) 
        return TRUE;            // Return a "true" condition to the code that
                                // called the ECAN_Receive function.
    }
    else
    {
        return FALSE;           // Otherwise, return a false condition.
    }    
}
alex_new_2030 вне форума   Ответить с цитированием
Старый 12.06.2020, 17:21   #2
Lunatic
Senior Member
 
Аватар для Lunatic
 
Регистрация: 26.03.2007
Сообщений: 137
Вес репутации: 102/53
Lunatic will become famous soon enoughLunatic will become famous soon enough
По умолчанию Re: Мониторинг сообщения по CAN в авто pic18f25k80

Есть рабочее устройство как раз на таком контроллере. Вот тебе пара мыслей...

Код:
void allini(void){
// настройка CAN модуля
	CANCON=0x80;		// режим конфигурации
		
	PIE5bits.RXB0IE=1;				// прерывание от буффера 0
	PIE5bits.RXB1IE=1;				// прерывание от буффера 1
	PIE5bits.TXB0IE=1;				// прерывание от передающего буффера 0

	WAKIE=1;				// CAN может будить
	ERRIE=1;
// настройки скорости  (в процедуре MaskFilterLoad )
	BRGCON1=0x00;  	BRGCON2=0xB8;  	BRGCON3=0x05;	// 500 
// насройка приемных буферов
	RXB0CON=0b00100000;
// насройка масок
	RXM1SIDH=0xFF;
	RXM1SIDL=0xE0;
	RXM0SIDH=0xFF;
	RXM0SIDL=0xE0;
			// настройка фильтров		
	RXF0SIDH=0x00;   // 200 - запрос на диагностику
	RXF0SIDL=0x00;
	RXF1SIDH=0x00;   // входящий ID со стороны диагнозы
	RXF1SIDL=0x00;
	
	RXF2SIDH=0xFF;	 // 7FF - программирование
	RXF2SIDL=0xE0;
	
	RXF3SIDH=0x41;	 // 0x068
	RXF3SIDL=0x00;
	RXF4SIDH=0x00;
	RXF4SIDL=0x00;
	RXF5SIDH=0x00;
	RXF5SIDL=0x00;

    RXFCON0=0b11000000;

}
А прием в прерывании

Код:
if (RXB0IF==1){
          FBuf[0]=RXB0SIDH; FBuf[1]=RXB0SIDL; FBuf[2]=RXB0D0; FBuf[3]=RXB0D1; FBuf[4]=RXB0D2; FBuf[5]=RXB0D3;
		 				                      FBuf[6]=RXB0D4; FBuf[7]=RXB0D5; FBuf[8]=RXB0D6; FBuf[9]=RXB0D7;
         RXB0CON=RXB0CON&0x7F;  RXB0IF=0;
	     SleepT=0x0F; 
		 inFrame=1;    
	}
	if (RXB1IF==1){
         FBuf[0]=RXB1SIDH; FBuf[1]=RXB1SIDL; FBuf[2]=RXB1D0; FBuf[3]=RXB1D1; FBuf[4]=RXB1D2; FBuf[5]=RXB1D3;
			  	    						 FBuf[6]=RXB1D4; FBuf[7]=RXB1D5; FBuf[8]=RXB1D6; FBuf[9]=RXB1D7;

	   RXB1CON=RXB1CON&0x7F;    RXB1IF=0;
 	   SleepT=0x0F; 
	   inFrame=1;
	}
Только учтите, что нужен будет по меньшей мере PicKit3. Пока идет шнурок... )))

Последний раз редактировалось Lunatic; 12.06.2020 в 17:26. Причина: Дополнение
Lunatic вне форума   Ответить с цитированием
Старый 14.06.2020, 11:22   #3
alex_new_2030
Senior Member
 
Аватар для alex_new_2030
 
Регистрация: 26.02.2007
Адрес: Deutschland
Возраст: 41
Сообщений: 207
Вес репутации: 105/54
alex_new_2030 will become famous soon enoughalex_new_2030 will become famous soon enough
Отправить сообщение для alex_new_2030 с помощью ICQ
По умолчанию Re: Мониторинг сообщения по CAN в авто pic18f25k80

Спасибо за пример.
Цитата:
Сообщение от Lunatic Посмотреть сообщение
Только учтите, что нужен будет по меньшей мере PicKit3. Пока идет шнурок... )))
Шнурок пришел. от сюда https://www.microchip.com/forums/m647173.aspx скачал pk2devicefile для пиккита2. Прошивает нормально pic18f25k80. Уже получилось поморгать светодиодами.
Пока не могу разобраться с фильтрами и масками. в кан анализаторе пытаюсь маской и фильтром выделить только посылки и ид 0х201, но пока неудачно.
alex_new_2030 вне форума   Ответить с цитированием
Старый 14.06.2020, 14:25   #4
Lunatic
Senior Member
 
Аватар для Lunatic
 
Регистрация: 26.03.2007
Сообщений: 137
Вес репутации: 102/53
Lunatic will become famous soon enoughLunatic will become famous soon enough
По умолчанию Re: Мониторинг сообщения по CAN в авто pic18f25k80

У микрочипа есть утилитка ECAN Bit Rate Calculator или как-то так, она сразу выплевывает настройки регистров для нужной скорости кан.

И да.
ID 201 - это SIDH: 40 SIDL: 20

а не: SIDH: 02 SIDL: 01
Lunatic вне форума   Ответить с цитированием
Старый 20.06.2020, 20:20   #5
alex_new_2030
Senior Member
 
Аватар для alex_new_2030
 
Регистрация: 26.02.2007
Адрес: Deutschland
Возраст: 41
Сообщений: 207
Вес репутации: 105/54
alex_new_2030 will become famous soon enoughalex_new_2030 will become famous soon enough
Отправить сообщение для alex_new_2030 с помощью ICQ
По умолчанию Re: Мониторинг сообщения по CAN в авто pic18f25k80

Спасибо большое! Все заработало.
alex_new_2030 вне форума   Ответить с цитированием
Ответ

Метки
can-bus


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем/как отлаживать код написаный на Си в WinAVR Yokel Микроконтроллеры других производителей 49 30.09.2014 09:48
Присоветуйте тип и способ управления MOSFETом "верхнего" плеча dr_Sash Источники питания и силовая электроника 37 08.09.2012 18:50
Подскажите по "Парковочным датчикам" от авто Синклер Общетехнические вопросы 17 09.09.2008 21:24
gprs тарификация (конкретнее- по sim300) MaxB Общетехнические вопросы 4 21.08.2008 20:16


Часовой пояс GMT +3, время: 15:57.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot