程序是在定时器例程里面改的,现在编译也正常,但就是P34引脚输出没有波形?大佬们这个是什么情况??
定时器中的timer1变量为局部变量,应该是timer++以及相关的if判断工作不正常。
将timer1定义为全局变量。
回来订正一下:局部变量的时候波形输出没有变化,改成全局变量的时候波形输出有变化了
错误信息,不能撤回;希望论坛这边可以添加一个消息撤回选项
/********************************** (C) COPYRIGHT ******************************* * File Name : Main.C * Author : WCH * Version : V1.1 * Date : 2017/09/05 * Description : CH554 Time ?????????¨?±?÷???????÷??????T2??×??????? ?¨?±?÷???????í *******************************************************************************/ #include "..\Public\CH554.H" #include "..\Public\Debug.H" #include "Timer.H" #include "stdio.h" #include "GPIO.H" #pragma NOAREGS //UINT8 FLAG; //UINT16 Cap[8] = {0}; int time1=0,time2=0; sbit PWM_1 = P3^4; sbit PWM_2 = P1^0; main( ) { CfgFsys( ); //CH554?±?????????? mDelaymS(50); //?????÷?????¨?é???????±?????÷?????¨ mInitSTDIO( ); //?????????? Port3Cfg(1,4); //P34?è?????ì???? Port1Cfg(1,0); //P10?è?????ì???? printf("start ...\n"); #ifdef T0_INT printf("T0 Test ...\n"); // mTimer0ClkFsys(); //T0?¨?±?÷?±???è?? ?¨?±?÷,?±??=Fsys mTimer0Clk12DivFsys(); //T0?¨?±?÷?±???è?? ?¨?±?÷,?±??=Fsys/12 T0±ê×??±?? mTimer_x_ModInit(0,1); //T0 ?¨?±?÷?????è?? ????1??16???¨?±?÷ mTimer_x_SetData(0,0xD8FE); //T0?¨?±?÷???? mTimer0RunCTL(1); //T0?¨?±?÷???? ET0 = 1; //T0?¨?±?÷???????? EA = 1; while(1); #endif //#ifdef T1_INT // printf("T1 Test ...\n"); // mTimer1Clk12DivFsys(); //T1?¨?±?÷?±???è?? // mTimer_x_ModInit(1,2); //T1 ?¨?±?÷?????è?? 8??×?????×°?¨?±?÷ // mTimer_x_SetData(1,0xEEEE); //T1?¨?±?÷???? // mTimer1RunCTL(1); //T1?¨?±?÷???? // ET1 = 1; //T1?¨?±?÷???????? // EA = 1; // while(1); //#endif #ifdef T2_INT printf("T2 Test ...\n"); mTimer2Clk12DivFsys(); //T2?¨?±?÷?±???è?? mTimer_x_ModInit(2,2); //T2 ?¨?±?÷?????è?? mTimer_x_SetData(2,0xD8F0); //T2?¨?±?÷???? mTimer2RunCTL(1); //T2?¨?±?÷???? ET2 = 1; //T2?¨?±?÷???????? EA = 1; while(1); #endif while(1); } #ifdef T0_INT /******************************************************************************* * Function Name : mTimer0Interrupt() * Description : CH554?¨?±?????÷0?¨?±?????÷???????í???? *******************************************************************************/ void mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1 //timer0????·??????ò,?????????÷×é1 { //·???3?±??TH0????Timer1??????×??? // mTimer_x_SetData(0,0x0000); //·?×???????·????è??????TH0??TL0???? mTimer_x_SetData(0,0xD8FE); //T0?¨?±?÷???? 65535-10000 SCK = ~SCK; time1++; if(time1>=200) time1=0; if(time1=200) time2=0; if(time2<100) PWM_2=1; else PWM_2=0; } #endif
订正:这个程序没有定义宏,所以定义的引脚用示波器监测的时候显示不出来波形。
错误信息,可能会造成误导,撤回
1、检查T0_INT、T2_INT两个宏是否有效
2、程序中都有保留SCK翻转,用示波器观察P1.7(SCK)是否有翻转
3、不使用定时器功能,直接在主循环中定时翻转两个IO,检查IO本身能否实现翻转
在程序最开始的时候添加了宏定义,这个时候示波器监测到SCK翻转,但IO不翻转;直接在程序里面翻转IO又是没有问题的。
时钟引脚有翻转信号,但定义的输出引脚信号没有翻转;单独翻转定义的输出引脚又可以实现翻转。更换引脚和配置还是一样的效果,只要设置成输出模式都可以(一般设置成推挽输出)。
自己回复自己一下,能输出波形了,但具体不知道是什么问题?
我把程序宏全部去掉,只留下定时器基础设置和中断函数,然后运行可以输出波形。这样看的话应该算是宏定义有误吧!
但程序是能进入中断的,SCK也能翻转但就是没有波形输出。这样来说宏应该是定义成功了的。
所以我也不知道是什么问题,有大佬帮忙给小白解释一下吗?
/********************************** (C) COPYRIGHT ******************************* * File Name : Main.C * Author : WCH * Version : V1.1 * Date : 2017/09/05 * Description : CH554 Time ?????????¨?±?÷???????÷??????T2??×??????? ?¨?±?÷???????í *******************************************************************************/ #include "..\Public\CH554.H" #include "..\Public\Debug.H" #include "Timer.H" #include "stdio.h" #include "GPIO.H" #pragma NOAREGS int time=0; sbit PWM_1 = P3^4; UINT16 T0_INIT=0X0056; main( ) { CfgFsys( ); //CH554?±?????????? mDelaymS(10); //?????÷?????¨?é???????±?????÷?????¨ mInitSTDIO( ); //?????????? Port3Cfg(1,4); //P34?è?????ì???? UART1Init( ); //????1?????? mTimer0ClkFsys(); //T0?¨?±?÷?±???è?? ?¨?±?÷,?±??=Fsys // mTimer0Clk4DivFsys(); //T0?¨?±?÷?±???è?? ?¨?±?÷,?±??=Fsys/4 // mTimer0Clk12DivFsys(); //?¨?±?÷,?±??=Fsys/12 T0±ê×??±?? mTimer_x_ModInit(0,1); //T0 ?¨?±?÷?????è?? ????1??16???¨?±?÷ // mTimer_x_ModInit(0,2); //T0 ?¨?±?÷?????è?? ????2??8??×?????×°?????¨?±?÷ mTimer_x_SetData(0,T0_INIT); //T0?¨?±?÷???? mTimer0RunCTL(1); //T0?¨?±?÷???? ET0 = 1; //T0?¨?±?÷???????? EA = 1; while(1) {} } /******************************************************************************* * Function Name : mTimer0Interrupt() * Description : CH554?¨?±?????÷0?¨?±?????÷???????í???? *******************************************************************************/ void mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1 //timer0????·??????ò,?????????÷×é1 { //·???3?±??TH0????Timer1??????×??? mTimer_x_SetData(0,T0_INIT); //T0?¨?±?÷???? SCK = ~SCK; time++; if(time>=2) time=0; if(time<1) PWM_1=1; else PWM_1=0; }
现在可以输出43K左右的波形,但继续调小T0_INIT(定时器初始值),波形变化有点奇怪,继续减小初始值频率会变大,但达到一定程度后初始值不管如何变化频率基本保持不变。这是个什么情况?
我发现定时器时钟=Fsys和定时器时钟=Fsys/12两种情况下输出的频率并非是12倍的关系(输出PWM频率在43K左右),当选择四倍频输出的时候程序报错,4倍频没测。我想输出频率在43K、占空比可调的PWM波,这个芯片能做到吗?现在能输出43K但占空比不能调整,大佬可以帮忙看看吗?
您好,使用定时器时要注意是否和串口初始化时使用的定时器冲突。比如T2MOD寄存器。
这个应该是没有关系的,我前面也考虑是否会有影响,我把串口初始化那些都注释掉了,输出还是大概到50K的时候频率就不变化了,我监测的是SCK时钟引脚。
现在的情况是,定时器给初值0x0056时钟引脚SCK可以输出43K左右的波形,当把初始值改为0x002B的时候输出就是50K,按照理论来说应该是86K左右才是正常的,但现在好像到50K就达上限了