智能车制作

标题: 求解答啊,估计是中断问题啊,自动复位,求大神赐教 [打印本页]

作者: Neozoic    时间: 2013-5-29 20:53
标题: 求解答啊,估计是中断问题啊,自动复位,求大神赐教
  1. #include <hidef.h>      /* common defines and macros */
  2. #include "derivative.h"
  3. #pragma CODE_SEG __NEAR_SEG NON_BANKED

  4. //#define PORTE_PE0
  5. #define Field_Delete 3
  6. #define LINE 60
  7. #define COL 50//76

  8. #define BUSCLK      64000000              //总线频率
  9. #define OSCCLK      16000000             //晶振频率
  10. #define BAUD           9600                     //波特率


  11. #define THRESHOLD 20      //阈值



  12. //定义变量
  13. //
  14. unsigned int Line_Select[LINE]=
  15.   {
  16.           21,24,27,30,33,36,39,42,45,48,
  17.           51,54,57,60,63,66,69,72,75,78,
  18.           81,84,87,90,93,96,99,102,105,108,
  19.           111,114,117,120,123,126,129,132,135,138,
  20.           141,144,147,150,153,156,159,162,165,168,
  21.           171,174,177,180,183,186,189,192,195,198
  22.   };
  23. unsigned char IMG[LINE][COL]=
  24.   {0
  25.   };
  26. unsigned int Line_cnt = 0;                                                              //行计数
  27. unsigned int Field_cnt = 0;                                                             //场计数
  28. unsigned int Used_Line = 0;                                                           //所用行的指针
  29. unsigned int a,k,temp = 0;
  30. unsigned char POST_PE2 = 0;
  31. //unsigned char IMG[LINE][COL];
  32. //unsigned char (*Pix_point)[COL] = IMG;
  33. unsigned char SCI_ENABLE_FLAG = 0;


  34. interrupt 6 void IRQ_ISR(void)
  35.   {
  36.       if(PORTE_PE2!=POST_PE2)      //判断是否是新的一场,
  37.                 //即判断场中断的端口值是否发生改变
  38.         {
  39.               Line_cnt = 0;       //新的一场,行计数清零
  40.               Field_cnt ++;       //场计数加一
  41.               Used_Line = 0;
  42. //              if(Used_Line > LINE)
  43. //                        {
  44. //                          SCI_ENABLE_FLAG = 1;
  45. //                        }
  46.         }
  47.       else if (Field_cnt >= Field_Delete)           //判断场数,用以舍弃前几场,        //去场消隐?好像不是
  48.                                                                       //如果大于舍弃掉的场数,则开始采集
  49.         {
  50.               if (Line_cnt == Line_Select[Used_Line])           //如果行计数等于所需采集行,则进行采集
  51.                                                                                        //因为所需采集行数组可自行设置,可避开消隐区
  52.                 {
  53.                       SCI_ENABLE_FLAG = 0;
  54.                       k = 53;
  55.                       while(k--);                                                  //去行消隐
  56.                       //开始采集
  57.                       for(a=0; a<COL; a++)
  58.                         {
  59.                     
  60.                             temp = 0;
  61.                             temp += PORTK_PK0;
  62.                             temp += PORTK_PK0;
  63.                             temp += PORTK_PK0;
  64.                             temp += PORTK_PK0;
  65.                             temp += PORTK_PK0;
  66.                             temp += PORTK_PK0;
  67.                             temp += PORTK_PK0;
  68.                             temp += PORTK_PK0;
  69.                             temp += PORTK_PK0;
  70.                             temp += PORTK_PK0;
  71.                             temp += PORTK_PK0;
  72.                             temp += PORTK_PK0;
  73.                             temp += PORTK_PK0;
  74.                             temp += PORTK_PK0;
  75.                             temp += PORTK_PK0;
  76.                             temp += PORTK_PK0;
  77.                             temp += PORTK_PK0;
  78.                             temp += PORTK_PK0;
  79.                             temp += PORTK_PK0;
  80.                             temp += PORTK_PK0;
  81.                            
  82.                             IMG[Used_Line][a] = 1;
  83.                            
  84. }
  85.                      

  86.                       Used_Line++;

  87.                 }
  88.                 Line_cnt++;
  89.         }
  90.   }

  91. void SetBusCLK_64M(void)
  92. {   
  93.     CLKSEL=0x00;                                //disengage PLL to system
  94.     PLLCTL_PLLON=1;                        //turn on PLL
  95.     SYNR =0xC0 | 0x07;                        
  96.     REFDV=0x80 | 0x01;
  97.     POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=128MHz;
  98.     _asm(nop);          //BUS CLOCK=64M
  99.     _asm(nop);
  100.     while(!(CRGFLG_LOCK==1));          //when pll is steady ,then use it;
  101.     CLKSEL_PLLSEL =1;                        //engage PLL to system;
  102. }

  103. void SCI_INIT(void)
  104.   {
  105.         SCI0BD = BUSCLK/16/BAUD;//   0x01A0;          //设置SCI0波特率为9600
  106.         SCI0CR1 = 0x00;                                 //设置SCI0为正常工作模式,八位数据位,无奇偶校验
  107.         SCI0CR2 = 0x08;                           
  108.   }

  109. void uart_putchar(unsigned char ch)
  110. {
  111.         while(!(SCI0SR1&0x80)) ;                     //keep waiting when not empty  
  112.         SCI0DRL=ch;
  113. }


  114.   
  115.   void Send_IMG(void)
  116.   {
  117.         unsigned int i,j;
  118.         for(i=0; i<LINE; i++)
  119.           {
  120.                 for(j=0; j<COL; j++)
  121.                   {
  122.                         uart_putchar(IMG[i][j]+0x30);      //
  123.                   }
  124.                  uart_putchar('\n');
  125.                  uart_putchar('\r');
  126.           }
  127.           uart_putchar('\n');
  128.           uart_putchar('\r');
  129.           uart_putchar('\n');
  130.           uart_putchar('\r');
  131.           uart_putchar('\n');
  132.           uart_putchar('\r');
  133.   }




  134. void main(void) {
  135. //int i,j;
  136.   /* put your own code here */
  137.     DisableInterrupts;
  138.    
  139.     SetBusCLK_64M();
  140.     SCI_INIT();
  141. //    DDRB = 0xFF;
  142. //    PORTB = 0x00;


复制代码
所有的代码都写在一个主函数里了,BDM在线调试时,一开始还能正常发回几个‘1’,接着就就发回‘0’了,目测是复位了,然后过一会儿程序就停止了,怎么回事啊?感觉中断没写错啊?求大神赐教


作者: Neozoic    时间: 2013-5-29 21:17
  1. #include <hidef.h>      /* common defines and macros */
  2. #include "derivative.h"
  3. #pragma CODE_SEG __NEAR_SEG NON_BANKED

  4. //#define PORTE_PE0
  5. #define Field_Delete 3
  6. #define LINE 60
  7. #define COL 50//76

  8. #define BUSCLK      64000000              //总线频率
  9. #define OSCCLK      16000000             //晶振频率
  10. #define BAUD           9600                     //波特率


  11. #define THRESHOLD 20      //阈值



  12. //定义变量
  13. //
  14. unsigned int Line_Select[LINE]=
  15.   {
  16.           21,24,27,30,33,36,39,42,45,48,
  17.           51,54,57,60,63,66,69,72,75,78,
  18.           81,84,87,90,93,96,99,102,105,108,
  19.           111,114,117,120,123,126,129,132,135,138,
  20.           141,144,147,150,153,156,159,162,165,168,
  21.           171,174,177,180,183,186,189,192,195,198
  22.   };
  23. unsigned char IMG[LINE][COL]=
  24.   {0
  25.   };
  26. unsigned int Line_cnt = 0;                                                              //行计数
  27. unsigned int Field_cnt = 0;                                                             //场计数
  28. unsigned int Used_Line = 0;                                                           //所用行的指针
  29. unsigned int a,k,temp = 0;
  30. unsigned char POST_PE2 = 0;
  31. //unsigned char IMG[LINE][COL];
  32. //unsigned char (*Pix_point)[COL] = IMG;
  33. unsigned char SCI_ENABLE_FLAG = 0;
  34. interrupt 6 void IRQ_ISR(void)
  35.   {
  36.       SCI_ENABLE_FLAG = 0;
  37.       if(PORTE_PE2!=POST_PE2)      //判断是否是新的一场,
  38.                 //即判断场中断的端口值是否发生改变
  39.         {
  40.               Line_cnt = 0;       //新的一场,行计数清零
  41.               Field_cnt ++;       //场计数加一
  42.               Used_Line = 0;
  43.                      }
  44.         }
  45.       else if (Field_cnt == Field_Delete)           

  46.         {
  47.               if (Line_cnt == Line_Select[Used_Line])   
  48.                                                                                          {
  49.                       SCI_ENABLE_FLAG = 0;
  50.                       k = 53;
  51.                       while(k--);                                                  //去行消隐
  52.                       //开始采集
  53.                       for(a=0; a<COL; a++)
  54.                         {
  55.                     
  56.                             temp = 0;
  57.                             temp += PORTK_PK0;
  58.                             temp += PORTK_PK0;
  59.                             temp += PORTK_PK0;
  60.                             temp += PORTK_PK0;
  61.                             temp += PORTK_PK0;
  62.                             temp += PORTK_PK0;
  63.                             temp += PORTK_PK0;
  64.                             temp += PORTK_PK0;
  65.                             temp += PORTK_PK0;
  66.                             temp += PORTK_PK0;
  67.                             temp += PORTK_PK0;
  68.                             temp += PORTK_PK0;
  69.                             temp += PORTK_PK0;
  70.                             temp += PORTK_PK0;
  71.                             temp += PORTK_PK0;
  72.                             temp += PORTK_PK0;
  73.                             temp += PORTK_PK0;
  74.                             temp += PORTK_PK0;
  75.                             temp += PORTK_PK0;
  76.                             temp += PORTK_PK0;
  77.                            
  78.                             IMG[Used_Line][a] = 1;            
  79.                         }
  80.                      Used_Line++;
  81.                }
  82.                 Line_cnt++;
  83.         }
  84.         else
  85.           {
  86.             SCI_ENABLE_FLAG = 1;
  87.           }
  88.   }
  89. void SetBusCLK_64M(void)
  90. {   
  91.     CLKSEL=0x00;
  92.     PLLCTL_PLLON=1;
  93.     SYNR =0xC0 | 0x07;                        
  94.     REFDV=0x80 | 0x01;
  95.     POSTDIV=0x00;      
  96.     _asm(nop);
  97.     _asm(nop);
  98.     while(!(CRGFLG_LOCK==1));          
  99.     CLKSEL_PLLSEL =1;                     
  100. }
  101. void SCI_INIT(void)
  102.   {
  103.         SCI0BD = BUSCLK/16/BAUD;//设置SCI0波特率为9600
  104.         SCI0CR1 = 0x00;                                 
  105.         SCI0CR2 = 0x08;                           
  106.   }
  107. void uart_putchar(unsigned char ch)
  108. {
  109.         while(!(SCI0SR1&0x80)) ;                      
  110.         SCI0DRL=ch;
  111. }
  112. void Send_IMG(void)
  113.   {
  114.         unsigned int i,j;
  115.         for(i=0; i<LINE; i++)
  116.           {
  117.                 for(j=0; j<COL; j++)
  118.                   {
  119.                         uart_putchar(IMG[i][j]+0x30);      //
  120.                   }
  121.                  uart_putchar('\n');
  122.                  uart_putchar('\r');
  123.           }
  124.           uart_putchar('\n');
  125.           uart_putchar('\r');
  126.           uart_putchar('\n');
  127.           uart_putchar('\r');
  128.           uart_putchar('\n');
  129.           uart_putchar('\r');
  130.   }
  131. void main(void) {
  132.     DisableInterrupts;  
  133.     SetBusCLK_64M();
  134.     SCI_INIT();
  135.     EnableInterrupts;
  136.     _DISABLE_COP();
  137.     while(1)
  138.       {
  139.                 if(SCI_ENABLE_FLAG == 1)
  140.                   {
  141.                        Send_IMG();
  142.                   }
  143.       }
  144. }
复制代码





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