打印
[STM8]

紧急求助1个8位寄存器如何只控制后4位,前4位不变

[复制链接]
1721|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
之前一直用STM8S003一直觉得好用,后来换国产单片机觉得各种奇葩的设计。像STM8S003 频率高低位寄存器 和 占空比高低位寄存器都是分开的,如果想改变占空比就可以用公式:    高位 = 输出值 / 256;   低位 = 输出值 % 256;即可。换成国产单片机就发现频率和占空比高位寄存器就公用一个8位,(1000   0001)前面4位控制频率高位    后面4位控制占空比高位。这样用之前公式改变占空比就不行了,因为改变高位就会改变频率,大家帮我看一下有没有办法解决,我只需要用公式控制占空比,频率保持不变,感谢。

使用特权

评论回复
沙发
捉虫天师| | 2019-8-13 20:24 | 只看该作者
逻辑运算啊,分开搞,配置好后,逻辑运算合并成一个再赋值。

使用特权

评论回复
板凳
捉虫天师| | 2019-8-13 20:24 | 只看该作者
你换了芯片了,就要按照新的芯片做嘛。

使用特权

评论回复
地板
自己和自己玩|  楼主 | 2019-8-13 21:44 | 只看该作者
捉虫天师 发表于 2019-8-13 20:24
你换了芯片了,就要按照新的芯片做嘛。

能不能具体说一下哈,C语言都是网上自己研究的,不是很懂哈,感谢

使用特权

评论回复
5
捉虫天师| | 2019-8-13 22:07 | 只看该作者
自己和自己玩 发表于 2019-8-13 21:44
能不能具体说一下哈,C语言都是网上自己研究的,不是很懂哈,感谢

低4位和高四位分别操作啊。
比如高四位和低四位都是F,即1111,
H和L表示高四位和低四位,用X表示那个8BIT的寄存器。
H=0x0F
L=0x0F
X=(H<<4)|L
这样就合并成一个完整的8BIT数据赋值给X了
先用移位移动到目标位。再逻辑或合并。

使用特权

评论回复
6
cry1109| | 2019-8-13 22:15 | 只看该作者
本帖最后由 cry1109 于 2019-8-13 22:34 编辑

8位好搞啊。
uint8_t temp;

temp = reg_value;   //读取寄存器值
reg_value=temp | 0x01;   //对低4位中的某位置1  eg:0x01=0000 0001  即对低4位中的最后一位(bit0)置1
reg_value=temp & oxfe;   //对低4位中的某位清0  eg:0xfe=1111 1110  即对低4位中的最后一位(bit0)清0
就是说,置1或运算,清0与运算。

使用特权

评论回复
7
捉虫天师| | 2019-8-13 22:28 | 只看该作者
建议楼主看看C语言入门的书吧,这个位的逻辑操作是很基本的概念。

使用特权

评论回复
8
自己和自己玩|  楼主 | 2019-8-13 22:31 | 只看该作者
感谢各位了,我自行研究一下

使用特权

评论回复
9
自己和自己玩|  楼主 | 2019-8-13 22:49 | 只看该作者
本帖最后由 自己和自己玩 于 2019-8-13 23:00 编辑
捉虫天师 发表于 2019-8-13 22:07
低4位和高四位分别操作啊。
比如高四位和低四位都是F,即1111,
H和L表示高四位和低四位,用X表示那个8BIT ...

可能我没说很清楚,其实应该是低8位,高4位,(高其实也是8位,只是前4位是改变频率的),如果移位的话,就会造成高位的前4位的值发生变化,造成改变占空比的时候,频率也发生了变化C语言表示一下。T5PH = 0x76;     // 01110110 (高8位,其中前面4位0111 表示频率高4位        后面0110表示占空比高4位)
                        T5PL = 0xff;       //设置PWM频率      11111111  (低8位)
                        T5RL = 0xfb;      //设置PWM占空比  11111011  (低8位)
                        那么频率 =0111(高4位) 0x07      11111111(低8位) 0xff
                        占空比  =  0110(高4位) 0x06      11111011(低8位) 0xfb
如果高位移位的话,就会造成前面频率的高4位发生变化,就会造成频率占空比都发生变化,我只想高位后4位值发生变化,前面4位不变

使用特权

评论回复
10
cry1109| | 2019-8-13 22:51 | 只看该作者
本帖最后由 cry1109 于 2019-8-13 23:19 编辑
自己和自己玩 发表于 2019-8-13 22:31
感谢各位了,我自行研究一下

你按照我那个方法来准行。你随便打开一个工程里的库函数,追根溯源一直go to下去,发现到最后都是对寄存器进行位运算。
temp = reg_value;          //读取寄存器值
reg_value=temp | 0x01;   //对低4位中的某位置1  eg:0x01=0000 0001  即对低4位中的最后一位(bit0)置1
reg_value=temp & oxfe;   //对低4位中的某位清0  eg:0xfe=1111 1110  即对低4位中的最后一位(bit0)清0
比如你这个控制占空比和频率的寄存器,1000 0001对应16进制位0x81,现在想把最低位清0变为1000 0000即
0x80,那么只需1000 0001和1111 1110按位与运算就可以了,与运算法则两个都是1的的时候才为1,否则为0,1000 0001的最后一位为1,1000 0000的最后一位位0,这样不满足两个都是1,所以该位的与运算结果为0,1111 1110除最低位即要操作的位为0外其他位均为1,是为了不影响寄存器其他位的值,这样原寄存器值为1的位运算后还为1,为0的为还为0;如果想把1000 0001的值变为1000 0011,那么1000 0001和0000 0010或运算就可以了,或运算法则是只要有1,那么运算结果即为1,1000 0001的倒数第二位为0,0000 0010倒数第二位为1,满足只要有1就为1的运算法则,所以1000 0001倒数第二位就被置1了,0000 0010除要操作的位为1外其他位均为0也是为了不影响原寄存器其他位的值。。

嗯,说的很详细了,自学路途艰辛。

使用特权

评论回复
评论
自己和自己玩 2019-8-13 23:05 回复TA
感谢感谢了哈,谢谢各位大神 
11
newrevive| | 2019-8-14 08:49 | 只看该作者
楼主的问题可能不在如何设置寄存器上,问题在于PWM的周期和频率寄存器有没有一级缓存,如果没有缓存,很麻烦。

使用特权

评论回复
12
自己和自己玩|  楼主 | 2019-8-14 17:24 | 只看该作者
楼上说的非常对,国产单片机设计很奇葩,高位前4位控制频率,高后4位控制占空比,所以想修改高后四位的占空比值就比较麻烦,我现在就不用高位了,用低8位,但是分辨率就低了,0-255、所以PWM波形细腻度差一些,没有办法中的办法了

使用特权

评论回复
13
diy1997| | 2019-8-15 09:26 | 只看该作者
你可以先读出来修改后再写回去啊?

假设频率和占空比高位寄存器为FP;

用一个变量fpwm来暂存频率高4位:

fpwm =FP & 0xf0;

把改变后的占空比高4位和频率高4位合并并写回去:

FP =fpwm | pwm >>8;

使用特权

评论回复
14
自己和自己玩|  楼主 | 2019-8-15 11:37 | 只看该作者
diy1997 发表于 2019-8-15 09:26
你可以先读出来修改后再写回去啊?

假设频率和占空比高位寄存器为FP;

已测试,不行

使用特权

评论回复
15
coshi| | 2019-9-13 10:47 | 只看该作者
用与或非进行控制就行啊

使用特权

评论回复
16
zljiu| | 2019-9-13 11:08 | 只看该作者
看起来挺好的啊

使用特权

评论回复
17
labasi| | 2019-9-16 15:05 | 只看该作者
与或非组合运算啊

使用特权

评论回复
18
paotangsan| | 2019-9-16 15:07 | 只看该作者
变的就或非 不变的就与

使用特权

评论回复
19
renzheshengui| | 2019-9-16 15:10 | 只看该作者
感觉这个挺简单的应该

使用特权

评论回复
20
NickyGrout| | 2019-9-16 16:40 | 只看该作者
感觉和我最近在折腾的应用相似。只是调整一个8位变量的其中几位数。用74HC595串转并输出,设置后面芯片的几种功能。每次调整的只是其中的一种功能……


其中data_595就是对应输出的缓存,楼主的应用可以设定一个变量来缓存要设定的寄存器。
每次修改时,只改低4位,那就是
data_595 = data_595 | 0x0F;    // 先把要修改的位  置位
data_595 &= 0xFB;                  // 然后再进行修改  // 假设要修改的是寄存器低四位中的第三位清零。(只修改低4位,对应的范围是0xF0 ~ 0xFF之间)

修改占空比 = data_595;

这样应该能行吧

使用特权

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

本版积分规则

25

主题

82

帖子

0

粉丝