智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1654|回复: 1
打印 上一主题 下一主题

求帮助!!看看行中断和长中断有什么问题??

[复制链接]

12

主题

82

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1652
威望
434
贡献
1092
兑换币
103
注册时间
2012-9-20
在线时间
63 小时
跳转到指定楼层
1#
发表于 2012-12-18 10:58:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
30贡献
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#include  "MC9S12XS128.h"
#pragma LINK_INFO DERIVTIVE "mc9s12xs128b"

//用宏定义行场中断的使能开关
#define EN_HS IRQCR_IRQEN=1      //开行中断
#define STOP_HS IRQCR_IRQEN=0    //关行中断
#define EN_VS PIEJ|=0x40     //开场中断
#define STOP_VS PIEJ&=0x00   //关场中断

//宏定义
#define LINE_MAX     70       //每行采集的点数,列数
#define ROW_MAX      105       //采集到的行数

//定义变量
unsigned char image[ROW_MAX][LINE_MAX]={0};        //图像数据
unsigned int  SampleRow=0,SampleLine=0;
unsigned int  changshu=0,jiange=0;   //用来计算场数
unsigned char   a[80];
unsigned  int j=0,i=0;
int c,b;
void delay()
{

   for(c=0;c<6;c++)
      for(b=0;b<7;b++);



}





/***************************************************/
//函数功能:端口的设定
//函数名称:PORT_Init()
/***************************************************/
void PORT_Init()
{
  DDRA=0X00;     //A口设置为输入
  DDRE&=0XFD;    //E1口设置为输入
  DDRJ_DDRJ6=0;  //PJ6口设置为输入
   //SCI的设置
  DDRS_DDRS1=1;  //表示输出
  DDRS_DDRS0=0;  //表示输人  
}

/***************************************************/
//函数功能:串口初始化SCI0
//函数名称:SCI0_Init()
/***************************************************/
void SCI0_Init()
{
    SCI0BD=65;   //SCI波特率=BUSCLK/(16*65)=38400
    SCI0CR1=0X00;   //正常工作使能,SCI等待模式使能,8位数据位
    SCI0CR2=0X0C;   //使能发送接收端,用来验证图像信号的,接收中断使能
}



/***************************************************/
//函数功能:SCI的接收(读)
//函数名称:SCI_Read()
/***************************************************/
unsigned char  SCI_Read()
{
   if(SCI0SR1_RDRF==1)  //表明数据从位移寄存器传输到SCI数据寄存器
   {
     SCI0SR1_RDRF=1;    //读取数据寄存器会将RDRF清除,重新置位
     return SCI0DRL;    //返回数据寄存器的数据
   }
}






/***************************************************/
//函数功能:行中断初始化
//函数名称: HS_J7Init()
/***************************************************/
void HS_IRQInit()
{
   STOP_HS;   //关闭中断
   IRQCR_IRQE=1;
  // STOP_HS;     //IRQ为下降沿触发
  // PIEJ_PIEJ7=1;   //开中断
     EN_HS;
}



/***************************************************/
//函数功能:场中断初始化  PE1口外部中断
//函数名称?VS_IRQInit()
/***************************************************/
void VS_PJ6Init()
{
  STOP_VS;    //IRQ中断触发中断
PPSJ_PPSJ6=1;   //J6口设置为         卮シ⒂行?
   EN_VS; //使能IRQ触发中断
}



/***************************************************/
//函数功能:设置主频40M
//函数名称:PLL_Init()
/***************************************************/
void PLL_Init()
{
   CLKSEL=0X00;             //时钟选择,关闭锁相环
   PLLCTL_PLLON=1;          //锁相环电路允许
   SYNR=0X53;               //SYNR=19
   REFDV=0x07;              //fVC0=fPLL=2*fOSC*(SYNR+1)/(REFDV+1)=2*16M*20/8=80M
   while(CRGFLG_LOCK!=1);   //等待VCO的稳定
   POSTDIV=0;               //fBUS=fPLL/2=80M/2=40M
   CLKSEL=0X80;          //选择由锁相环产生总线周期
}


void tuxiangchuli()
{
   // #if  SCI0  //如果常量位真(非0),就执行程序1否则终止预处理命令
     unsigned char  row,col;
   //  #endif    //终止预处理命令



   //  #if   SCI0
           while((SCI0SR1&0X80)==0);
                  SCI0DRL=0xff;
         for(row=0; row<ROW_MAX;row++)
         {
                     //每行发送一个0表示换行  
             for(col=0;col<LINE_MAX;col++)  
             {  


                while((SCI0SR1&0X80)==0);        
               // if(image_data[row][col]==0)    SCI0DRL=255;    //255表示白点
             //   else                           SCI0DRL=1;      //1表示黑点  
                SCI0DRL=image[row][col];                 
             }
         }
        while((SCI0SR1&0X80)==0);
         SCI0DRL=0;
         while((SCI0SR1&0X80)==0);
         SCI0DRL=0;                     //发送2个零,表示发送结束
       //#endif
}

void main(void) {
  /* put your own code here */
  PLL_Init();               //主频的初始化
    PORT_Init();              //端口的初始化
    HS_IRQInit();              //行中断的初始化
    VS_PJ6Init();             //场中断的初始化
    SCI0_Init() ;

        EnableInterrupts;

  while(1)
  {
      /*  if(changshu>1)
        {
              DisableInterrupts;
        }*/;

  }

  /* please make sure that you never leave main */
}

#pragma CODE_SEG   NON_BANKED
void interrupt  24  VS(void)
{    PIFJ_PIFJ6=1;          //清行中断标志1;
    changshu++;        //表示进的场数
   if(changshu==1)
    {
      // changshu=0;   //场数的计算
       SampleRow=0;  //行数的计算
       SampleLine=0;
  //     EN_HS ;        //开行中断
      // PIFJ_PIFJ6=1;
   //    STOP_VS;      //关场中断
     }
     else if(changshu==60001)
      {
       SampleRow=0;  //行数的计算
       SampleLine=0;
     //  EN_HS ;        //开行中断
     //  PIFJ_PIFJ6=1;
//      STOP_VS;      //关场中断
      }
     // else   ;

}
#pragma CODE_SEG DEFAULTX


/***************************************************/
//函数功能:行中断
//函数名称: 24号
/***************************************************/
#pragma CODE_SEG   NON_BANKED
void interrupt 6 HS(void)
{


     //PIFJ_PIFJ6=1;
    // STOP_VS;
   //  STOP_HS;               //关闭行中断        
     SampleRow++;         //行的计数
    /* if(SampleRow<=60)
     {
          goto loop;
     }
     else if(SampleRow<=120)    //共采集10行
     {
        jiange=2;
     }
     else if((SampleRow>120)&&(SampleRow<=210))   //共采集10行
     {
        jiange=3;
     }
    // else if((SampleRow>210)&&(SampleRow<=290))  //共采集10行
    // {   
    //    jiange=4;
   //  }
     else                                     //共采集10行
     {
        jiange=4;
     }   */


       jiange=5;


     if(SampleRow%jiange==0)
     {   

            //delay();
        for(j=0;j<80;j++)
        {


            a[j]=image[i][j]=PORTA;

        }
         i++;   
      }
                         //开行中断
        // STOP_VS;                    //关场中断
   //  loop:    EN_HS;    //开行中断
     if(SampleRow>=525)
     {      
     //   STOP_HS;
        PIFJ_PIFJ6=1;
     //  EN_VS;    //开场中断
       tuxiangchuli();



     }
    //  else    EN_HS;
}

#pragma CODE_SEG DEFAULTX


程序中行中断和场中断有问题!!记数场数的参数 记下的次数不对!!求大神知道,看看程序中有什么错误!程序代码是完整版的 可以复制粘贴运行试试!!谢谢!!

50

主题

198

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1393
威望
690
贡献
439
兑换币
386
注册时间
2013-3-6
在线时间
132 小时
毕业学校
北京师范大学珠海分校
2#
发表于 2013-3-31 06:42:13 | 只看该作者
[别人的代码真心看不下去,只看了一点点...
(我是菜鸟)不知道这里会不会有问题...

行中断 应该检测上升沿吧,高电平的时候,数据才是有效的,下降沿才触发,数据接收没问题吗?
飘过....自己的进度比你还惨,至今看不到图像....

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 06:06 , Processed in 0.084192 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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