0

ここで最初のタイマー。

ラズベリー pi 3 でアーム アセンブリ モールス符号トランスレータをコーディングしようとしています。プログラムは文字列リテラル (x) を読み取り、対応するモールス符号文字列 (h) を取得して、文字列 (".... ") をスキャンする必要があります。文字列のすべてのピリオドに対して、ブレッドボードに設定された LED にドットを出力します。

私の元のコードでは、単語全体を 1 文字ずつスキャンして翻訳する必要がありました。LED を点灯させる関数が呼び出される前に LED が点灯し、プログラムが停止してしまいました。そこで、このサイド プログラムを作成して、1 文字 (この場合は "H") だけを変換して、LED に正しく出力するようにしました。

ここでの私の問題は、「....」文字列のドットを LED に出力するために、コードが dot: 関数に分岐した後、(exit_if: 経由で) LED_lp: にループバックするコードを取得できないことです。

私は多くのことを試しました。

  • スタックに何か関係がある場合に備えて、ラベルのさまざまな領域で {lr} をプッシュ / {pc} をポップ
  • 配線Piコマンドと競合する場合に備えて、プライマリレジスタ(r0、r1など)から離れます

[ピン番号をロードしたり、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