This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、
我正在做一个简单的解决方案。 在这里、我想进行 PWM 更改计时周期、并在终端中打印当前计时周期。 我的代码基于 hetPwm 和 adcDisplay 示例。 代码工作正常、但我希望将 dutyCicle 值打印为十进制。
以下是我的代码:
/*包含文件*/ #include "sys_common.h" /*用户代码开始(1)*/ #include "het.h" #define TIZE1 8 uint8 text1[TIZE1]={'r'、'n'、't'、'1't、 't'0'、't'0'、't'2'、't't's'、't'0'、't'ze2'、't't's's'e2'、't's's's'、't't's's'e2'、't's's's's'、'e2'、't's's's's's's's's's's's'、'e2'、'e'、's's's's's's's's's'e'、'e'、'e'、's's's's'e'、'e'、's's's's'e'、 's void sciDisplayText (sciBASE-t * sci、uint8 *文本、uint32长度); void sciDisplayData (scibase_t * sci、uint8 *文本、uint32长度); void wait (uint32时间); //*用户代码结束* ////**@fn void main (void) *@brief Application main 函数 *@注意默认情况下,此函数为空。 * *此函数在启动后调用。 *用户可以使用此函数来实现应用程序。 // //*用户代码开始(2)*/ uint32时间; uint32 dutyCle; float64 period_us; uint32值; //用户代码结束*/ int main (void) { //*用户代码开始(3)*/ sciInit(); sciDisplayText (scilinREG、&text1[0]、tisdutye0 = Zetus);sciIneiinteiC1000 = Zeth; 时间= 1000.0; setPwm (dutyCleum、period_us); while (1) { sciDisplayText (scilinREG、&text2[0]、TIZE2); dutyCley=0; 值= dutyCicle; while (dutyCley<=100) { sciDisplayText (scilinREG、&text3[0]、TsIZE3); sciDisplayData (scilinREG、(uint8*)&value、4); 值= dutyCley; setPwm (dutyCley, period_us); //__delay_cycles (50000000); dutyCley+=5; wait (0xFFFFFF); } pwmStop (hetRAM1、pwm0); sciDisplayText (scilinREG、&text4[0]、TMSIZE4); Wait (0xFFFFFFF); } //*用户代码结束* /*用户代码开始(4)*/ void setPwm (uint32 dutyCicle、float64 period_us) { hetInit (); hetGNSIUs *、void setPwm 信号 周期= dutymr.pwt;duty 信号周期 = rmwmwmrh;pwmwmrandit 信号= durt;pwmwmwmwmwmwmrands = durt 信号周期 pwmSetDuty (hetRAM1、pwm0、pwmSignal.dDuty); pwmStart (hetRAM1、pwm0); } void DisplayText (scii_t * sci、uint8 *文本、uint32长度){while (length-)(scilini-);}void DisplayText (sci_t * sci+* 8 *、uint8 *、uint32 length);}uinte+= 0xuinte+、uint8 * wi+、uinte+ 1、uinte+ 1、uinte+= 0xinte+ 1、uinteUSt 2、uinte+ 1、uinte+ 1、uinte+ 1、uintex 2、uinte+ 1、uint #if (__little_endian__==1)||(__little_ENDIAN__==1) text = text +(length -1); #endif while (length---) { #if (__little_endian__==1)||(__little_ENDIAN_= 0x1+; txt= ~ 0xtf0 = ~ 1+;text= 0t1+= t1+(txt+)*t1+= 0xt1+(txt1);ttxt+= t1+= t0t1+= t1+(txt1) if (txt<=0x9) { txt +=0x30; } 否则 if (txt > 0x9 && txt < 0xF) { txt +=0x37; } 否则 { txt = 0x30; } if (txt1 <= 0x9) { txt1 +=0x30; } 否则((txt1 > 0x9)&&(txt1 <= 0x30 );}txt1 = 0x31;}= 0x31 while ((scilinREG->FLR & 0x4)== 4);//等待直至繁忙*/ sciSendByte (scilinREG、txt1);//发送文本 */ while (scilinREG->FLR & 0x4)=4);// 等待直至繁忙*/ sciINTByte (scilinREG->Fr & 0x4);//* 等待时间};while (uidt.32)*等待时间(uidt.out)
我的教师建议它可以是终端配置。 但我尝试了三种不同的终端软件、没有成功。
欢迎提出任何建议。
Anthony
感谢您的建议。 这似乎是有效的,但不是我希望的。 sprintf 函数打印在控制台上、sciDisplayData 打印在终端上、请查看下面的屏幕截图。 为什么会发生这种情况、有何不同?
代码的修改部分
while (dutyCley<=100) { //sciDisplayText (scilinREG、&text3[0]、TMSIZE3); //DisplaysciData (scilinREG、(uint8*)&value、4); value = sprintf (buffer、"loop.dit_cicle \t %d"、dutyCicle); setPwm (dutyCleum、period_us); //_delay_cycles (50000000); dutyCle+=5; printf (buffer、 值); Wait (0xFFFFFFF); }
我想介绍一下这个解决方案、但我之前没有应用它、因为我想了解正在发生的情况、并想使用 sci lib。 I'v 的目的是在该函数中实现传感器读数、并将 PWM dutyCicle 的百分比与从传感器读取的值进行比较。
在发送到发送数据例程之前、您需要将变量"value"转换为 BCD。 发送数据例程设置为发送十六进制值。
将十六进制值转换为最多3位 BCD 值的一些简单代码为:
uint8 val; //要转换 uint16 bcdval 的值;//转换后的值 uint8 d0、d1、d2;//用于写入0 ~ 255 d2 = val / 100; val = 100 * d2; d1 = val / 10; d0 = val % 10; bcdval = d2 << 8 + d1 << 4 + d0;
这将处理高达999的值。 如果您需要更多数字、则需要添加一个分步以除以1000。
另请注意、发送例程仅适用于2个字符(即00至99) 因此、需要对其进行修改以处理需要传递到其中的较大16位值、或者需要对打印值进行分区、以便您单独将2个8位 BCD 值传递到其中。
Chuck、我花了一些时间尝试您的代码、但我不确定它是否正常工作、或者我是否了解转换应该在哪里。
我调整了您显示的代码以仅转换2个字符、因为仅显示3个字符的零。 看看 I'v 从输出中得到的结果。
这种与以下代码相关的调整:
while (1) { sciDisplayText (scilinREG、&text2[0]、TMSIZE2); dutyCley=0; value = dutyCley; while (dutyCley<=100) { sciDisplayText (scilinREG、&text3[0]、TMSIZE3); value = bcdConvert (dutyCleyCleyCleyCley<=100); sciDisplayData (scilinREG、(uint8*)&value、4); setPwm (dutyCicle、period_us); //_ delay_cycles (5000000); dutyCicle+=5; Wait (0xFFFFFFF); } pwmStop (hetRAM1、pwm0); sciDisplayText (scilinREG、&text4[0]、TMSIZE4); Wait (0xFFFFFF); } uint32 bcdConvert (uint32值) { uint16 d0、d1、d2、d3; uint32 bcdValue;uint32 bcdc //D3 =值/1000; //value -= D3*1000; //D2 =值/100; //value -= D2*100; D1 =值/10; d0 =值%10; bcdValue = d1 << 4+d0; 返回 bcdValue; }
之后、我注意到我将向发送例程发送十进制数。 我认为十六进制转换器到 bcd 无法这样工作、对吧? 我不应该向例程发送十六进制并在 de sciSendByte 之前转换该 valoue?
卡盘、我明白了。 我发现了一个有效操作错误。 在回顾时、我看到了在发送到发送例程之前将数据转换为 BCD 时的屏幕截图、并注意到输出是半正确的(输出是在正确值和错误值上交替显示的)。 我只需括号、一切看起来都很正常。
uint32 bcdConvert (uint32 value)
{
uint8 d0、D1、D2、D3;
uint32 bcdValue;
//D3 = Value/1000;
//value -= D3*1000;
D2 = Value/0x64;
Value -= D2*100;
D1 = Value/0x0A;
D0 =值%0x0A;
bcdValue =(D2 << 8)+(D1 << 4)+ d0;
返回 bcdValue;
}
感谢大家的支持和解释。
很高兴听到!!
很高兴您能够解决此问题、感谢您使用 Hercules E2E!