微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > 请教各位高手:二-十转换LED显示(急!)

请教各位高手:二-十转换LED显示(急!)

时间:10-02 整理:3721RD 点击:
我想问一下在单片机里二-十转换可以用除法,但是在DSP里没有除法指令,怎么进行转换呢?
我需要转换的二进制数位16位,LED是四位,分别为百位,十位,个位,我用的是TI2407



不太了解2407,不过C语言的库都带除法函数。在别的芯片中有EXP这样的命令支持自己写除法。不过就你这个例子来说,只用减法或者比较也可以做出来。

   16 位 2 进制数是当作正整数转换成10 进制数吗? 可以用C语言吧,还是必须用汇编语言?我想都有办法,不过工作量大小而已。

  16 位 2 进制正整数,最大可达32767,可以有万位的呀,为什么只到百位?莫非小数后还有几位?这些细节也需交待一下。

我的小数点后面只有一位数的模式为XXX.X
我只能用汇编,因为我不会C语言啊

那就不行了,用汇编我还没有编过,我只是用c实现了,计算用时也不很长,

其实方法很多 我是这样做的 假如二进制数为d,
然后循环判断(d-100)是否大于0,若是,百位加1,否则d-百位×100赋给d,
然后循环判断(d-10)是否大于0,若是,十位加1,否则d-十位×10赋给d,
然后。。。

依次类推即可算出百位,十位,各位。。。

你可以参考一下,然后我们共同探讨更好的方案。

       还有一点不清楚。16 位2 进制数是什么格式?Qxx ?小数点在哪儿?(如果是正整数,表示范围是0 - 32767,没有小数,好像与你前面讲的不太符合)。

to mlwang_km:
16位二进制数是16权制的,要表示的数为例219.3

to youzai:
\"然后循环判断(d-100)是否大于0,若是,百位加1,否则d-百位×100赋给d,\"
\"否则d-百位×100赋给d\"这句话我不是很明白为什么要这么处理,作用时什么?
我找到一个除法的子程序好像和你说得方法一样,传给你,汇编的

还想问两位一个问题,如果我要对有符号的数进行除法,DSP中的除法是针对的是被除数和除数都大于零,如果小于零怎么处理呢?请帮我指教一下,谢谢啦!!

   16权制,我是第一次听到。莫非是:16位分为四段,每段表示一个十进制位,从高到低,分别是百,十,个位和十分位?并非Qxx 格式的二进制数?如果如此,倒还简单了,那就不必做2- 10 转换,只要切成四段,变为代码就完事大吉。

不是,如果分成四段用8421表示,就会出现字母了,所以要进行十进制转换,转换成BCD数(0000-1001),需要转换的数据就是一个16位的二进制数,
我还想问你一下,如果我要对有符号的数进行除法,DSP中的除法是针对的是被除数和除数都大于零,如果小于零怎么处理呢?请帮我指教一下,谢谢啦!!

    我还是不明白,如果是 16 位 2 进制数,由于设定的小数点位置不同,有Q0,Q1,Q2,..., Q15  等16 种不同格式的,你用的是哪一种?

16进制数的16个位为
D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
你的意思是说小数点要占其中的一位么?

小数点当然不占一位,但是16 位中,前面几位是整数,后面的几位是小数,这是要说清楚的(Q0-Q15 格式就是规定这个东西)。否则谁知道这个 2 进制码表示什么东西,如何转换?

DSP 内用2进制数表示不同范围数据的不同格式,见下表:( S 0.15 表示一位符号,0位整数,15位小数)

Q表示 S表示 十进制数表示范围
Q15 S0.15 -1≤x≤0.9999695
Q14 S1.14 -2≤x≤1.9999390
Q13 S2.13 -4≤x≤3.9998779
Q12 S3.12 -8≤x≤7.9997559
Q11 S4.11 -16≤x≤15.9995117
Q10 S5.10 -32≤x≤31.9990234
Q9 S6.9 -64≤x≤63.9980469
Q8 S7.8 -128≤x≤127.9960938
Q7 S8.7 -256≤x≤255.9921875
Q6 S9.6 -512≤x≤511.9804375
Q5 S10.5 -1024≤x≤1023.96875
Q4 S11.4 -2048≤x≤2047.9375
Q3 S12.3 -4096≤x≤4095.875
Q2 S13.2 -8192≤x≤8191.75
Q1 S14.1 -16384≤x≤16383.5
Q0 S15.0 -32768≤x≤32767

抱歉啊,我没听懂你说的,你说的很专业,我的水平很业余……
我想后四位应该是小数,D3 D2 D1 D0
关于小数点的问题我完全不清楚是怎么一回事

按照你刚才给我的表我想应该选这一位 Q6 S9.6 -512≤x≤511.9804375(因为我的数值在380左右)

事实上小数点是不占位数的,
至于你说的有符号的 我觉得应该事先就判断出正负,然后转换位无符号做除法计算

可以在DSP中,没有单独的除法指令,需要用减法指令来实现除法,而此减法指令(SUBC)在执行的时候要保证除数和被除数都要大于等于零,那是不是就表示,除数和被除数都需要是有带符号数呢?如果是这样的话,还可以先转换为无符号数进行处理么?

    我想是的,记住结果的符号,(负负得正之类)然后都转换成无符号数,再做除法。

thank you
我想问一下,如果转换成无符号数,那么原来的16位数的最高位应该怎么办呢?
比如:1001 0101 0001 1100
最高位(第十五位)为1,表示为负数,如果转换为无符号数是不是应该改为
0001 0101 0001 1100?
第二个问题(很蠢!)
在SUBC指令执行的时候写到:
(ACC)-[(数据存储器地址)×2的15次方]-->ALU输出
若ALU>=0
则(ALU输出)×2+1
否则(ACC)×2-->ACC

(1) (数据存储器地址)×2的15次方是不是表示数据存储器里存放的数据为32位呢?
(2) (ALU输出)×2 乘以2可以表示位左移一位吧?如果ALU或ACC的最高位为1,那么是不是相当于把最高位的1移出去了?最低位补零?
谢谢你了~~~

汇编语言的这些部分,实在太折磨人了。我是看过一下的,但是没有用过,稍复杂一点的计算都用C语言了。 SUBC 指令是用于计算除数和被除数都是16 位正整数的情形。被除数放在ACC 低位,ACC高位先清零,除数放在数据存储地址(肯定是16 位,不可能是32 位),然后重复执行16 次SUBC,商就在ACL里,余数在ACH里了。很神奇,是不是?没有仔细推敲过。手册上这么说,理解上好像没错。
负数化为绝对值,好像应该用NEG 指令的,不是简单去掉符号位。比如说,0FFFFh表示-1,如果去掉符号位,得 07FFFh,表示+ 36767,岂不大谬!
(数据存储地址的内容)左移15 位后相减,由于ACC是32位,没啥问题。

   (ACC)* 2 -> ACC,是左移一位,右边补0。移出的最高位,似乎永远是0 ,不可能是1。因为一开始,ACC高16 位已清0。以后只有在够减时才做减法,否则只移位。所以ACC 不会成为负数。

我有再琢磨了一下SUBC指令,觉得手册上讲的除法算法是对的,我们理解也没问题,按说明设置好ACC和除数后,
RPT 15
SUBC dma

除法就完成了。
只是设计得实在太巧妙了,不易理解。

可是(数据存储地址的内容)左移15 位后相减,数据存储器是16的,如果再左移15位,不是相当与把数据全都已走了么?我不太明白啊?

并不需要在存储单元里移(实际上,做完除法存储单元里的除数是保持不变的),而是读出来以后在输入定标移位器里移。“输入定标移位器的功能是,把程序存储器或数据存储器送来的16位数调整为32 位数,然后送往32 位的CALU,”《 ...CPU 与外设》,
p 18。

这一点我明白了。thank you!
对带符号的数据进行除法,你能给我点思路么?我有一个除法的子程序,上面直接将除数和被除数进行ABS指令,和你刚才说得好像有点出入。

“负数化为绝对值,好像应该用NEG 指令的,不是简单去掉符号位。比如说,0FFFFh表示-1,如果去掉符号位,得 07FFFh,表示+ 36767,岂不大谬!”

而且我记得符号位位最高位,0FFFFh表示应该表示-7FFF,为什么是-1呢?符号到底要怎么处理呢?

还有就是你刚刚跟我说的小数的问题,怎么含有小数的二进制数进行除法,从而得到十进制数呢?


对对,我忘记了,取绝对值应该用ABS指令,这样不必判符号,无论正负,统统 ABS 一下就行了。而 NEG 只能用于负数。
负数是用补码表示的,并非绝对值加符号位。-1,是:0xFFFF,而不是 0x8001.

谢谢你,我想问一下我要是向编一个带符号含有小数的的除法程序,我的想法是把它们的绝对值相除,然后再把符号加上,可是我不知道怎么使去掉符号的数等于原来的带有符号的数,并且小数我应该怎么处理呢?
我记得你好像有例程,能给我一个汇编的么?

  我也没有做过,只能说说想法,只要两个数格式相同,(比如,都是Q6),就当做两个整数直接相除就行了。这相当于除数,被除数都同时乘与2 的若干次方,商数不变,是不是?先记住结果的符号,再把两个数 ABS,就可以相除。

我想问一下Q6怎么定呢?
还有一个就是除数和被除数ABS以后,所得到的商因该是一个无符号的数,那么这个商的最高位就应该是表示数值得,如果我把符号位加上,不就相当于把数值改变了么?

    当然不能简单地加上符号位。如果已经记住商应该是负数,绝对值相除除的结果就要用NEG 指令来取负。

真的非常谢谢你,前两天上网不方便,没有及时回复你的回答,抱歉
我想问你一下,这个除以100,除10的方法仅限于十进制数,如果我的除法想做的应用范围更广一些,我知道有一种移位的方法,但是我想了很久都想不出用移位方法怎么实现,请教你一下,谢谢!

     不太明白你的意思,机内存储的是2 进制码,要化为表示10数的字符串输出,才需要除1000,100,10 等等。除此而外你还需要做什么呢?

刚才才看到短信。我觉得首先要明确,存储在变量中的数是什么格式?希望转换成什么格式?一定要把这个前提讲的清清楚楚,才谈得到算法问题。
IEEE 大概是指一种浮点数格式。我们前几天讨论的,是 Q0-Q15,也是一种表示实数的格式。由于DSP上用Q0 -Q15 格式比较多,也比较方便。所以我想当然以为你要转换的也可能是这种格式。如果是IEEE格式的由数符,尾数,阶码组成浮点格式数,转换方法就完全不同了。

确实是你说得这个问题,但是我不太明白你说的IEEE格式格式数(由数符,尾数,阶码组成浮点)根据我刚才说的,你认为我要转换的二进数是数为IEEE格式数么?
问题1:这种数在哪能查到它的解释,c语言书可以么?
问题2:这种格式数是不是也可以转换为十进制或其他进制呢?
问题3:如果将这种格式的数转换为十进制的数是不是咱们原来说的方法就不可行了?
问题4:TI公司好像有除法的例子,用的是NORM指令,好像就是针对这种IEEE格式数的,你能帮我解释一下他的算法么?
谢谢你了高手,mlwang_km~~~

1 .我查了手边的 C 语言书,没讲 float,double (应该就是IEEE) 等的格式。我以前是看过这方面的资料的,不知还找得到否。
2。任何格式的数,都可以相互转换的,只要搞清楚格式定义。
3。如果是IEEE格式浮点数,转换方法当然完全不一样了。
4。TI公司这个算法我没有见到,说不清。

谢谢你,我想再问一下,我编了个超小的程序,在编译的时候没有问题,但是只要一build就出现错误,麻烦你帮我看一看好么?谢谢了
下面的是错误提示:
\"d:\\ti\\c2400\\cgtools\\bin\\dspcl\" -g -q -fr\"D:/ti/myprojects/xianshi/Debug\" -d\"_DEBUG\" -v2xx -@\"Debug.lkf\" \"xianshi.asm\"
<xianshi.asm>

\"d:\\ti\\c2400\\cgtools\\bin\\dspcl\" -@\"Debug.lkf\"
<Linking>
TMS320C24xx COFF Linker Version 7.01
Copyright (c) 1987-2002 Texas Instruments Incorporated

undefined first referenced
symbol in file
--------- ----------------
EXIT D:\\ti\\myprojects\\xianshi\\Debug\\xianshi.obj
>> symbol referencing errors - ./Debug/xianshi.out not built

Build Complete,
1 Errors, 0 Warnings, 0 Remarks.

&nbsp; &nbsp; 你在 xianshi 程序里用到符号 EXIT(不知是个变量,还是函数?好像是函数),却没有定义。

嗯,是的,没有错误了,谢谢
可是为什么我用.ref会出错,而用.def定义就不会出错呢?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top