打印
[STM8]

只控制后4位,前4位不变

[复制链接]
1587|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dengdc|  楼主 | 2021-8-8 19:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1个8位寄存器如何只控制后4位,前4位不变

使用特权

评论回复
沙发
wangzsa| | 2021-8-8 19:31 | 只看该作者

然后呢?你是怎么应对这个的呢        

使用特权

评论回复
板凳
dengdc|  楼主 | 2021-8-8 19:34 | 只看该作者
之前一直用STM8S003一直觉得好用,后来换国产单片机觉得各种奇葩的设计。像STM8S003 频率高低位寄存器 和 占空比高低位寄存器都是分开的,如果想改变占空比就可以用公式:    高位 = 输出值 / 256;   低位 = 输出值 % 256;即可。换成国产单片机就发现频率和占空比高位寄存器就公用一个8位,(1000   0001)前面4位控制频率高位    后面4位控制占空比高位。这样用之前公式改变占空比就不行了,因为改变高位就会改变频率,大家帮我看一下有没有办法解决,我只需要用公式控制占空比,频率保持不变,感谢。

使用特权

评论回复
地板
huanghuac| | 2021-8-8 19:37 | 只看该作者
逻辑运算啊,分开搞,配置好后,逻辑运算合并成一个再赋值。

使用特权

评论回复
5
liliang9554| | 2021-8-8 19:39 | 只看该作者
你换了芯片了,就要按照新的芯片做嘛。

使用特权

评论回复
6
dengdc|  楼主 | 2021-8-8 19:41 | 只看该作者
能不能具体说一下哈,C语言都是网上自己研究的,不是很懂哈,感谢

使用特权

评论回复
7
dengdc|  楼主 | 2021-8-8 19:46 | 只看该作者
低4位和高四位分别操作啊。
比如高四位和低四位都是F,即1111,
H和L表示高四位和低四位,用X表示那个8BIT的寄存器。
H=0x0F
L=0x0F
X=(H<<4)|L
这样就合并成一个完整的8BIT数据赋值给X了
先用移位移动到目标位。再逻辑或合并。

使用特权

评论回复
8
pangb| | 2021-8-8 19:52 | 只看该作者
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与运算。

使用特权

评论回复
9
songqian17| | 2021-8-8 19:54 | 只看该作者
建议楼主看看C语言入门的书吧,这个位的逻辑操作是很基本的概念。

使用特权

评论回复
10
dengdc|  楼主 | 2021-8-8 19:57 | 只看该作者
可能我没说很清楚,其实应该是低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位不变

使用特权

评论回复
11
juventus9554| | 2021-8-8 20:01 | 只看该作者
你按照我那个方法来准行。你随便打开一个工程里的库函数,追根溯源一直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也是为了不影响原寄存器其他位的值。。

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

使用特权

评论回复
12
dengdc|  楼主 | 2021-8-8 20:04 | 只看该作者
问题可能不在如何设置寄存器上

使用特权

评论回复
13
wyjie| | 2021-8-8 20:08 | 只看该作者
问题在于PWM的周期和频率寄存器有没有一级缓存,如果没有缓存,很麻烦。

使用特权

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

使用特权

评论回复
15
yszong| | 2021-8-8 20:14 | 只看该作者
你可以先读出来修改后再写回去啊?

使用特权

评论回复
16
zwll| | 2021-8-8 20:18 | 只看该作者
假设频率和占空比高位寄存器为FP;

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

fpwm =FP & 0xf0;

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

FP =fpwm | pwm >>8;

使用特权

评论回复
17
dengdc|  楼主 | 2021-8-8 20:20 | 只看该作者
已测试,不行

使用特权

评论回复
18
xxrs| | 2021-8-8 20:27 | 只看该作者
用与或非进行控制就行啊

使用特权

评论回复
19
dengdc|  楼主 | 2021-8-8 20:31 | 只看该作者
看起来挺好的啊

使用特权

评论回复
20
liliang9554| | 2021-8-8 20:33 | 只看该作者
与或非组合运算啊

使用特权

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

本版积分规则

892

主题

13885

帖子

7

粉丝