注册 登录
查看: 339|回复: 6

[K60] K60野火库的LCD显示有没有用到中断?

[复制链接]
发表于 2015-1-27 21:40:09 | 显示全部楼层 |阅读模式
求告知。
回复

使用道具 举报

发表于 2015-1-27 21:45:22 | 显示全部楼层
没有
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-27 21:47:39 | 显示全部楼层

可是为什么我加定时器中断后屏蔽液晶和不屏蔽反映会差很多?
回复 支持 反对

使用道具 举报

发表于 2015-1-27 21:50:51 | 显示全部楼层
dns936925573 发表于 2015-1-27 21:47
可是为什么我加定时器中断后屏蔽液晶和不屏蔽反映会差很多?

没代码,没法判断。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-27 21:56:12 | 显示全部楼层
山外メ雲ジ 发表于 2015-1-27 21:50
没代码,没法判断。

/*!
  *     COPYRIGHT NOTICE
  *     Copyright (c) 2013,山外科技
  *     All rights reserved.
  *     技术讨论:山外初学论坛 http://www.vcan123.com
  *
  *     除注明出处外,以下所有内容版权均属山外科技所有,未经允许,不得用于商业用途,
  *     修改内容时必须保留山外科技的版权声明。
  *
  * @file       main.c
  * @brief      山外K60 平台主程序
  * @author     山外科技
  * @version    v5.0
  * @date       2013-08-28
  */

#include "common.h"
#include "include.h"
int i=0;
//int I=0;
int far,L,R,Val,L_1,R_1,M;
int D,FAR,FAR_m;
int m = 0;

/*==============  adc引脚定义  =================*/
#define LOUT    ADC1_SE10     /*端口自己修改*/                  //左  传感器所接adc端口
#define ROUT    ADC1_SE15     /*端口自己修改*/                  //右  传感器所接adc端口
#define lOUT    ADC1_SE13     /*端口自己修改*/                  //左副传感器所接adc端口,判断直角
#define rOUT    ADC1_SE14     /*端口自己修改*/                  //右副传感器所接adc端口,判断直角
#define MOUT    ADC1_DM0      /*端口自己修改*/                  //中  传感器所接adc端口,判断坡道
/*==============  adc引脚定义  =================*/

/*============== 舵机基本定义 ==================*/
#define S3010_FTM   FTM1
#define S3010_CH    FTM_CH0
#define S3010_HZ    (300)
/*============== 舵机基本定义 ==================*/
void PORTD_IRQHandler(void);        //PORTD端口中断服务函数
void cgq_init(void);
void cgq_out(void);
void duoji_out(void);
void dianji_out(void);
void yejing_out(void);
extern void PIT0_IRQHandler(void);
void main ()
{
  DisableInterrupts;                                //禁止总中断  4124
  FTM_PWM_init(S3010_FTM, S3010_CH,S3010_HZ,2950);  //舵机初始化,duty_mid为舵机中值
  FTM_PWM_Duty(S3010_FTM, S3010_CH,2950);           //duty_mid为舵机中值
  cgq_init();                                       //传感器初始化

  //FTM_QUAD_Init(FTM1);                          //FTM2 正交解码初始化(所用的管脚可查 vcan_port_cfg.h )
  //port_init(PTA12, ALT7+PULLUP );               //编码器接口自行定义
  //pit_init_ms(PIT0, 500);                       //初始化PIT0,定时时间为: 1000ms
  //gpio_init(PTA6,GPO,LOW);
  FTM_PWM_init(FTM0, FTM_CH4,10000,0);       //初始化 电机 PWM,所接端口自己定义

  //--------------------PIT------------------//
  pit_init_ms(PIT0, 500);                                //初始化PIT0,定时时间为: 20ms
  set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler);      //设置PIT0的中断服务函数为 PIT0_IRQHandler
  enable_irq (PIT0_IRQn);
  //-------------------pit------------------//

  //gpio_init(PTD11,GPI,1);                       //左按键
  //gpio_init(PTD12,GPI,1);                       //右按键
  //port_init(PTD11,ALT1+PULLUP);                 //配置上拉
  //port_init(PTD12,ALT1+PULLUP);

  port_init(PTD7, ALT1 | IRQ_FALLING | PULLUP );          //初始化 PTD7 管脚,复用功能为GPIO ,下降沿触发中断,上拉电阻
  set_vector_handler(PORTD_VECTORn ,PORTD_IRQHandler);    //设置PORTE的中断复位函数为 PORTE_IRQHandler
  enable_irq (PORTD_IRQn);                                //使能PORTE中断
  EnableInterrupts;                                       //开总中断
  while (1)
  {
    if(m==0)
    {
    cgq_out();
    yejing_out();   
    }   
  }
}

/*--------传感器所用adc模块的初始化------*/
void cgq_init(void)                 
{
  adc_init(LOUT);
  adc_init(ROUT);
  //adc_init(lOUT);
  //adc_init(rOUT);
  //adc_init(MOUT);  
}
/*--------传感器所用adc模块的初始化-------*/


/*-------------传感器数据读取-------------*/
void cgq_out(void)
{
  /*+++++++++++++ 软件滤波 ++++++++++++*/
  int n;
  int L0 = 0;
  int R0 = 0;
  //int L1 = 0;
  //int R1 = 0;
  //int M  = 0;
  for (n=0;n<100;n++)
  {
  L0+=(int)adc_once(LOUT,ADC_10bit);
  R0+=(int)adc_once(ROUT,ADC_10bit);
  //L1+=(int)adc_once(lOUT,ADC_10bit);
  //R1+=(int)adc_once(rOUT,ADC_10bit);
  //M +=(int)adc_once(MOUT,ADC_10bit);
  }
  L = L0/100;
  R = R0/100;
  //过滤噪音
  if (L<100)
    L=0;
  if (R<45)
    R=0;
  //过滤噪音

  //L_1=L1/100;
  //R_1=R1/100;
  //D=L-R;                                        //计算差值
/*+++++++++++++ 软件滤波 ++++++++++++*/
/**++++++++++++++ 简单舵机控制 +++++++++++++++*/
if (L<35&&R<30)             //出赛道
{
    FAR = -860;
    FAR_m = 0;
}
else if(L-R>10)
{
  FAR_m = 25;
  FAR = 0;
  if (L-R>45)
  {

    FAR = 40;
      if(L-R>160)
      {
        FAR_m = 12;
        FAR = 860;
      }
  }
}
else if(R-L>10)
{
  FAR = 0;
  FAR_m = 25;
  if (R-L>45)
  {

    FAR = -40;
      if(R-L>160)
      {
        FAR_m = 12;
        FAR = -860;
      }
  }
}
/**++++++++++++++ 简单舵机控制 +++++++++++++++**/
}
/*-------------传感器数据读取-------------*/


/*-------------简单的电机控制-------------*/
void dianji_out(void)
{
  if (m)
  {
  gpio_init(PTA5,GPO,HIGH);
  gpio_init(PTA6,GPO,LOW);
  FTM_PWM_Duty(FTM0, FTM_CH4, FAR_m);
  }
  else
  {
   gpio_init(PTA5,GPO,LOW);
  }
}
/*-------------简单的电机控制-------------*/

/*------------液晶显示参数模块------------*/
/*-------------液晶端口需注意-------------*/

void yejing_out(void)
{
    uint16 far,d;
    Site_t site = {35,5};

    LCD_init();
    //LCD_str(site,"l",FCOLOUR,BCOLOUR);          //显示左传感器电压(其实我觉得没必要显示,这里玩玩而已)
    //site.y += 20;
    //LCD_str(site,"r",FCOLOUR,BCOLOUR);          //显示右传感器电压
    //site.y += 20;      
    //LCD_str(site,"L_1",FCOLOUR,BCOLOUR);        //显示编码器反馈的速度
    //site.y += 20;
    //LCD_str(site,"R_1",FCOLOUR,BCOLOUR);        //显示编码器反馈的速度
    //site.y += 20;
    //LCD_str(site,"d",FCOLOUR,BCOLOUR);          //显示左右传感器的差
    //site.y += 20;
    //LCD_str(site,"far",FCOLOUR,BCOLOUR);        //显示舵机转向角度(没有左右之分,可通过d的正负判断)  
    //site.x = 3 + 4*8;

    site.y = 5+80;
    //LCD_str(site," ",FCOLOUR,BCOLOUR);
    //site.y += 20;
    //LCD_str(site," ",FCOLOUR,BCOLOUR);
    //site.y += 20;
    //LCD_str(site," ",FCOLOUR,BCOLOUR);
    //site.y += 20;
    //if (Val>0)
    //{
    //  val=Val;
    //  LCD_str(site,"-",FCOLOUR,BCOLOUR);
    //}
    //else
    //{
    //  val=-Val;
    //  LCD_str(site," ",FCOLOUR,BCOLOUR);
    //}
    //site.y += 20;
    if (D>=0)
    {
      d=D;
      LCD_str(site," ",FCOLOUR,BCOLOUR);
    }
    else
    {
      d=-D;
      LCD_str(site,"-",FCOLOUR,BCOLOUR);
    }
    site.x = 3+5*8;

    site.y = 5;
    //l=L;   
    LCD_num_C (site, L , FCOLOUR , BCOLOUR);
    site.y += 20;   
    //r=R;   
    LCD_num_C (site, R , FCOLOUR , BCOLOUR);
    site.y += 20;   

    //far=3628+i;
    LCD_num_C (site, d , FCOLOUR , BCOLOUR);
    site.y += 20;   



    LCD_num_C (site, i , FCOLOUR , BCOLOUR);
    site.y += 20;

    far=2950-FAR;
    LCD_num_C (site, far, FCOLOUR , BCOLOUR);
    site.y += 20;

    if (m == 0)
    LCD_str(site,"ON",FCOLOUR,BCOLOUR);
    else
    LCD_str(site,"OFF",FCOLOUR,BCOLOUR);

    //DELAY_MS(200);
}

/*------------液晶显示参数模块------------*/



void PORTD_IRQHandler(void)
{

//#if 0       // 条件编译,两种方法可供选择

    uint8  n = 0;    //引脚号
    n = 7;
    if(PORTD_ISFR & (1 << n))           //PTD7 触发中断
    {
        PORTD_ISFR  = (1 << n);        //写1清中断标志位

        //  以下为用户任务  //

        m = ~m;

        //  以上为用户任务  //
    }
//#else
//    PORT_FUNC(D,7,key_handler);
//#endif
}



void PIT0_IRQHandler(void)
{
    //lptmr_time_start_ms();
    cgq_out();
    FTM_PWM_Duty(S3010_FTM, S3010_CH,2950-FAR);
    PIT_Flag_Clear(PIT0);       //清中断标志位
    //I = lptmr_time_get_ms();
}


舵机打角的速度会改变。

回复 支持 反对

使用道具 举报

发表于 2015-1-27 22:05:58 | 显示全部楼层
dns936925573 发表于 1422366459
可是为什么我加定时器中断后屏蔽液晶和不屏蔽反映会差很多?
中断里执行那么多代码,肯定会差很多
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-28 12:36:23 | 显示全部楼层
山外メ雲ジ 发表于 2015-1-27 22:05
中断里执行那么多代码,肯定会差很多

中断里就算只有一句PWM好像也是一样,是不是把PWM也去掉只留下一个占空比修改?
回复 支持 反对

使用道具 举报

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

本版积分规则

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