0

这里的第一个计时器。

我正在尝试在我的树莓派 3 上编写一个 arm 组件莫尔斯电码翻译器。程序应该读取字符串文字 (x),获取相应的莫尔斯电码字符串 (h) 并扫描字符串 ("....")并为字符串中的每个周期在我的面包板上设置的 LED 上输出一个点。

我的原始代码实际上涉及将整个单词逐个字符地扫描和翻译。我的 LED 会在点亮 LED 的函数被调用之前点亮,程序会停止。所以我做了这个小程序来尝试只翻译一个字母[在本例中为“H”],并让它在我的 LED 上正确输出。

我的问题是我无法让代码循环回到 LED_lp: (通过 exit_if:) 在它分支到 dot: 函数之后,以便在 LED 上输出“....”字符串中的点。

我尝试了很多东西,包括

  • 在标签的不同区域推送 {lr} / 弹出 {pc} 以防它与堆栈有关
  • 远离主寄存器(r0、r1 等),以防它与 WiringPi 命令冲突

[我得出的结论是它确实存在冲突,即使您没有尝试加载引脚号或调用 pinMode,似乎加载寄存器 r0、r1 的值如 0 和 1 会导致引脚模式过早且不需要的更改/ LED 输出。] 如果我对这个结论有误,请告诉我。

甚至我的装配教授也不确定我的代码出了什么问题,或者在查看我的原件时为什么我的 LED 输出行为不正常。

为文字墙道歉,但我认为一点额外的背景故事会节省一些时间并避免含糊不清。我希望有人能够提供帮助,因为我需要将其实施到我的最终项目中。

提前致谢

  .equ MY_PIN, 25
  .equ OUTPUT, 1
  .equ INPUT, 0
  .equ LOW, 0
  .equ HIGH, 1

  .data
  x:  .asciz "H"

  h:  .asciz "...."

  .text
  .global main

  main:
  push {lr}

  bl wiringPiSetup

  ldr r4, =x
  mov r5, #0

  lp: 
  mov r6, r4        // mov r4 [x] into r6
  cmp r6, #72       // check if r6 = H ascii code
  beq _do_H         // if equal branch to _do_H


  _do_H:
  ldr r4, =h
  bl LED

  LED:
  push {lr}
  mov r5, #0

  LED_lp:
  ldrb r6, [r4, +r5]  // scan for first char in r6
  cmp r6, #0        // cmp , if string done branch to exit_if
  beq exit_LED
  cmp r6, #46       // cmp, if first char is dash, branch to dash_check
  bne check_dash
  bl dot        // else branch to dot


  check_dash:
  cmp r6, #45
  beq dash

  exit_if:
  add r5, #1    // increment index for string scan
  bal LED_lp

  exit_LED:
  pop {pc}

  dot:   
  push {r0, r1,r2}

  mov r0, #MY_PIN
  mov r1, #HIGH
  bl digitalWrite

  mov r0, #100       
  bl delay

  mov r0, #MY_PIN
  mov r1, #LOW
  bl digitalWrite

  // bl exit_if   $$ having this line BEFORE the pop causes LED to stay on
  // for more than 100 ms, but seems to terminate the program after it
  // lights up


  pop {r0, r1,r2}

  // bl exit_if $$ having this line AFTER the pop causes the led to stay on
  // $$ for longer than 100 ms, and gets the program stuck running? after
  // $$   execution

  dash:      // commented out dash to work on dot, left here for reference
  //  push {lr}
  push {r0,r1,r2}

   //   mov r0, #MY_PIN
   //   mov r1, #HIGH
   //   bl digitalWrite

  //    mov r0, #1000
  //    bl delay

  //    mov r0, #MY_PIN
  //    mov r1, #LOW
  //    bl digitalWrite
  pop {r0,r1,r2}
   //   pop {pc}

   /////////end
4

0 回答 0