【STC单片机】请问谁能解释一下stc8h/stc8g系列IO口驱动问题

[复制链接]
 楼主| 819109964 发表于 2022-6-21 18:10 | 显示全部楼层 |阅读模式
最新发现一个IO口输出两组方波,第一组直接等于IO口取反,第二组等于第一组的取反,不管是用推挽还是准双向,频率在20M,22.1184M,24M,27M的时候,用测试表笔同时测两个信号(需拉信号线测试,直接在IO口上测试,有时候是正常的),拉了信号线测试第二个信号会没掉,单独只测一个信号都是ok的,单片机用其他频率也是正常的,哪位大神能解释一下       
        P2M1 &= ~0x06; //推挽
        P2M0 |= 0x06;
//        P2M1 &= ~0x06; //准双向
//        P2M0 &= ~0x06;
        while (1)
        {               
                P21=~P21;
                P22=~P21;
                Delay1us();
        }
搜索
复制

gx_huang 发表于 2022-6-21 20:51 | 显示全部楼层
第二个读第一个,第一个还没稳定,数据手册有介绍,写读写GPIO需要加延时
fpgamcudsp 发表于 2022-6-21 21:32 | 显示全部楼层
LS正解。低频就可以,高频需延时才能读状态。
 楼主| 819109964 发表于 2022-6-22 10:18 | 显示全部楼层
gx_huang 发表于 2022-6-21 20:51
第二个读第一个,第一个还没稳定,数据手册有介绍,写读写GPIO需要加延时

void timer0_int (void) interrupt TIMER0_VECTOR
{
        TH0=0xff;                          
        TL0=0xFE;
        SCK=!SCK;         //周期15.625k,64us  进一次中断32us
        if(!SCK)
        {
                if(++SCKtimes>=16)
                {
                        SCKtimes=0;
                        DATA=1;
                }
                if(SCKtimes>=1)
                {
                        DATA=0;
                }
        }
}
 楼主| 819109964 发表于 2022-6-22 10:22 | 显示全部楼层
gx_huang 发表于 2022-6-21 20:51
第二个读第一个,第一个还没稳定,数据手册有介绍,写读写GPIO需要加延时

谢谢,我试了加延时确实可以,但是我用30M和35M不加延时也是可以的,就是20-27M的时候不行,以前用stc15系列没有这个问题,8G和8H是有什么区别吗
 楼主| 819109964 发表于 2022-6-22 10:25 | 显示全部楼层
fpgamcudsp 发表于 2022-6-21 21:32
LS正解。低频就可以,高频需延时才能读状态。

谢谢,我试了加延时确实可以,但是我用30M和35M不加延时也是可以的,就是20-27M的时候不行,以前用stc15系列没有这个问题,8G和8H是有什么区别吗?我实际运用的时候是定时器0采外部脉冲,产生两个方波信号SCK和DATA,就是不加延时的话,还有什么解决方法吗
void timer0_int (void) interrupt TIMER0_VECTOR
{
        TH0=0xff;                           
        TL0=0xFE;
        SCK=!SCK;         //周期15.625k,64us  进一次中断32us
        if(!SCK)
        {
                if(++SCKtimes>=16)
                {
                        SCKtimes=0;
                        DATA=1;
                }
                if(SCKtimes>=1)
                {
                        DATA=0;
                }
        }
}
coody 发表于 2022-6-22 10:28 | 显示全部楼层
IO反应是需要时间的。
你可以这样:
bit  B_clip;

  B_clip = B_clip;
  P21=B_clip;
  P22=~B_clip;

或者这样:
   P21=~P21;
  _nop_();
  _nop_();
  P22=~P21;
gx_huang 发表于 2022-6-22 11:00 | 显示全部楼层
819109964 发表于 2022-6-22 10:18
void timer0_int (void) interrupt TIMER0_VECTOR
{
        TH0=0xff;                          

void timer0_int (void) interrupt TIMER0_VECTOR
{
bit aaa;
        TH0=0xff;                           
        TL0=0xFE;
aaa=!aaa;
SCK=aaa;
if(!aaa)
        //SCK=!SCK;         //周期15.625k,64us  进一次中断32us
        //if(!SCK)
        {
                if(++SCKtimes>=16)
                {
                        SCKtimes=0;
                        DATA=1;
                }
                if(SCKtimes>=1)
                {
                        DATA=0;
                }
        }
}
henangongda123 发表于 2022-6-22 12:50 | 显示全部楼层
51的内核 度给它一点时间吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部