Advertisement
Guest User

Untitled

a guest
Feb 25th, 2021
587
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.37 KB | None | 0 0
  1.  
  2.  リエントラント
  3.   サブルーチン内で使用しているレジスタをタスク毎に用意すれば、
  4.  そのサブルーチンはリエントラント(再入可)になり、あるタスクで実行中のサブルーチンであっても、
  5.  別のタスクでも同時に実行する事が出来ます。
  6.  
  7.  前回のサンプル1は2組のSWとLEDについて、モメンタリ動作の「SWを押している間LEDが点灯する」でしたが、
  8.   ( https://pastebin.com/G7XQgu1q )
  9.  今回のサンプル3はオルタネート動作の「SWを押すとLEDが点灯し、もう一度押すと消灯する」です。
  10.  したがって、SWを操作した時のチャタリング除去処理が必要になりますが、
  11.  その目的で使用しているディレィループ「Delay_01S」はリエントラントです。
  12.  たとえばこの「Delay_01S」ルーチンをtask1が実行中であっても、
  13.  task2はtask1のディレィループのカウント動作に影響する事無く、
  14.  またtask1から影響される事無く、カウント動作を正しく実行する事が出来ます。
  15.  
  16.  ・timer0割り込み処理にディレイループのカウント用レジスタタZLの-1命令が追加されていますが、
  17. ソフウトウェアだけでのカウント動作も可能です。
  18.  ・タイマ割り込みのインターバルは1mSでタスク数は2個なので2~512mSのディレイとなります。
  19.  ・ディレイループはSWのチャタリング除去だけでなく、LEDの点滅などにも使用できます。
  20.  ・なお、このプログラムはリエントラントのサンプルであり、プログラムサイズを小さくするために、
  21. チャタリング除去方法を簡易的なものにしました。
  22.  
  23.  サンプル3 リエントラント
  24.          ;***** tiny2313 vectors ***************
  25. C:000000 c021  rjmp RESET ;00 RESET
  26. C:000001 9518  reti    ;01 INT0
  27. C:000002 9518  reti    ;02 INT1
  28. C:000003 9518  reti    ;03 timer1 Capt
  29. C:000004 9518  reti    ;04    CompA
  30. C:000005 9518  reti    ;05    OVF1
  31. C:000006 9518  reti    ;06 timer0 OVF0
  32. C:000007 9518  reti    ;07 USART RX
  33. C:000008 9518  reti    ;08    UDRE
  34. C:000009 9518  reti    ;09    TX
  35. C:00000a 9518  reti    ;10 ANA_COMP
  36. C:00000b 9518  reti    ;11 PCINT0
  37. C:00000c 9518  reti    ;12 timer1 CompB
  38. C:00000d c007  rjmp IRQ13 ;13 timer0 CompA
  39. C:00000e 9518  reti    ;14     CompB
  40. C:00000f 9518  reti    ;15 I2C Start Condition
  41. C:000010 9518  reti    ;16   Over Flow
  42. C:000011 9518  reti    ;17 EEPROM EEw_Rdy
  43. C:000012 9518  reti    ;18 WDT
  44. C:000013 9518  reti    ;19 PCINT1
  45. C:000014 9518  reti    ;20 PCINT2
  46.  
  47.          ;===== timer0 for dispatch ============
  48.          ; CompA:interval 1mS
  49.          ; execute time about 1uS at 20MHz system clock
  50.          IRQ13:
  51. C:000015 93ef  push ZL     ;save ZL,ZH & SREG to currrent stack
  52. C:000016 93ff  push ZH
  53. C:000017 b7ef  in  ZL,SREG
  54. C:000018 93ef  push ZL
  55.  
  56. C:000019 2de1  mov  ZL,sv_SPL ;exchange SP task1 <--> task2
  57. C:00001a b61d  in  sv_SPL,SPL
  58. C:00001b bfed  out  SPL,ZL
  59.  
  60. C:00001c 91ef  pop  ZL     ;restore ZL,ZH & SREG from next stack
  61. C:00001d bfef  out  SREG,ZL
  62. C:00001e 91ff  pop  ZH
  63. C:00001f 91ef  pop  ZL
  64. C:000020 95ea  dec  ZL     ;-1 for delay loop     <<<追加
  65. C:000021 9518  reti       ;exec. next task
  66.  
  67. ***** system setup *******************
  68.          RESET:
  69.          ;----- Port_B
  70. C:000022 efef  ldi  ZL,0b11111111  ;b0/1:output_Hi for LED1/LED2
  71. C:000023 bbe8  out  PortB,ZL    ;b2/3:input_PullUp for SW1/SW2
  72. C:000024 e8e3  ldi  ZL,0b10000011  ;bit7:output for check
  73. C:000025 bbe7  out  DDRB,ZL
  74.          ;
  75.          ;----- stack2 for task dispatch
  76. C:000026 e8ef  ldi  ZL,stack2    ;set stack2($8F) to SPL
  77. C:000027 bfed  out  SPL,ZL
  78. C:000028 e4e4  ldi  ZL,LOW(task2)  ;push task2 strat adrs for PCL
  79. C:000029 93ef  push  ZL
  80. C:00002a e0e0  ldi  ZL,HIGH(task2) ;               PCH
  81. C:00002b 93ef  push  ZL
  82. C:00002c 93ef  push  ZL        ;         for dumy ZL
  83. C:00002d 93ef  push  ZL        ;              ZH
  84. C:00002e 93ef  push  ZL        ;             SREG
  85. C:00002f b61d  in   sv_SPL,SPL    ;save task2 SPL
  86.          ;
  87. C:000030 e7ef  ldi  ZL,stack1    ;set stack1($7F) to SPL
  88. C:000031 bfed  out  SPL,ZL
  89.          ;
  90.          ;----- timer0 for 1mS interval
  91. C:000032 e0e2  ldi  ZL,0b00000010  ;set simple-CTC mode
  92. C:000033 bfe0  out  TCCR0A,ZL
  93. C:000034 e0e4  ldi  ZL,0b00000100  ;prescale system clock by 256
  94. C:000035 bfe3  out  TCCR0B,ZL
  95. C:000036 e4ed  ldi  ZL,77      ;count up for 1mS interval
  96. C:000037 bfe6  out  OCR0A,ZL
  97. C:000038 27ee  clr  ZL        ;clear TCNT=0
  98. C:000039 bfe2  out  TCNT0,ZL
  99. C:00003a e0e1  ldi  ZL,0b00000001  ;enable intrpt by comp_A
  100. C:00003b bfe9  out  TIMSK,ZL
  101.          ;
  102. C:00003c 9478  sei           ;intrpt enable
  103.          ;
  104.          ;***** task1 **************************
  105.          task1:
  106. C:00003d 99b2  sbic  PinB,_SW1   ;SW1 ON ?
  107. C:00003e cffe  rjmp  task1     ; No, wait ON
  108. C:00003f 9ab0  sbi  PinB,_LED1   ; Yes, toggle LED1 ON/OFF
  109.          task1_Dly:
  110. C:000040 d00a  rcall Delay_01S   ;delay while 0.1Sec
  111. C:000041 9bb2  sbis PinB,_SW1    ;SW1 OFF ?
  112. C:000042 cffd  rjmp task1_Dly    ; No, wait OFF
  113. C:000043 cff9  rjmp task1      ; Yes, next
  114.          ;
  115.          ;***** task2 **************************
  116.          task2:
  117. C:000044 99b3  sbic  PinB,_SW2  ;SW2 ON ?
  118. C:000045 cffe  rjmp  task2    ; No, wait ON
  119. C:000046 9ab1  sbi  PinB,_LED2  ; Yes, toggle LED2 ON/OFF
  120.          task2_Dly:
  121. C:000047 d003  rcall  Delay_01S  ;delay while 0.1Sec
  122. C:000048 9bb3  sbis  PinB,_SW2   ;SW2 OFF ?
  123. C:000049 cffd  rjmp  task2_Dly   ; No, wait OFF
  124. C:00004a cff9  rjmp  task2     ; Yes, next
  125.          ;
  126.          ;===== 0.1Sec delay loop ==============
  127.          Delay_01S:
  128. C:00004b e3e2  ldi  ZL,50     ;*2 mS
  129.          Delay_01S1:
  130. C:00004c 30e0  cpi  ZL,0      ;time up ?
  131. C:00004d f7f1  brne  Delay_01S1  ; No, loop
  132. C:00004e 9508  ret          ; Yes
  133.          ;
  134.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement