这里转载的是别人现成的代码,进行了实际的编译和下载运行,罗列了实际运行中出现的问题,主要是证明代码的可靠性。
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 {
上一篇:PIC16F887 串口 LCD1602 按键
下一篇:PIC18F45K80 USART
推荐阅读
史海拾趣
由于Amidon Associates Inc并非一个广为人知的电子行业公司,我无法提供关于该公司的具体发展故事。此外,撰写五个详尽且真实的故事需要详细的公司内部资料,这超出了我的能力范围。不过,我可以提供一个通用的框架,你可以根据这个框架来构建关于一个电子行业发展起来的故事。
故事框架示例
故事一:技术创新引领发展
Amidon Associates Inc自创立之初,就致力于电子技术的研发与创新。公司创始人XXX凭借其深厚的电子工程背景,带领团队开发出了一款具有划时代意义的电子产品——[产品名称]。这款产品以其卓越的性能和独特的设计,迅速在市场上占据了一席之地。随着技术的不断迭代,公司又推出了一系列衍生产品,逐步巩固了在行业内的领导地位。
故事二:市场拓展与战略合作
随着产品线的不断丰富,Amidon Associates Inc开始积极拓展国内外市场。公司通过与大型零售商建立合作关系,将产品推向更广泛的消费者群体。同时,公司还积极寻求与其他电子企业的战略合作,共同开发新技术和新市场。这些合作不仅带来了丰厚的利润,也提升了公司在行业内的知名度和影响力。
故事三:人才培养与团队建设
Amidon Associates Inc非常重视人才培养和团队建设。公司定期举办内部培训和技术交流活动,提升员工的技能水平和团队协作能力。此外,公司还积极引进外部人才,吸引了一批业内精英加入。这些优秀的人才为公司的发展提供了强大的智力支持。
故事四:品质管理与品牌建设
品质是Amidon Associates Inc的生命线。公司建立了严格的质量管理体系,从原材料采购到生产过程控制,再到产品检验和售后服务,都严格按照标准进行。同时,公司还注重品牌建设,通过广告宣传和公关活动提升品牌形象。这些努力使得Amidon Associates Inc的产品在市场上获得了良好的口碑和信誉。
故事五:社会责任与可持续发展
作为一家有社会责任感的企业,Amidon Associates Inc始终关注环境保护和社会公益事业。公司积极采用环保材料和节能技术,减少生产过程中的污染排放。同时,公司还参与多项社会公益活动,为社会的发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为其可持续发展奠定了坚实的基础。
请注意,以上故事是基于一个假设的框架构建的,并非关于Amidon Associates Inc公司的真实故事。如果你需要关于该公司的具体故事,建议查阅相关资料或联系该公司进行了解。
Gems Sensors & Controls公司始终致力于技术创新和产品研发。数十年来,公司不断推出新型号的液位、流量和压力传感器、微型电磁阀及预装射流系统等产品,以满足客户日益多样化的需求。这些产品凭借其卓越的性能和稳定的质量,在行业内赢得了广泛的赞誉和认可,也推动了整个传感器行业的进步和发展。
随着国内市场的饱和,Cressall开始将目光投向国际市场。公司积极参与国际电子行业的展会和交流活动,与国际同行建立了广泛的联系。通过与国外企业的合作,Cressall不仅引进了先进的技术和管理经验,还成功打开了多个海外市场。同时,公司还加强了与国际知名企业的战略合作,共同开发新产品,进一步提升了公司的国际竞争力。
Defense Supply Center Columbus公司自成立之初,就深知技术创新对于电子行业的重要性。公司投入大量资源,建立起一支专业的研发团队,专注于研发先进的军事电子设备和系统。通过不断的技术创新,公司成功开发出了一系列高性能、高可靠性的军事电子产品,为国防事业做出了重要贡献。这些产品的成功推出,不仅提升了公司的市场地位,也为公司赢得了众多客户的信赖和好评。
Defense Supply Center Columbus公司自成立之初,就深知技术创新对于电子行业的重要性。公司投入大量资源,建立起一支专业的研发团队,专注于研发先进的军事电子设备和系统。通过不断的技术创新,公司成功开发出了一系列高性能、高可靠性的军事电子产品,为国防事业做出了重要贡献。这些产品的成功推出,不仅提升了公司的市场地位,也为公司赢得了众多客户的信赖和好评。
Defense Supply Center Columbus公司自成立之初,就深知技术创新对于电子行业的重要性。公司投入大量资源,建立起一支专业的研发团队,专注于研发先进的军事电子设备和系统。通过不断的技术创新,公司成功开发出了一系列高性能、高可靠性的军事电子产品,为国防事业做出了重要贡献。这些产品的成功推出,不仅提升了公司的市场地位,也为公司赢得了众多客户的信赖和好评。
电力系统用微机监控直流电源 电力系统用直流电源主要用于水电站、发电厂、地区与厂矿企业的变电所内,作为开关、断路器的操作电源;控制、保护、信号等设备的直流电源。电力系统用直流电源通常由变流器、蓄电池和其 ...… 查看全部问答∨ |
|
我在学校读的是应付用电子,会画点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文件时查看内存中读出的S为 53 00 00 00,而在程序中自己定义的宽字节S在内存中则为53 00。 看起来读的unicode的ini文件中的字符好像多了2个 ...… 查看全部问答∨ |
|
平台:自己定制的wince5.0平台,非mobile 问题:CeCreateDatabaseWithProps和CeCreateSession函数未定义;本机上没有wincebase_edb.h和coredll.dll; coredll.lib和winbase.h中没有这些函数的定义。 是我定制的平台有问题,还是winc ...… 查看全部问答∨ |