使用计时器在正确的时间发送和接收保证位-8051

时间:2018-07-21 22:52:23

标签: assembly byte signals 8051 debouncing

不确定标题的字词,但这是我的问题。

我正在制作激光标签,目前每件背心都有多个生命值。在代码中,我称它为流。

我想做的是在玩游戏时:

  1. 每件背心都将扫描其流或命中点,以查看是否尝试射击。一旦检测到镜头的第一位,便暂停流扫描,直到镜头的所有位都到达为止。然后使用另一个常数值扫描该值,以确定镜头是否合法或是否有一些噪音进入系统,在这种情况下镜头无效并被忽略。

  2. 每件背心都具有一项功能,可以不断地从1到最大玩家数。就个人而言,我并不关心数字是前进还是后退,或者只要以固定的方式处理每个玩家号码就可以了。

  3. 外部引脚将定义玩家何时准备射击。在该功能将编号设置为同一播放器之前,不会发生射击(传输)。然后所有数据立即全部传输出去,然后完成拍摄。

到目前为止,这是我的代码:

  TXDP equ P3.1 ;pin to output data on
  LCTR equ 30h ;data selector counter
  MYDATA equ 31h ;data to send out
  LI1 equ P3.5 ;bit to select data
  LI2 equ P3.5 ;bit to select data

  timer_interrupt:
    ;Save registers
    push ACC
    push PSW
    ;R7 = player# from 1 to MAX
    djnz R7,notstart
      mov R7,#MAX
    notstart:
    ;Send out my data one bit at a time
    ;if current player number is me
    cjne R7,#ME,notme
      mov A,MYDATA
        jz nodato 
          ;As data is sent, 0's fill in and MYDATA eventually becomes 0.
          clr C
          rrc A
          mov MYDATA,A
          mov TXDP,C
        nodato:
    notme:
    ;Start the receiving process if flag is set
    jnb STARTB,rcvst
      ;?? something needs to go here ??
      clr STARTB
      ;?? and here ??
      sjmp exittimer
    rcvst:
    ;At this point we move on to the next stream
    acall selectnextstream  
    ;And see if there is incoming data
    jb RCVP,norcv
      ;there is, so set the flag
      setb STARTB
    norcv:
    exittimer:
    ;restore registers
    pop PSW
    pop ACC
  reti

  selectnextstream:
    inc LCTR
    mov A,LCTR
    rrc A
    mov LI1,C
    rrc A
    mov LI2,C
  ret

我最大的问题是让#3成功工作。

问题是,当玩家编号匹配时,射击不能中途开始,而在系统设置下一个玩家编号时,射击不能结束,因为如果每个人都想进行射击,则将同时发生两次射击。

我不能同时拍摄两张或更多张照片,因为这会弄乱接收器。

此外,之所以使用大量的数据I / O,是因为我想创建数据保证。定义它的最佳方法更像是按键反跳(如果您按下按钮,直到很长时间之后才能识别该值)。

因此,我正在考虑创建一个像这样的字节以不断发送:

01111110

对于接收方,希望这些值中的任何一个都符合接收到的有效发射的条件:

00011000
00111100
01111110

但是这些只是例子。

此外,由于激光机的速度限制,我无法使用UART进行数据交换。

我可以在代码中做什么来解决此问题?

0 个答案:

没有答案