dongdaxing 发表于 2008-8-27 14:14:24

菜鸟第二贴--TM80--中断控制

电路图如上面那个GPIO的例子中的电路图

功能:LED_R1 闪烁
LED_R2//LED_R3 闪烁

主程序如下
时钟内部 :8M

/*
*******************************************************************************
**Include files
*******************************************************************************
*/
#pragma interruptINTTM80 MD_INTTM80

#include "macrodriver.h"
#include "system.h"
/*
*******************************************************************************
**MacroDefine
*******************************************************************************
*/
/*
**---------------------------------------------------------------------------
**
**Abstract:
**        This function implements main function.
**
**Parameters:
**        None
**
**Returns:
**        None
**
**---------------------------------------------------------------------------
*/
#define        PORT_PM4        0x1f   //SET P4.5 P4.6 P4.7 OUT
#define        PORT_PU4        0x0    //SET P4.5 P4.6 P4.7 UP
#define        PORT_P4                0x00    //SET P4.5 P4.6 P4.7 = 0

#define LED_R1 P4.5
#define LED_R2 P4.6
#define LED_R3 P4.7

extern void hdwinit( void );
bit LED_STATUS;
bit TM80_FLAG;

unsigned char g_ucTM80cnt = 0;
unsigned char time_count = 0;

__interrupt void MD_INTTM80( void )
{       
      if (++g_ucTM80cnt == 250)
      {   
            g_ucTM80cnt = 0;
            LED_R1=LED_STATUS;
            LED_STATUS = ~LED_STATUS;
            time_count++;
      }        
      if(time_count == 10)
      {
                      LED_R2 = LED_STATUS;
                      LED_R3 = ~LED_STATUS;
                      time_count = 0;
      }
        return ;
}

void PORT_Init( void )
{
        P4= PORT_P4;
        PU4 = PORT_PU4;
        PM4 = PORT_PM4;
}

void main( void )
{
        hdwinit();
       
        PORT_Init();
       
        LED_STATUS = 0;
        time_count = 0;
        TM80_FLAG = 0;

    TMC80 = 0b00000000;         /* Count clock = fxp/2^6 = 125 kHz */
    CR80= 249;               
    TCE80 = 1;                  /* Start the timer operation */

    TMMK80 = 0;                   /* Enable INTTM80 interrupts */
               
        EI();
        while(1)
        {
                ;//wait interrupt
    }
}

//=============================================================================

请高手指点一下:
1==感觉时钟不准确,led亮暗间隔不均匀。(手上没有示波器 不好检查波形)

2==为什么LED_R2和LED_R3不会产生闪烁,是不是中断程序有要求????

工程文件如下
tm80工程文件ourdev_391754.rar(文件大小:56K) (原文件名:TIME.rar)

jishanlaike 发表于 2008-8-27 16:03:19

是不是这样的原因:设开始LED_STATUS=0;每次进入中断,它反转,当TIME_CNT=10时,进入第二个IF时,LED_STATUS又回到0,依此类推,故R2,R3只有一个亮,且都
不闪烁。我一菜鸟~~~~~~~

dongdaxing 发表于 2008-8-27 16:13:20

R2,R3只有一个都不亮 啊

dongdaxing 发表于 2008-8-27 16:14:31

中断程序改成这样后还是LED_R1工作正常
LED_R2和LED_R2没工作
__interrupt void MD_INTTM80( void )
{       
      if (++g_ucTM80cnt == 250)
      {   
            g_ucTM80cnt = 0;
            LED_R1 = ~LED_R1;
//                      LED_R2 = ~LED_R2;
//                      LED_R3 = ~LED_R3;
            time_count++;
      }        
      if(time_count == 3)
      {
                      LED_R2 = ~LED_R2;
                      time_count = 0;
      }
        return ;
}

jishanlaike 发表于 2008-8-27 16:28:01

无语,才学2天,请各位高手来看看

RENESAS-etouch 发表于 2008-8-27 16:31:12

灯2与3不闪烁的原因是你软件上并没有让它电压产生改变。

dongdaxing 发表于 2008-8-27 16:34:04

NEC-etouch 北京意同创科技公司
积分:59
派别:
等级:------
来自:北京意同创科技有限公司
灯2与3不闪烁的原因是你软件上并没有让它电压产生改变。

终于等来boss了

__interrupt void MD_INTTM80( void )
{         
      if (++g_ucTM80cnt == 250)
      {      
            g_ucTM80cnt = 0;   
            LED_R1 = ~LED_R1;
                      LED_R2 = ~LED_R2;
                     LED_R3 = ~LED_R3;
            time_count++;
      }         
      if(time_count == 3)
      {
                     // LED_R2 = ~LED_R2;
                      time_count = 0;
      }
      return ;
}
//

如果是这样 LED 工作就都正常
对于上面的如果我是在debug模式下调试硬件 运行工作也正常

那么请问您能否指点一下 我该如何修改

RENESAS-etouch 发表于 2008-8-27 16:42:24

time_count          LED_STATUS
0                  1
1                  0
2                  1
3                  0
4                  1
5                  0
6                  1
7                  0
8                  1
9                  0
10                   0
LED_R2= 0,LED_R3 = 1;---------------------没改变
0                  1
1                  0
2                  1
3                  0
4                  1
5                  0
6                  1
7                  0
8                  1
9                  0
10                   0
LED_R2= 0,LED_R3 = 1;----------没改变

RENESAS-etouch 发表于 2008-8-27 16:43:44

你的程序循环进行,而这2个IO口电压是没改变的啊

dongdaxing 发表于 2008-8-27 16:53:53

这个我看到了

谢谢

请您看看我后面发的那个中断程序

__interrupt void MD_INTTM80( void )
{         
      if (++g_ucTM80cnt == 250)
      {      
            g_ucTM80cnt = 0;   
            LED_R1 = ~LED_R1;
//                      LED_R2 = ~LED_R2;
//                      LED_R3 = ~LED_R3;
            time_count++;
      }         
      if(time_count == 3)
      {
                      LED_R2 = ~LED_R2;   //==============此处修改 程序无法进入这个地方 即使改成WHILE(1);
                      time_count = 0;
      }
      return ;
}

sophie0403 发表于 2008-8-27 18:16:06

我用SM+软仿是正常的,说明你改后逻辑没有错,看看硬件?
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_391993.JPG
(原文件名:4.JPG)

lovefei 发表于 2008-8-27 22:46:40

为什么要把简单的程序复杂化呢?

lovefei 发表于 2008-8-27 22:51:49

__interrupt void MD_INTTM80( void )
{         
      if (++g_ucTM80cnt == 250)
      {      
            g_ucTM80cnt = 0;   
            LED_R1=~LED_R1;
            time_count++;
      }         
      if(time_count == 10)
      {
             LED_R2 = ~LED_R2;
             LED_R3 = ~LED_R3;
             time_count = 0;
      }
      return ;
}
这样应该没问题的吧,你再看看。单步运行,看程序是否执行到了LED_R2那?

dongdaxing 发表于 2008-8-28 07:56:32

软件调试是可以进去的 但是下到硬件上就不行了 连波形都没有

dongdaxing 发表于 2008-8-28 08:10:24

硬件是不会有问题的 其他程序都通过了
我现在只是想写点入门小例子 所以一个一个资源调的

如果改成这样子就没有问题 led都可以闪烁了
__interrupt void MD_INTTM80( void )
{         
      if (++g_ucTM80cnt == 250)
      {      
            g_ucTM80cnt = 0;   
            LED_R1=~LED_R1;
            LED_R2 = ~LED_R2;
             LED_R3 = ~LED_R3;   
            time_count++;
      }         
      if(time_count == 10)
      {
            
             time_count = 0;
      }
      return ;
}

这样已经可以说明硬件没有问题了吧

jackiezeng 发表于 2008-8-28 08:15:13

你的看门狗是不是打开了啊?

dongdaxing 发表于 2008-8-28 08:19:14

没有打开 即使打开了也不应该有影响的

dongdaxing 发表于 2008-8-28 15:57:06

问题找到了

是我系统时钟部分设置出现问题了

zghycc 发表于 2008-11-27 12:02:13

问题找到了  



是我系统时钟部分设置出现问题了

  



什么问题,我也没搞懂,能说一下吗?

dongdaxing 发表于 2008-11-30 11:22:53

关键是你没有设置让软件能够停止内部时钟

看看这个图 你需要按照如下设置

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_522676.JPG

 (原文件名:未命名.JPG) 

dongdaxing 发表于 2008-11-30 11:23:46

低速内部时钟需要能够被软件停止



希望是这个原因啊 



后面还是请nec-teach来解答一下呵呵

sweetea 发表于 2009-2-23 15:29:42

你好,我想问一下,
bit LED_STATUS;
bit TM80_FLAG;
C语言不是没有这个定义类型的么?
这个我不大明白。

moon557 发表于 2010-7-25 15:58:17

问一下,你们用的软件为什么我下不下来,下载下来的也没用。。。
页: [1]
查看完整版本: 菜鸟第二贴--TM80--中断控制