历史上的今天

今天是:2024年08月27日(星期二)

正在发生

2020年08月27日 | PIC18F45K80 CAN通讯示例代码

发布者:数据梦行者 来源: eefocus关键字:PIC18F45K80  CAN  通讯示例 手机看文章 扫描二维码
随时随地手机看文章

这里转载的是别人现成的代码,进行了实际的编译和下载运行,罗列了实际运行中出现的问题,主要是证明代码的可靠性。


1、新建工程、选择好器件、选择编译环境,我当时选择的是C:Program Files (x86)Microchipmplabc18v3.47文件夹下的C18编译器。实际操作时,我当时误选了_mplink.exe,实际上选择的应该是mplink.exe文件。编译时出现错误,重新选择后,错误消除。


2、文件如下


源文件


main.c 


#pragma config XINST = OFF                                                  // CONFIG1L

#pragma config FOSC = INTIO2, FCMEN = OFF, IESO = OFF ,PLLCFG = OFF         // CONFIG1H

#pragma config BOREN = OFF, BORV = 0                        // CONFIG2L

#pragma config WDTEN = OFF                                    // CONFIG2H

/** I N C L U D E S **************************************************/

#include "main.h"

 

unsigned char CAN_RecFLAG=0;

unsigned char Flag50ms = 0;

 

// AD采样的数据变量

unsigned int VoltageEdlc[5];

unsigned int VoltageBat;

unsigned int Current1;

unsigned int Current2;

unsigned int Temperature1;

unsigned int Temperature2;

 

void InterruptHandler(void);

 

#pragma code high_vector=0x08

void high_interrupt (void)

{

_asm GOTO InterruptHandler _endasm

}

#pragma code

 

#pragma code low_vector=0x18

void low_interrupt (void)

{

_asm GOTO InterruptHandler _endasm

}

#pragma code

 

#pragma interruptlow InterruptHandler

#pragma interrupt InterruptHandler

void InterruptHandler(void)

      static unsigned char Tick = 0;

  static unsigned char ChannelNo = 0;

 

      // 定时器0

  if(INTCONbits.TMR0IF&&INTCONbits.TMR0IE)     // timer0 = 10ms

  {

INTCONbits.TMR0IF = 0;

TMR0H = 0x63;     

         TMR0L = 0xBF;

Tick++;

if(Tick ==200)

{

Flag50ms = 1;     // 5s发送CAN消息到ECU

Tick = 0;

LATCbits.LATC5 = ~LATCbits.LATC5;

}

  }

 

      // CAN接收数据

      if(PIR5bits.RXB0IF==1)

  {

CAN_RecFLAG=1;

PIR5bits.RXB0IF=0; // 清接收中断标志

RXB0CONbits.RXFUL=0; // 清除标志,接收新报文

  }

 

 

 

 

 

}

 

#pragma code

 

void main(void)

{

unsigned int EDLC_temp[4];

 

INTCON=0x00;

InitInterOSC();

InitPORT();

InitCan();

Timer0_Init();

// INTCON=0xc0; //使能中断 1100 0000

INTCONbits.GIE=1;

    INTCONbits.PEIE=1;

  //  INTCONbits.GIEL=1;

  //  TXB0CONbits.TXREQ = 0;

  

    while(1)

{

if(CAN_RecFLAG==1)

{

CAN_RecFLAG = 0;

 

TXB0D0=1;          /* 写发送缓冲器数据区数据初值 */

TXB0D1=2;

TXB0D2=3;           

TXB0D3=4;

TXB0D4=5;

    TXB0D5=6;

    TXB0D6=7;

    TXB0D7=8;

TXB0CONbits.TXERR = 0;

TXB0CONbits.TXREQ=1; //请求发送,TXREQ=1

// while(TXB0CONbits.TXREQ){;}

while(!PIR5bits.TXB0IF){;}

 

Delay10KTCYx(1000);

            Delay10KTCYx(1000);

  }

    }

}



SysInit.c 


#include "main.h"

#include "p18f45k80.h"

 

void InitInterOSC(void)

{

// Set the internal oscillator to 64MHz

   OSCCONbits.IRCF = 7;         // 16 M

   OSCTUNEbits.PLLEN = 0;

}

 

void InitPORT(void)

{

/*

      RE2         RE1       RE0   RA5  RA3  RA2  RA1  RA0 

      AN7         AN6       AN5   AN4  AN3  AN2  AN1  AN0    : ANCON0

    Current2    Current1   BatV   C5   C4   C3   C2   C1 

                       RB0      RB4    RB1 

    X  X  X   X   X    AN10     AN9    AN8                   : ANCON1

                               temp2   temp1

*/

    ANCON0 = 0xff;

    ANCON1 = 0x03;           // 模拟/数字口选择

    TRISA = 0b00101111;      // RA方向寄存器

    TRISB = 0b11111010;      // RB方向寄存器

TRISC = 0b00000000;      // RC方向寄存器

TRISD = 0b10010000;      // RD方向寄存器

TRISE = 0b00001111;      // RE方向寄存器

    LATCbits.LATC1 = 0;      // disable buck

LATCbits.LATC2 = 0;      // disable boost

    LATCbits.LATC4 = 1;      // enable Aux power

}

 

// 使用16位定时器,使用内部时钟16Mhz,周期是4/16M = 0.25uS, TMR0H=TMR0L=0.定时时间2^16 = 65535/4uS=16.383mS

void Timer0_Init(void)

{

   // RCONbits.IPEN=1;              //打开中断高低优先级

    INTCONbits.TMR0IE = 1;          // 允许定时器0溢出中断

    INTCONbits.TMR0IF = 0;          // 清除中断标志

   // INTCON2bits.TMR0IP = 0;       // 设置定时器0中断为低优先级

    

    T0CON = 0b00001000;            // 定时器0设定为16位定时器,内部时钟触发,不使用分频器

   // T0CON = 0b00000001;          // 定时器0设定为16位定时器,内部时钟触发,使用分频器,1:4分频比

    TMR0H = 0x63;                  // clear timer - always write upper byte first

    TMR0L = 0xBF;                  // timer = 10ms

 

//   INTCONbits.GIE=1;

 //  INTCONbits.PEIE=1;

 //  INTCONbits.GIEL=1;

   T0CONbits.TMR0ON=1;

}

 

// need to set to 500kbps,standard frame

void InitCan(void)

{

TRISB=(TRISB|0x08)&0xFB; //设置CANRX/RB3为输入,CANTX/RB2为输出

 

CANCON = 0x80;

while(CANSTAT&0x80==0){;}

 

// 500Kbps@16M

    BRGCON1 = 0x00; //0000 0100     

    BRGCON2 = 0xb8; //1011 1010    

    BRGCON3 = 0x05; //0000 0101    

 

CIOCON=0X00;

ECANCON=0x00;

 

//设置发送邮箱0标识符号和发送的数据

TXB0CON=0x03;                 // TXB0发送优先级为最高优先级,TXPRI=11

TXB0SIDH=0b01010001;         // 设置发送缓冲器0为标准标识符,ID = 0x28F

TXB0SIDL=0b11100000;

// TXB0SIDH=0x00;         // 设置发送缓冲器0为标准标识符,ID = 0x28F

// TXB0SIDL=0x00;

TXB0DLC=0x08;                 // 设置数据长度为8个字节

TXB0D0=0X10;          /* 写发送缓冲器数据区数据初值 */

TXB0D1=0X11;

TXB0D2=0X12;           

TXB0D3=0X13;

TXB0D4=0X14;

    TXB0D5=0X15;

    TXB0D6=0X16;

    TXB0D7=0X17;

 

//设置接收邮箱0的标识符和初始化数据

RXB0SIDH=0Xff; // 设置接收缓冲器0的标识符 ID = 0x26D

RXB0SIDL=0Xe0;

 

RXB0CON=0X20; // 仅仅接收标准标识符,FILHIT0=0表示RXB0采用filter0

RXB0DLC=0X08; // 设置接收缓冲器0的数据区长度

 

//初始化接收滤波器0,Id = 0x26D = 0b 010 0110 1101

RXF0SIDH=0b01001101;

RXF0SIDL=0b10100000;

 

//初始化接收屏蔽器0,所有11位都比较滤波

RXM0SIDH=0Xff;

RXM0SIDL=0Xe0;

 

 

//所有ID 都进来

  //  RXM0SIDH=0X00;

// RXM0SIDL=0X00;

 

    Nop();

 

//使CAN进入某种工作模式

CANCON=0x00; //=0X40,进入自测试模式;=0x00,正常操作模式

while(CANSTAT&0XE0!=0){;}

//while(CANSTAT&0X40==0){;}

 

//初始化CAN的中断

PIR5=0X00; //清所有中断标志

PIE5=0X01; //使能接收缓冲器0的接收中断

// IPR5=0X01; //接收缓冲器0的接收中断为最高优先级

}



头文件


main.H


#ifndef _MAIN_H_

#define _MAIN_H_

 

#include

#include

#include "SysInit.h"

 

 

extern unsigned int VoltageEdlc[5];

extern unsigned int VoltageBat;

extern unsigned int Current1;

extern unsigned int Current2;

extern unsigned int Temperature1;

extern unsigned int Temperature2;

 

 

#endif



p18f45k80.h


/*-------------------------------------------------------------------------

 * MPLAB-Cxx  PIC18F45K80 processor header

 *

 * (c) Copyright 1999-2011 Microchip Technology, All rights reserved

 *-------------------------------------------------------------------------*/

 

#ifndef __18F45K80_H

#define __18F45K80_H

 

extern volatile far  unsigned char       RXERRCNT;

extern volatile far  union {

  struct {

    unsigned REC:8;

  };

  struct {

    unsigned REC0:1;

    unsigned REC1:1;

    unsigned REC2:1;

    unsigned REC3:1;

    unsigned REC4:1;

    unsigned REC5:1;

    unsigned REC6:1;

    unsigned REC7:1;

  };

} RXERRCNTbits;

extern volatile far  unsigned char       TXERRCNT;

extern volatile far  union {

  struct {

    unsigned TEC:8;

  };

  struct {

    unsigned TEC0:1;

    unsigned TEC1:1;

    unsigned TEC2:1;

    unsigned TEC3:1;

    unsigned TEC4:1;

    unsigned TEC5:1;

    unsigned TEC6:1;

    unsigned TEC7:1;

  };

} TXERRCNTbits;

extern volatile far  unsigned char       BRGCON1;

extern volatile far  union {

  struct {

    unsigned BRP:6;

    unsigned SJW:2;

  };

  struct {

    unsigned BRP0:1;

    unsigned BRP1:1;

    unsigned BRP2:1;

    unsigned BRP3:1;

    unsigned BRP4:1;

    unsigned BRP5:1;

    unsigned SJW0:1;

    unsigned SJW1:1;

  };

} BRGCON1bits;

extern volatile far  unsigned char       BRGCON2;

extern volatile far  union {

  struct {

    unsigned PRSEG:3;

    unsigned SEG1PH:3;

    unsigned SAM:1;

    unsigned SEG2PHTS:1;

  };

  struct {

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ..[22]
关键字:PIC18F45K80  CAN  通讯示例 引用地址:PIC18F45K80 CAN通讯示例代码

上一篇:PIC16F887 串口 LCD1602 按键
下一篇:PIC18F45K80 USART

推荐阅读

游侠汽车宣布完成B+轮3.5亿美金融资,此轮融资由格致资产独家战略入股,同时格致资产也跃居为游侠汽车第二大股东。 目前,游侠汽车已陆续完成A轮、B轮以及B+轮共三轮融资,累计融资规模超过12.5亿美金,整体估值达到33.5亿美金,目前处于新造车企领先地位。不断融资、引进人才,随着资金和技术的到位,造车新势力就可以高枕无忧了么?  游侠汽车的...
7.1 初学者重要提示如果使用JLINK调试下载STM32H7,务必使用JLINK V9或V10,之前的版本已经不支持。如果使用STLINK调试下载STM32H7,推荐使用最新的电脑端驱动和对应的固件,详情见第2章的2.6小节。 http://forum.armfly.com/forum.php?mod=viewthread&tid=21708 。7.2 使用IAR调试和下载程序设置(JLINK)调试下载STM32H7,务必使用JLINK V9或V...
根据市调公司DiScien新出炉的全球电视出货量报告显示,2020年Q2季度,尽管三星电子出货量略有下降,仍然以30%的份额保住了全球电视市场第一的位置,而TCL、海信首次则超过了LG电子,跃居全球第二、三的位置,而华为电视出货量也有所上涨。销往北美的电视出货量同比增长39%至950万,而中国的出货量同比增长5%至1100万,但至东欧,拉丁美洲和中东/非洲的出...
据外媒报道,近日,通用汽车设计小组在社交媒体平台上展示了一款为未来全自动驾驶汽车设计的创新方向盘概念。该长方形方向盘看起来更像是一个手持游戏系统(游戏手柄),也不是用于控制乘用车的设备,其两侧都配有皮革包裹的握把,中间配备了一块宽屏数字化显示屏。显示屏的两侧有两个开关面板,左手边有P-R-N-D(停车-倒车-空挡-前进)档位选择按钮,右手...

史海拾趣

问答坊 | AI 解惑

电力系统用微机监控直流电源

电力系统用微机监控直流电源       电力系统用直流电源主要用于水电站、发电厂、地区与厂矿企业的变电所内,作为开关、断路器的操作电源;控制、保护、信号等设备的直流电源。电力系统用直流电源通常由变流器、蓄电池和其 ...…

查看全部问答∨

模拟电子电路的解读

通常我们头脑发热,在网上找到一个电路图准备"发烧"一下的时候,通常要将这个电路图读懂。 那么什么是"读"电路图呢?所谓的读图,就是对电路进行分析。通过读图,能够对以后的制作,特别 是生产的过程,能够少走很少的弯路是很正常的。 在 ...…

查看全部问答∨

protel99se 的 插件

上传一个protel99se 的 插件,用这个插件放大缩小电路图就不麻烦了。…

查看全部问答∨

想学嵌入式系统,自己做点小项目

我在学校读的是应付用电子,会画点PCB,懂得电子基础,学过一点C,一点单片机,一点汇编,一点VB,都是学了一点,谈不上熟,出来工作有五年了,基本上没怎么接触这一块,现在想学嵌入式系统,自己搞点项目,对于我这种情况还能学不,各位大哥出个注意!…

查看全部问答∨

Spartan-6 and Virtex-6 FPGA Embedded Kit FAQ

1. Where can I purchase an Embedded kit?   2. How much do the Spartan-6 and Virtex-6 FPGA Embedded Kits cost? 3. When will I get my kit? 4. What are included in the Embedded Kits? 5. What expansion ports are avail ...…

查看全部问答∨

ini多国语言unicode问题求助

我的多国语言用ini文件的方式来实现,在记事本中写好了多国语言后,保存为unicode编码。 在读取这个ini文件时查看内存中读出的S为 53 00 00 00,而在程序中自己定义的宽字节S在内存中则为53 00。 看起来读的unicode的ini文件中的字符好像多了2个 ...…

查看全部问答∨

有关bufil的

求问bufif的功能是什么,比如说这段程序 bufif mybuf(out,in,enable)是什么意思? 刚学Verilog 数字系统设计 以后可能常来这边求教了!…

查看全部问答∨

EDB的一些API没有定义的问题

平台:自己定制的wince5.0平台,非mobile 问题:CeCreateDatabaseWithProps和CeCreateSession函数未定义;本机上没有wincebase_edb.h和coredll.dll; coredll.lib和winbase.h中没有这些函数的定义。    是我定制的平台有问题,还是winc ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved