⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt_tasks.c

📁 飞思卡尔嵌入式微处理器S12控制程序
💻 C
字号:
#include <hidef.h>      //基本定义和宏定义
#include <mc9s12dg128.h>     //硬件定义
#include "..\Sources\common_defs.h" //自定义常量

#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

//各种中断处理例程
//文件名:interrupt_tasks.c
//编码人:梁霄
//最后更新时间:2008.06.05 23:28

//外部变量声明
extern unsigned int isGraph1; //存储区域切换标志
extern unsigned int canScan; //允许采集图像标志
extern unsigned int lineCounter; //行计数器
extern unsigned int dotCounter; //像素计数器
extern unsigned int skipLines; //跳过行计数器
extern unsigned int processAllow; //允许处理的场标志
extern byte graph[GRAPHBLOCKNUM][MAX_LINES_PER_FIELD][MAX_DOTS_PER_LINE]; //图像存储区

//模块变量声明
//跳过初始半场信号标志
unsigned int skipFirstHalf = 0;

interrupt 6 void IRQ_ISR(void) 
{
  //临时变量,用于清除AD转换标志
  int tmp;
  
  //关中断
  DisableInterrupts;

  //如果能够采集,则每隔若干行进行采集  
  if(canScan)
    skipLines++;
  
  //如果能够采集,并且需要间隔的行已经跳过,则开始采集
  if(canScan && skipLines==SKIPLINE) 
  {
    //重置间隔行计数器
    skipLines=0;
    //先清除可能存在的AD转换完成标志
    tmp=ATD0DR0;
    //如果行数没有采够,则继续采集
    if(lineCounter<MAX_LINES_PER_FIELD) 
    {
      for(dotCounter=0;dotCounter<MAX_DOTS_PER_LINE;dotCounter++) 
      {
        //等待AD采样完成
        while(ATD0STAT1_CCF0==0);
        //清除AD采样完成标志
        tmp=ATD0DR0;
        //存储像素点
        graph[isGraph1][lineCounter][dotCounter]=ATD0DR0L;
      }
      lineCounter++;
    } 
    else 
    {
      //进行到这里说明一场已经采集完毕,进行一些变量的初始化工作
      //以便采集下一场图像时使用
      skipLines=0;
      canScan=0;
      lineCounter=0;
      ATD0CTL2_ADPU=0;
    }
  }
  
  //开中断
  EnableInterrupts;
}

interrupt 9 void IOC1_ISR(void) 
{
  //关中断
  DisableInterrupts;
  //清中断标志位
  TFLG1 = 0x02;
  
  //启动时的第一个场中断往往是不稳定的图像信号,因此不要
  if(!skipFirstHalf) 
  {
    //跳过第一个场中断
    skipFirstHalf = 1;
  }
  else 
  {
    //允许采集
    canScan = 1;
    //指示哪一场可以进行后续的数据处理
    processAllow=isGraph1;    
    //切换采集区域
    isGraph1 = !isGraph1;
    
    //重新初始化AD(莫名其妙...)
    //ATD0CTL2:禁止发生中断,忽略外部触发,软件方式清除中断
    //暂时不启动转换(等待奇偶场同步信号)
    ATD0CTL2 = 0x40;
    //ATD0CTL3:结果不映射到转换序列,转换序列长度为1
    ATD0CTL3 = 0x08;
    //ATD0CTL4:8位精度,ATD时钟为4MHz,按照公式
    //ADClock=BusClock*0.5/(PRS+1),BusClock=24MHz,
    //故PRS=2,精采样时间为2个AD时钟周期,AD转换时间为1微秒
    ATD0CTL4 = 0x82;
    //ATD0CTL5:单通道采样;连续A/D转换;转换结果无符号,右对齐;
    //模拟信号从AN0引脚输入
    ATD0CTL5 = 0xA0;
    //禁止数字输入
    ATD0DIEN = 0x00;
    
    //开AD转换
    ATD0CTL2_ADPU = 1;
  }
  
  //开中断
  EnableInterrupts;
}

interrupt 26 void MDC_ISR(void) 
{
  //关中断
  DisableInterrupts;
  
  //开中断
  EnableInterrupts;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -