打印

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

[复制链接]
7324|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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;
                }
        }
}

使用特权

评论回复
5
819109964|  楼主 | 2022-6-22 10:22 | 只看该作者
gx_huang 发表于 2022-6-21 20:51
第二个读第一个,第一个还没稳定,数据手册有介绍,写读写GPIO需要加延时

谢谢,我试了加延时确实可以,但是我用30M和35M不加延时也是可以的,就是20-27M的时候不行,以前用stc15系列没有这个问题,8G和8H是有什么区别吗

使用特权

评论回复
6
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;
                }
        }
}

使用特权

评论回复
7
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;

使用特权

评论回复
8
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;
                }
        }
}

使用特权

评论回复
9
henangongda123| | 2022-6-22 12:50 | 只看该作者
51的内核 度给它一点时间吧

使用特权

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

本版积分规则

4

主题

8

帖子

0

粉丝