搜索
bottom↓
回复: 22

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

[复制链接]

出0入0汤圆

发表于 2008-8-27 14:14:24 | 显示全部楼层 |阅读模式
电路图如上面那个GPIO的例子中的电路图

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

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

/*
*******************************************************************************
**  Include files
*******************************************************************************
*/
#pragma interrupt  INTTM80 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)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2008-8-27 16:03:19 | 显示全部楼层
是不是这样的原因:设开始LED_STATUS=0;每次进入中断,它反转,当TIME_CNT=10时,进入第二个IF时,LED_STATUS又回到0,依此类推,故R2,R3只有一个亮,且都
不闪烁。我一菜鸟~~~~~~~

出0入0汤圆

 楼主| 发表于 2008-8-27 16:13:20 | 显示全部楼层
R2,R3只有一个都不亮 啊

出0入0汤圆

 楼主| 发表于 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 ;
}

出0入0汤圆

发表于 2008-8-27 16:28:01 | 显示全部楼层
无语,才学2天,请各位高手来看看

出0入0汤圆

发表于 2008-8-27 16:31:12 | 显示全部楼层
灯2与3不闪烁的原因是你软件上并没有让它电压产生改变。

出0入0汤圆

 楼主| 发表于 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模式下调试硬件 运行工作也正常

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

出0入0汤圆

发表于 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;----------没改变

出0入0汤圆

发表于 2008-8-27 16:43:44 | 显示全部楼层
你的程序循环进行,而这2个IO口电压是没改变的啊

出0入0汤圆

 楼主| 发表于 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 ;
}

出0入0汤圆

发表于 2008-8-27 18:16:06 | 显示全部楼层
我用SM+软仿是正常的,说明你改后逻辑没有错,看看硬件?

(原文件名:4.JPG)

出0入0汤圆

发表于 2008-8-27 22:46:40 | 显示全部楼层
为什么要把简单的程序复杂化呢?

出0入0汤圆

发表于 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那?

出0入0汤圆

 楼主| 发表于 2008-8-28 07:56:32 | 显示全部楼层
软件调试是可以进去的 但是下到硬件上就不行了 连波形都没有

出0入0汤圆

 楼主| 发表于 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 ;  
}

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

出0入0汤圆

发表于 2008-8-28 08:15:13 | 显示全部楼层
你的看门狗是不是打开了啊?

出0入0汤圆

 楼主| 发表于 2008-8-28 08:19:14 | 显示全部楼层
没有打开 即使打开了也不应该有影响的

出0入0汤圆

 楼主| 发表于 2008-8-28 15:57:06 | 显示全部楼层
问题找到了

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

出0入0汤圆

发表于 2008-11-27 12:02:13 | 显示全部楼层
问题找到了  



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

  



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

出0入0汤圆

 楼主| 发表于 2008-11-30 11:22:53 | 显示全部楼层
关键是你没有设置让软件能够停止内部时钟

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



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

出0入0汤圆

 楼主| 发表于 2008-11-30 11:23:46 | 显示全部楼层
低速内部时钟需要能够被软件停止



希望是这个原因啊 



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

出0入0汤圆

发表于 2009-2-23 15:29:42 | 显示全部楼层
你好,我想问一下,
bit LED_STATUS;
bit TM80_FLAG;
C语言不是没有这个定义类型的么?
这个我不大明白。

出0入0汤圆

发表于 2010-7-25 15:58:17 | 显示全部楼层
问一下,你们用的软件为什么我下不下来,下载下来的也没用。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-16 07:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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