打印

单片机玩

[复制链接]
1716|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhiyonghe|  楼主 | 2010-4-21 15:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhiyonghe 于 2010-4-21 15:54 编辑

闲来无事做个程序玩玩,没想到我被玩了,

思路在TPM这么多通道设置上写个可以通用的调用初始化函数
突然想玩玩在初始化后在主程序里修改初始化,没想到带给我的是单片机下载老是出错,仿真也莫名其妙的老是要重启才能正常跑!

//========TPMoc_init:初始化输出比较系统配置==========
//功  能:                                                                  
//    设置通道是否产生方波对每个通道0~7设置是否启动方波,设置成功回送     

//参  数:                                                                  
//    channel-通道号('0'~'7')字符型变量                                    
//    Switch-开关('S'-产生方波,'E'-停止)字符型变量                        
//返  回:无  
//-------------------------------------------------------------
void TPMoc_init(uchar channel, uchar Switch)
{

    switch (channel)
    {
    case '0' :
        if(Switch == 'S')
        {
            TPM1SC = 0X0F;      //关中断,总线时钟,128分频(计数到1S时中断)
            TPM1C0SC = 0X54;    //输出比较,反转电平,中断使能
            TPM1C0VH = 0XF4;
            TPM1C0VL = 0X24;
        }
        if(Switch == 'E')       //0通道停止
        {         
            TPM1C0SC = 0X00;    //恢复通用IO
            TPM1C0VH = 0X00;    //TPM1C0V清零
            TPM1C0VL = 0X00;
        }   
    break;
   
    case '1' :
        if(Switch == 'S')
        {
            TPM1SC = 0X0F;      
            TPM1C1SC = 0X54;   
            TPM1C1VH = 0XF4;
            TPM1C1VL = 0X24;
         }
        if(Switch == 'E')       //0通道停止
        {         
            TPM1C1SC = 0X00;    //恢复通用IO
            TPM1C1VH = 0X00;
            TPM1C1VL = 0X00;
        }   
    break;
           
    case '2' :
        if(Switch == 'S')
        {
            TPM1SC = 0X0F;      
            TPM1C2SC = 0X54;   
            TPM1C2VH = 0XF4;
            TPM1C2VL = 0X24;
               
        }
        if(Switch == 'E')       //0通道停止
        {         
            TPM1C2SC = 0X00;    //恢复通用IO
            TPM1C2VH = 0X00;
            TPM1C2VL = 0X00;
        }
    break;
    ……
    ……
   
   
    default:
    break;
    }
    if(int_Flag == 0x56)
    {
        oc_flag = 1;
    }
    else oc_flag = 0;
   
   // SCISend1(int_Flag);         //返回设置标志
   
}

相关帖子

沙发
zhiyonghe|  楼主 | 2010-4-21 15:40 | 只看该作者
主程序里只做个输出比较中断程序进去多少次后就改变初始化,即改变TPM对应的IO为正常IO,而不产生中断

中断程序里就做些必要的工作和inter_num++

void main(void)
{
    init_all();
    for(;;)
    {
        if(inter_num==6)
        {
            TPMoc_init('0', 'E');   
        }
         // __RESET_WATCHDOG(); /* feeds the dog */
    }

}

使用特权

评论回复
板凳
zhiyonghe|  楼主 | 2010-4-21 15:47 | 只看该作者
问题是我在主程序里加了 TPMoc_init('0', 'E');    这句就是更改初始化!
下载程序就会出错,而且也不能仿真了!!
总之一些莫名其妙的问题就出来了……

搞得我还以为那里有问题,后来查出问题主要出在 这更改初始化上!
试了很多次,只要想改初始化,调试仿真就有写莫名的问题
难道单片机不能在程序运行时更改一些状态寄存器

使用特权

评论回复
地板
zhiyonghe|  楼主 | 2010-4-21 16:03 | 只看该作者
本帖最后由 zhiyonghe 于 2010-4-22 08:29 编辑

实验的结果表明是可以修改的,但仿真的时候会有很多意想不到的问题!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:zhiyonghe  ~ 学 以 致 用 ~

131

主题

1265

帖子

1

粉丝