智能车制作

标题: 电子设计大赛 MC9S12程序问题 [打印本页]

作者: yuyemu    时间: 2013-9-6 09:25
标题: 电子设计大赛 MC9S12程序问题
电子设计大赛 MC9S12程序求解[attach]50559[/attach][attach]50559[/attach]
作者: ℡单身旅行    时间: 2013-9-6 10:42
应该是你的文件用了浮点型的变量,但是工程建立的时候没有把浮点型勾选上~~~~~
作者: yuyemu    时间: 2013-9-6 12:59
工程建立了以后还能改成浮点型吗?怎么改?
还有MC9S12XS128  ECT模块输入中断函数加了几句算式,就进不了中断,直接附程序

/****************************************************************/

/*---------------------------------------------------------*/
/************************************************************
飞翔科技MC9S12XS128汽车电子开发板
E-mail: 2008f.d@163.com
淘宝店:http://fxfreefly.taobao.com
************************************************************/
/*---------------------------------------------------------*/
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "LCD.h"

#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define BUS_CLOCK                   32000000           //总线频率
#define OSC_CLOCK                   16000000           //晶振频率

unsigned int delaytime;
unsigned int time1;
unsigned int time2;

/******新增变量*****
unsigned int T;
float xiangweicha;
float PF;
unsigned int ge;
unsigned int shi;
unsigned int bai;

/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
    CLKSEL &= 0x7f;       //set OSCCLK as sysclk
    PLLCTL &= 0x8F;       //Disable PLL circuit
    CRGINT &= 0xDF;
   
    #if(BUS_CLOCK == 40000000)
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #endif

    REFDV = 0x81;         //PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1)=64MHz ,fbus=32M
    PLLCTL =PLLCTL|0x70;  //Enable PLL circuit
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08)); //PLLCLK is Locked already
    CLKSEL |= 0x80;        //set PLLCLK as sysclk
}

/************************************************************/
/*                    初始化ECT模块                         */
/************************************************************/
void initialize_ect(void){
  TSCR1_TFFCA = 1;  // 定时器标志位快速清除
  TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
  TIOS  = 0xfe;      //指定通道0为输入捕捉方式
  TCTL4 = 0x01;            // 设置通道0为捕捉上升沿方式
  TIE   = 0x01;     // 允许通道0定时中断
  TSCR2 = 0x07;            // 预分频系数pr2-pr0:111,时钟周期为4us,
  TFLG1 = 0xff;            // 清除各IC/OC中断标志位
  TFLG2 = 0xff;     // 清除自由定时器中断标志位
}

/*************************************************************/
/*                        初始化PWM                          */
/*************************************************************/
void init_pwm(void)
{
  PWMCTL_CON01= 1;   //联结通道0,1为16位的PWM
  PWMPOL_PPOL1= 1;   //通道01的极性为高电平有效
  PWMPRCLK = 0x55;   //A时钟和B时钟的分频系数为32,频率为1MHz
  PWMSCLA  =  100;   //SA时钟频率为5KHz
  PWMSCLB  =  100;   //SB时钟频率为5KHz
  PWMCLK =0x02;      //通道01用SA时钟作为时钟源
  PWMCAE   = 0x00;   //脉冲模式为左对齐模式
  PWMPER01  = 500;  //通道01的周期为10Hz
  PWMDTY01  = 250;  //通道01的占空比为50%  
  PWME_PWME1 = 1;    //使能通道01
}

/*************************************************************/
/*                   输入捕捉中断函数                        */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void capture(void)
{
if(TFLG1_C0F == 1)
   TFLG1_C0F = 1;
time1 = time2;
time2 = TC0;
delaytime = time2-time1;
LEDCPU = ~LEDCPU;
   
   /*********计算功率因数*********
   xiangweicha=(delaytime*4*2*3.1415)/(T*10000);
   PF=cos(xiangweicha);
   
   ge=(PF*1000)/100;
   shi=(PF*1000-ge*100)/10;
   bai=(unsigned int)(PF*1000-ge*100-shi*10);
   
  /*********显示*********
  DDRB=0xff;                         
        LCD_clear(); //清屏幕
        delay_nms(1000);

  LCD_write_hanzi(1,0,0);   
  LCD_write_hanzi(5,0,1);   
  LCD_write_hanzi(9,0,2);   
  LCD_write_hanzi(13,0,3);
  LCD_write_shu(17,0,47);
  
  
  LCD_write_shu(5,3,0);
  LCD_write_shu(7,3,45);
  LCD_write_shu(9,3,ge);
  LCD_write_shu(11,3,shi);
  LCD_write_shu(13,3,bai);
  /*********显示*********/
}
#pragma CODE_SEG DEFAULT


/*************************************************************/
/*                          主函数                           */
/*************************************************************/
void main(void) {

  /******新增变量*****
  T=2;
  xiangweicha=0.0;
  PF=0.0;
  ge=0;
  shi=0;
  bai=0;
  
  /*********显示*********
  DDRB=0xff;
  LCD_init();  //初始化LCD模块                         
        LCD_clear(); //清屏幕
        delay_nms(1000);
       
        PORTB_PB5=1;
  PORTB_PB6=1;
  PORTB_PB7=1;

  LCD_write_hanzi(1,0,0);   
  LCD_write_hanzi(5,0,1);   
  LCD_write_hanzi(9,0,2);   
  LCD_write_hanzi(13,0,3);
  LCD_write_shu(17,0,47);
  /*********显示*********/
  
  DisableInterrupts;
  INIT_PLL();
  initialize_ect();
  init_pwm();
  LEDCPU_dir = 1;
  EnableInterrupts;
  LEDCPU = 0;
  for(;;) {}
}

作者: 音之夏萤    时间: 2013-9-6 13:12
一种可能是你的那个子函数的头文件没有被添加进主函数里调用,还有一种可能就是你建立工程时,要一步一步选择一些配置,就是关于float和double配置那里勾选了none(应该要勾选float才行),希望有所帮助。
作者: 迯χIηɡ魜    时间: 2013-9-7 10:03
编译环境不支持浮点型数据,重新建立工程选择支持浮点型的按钮就可以了




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2