打印

又双叕遇到问题了,几天都没有头绪。

[复制链接]
7192|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tianxiongweitxw|  楼主 | 2022-12-21 16:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教大神,我要把P3口的几个脚配置成推挽输出,配置寄存器P3M0只在初始化配置程序中写了一次,在中断程序中读出来发送到串口,其值不停地有变化 ,找了二天原因了,找不到,头都大了。望大神支招。

使用特权

评论回复
沙发
changle11sdo5| | 2022-12-21 19:23 | 只看该作者
一看就是某某C单片机了,删除无关代码,上传本问题代码

使用特权

评论回复
评论
tianxiongweitxw 2022-12-21 20:13 回复TA
我确认是与XXC无关,是我的程序问题。 
板凳
tianxiongweitxw|  楼主 | 2022-12-21 20:36 | 只看该作者
已经上传了,谢谢大佬帮忙。

IO测试.rar

332.71 KB

使用特权

评论回复
地板
tianxiongweitxw|  楼主 | 2022-12-21 20:38 | 只看该作者
目前是想设置:P3M1=0   P3M0=0xb4;但设置不成功,在中断中有串口输出监控,其值不稳定,会变。

使用特权

评论回复
5
changle11sdo5| | 2022-12-21 21:25 | 只看该作者
这代码有些内容很像我的风格

使用特权

评论回复
6
tianxiongweitxw|  楼主 | 2022-12-21 21:33 | 只看该作者
本帖最后由 tianxiongweitxw 于 2022-12-21 21:39 编辑

P3口,P3.0  P3.1是串口,会不会是由于这个原因,造成串口程序执行时,更改了P3口的配置寄存器。由于有串口,P3M0.0和P3M0.1必须配置为1,所以应该这样配置。P3M0=0xb7  P3M1=0x00;改了,问题依旧。

使用特权

评论回复
7
coody| | 2022-12-21 21:52 | 只看该作者
建议楼主直接拿一个STC官方的串口例子测试。

使用特权

评论回复
8
tianxiongweitxw|  楼主 | 2022-12-21 22:14 | 只看该作者
单独测试是正常的,目前就是中断程序中更改了寄存器,找不到在那里更改了,所以求助大家

使用特权

评论回复
9
changle11sdo5| | 2022-12-22 00:18 | 只看该作者
本帖最后由 changle11sdo5 于 2022-12-22 11:17 编辑

//Inition.h
sbit           DianCi_JD2        =         P3^4;        //枕头放气电磁阀 sbit   SparePort1        =         P3^5;        // sbit        TestLed                =        P3^6;        //测试指示灯,功能保留 sbit   SparePort2  =         P3^7;        //   

//Inition.c        
PumpTwo_PWM=0;         QiBeng_JD1= 0;     DianCi_JD2= 0;                    

//TIMER.c                                  
if( Time24_counter>400)                                   {                                  Alarming=1;                                           HexUartSend(PoseStatus);                                  HexUartSend(QiBeng_JD1);                                  HexUartSend(DianCi_JD2);                                  HexUartSend( PumpSmallBag);                                  HexUartSend(Calibra_JD4);                                  }                                   while( Alarming==1)  ///报警,停止所有输出                    {                                            CCAP0H=CCAP0L=255; //速度设定为0                                            CCAP1H=CCAP1L=255;  //速度设定为0                                           QiBeng_JD1=0;                                           DianCi_JD2=0;        
                                  
//ProcessControl.c
void  Platstudy( )             {                         uchar i;                            DianCi_JD2=1;                            HeatingRelay=0;                    Delay(20000);            while( IapReadByte(Study_ModeOnOff)==0x01)                                                //         Switch_S1            {                      if(AD_DATA<30)                          {                                  QiBeng_JD1=1;                                    PumpSmallBag=0;                                  DianCi_JD2=0;                           }                           else                           {                             QiBeng_JD1=0;                                    PumpSmallBag=0;                                 DianCi_JD2=0;                                  break;                                 }                  }

使用特权

评论回复
10
changle11sdo5| | 2022-12-22 00:22 | 只看该作者
和推勉没有关系,有函数修改了P3电平,串口发的电平状态

使用特权

评论回复
评论
tianxiongweitxw 2022-12-22 09:40 回复TA
P3口操作是正常的没有问题,现在是要把2,4,5,7脚的工作方式由双向口改为推挽输出,但改不成功。监控P3口的配置寄存器P3M0 P3M1,发现寄存器值不固定,会变化,这是不正常的,因为这两个配置寄 存器只在开机写了一次,正常运行中间不应该有变化。 
11
xch| | 2022-12-22 12:27 | 只看该作者
MCU 是不是深度休眠了?

使用特权

评论回复
评论
tianxiongweitxw 2022-12-22 14:08 回复TA
MCU没有设置休眠,一直工作 
12
xch| | 2022-12-22 12:42 | 只看该作者
你的串口驱动没关闭中断。会不会其他中断函数也同时使用串口?

使用特权

评论回复
评论
tianxiongweitxw 2022-12-22 14:23 回复TA
串口发送程序中有关中断,发送完了才开的 void HexUartSendText(uchar *valu) { //关中断??? uchar i=0; while((*(valu+i))!='\0') //发送字符串,直到遇到0才结束 { HexUartSend(*(valu+i) ); i++; } 
13
xch| | 2022-12-22 12:48 | 只看该作者
看程序乱七八糟的到处调用 HexUartSend 。
能不能改成中断模式,开辟一个环形缓冲区,让串口发送中断自己从缓冲区里面取数据发送。
HexUartSend 函数仅负责填充缓冲区。且禁止在高优先级中断中调用 HexUartSend 。

使用特权

评论回复
14
tianxiongweitxw|  楼主 | 2022-12-22 14:05 | 只看该作者
xch 发表于 2022-12-22 12:42
你的串口驱动没关闭中断。会不会其他中断函数也同时使用串口?

,目前的问题不是串口工作不正常,是P3口无法成功配置成推挽模式。

使用特权

评论回复
15
tianxiongweitxw|  楼主 | 2022-12-22 14:17 | 只看该作者
本帖最后由 tianxiongweitxw 于 2022-12-22 14:21 编辑

监控:P3M0 P3M1;一直在03  08    和09 00两种值变动。咨询了STC公司技术,回复是寄存器只有写入时会变化,其它操作不会间接更改更改,中断程序里面没有写入操作过,但寄存器值就是变化了。

使用特权

评论回复
16
xch| | 2022-12-22 15:57 | 只看该作者
tianxiongweitxw 发表于 2022-12-22 14:05
,目前的问题不是串口工作不正常,是P3口无法成功配置成推挽模式。

没有确凿证据表明 P3 无法配置推挽模式。 是你根据串口输出判断的。

使用特权

评论回复
17
xch| | 2022-12-22 16:02 | 只看该作者
void HexUartSend(uchar valu)
{
        ES=0;                        //¹Ø´®¿ÚÖжϣ¿£¿£¿
        SBUF=valu;
        while (0==TI);                                                                                                //µÈ´ý·¢ËÍÍê³É
        TI=0;                                                                                                                //·¢Ëͱê־λ¸´Î»
        ES=1;
}
这里哪里关闭了中断?
仅仅关闭了串口的中断。
其他高优先级,可以打断进程,重入该函数

使用特权

评论回复
18
changle11sdo5| | 2022-12-22 17:00 | 只看该作者
12c5a60s2.h文件被动了手脚,sfr P3M0 = 0xBE; //   0XB2                                                                      0000,0000 sfr P3M1 = 0xBD; //    0XB1

使用特权

评论回复
评论
tianxiongweitxw 2022-12-22 22:26 回复TA
大神,我对比了,好像确实有问题,我改了试一下。 
19
syh2431| | 2022-12-22 19:14 | 只看该作者
一方有难,八方支援……

使用特权

评论回复
20
tianxiongweitxw|  楼主 | 2022-12-22 22:23 | 只看该作者
changle11sdo5 发表于 2022-12-22 17:00
12c5a60s2.h文件被动了手脚,sfr P3M0 = 0xBE; //   0XB2                                                ...

我也注意到这个问题,但这是STC的原版文件,我仔细查查

使用特权

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

本版积分规则

72

主题

520

帖子

0

粉丝