dht11.pio 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. ; DHT11を駆動するPIOコード
  2. .program dht11
  3. .wrap_target
  4. ; ウェイト用の値として20000をメインプログラムから受け取る
  5. pull block ; osr = 20000
  6. set pindirs, 1 ; Set pinsを出力に切り替え
  7. ; スタートパルス20ms以上
  8. set pins, 0 ; Low
  9. mov x,osr ; 20 000 us
  10. start_pulse:
  11. jmp x-- start_pulse
  12. set pindirs, 0 ; 入力に切り替え
  13. ; スタートパルスを待つ
  14. mov isr,null ; ISRを0クリア
  15. wait 1 pin, 0 ; バスがHighかチェック
  16. wait 0 pin, 0 ; LOWを待つ
  17. wait 1 pin, 0 ; HIGHを待つ
  18. set y, 4 ; 5バイトを読み取る
  19. ; 1バイト読み取りスタート
  20. start_byte:
  21. mov osr, y ; OSRにバイト数を退避
  22. set y, 7 ; 8bitを読み取る
  23. bit_start:
  24. wait 0 pin, 0 ; LOWになるまで待つ
  25. wait 1 pin, 0 ; パルス
  26. set x, 29 ; 30us以上HIGHなら1
  27. pulse_width_count:
  28. jmp x-- pulse_width_count
  29. in pins, 1 ; ISRにピンの値を入力し1bit終了
  30. jmp y-- bit_start
  31. ; 8bit読み取り終了
  32. push noblock ; ISRをFIFOにプッシュ
  33. irq set 0 ; 割り込み発生
  34. mov y, osr ; バイト数カウンタを復帰
  35. jmp y-- start_byte
  36. ; 5バイト読み取り完了
  37. irq set 1
  38. .wrap
  39. % c-sdk {
  40. #include "hardware/clocks.h"
  41. void dht11_program_init(PIO pio, uint sm, uint offset, uint pin) {
  42. gpio_disable_pulls(pin); // pinのプルアップダウンを無効化しておく
  43. pio_gpio_init(pio, pin);
  44. pio_sm_config c = dht11_program_get_default_config(offset);
  45. // Set pins
  46. sm_config_set_set_pins(&c, pin, 1);
  47. // In pins
  48. sm_config_set_in_pin_base(&c, pin);
  49. sm_config_set_in_pin_count(&c, 1);
  50. sm_config_set_in_shift(&c, false, false, 0);
  51. // 1MHz動作に
  52. float clkdiv = (float)clock_get_hz(clk_sys) / 1000000;
  53. sm_config_set_clkdiv(&c, clkdiv);
  54. pio_sm_init(pio, sm, offset, &c);
  55. }
  56. %}