问答

汇集网友智慧,解决技术难题

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

STC单片机

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

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

回答 +关注 2
947人浏览 8人回答问题 分享 举报
8 个回答
  • 51的内核 度给它一点时间吧
  • 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;
                    }
            }
    }
  • IO反应是需要时间的。
    你可以这样:
    bit  B_clip;

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

    或者这样:
       P21=~P21;
      _nop_();
      _nop_();
      P22=~P21;
  • 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;
                    }
            }
    }
  • gx_huang 发表于 2022-6-21 20:51
    第二个读第一个,第一个还没稳定,数据手册有介绍,写读写GPIO需要加延时

    谢谢,我试了加延时确实可以,但是我用30M和35M不加延时也是可以的,就是20-27M的时候不行,以前用stc15系列没有这个问题,8G和8H是有什么区别吗
  • 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;
                    }
            }
    }
  • LS正解。低频就可以,高频需延时才能读状态。
  • 第二个读第一个,第一个还没稳定,数据手册有介绍,写读写GPIO需要加延时

您需要登录后才可以回复 登录 | 注册