智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5395|回复: 10
打印 上一主题 下一主题

这里有个MC9S12G程序,高手给改一下

[复制链接]

7

主题

69

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1090
威望
612
贡献
308
兑换币
214
注册时间
2012-3-10
在线时间
85 小时
毕业学校
孟坝中学
跳转到指定楼层
1#
发表于 2012-6-25 11:22:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5贡献
求高手改一下,我就是想实现上位机显示赛道信息……谢谢啦
#include <hidef.h>
#include "derivative.h"     /* common defines and macros */

#include <math.h>
#pragma CODE_SEG DEFAULT
#define CR_as_CRLF TRUE
#define PT0AD0
unsigned char   Laserchannel,Sen_scan=0,AD1[9],Value,AD0[9],Value0;
unsigned int    m,N[9],n,M[9];
unsigned int    sensor[9]={1,3,5,7,9,11,13,15,17 },sensor1[9]={17,15,13,11,9,7,5,3,1 } ;
/******************************************************************************/

/*******************延时************/
void Delay_1ms(unsigned int j)
  {
  unsigned int i,k;
  for( k=0;k<j;k++)
   {
    for(i=0;i<2000;)
        i++;
   }
  }
void AD_Init(void)
{  
  //8ch   
  ATDCTL1=0x00;   //7:1-外部触发,65:00-8位精度,4:放电,3210:ch
  ATDCTL2=0x40;   //禁止外部触发, 中断禁止   
  ATDCTL3=0x80;   //右对齐无符号,每次转换8个序列, No FIFO, Freeze模式下继续转   
  ATDCTL4=0x01;   //765:采样时间为4个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]
  ATDCTL5=0x30;   //6:0特殊通道禁止,5:1连续转换 ,4:1多通道轮流采样
  ATDDIEN=0x00;   //禁止数字输入
}   
  
void INIT_SCI(void)  
{

  SCI0BD = 156;         //设置SCI0波特率为9600     
  SCI0CR1= 0x00;       //设置SCI0为正常模式,八位数据位,无奇偶校验
  SCI0CR2= 0x2c;       //允许发送数据,禁止中断功能  
}  
//时钟初始程序
void SetBusCLK_16M(void)
{   
    MMCCTL1=0X00;   
    PKGCR  =0X06;   
    DIRECT =0x00;
    IVBR   =0xFF;   
    ECLKCTL=0xC0;   
    CPMUPROT   =0x26;    //停止保护时钟配置寄存器
    CPMUCLKS_PSTP=0;     //
    CPMUCLKS_PLLSEL=1;   //应用PLL
    //CPMUSYNR: VCOFRQ1=0,VCOFRQ0=0,SYNDIV5=0,SYNDIV4=0,SYNDIV3=1,SYNDIV2=1,SYNDIV1=1,SYNDIV0=1
    CPMUSYNR=0x00|0x0F; // VCOFRQ[7:6];SYNDIV[5:0]
                        // fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)
                        // fPLL= fVCO/(2 × CPMUPOSTDIV)
                        // fBUS= fPLL/2
                        // VCOCLK Frequency Ranges  VCOFRQ[7:6]
                        // 32MHz <= fVCO <= 48MHz    00
                        // 48MHz <  fVCO <= 50MHz    01
                        // Reserved                  10
                        // Reserved                  11   
    //CPMUREFDIV=0x00|0x01; // REFFRQ[7:6];REFDIV[3:0]
                        // fREF=fOSC/(REFDIV + 1)
                        // REFCLK Frequency Ranges  REFFRQ[7:6]
                        // 1MHz <  fREF <=  2MHz       00
                        // 2MHz <  fREF <=  6MHz       01
                        // 6MHz <  fREF <= 12MHz       10
                        // fREF >  12MHz               11                        
                        // pllclock=2*osc*(1+CPMUSYNR)/(1+CPMUPOSTDIV)=32MHz;
    CPMUPOSTDIV=0x00;   // 4:0, fPLL= fVCO/(2xPOSTDIV)
                        // If CPMUPOSTDIV = $00 then fPLL is identical to fVCO (divide by one).
    _asm(nop);          // BUS CLOCK=16M
    _asm(nop);
    CPMUPLL=0x10;       // Set the PLL frequency modulation
    while(CPMUFLG_LOCK == 0); //when pll is steady ,then use it;
    CPMUPROT=0x00;          //engage PLL to system;
}
void SetBusCLK_64M(void)
{   
    MMCCTL1=0X00;   
    PKGCR  =0X06;   
    DIRECT =0x00;
    IVBR   =0xFF;   
    ECLKCTL=0xC0;   
    CPMUPROT   =0x26;    //停止保护时钟配置寄存器
    CPMUCLKS   =0x80;    //允许PLL分频
    CPMUSYNR   =0xc0|0x3f; //设置分频因子
    CPMUREFDIV =0x80|0x01; //pllclock=2*osc*(1+63)/(1+0)=128MHz;
    CPMUPOSTDIV=0x00;   // Set the post divider register  
    CPMUPLL    =0x10;   // Set the PLL frequency modulation  
    while(CPMUFLG_LOCK == 0);          /* Wait until the PLL is within the desired tolerance of the target frequency */
   
    CPMUPROT=0x00;            /* Enable protection of clock configuration registers */
}
void SetBusCLK_32M(void)
{   
    MMCCTL1=0X00;   
    PKGCR=0X06;   
    DIRECT=0x00;
    IVBR=0xFF;   
    ECLKCTL=0xC0;
   
    CPMUPROT   =0x26;   //停止保护时钟配置寄存器
    CPMUCLKS   =0x80;   //允许PLL分频
    CPMUSYNR   =31;     //设置分频因子      
    CPMUPOSTDIV=0x00;   // Set the post divider register  
    CPMUPLL    =0x10;   // Set the PLL frequency modulation  
    while(CPMUFLG_LOCK == 0);          /* Wait until the PLL is within the desired tolerance of the target frequency */
   
    CPMUPROT=0x00;            /* Enable protection of clock configuration registers */
}
//基于16M外部晶振
//byte nM 预设定的总线频率
//函数可能存在问题,仅供参考演示
void SetBusCLK_nM(byte nM)
{   
    MMCCTL1=0X00;   
    PKGCR  =0X06;   
    DIRECT =0x00;
    IVBR   =0xFF;   
    ECLKCTL=0xC0;   
    CPMUPROT   =0x26;   //停止保护时钟配置寄存器
    CPMUCLKS_PSTP=0;    //
    CPMUCLKS_PLLSEL=1;  //应用PLL      
    //CPMUSYNR   =nM-1;   //设置分频因子  
    CPMUSYNR   =0xc0|(nM-1); //设置分频因子
    CPMUREFDIV =0x80|0x00; //pllclock=2*(1+SYNR)= MHz;
    CPMUPOSTDIV=0x00;   // Set the post divider register      
    CPMUPOSTDIV=0x00;   // Set the post divider register  
    CPMUPLL    =0x10;   // Set the PLL frequency modulation  
    while(CPMUFLG_LOCK == 0);          /* Wait until the PLL is within the desired tolerance of the target frequency */
    CPMUPROT=0x00;            /* Enable protection of clock configuration registers */
}
//-----------------------------------------------------  
//-----PWM 初始化程序------//
void PWM_Init(void)
{
PWMPRCLK=0X00;        
PWMSCLA=12;
PWMSCLB=12;
PWMCTL_CON45=1;
PWMCTL_CON67=1;
PWMCTL_CON23=1;
PWMCTL_CON01=1;
PWMCLK_PCLK1=1;
PWMCLK_PCLK5=1;
PWMCLK_PCLK3=1;
PWMCLK_PCLK7=1;
PWMPER45=10;
PWMPER23=10;
PWMPER67=200;
PWMPER01=3333;
PWMPOL_PPOL5=1;
PWMPOL_PPOL3=0;
PWMPOL_PPOL7=1;
PWMPOL_PPOL1=1;
PWMCAE =0x00;
PWMDTY67=1500;
PWME_PWME1=1;
PWME_PWME7=1;
}
/*void Motor_forward (void)    //正转;占空比:duty
{
PWME_PWME7=1;
PWME_PWME3=0;
DDRP_DDRP3=1;
PTP_PTP3=0;
PWMDTY67=20;
}
void Motor_back (unsigned int duty)    //反向?占空比:duty
{
PWME_PWME3=1;
PWME_PWME7=0;
DDRP_DDRP7=1;
PTP_PTP7=0;
PWMDTY23=duty;
}
void Motor_brake (void)    //停机
{
PWME_PWME3=0;
PWME_PWME7=0;
DDRP_DDRP3=1;
DDRP_DDRP7=1;
PTP_PTP3=0;
PTP_PTP7=0;
}*/
void STEER( uint  duty1)
{
PWMDTY01=duty1;
}
/****************定时器0初始化函数*************************/
/*void PIT0_init(void)//激光分时点亮,定时600us函数
{
PITCFLMT_PITE=0;//Close_time0();//关PIT定时
PITMTLD0=200-1;//8位定时器初值设定。160分频。频率0.4MHZ.即2.5us.
PITLD0=2000-1;//16位定时器0初值设定,定时240*2.5us=600us.
PITCE_PCE0=1;//使能通道0
PITMUX_PMUX0=0;//相应16位定时器也时基0连接
PITINTE_PINTE0=1;//开通PIT0定时器溢出中断
PITCFLMT_PITE=1;//使能PIT
}*/
/****************激光发射函数******************************/
//extern void Delay(unsigned int j);
void Open_sen(void)//3路激光发射管分时发射
{  

   
              PORTA_PA2=1;//打开第一路激光管
              Delay_1ms(2);
              
               
                AD0[0]=PT0AD0_PT0AD00;
                AD0[3]=PT0AD0_PT0AD01;
                //AD0[6]=PT0AD0_PT0AD02;
                AD1[0]=PT1AD0_PT1AD01;
                AD1[3]=PT1AD0_PT1AD02;
               // AD1[6]=PT1AD0_PT1AD03;
               
               PORTA_PA2=0;//关闭第一路激光管
              PORTA_PA4=1;//打开第二路激光管
              Delay_1ms(2);
              
                AD0[2]=PT0AD0_PT0AD00;
                AD0[5]=PT0AD0_PT0AD01;
                //AD0[7]=PT0AD0_PT0AD02;
                AD1[2]=PT1AD0_PT1AD01;
                AD1[5]=PT1AD0_PT1AD02;
               // AD1[7]=PT1AD0_PT1AD03;
               
            
              PORTA_PA4=0;//关闭第二路激光管
               PORTA_PA6=1;//打开第三路激光管
               Delay_1ms(2);
               
                AD0[4]=PT0AD0_PT0AD00;
                AD0[7]=PT0AD0_PT0AD01;
                //AD0[8]=PT0AD0_PT0AD02;
                AD1[4]=PT1AD0_PT1AD01;
                AD1[7]=PT1AD0_PT1AD02;
                //AD1[8]=PT1AD0_PT1AD03;
                PORTA_PA6=0;//关闭第三路激光管*/
                PORTA_PA7=1;//打开第四路激光管
                Delay_1ms(2);
               
                AD0[1]=PT0AD0_PT0AD00;
                AD0[6]=PT0AD0_PT0AD01;
                //AD0[8]=PT0AD0_PT0AD02;
                AD1[1]=PT1AD0_PT1AD01;
                AD1[6]=PT1AD0_PT1AD02;
                //AD1[8]=PT1AD0_PT1AD03;
               
   
}
//extern void Delay(unsigned int j);

void SCI_Tx(void)
  {
unsigned char sci[25]={128},i;  
int l;  
    for(l=0;l<9;l++) {
     if(M[l]==1) {M[l]=0;}
     else M[l]=1;}
    for(l=0;l<9;l++) {
     if(N[l]==1) {N[l]=0;}
     else N[l]=1;}
m=0;
n=0;
  //发送 激光检测信息      
n=N[0]+N[1]*2+N[2]*4+N[3]*8+N[4]*16+N[5]*32+N[6]*64+N[7]*256+N[8]*512+1024+2048+4096;
m=M[0]+M[1]*2+M[2]*4+M[3]*8+M[4]*16+M[5]*32+M[6]*64+M[7]*256+M[8]*512+1024+2048+4096;
sci[1]=(unsigned char)(1500/128);  //推荐舵机pwm值
sci[2]=1500%128;
sci[3]=(unsigned char)(150/128);//推荐电机pwm值
//sci[4]=PWMDTY1%128;
sci[4]=(unsigned char)(n/128);//推荐激光1
sci[5]=n%128 ;
sci[6]=(unsigned char)(m/128);//推荐该激光2
sci[7]=m%128 ;
sci[8]=(unsigned char)(1281/128);//推荐欧姆龙速度
sci[9]=1281%128;
sci[10]=0;
sci[11]=0;
sci[12]=0;
sci[13]=0; //自定义数据,推荐pid
sci[14]=Value0;
sci[15]=Value; //推荐激光权重
for(i=0;i<16;i++) {   
while(!SCI0SR1_TDRE);  
SCI0DRL=sci[i];      }  
  }

  
/*void pianyi(void )

{  
unsigned char  BlackNum,Value_Sum,a;
   int f;
   
for(f=0;f<9;f++)   
{
  M[f]=AD1[f] ;
}
BlackNum=0;
Value_Sum=0;
for(a=0;a<9;a++)
    {  
        Value_Sum+=M[a]*sensor1 [a];  
        if(M[a]==1) BlackNum++;
        else;
    }   
if(BlackNum==0) Value=0;
else
Value=Value_Sum/BlackNum;
     }
void pianyi0(void )

{  
unsigned char  BlackNum,Value_Sum,a;
   int f;
   
for(f=0;f<9;f++)   
{
  N[f]=AD0[f] ;
}
BlackNum=0;
Value_Sum=0;
for(a=0;a<9;a++)
    {  
        Value_Sum+=N[a]*sensor [a];  
        if(N[a]==1) BlackNum++;
        else;
    }   
if(BlackNum==0) Value0=0;
else
Value0=Value_Sum/BlackNum;
     }*/
   
void AD1_INIT(void)
{
DDR1AD0=0X00;
DDR0AD0=0X00;
ATD0DIEN=0XFFFF;


}
/*
unsigned int zhuanxiang(unsigned char value)
{
unsigned int PWMDTY;
PWMDTY=1100-10*value;
return (PWMDTY);
}   
unsigned int zhuanxiang0(unsigned char value)
{
unsigned int PWMDTY;
PWMDTY=1100+10*value;
return (PWMDTY);
}  
unsigned int zhuanxiang1(unsigned char value1)
{
unsigned int PWMDTY9;
if(value1<=9)
{
PWMDTY9=1500-30*value1;
}
else if(value1>9&&value1<18)
{
PWMDTY9=1500+30*(18-value1);
}
else  ;
return (PWMDTY9) ;
}         

void panduan(void)
{

if(Value>Value0)
        {
          if(Value>0&&Value<=5)  PWMDTY01=1100+15*Value;  
          else if(Value>5&&Value<=11)   PWMDTY01=1100+20*Value;  
          else if(Value>11&&Value<=17)   PWMDTY01=1100+20*Value;  
          else  ;
        }
      
else if(Value<Value0)
        {
  
          if(Value0>0&&Value0<=5)  PWMDTY01=1100-15*Value0;
          else if(Value0>5&&Value0<=11)   PWMDTY01=1100-20*Value0;
          else if(Value0>11&&Value0<=17)   PWMDTY01=1100-20*Value0;
          else  ;  
         }
  
        
      
else if(Value==Value0)     PWMDTY01=1100;
      
else ;
     
}*/
void main(void) {

   PLL_init();
   PWM_Init();
   PIT0_init();
   SetBusCLK_nM(64);
   SCI_Init();//INIT_SCI();
   DDRA=0XFF;
   AD_Init()
   AD1_INIT();
   //Motor_forward();
// EnableInterrupts;

for(;;)
{
     Open_sen();
      //pianyi();
      //pianyi0();
      SCI_Tx();
      Delay_1ms(10);
      //PWMDTY67=zhuanxiang1(Value);
      panduan();
      
    }
  }


/**************定时0中断函数************************************/
/*#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0(void)
{
     DisableInterrupts;
     //Laserchannel++;//用于通道的切换
    // if(Laserchannel==4)
    // {
    //    PITCE_PCE0=0;//关闭通道0
   //  }
    Open_sen();
    // get_angl();
     PITTF=0x01;//清除中断标志位
     EnableInterrupts;
}*/

11

主题

583

帖子

0

精华

常驻嘉宾

MISS Gao

Rank: 8Rank: 8

积分
5774

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
2282
贡献
1682
兑换币
935
注册时间
2012-2-12
在线时间
905 小时
2#
发表于 2012-6-25 14:03:15 | 只看该作者
G128没有PIT模块吧。。。
回复

使用道具 举报

25

主题

1003

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4584

活跃会员奖章优秀会员奖章在线王奖章论坛元老奖章

威望
1986
贡献
1142
兑换币
789
注册时间
2012-5-16
在线时间
728 小时
3#
发表于 2012-6-25 14:55:30 | 只看该作者
你们都不用PE的、、PE好方便、、
回复

使用道具 举报

11

主题

583

帖子

0

精华

常驻嘉宾

MISS Gao

Rank: 8Rank: 8

积分
5774

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
2282
贡献
1682
兑换币
935
注册时间
2012-2-12
在线时间
905 小时
4#
发表于 2012-6-25 15:18:49 | 只看该作者
軌跡。 发表于 2012-6-25 14:55
你们都不用PE的、、PE好方便、、

怎么个用法?能发个例子来看看不?
我用的是T0中断。。。
回复

使用道具 举报

25

主题

1003

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4584

活跃会员奖章优秀会员奖章在线王奖章论坛元老奖章

威望
1986
贡献
1142
兑换币
789
注册时间
2012-5-16
在线时间
728 小时
5#
发表于 2012-6-25 16:06:50 | 只看该作者
subingkiun 发表于 2012-6-25 15:18
怎么个用法?能发个例子来看看不?
我用的是T0中断。。。

建立工程的时候选用PE模式就完了 - -

回复

使用道具 举报

2

主题

9

帖子

0

精华

注册会员

Rank: 2

积分
126
威望
85
贡献
37
兑换币
4
注册时间
2012-5-28
在线时间
2 小时
毕业学校
湖南邵阳
6#
发表于 2012-6-25 17:01:58 | 只看该作者
好难啊,高手解答吧
回复

使用道具 举报

7

主题

69

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1090
威望
612
贡献
308
兑换币
214
注册时间
2012-3-10
在线时间
85 小时
毕业学校
孟坝中学
7#
 楼主| 发表于 2012-6-26 16:00:40 | 只看该作者
subingkiun 发表于 2012-6-25 14:03
G128没有PIT模块吧。。。

呵呵,是从XS128哪里改的……
回复

使用道具 举报

4

主题

443

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1849
威望
1067
贡献
556
兑换币
57
注册时间
2011-8-31
在线时间
113 小时
8#
发表于 2012-6-30 16:55:57 | 只看该作者
没有PIT,用API
回复

使用道具 举报

4

主题

443

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1849
威望
1067
贡献
556
兑换币
57
注册时间
2011-8-31
在线时间
113 小时
9#
发表于 2012-6-30 16:58:14 | 只看该作者
void APIInit() //相当于PIT 定时基准100us
{
  CPMUAPICTL_APIFE = 0;//在设定值之前需要清零;               
  CPMUAPICTL_APICLK = 1;//0:使用Autonomous Clock 1:使用BUs CLOCK,这里使用BUS CLK           
  //CPMUACLKTR=0xFC;// fACLK is trimmed to 10KHz,如果使用的是Auto Clock 则要设置此寄存器 为0xfc   
  CPMUAPIR = 2399; //2399
  //使用BUS  CLK , Period = 2*(APIR[15:0] + 1) *(1/40 000 000HZ)此处定时2ms
  //若使用AUTO CLK ,0.2(x+1)=y ms 如定时10ms 值为49
  CPMUAPICTL_APIE = 1;     //使能中断申请
  CPMUAPICTL_APIF = 1;      // 中断标志位清零
  CPMUAPICTL_APIFE = 1;    //在设定值之前需要清零;
}
interrupt  VectorNumber_Vapi void API_ISR(void)
{
    TimeCount_200us ++;
    if(TimeCount_200us >= 2)
    {
        TimeCount_200us = 0;
        TimeReach_200us = 1;      
    }
    CPMUAPICTL_APIF=1;     
}
回复

使用道具 举报

7

主题

69

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1090
威望
612
贡献
308
兑换币
214
注册时间
2012-3-10
在线时间
85 小时
毕业学校
孟坝中学
10#
 楼主| 发表于 2012-7-3 20:37:25 | 只看该作者
xining_yang 发表于 2012-6-30 16:58
void APIInit() //相当于PIT 定时基准100us
{
  CPMUAPICTL_APIFE = 0;//在设定值之前需要清零;         ...

恩恩,解决了,谢谢哈……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 16:10 , Processed in 0.148301 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表