打印

求解单片机判编码器旋转方向时的一个奇怪现象

[复制链接]
楼主: catiya
手机看帖
扫描二维码
随时随地手机跟帖
21
catiya|  楼主 | 2011-8-19 13:34 | 只看该作者 回帖奖励 |倒序浏览
很郁闷,就这么简单的破玩意折腾这么久。

使用特权

评论回复
22
dengm| | 2011-8-19 14:50 | 只看该作者
DB 0,0,0,0
  =============
   NOP
   NOP
   NOP
   NOP

使用特权

评论回复
23
catiya|  楼主 | 2011-8-19 15:56 | 只看该作者
反正就是不行!哪位高人能一针见血?

使用特权

评论回复
24
Cortex-M0| | 2011-8-19 15:56 | 只看该作者
6楼 dengm大虾的程序精简,学习了~~~

使用特权

评论回复
25
catiya|  楼主 | 2011-8-19 16:01 | 只看该作者
6楼 dengm大虾的程序精简,学习了~~~
Cortex-M0 发表于 2011-8-19 15:56


你试过了?可用?

使用特权

评论回复
26
Cortex-M0| | 2011-8-19 16:29 | 只看该作者
你试过了?可用?
catiya 发表于 2011-8-19 16:01



没用过,不过看一眼dengm大虾的程序,就知道是用51汇编的老前辈,程序非常精简,多一条指令显拥肿,少一条指令没法工作,不愧为高手中的高手,您说这样的程序能用吗?

使用特权

评论回复
27
Cortex-M0| | 2011-8-19 16:34 | 只看该作者
反正就是不行!哪位高人能一针见血?
catiya 发表于 2011-8-19 15:56



人生最大的悲哀是什么,就是和机遇擦肩而过~~~

捡到金子当牛粪,  碰到高人当傻子~~~

使用特权

评论回复
28
Cortex-M0| | 2011-8-19 16:37 | 只看该作者
在二姨家,在A/B相编码器应用上,俺还没碰到比dengm老师更NB的大虾~~~

使用特权

评论回复
29
catiya|  楼主 | 2011-8-21 19:54 | 只看该作者
我可没把高人当傻子,只是客观地讲,这个程序没用起来。我再找找我的原因。

使用特权

评论回复
30
Cortex-M0| | 2011-8-22 11:00 | 只看该作者
客观原因很简单,一定是某个地方有个小虫虫,他认识你,你暂时不认识他,什么时候你认识他了,问题也就解决了~~~  :P

使用特权

评论回复
31
catiya|  楼主 | 2011-8-22 14:48 | 只看该作者
:Q

使用特权

评论回复
32
catiya|  楼主 | 2011-8-22 15:47 | 只看该作者
最新进展:

实在没辙,做了个实验,把A相(p3.3)强制拉到低或高,p3.2仍然不断送B相脉冲,每次判断结果一致。

然后把模拟的A、B相脉冲周期进一步调慢为4s,结果居然还是判不对。

用的是最初的,也就是我自己的程序,外部中断0里直接判p3.3。

强制拉低拉高p3.3,可看成是周期无限大的脉冲啊。

周期为4s都判不对,究竟在中断里出了什么事?

感觉不是小问题。

使用特权

评论回复
33
catiya|  楼主 | 2011-8-24 15:55 | 只看该作者
不折腾了。还是硬件鉴相吧。今天用74hc175做了实验,非常稳定。

话说现场编码器脉冲的频率达到了30k左右,我想还是硬件最可靠了。

使用特权

评论回复
34
dengm| | 2011-8-24 16:52 | 只看该作者
30K 肯定用硬件了!! 用12M at2051 要98%才能完成.


L_00B:
     DEC CNT
L_00:
     JB P3.2,  L_01B
     JNB P3.3,  L_00

L_1X:
        JBC TI, L_OUT_CNT
L_1XB:
        JNB P3.3,  L_0X
        SJMP L_1X        

L_OUT_CNT:
        MOV SBUF, CNT
        JB P3.3,  L_1XB
L_0X:
        JB P3.2, L_01
        SJMP L_00

L_01B:
      INC CNT
L_01:
      JNB P3.2,  L_00B
      JB P3.3,  L_1X
      SJMP L_01

使用特权

评论回复
35
catiya|  楼主 | 2011-8-24 17:17 | 只看该作者
我用的是STC 11F01E,1T的单片机,外部晶振22.1184M,尽管这个速度还是可以应付很多场合的。

使用特权

评论回复
36
dengm| | 2011-8-24 17:25 | 只看该作者
用定时器 30 周期, 采样一次,  1T 22.1184MHZ  可能 40%--50% CPU 时间

使用特权

评论回复
37
catiya|  楼主 | 2011-8-24 18:56 | 只看该作者
用定时器 30 周期, 采样一次,  1T 22.1184MHZ  可能 40%--50% CPU 时间
dengm 发表于 2011-8-24 17:25


谢谢

使用特权

评论回复
38
dengm| | 2011-8-27 17:25 | 只看该作者
本帖最后由 dengm 于 2011-8-27 17:40 编辑

catiya 这应该是最好的算法:
    ; P3.2     0 0  1  1  0  0 1  1 0 0  1  1
    ; P3.3     1 0  0  1  1  0  0  1  1  0 0  1
    ;             B     A    B      A    B     A    B
    ;     P3.2 的高电位时 A边 离开   B边进来时:   -1
    :     P3.2 的高电位时 A边 离开   A边进来时:  xxxxx  
    ;     P3.2 的高电位时 B边 离开   A边进来时:   +1
    :     P3.2 的高电位时 B边 离开   B边进来时:  xxxxx
    ;          B边 离开: F_ST0=1
    ;          A边 离开: F_ST0=0
    C_DELAY EQU 3
    F_ST0 BIT 20H.0
    F_DIR BIT 20H.2
    CntL  data 30h
    CntH  data 31h
   
    ORG 000H
      AJMP Start
    ORG 003H  ; P3.2电平
      JNB P3.3, L_P33L
      SJMP L_P33H
    ORG 00BH  ; Timer0: Mode 2
      JNB P3.3, L_P33LB
      SJMP L_P33HB

    ORG 40H
      RETI
;-----------------------------
L_P33L:
      CLR F_ST0
      SJMP L_P33EX
L_P33H:
      SETB F_ST0
L_P33EX:
      CLR EX0
      MOV TL0, #(256-C_DELAY)
      SETB TR0
      RETI
;--------------      
L_P33LB:
      JNB F_ST0, L_P33EXB
        CLR F_DIR
        XCH A, CntL
        JNZ $+4        
          DEC CntH
        DEC A
        SJMP L_P33EXB2

L_P33HB:
      JB F_ST0, L_P33EXB
        SETB F_DIR
        INC CntL
        XCH A, CntL
        JNZ L_P33EXB2
          inc CntH
L_P33EXB2:
        XCH A, CntL
L_P33EXB:
        SETB EX0
        CLR TR0
        RETI

使用特权

评论回复
39
catiya|  楼主 | 2011-8-27 18:12 | 只看该作者
谢谢dengm,我测试一下

使用特权

评论回复
40
dengm| | 2011-8-27 18:58 | 只看该作者
; to  catiya  Ini 部分

start:

; Configure Timer 0
;    - Mode                   = 2
;    - Interrupt              = ENABLED
;    - Clock Source           = INTERNAL
;    - Enable Gating Control  = ENABLED
      anl   TMOD, #0F0H                  ;clear Timer 0
      orl   TMOD, #0Ah  ;
      mov   TL0,  #00h   ;value set by user
      mov   TH0,  #00h   ;value set by user
      SETB ET0 ;setb IE.1
      CLR  TR0   ;TCON.4  NOT start timer
  
      CLR A
      MOV CNTL,  A
      MOV CNTH, A
      MOV 20H,  A

      SETB EX0
      SETB EA
;--------------------------------------   
MainLoop:
       nop
       nop
      sjmp MainLoop

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
catiya + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则