Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- リエントラント
- サブルーチン内で使用しているレジスタをタスク毎に用意すれば、
- そのサブルーチンはリエントラント(再入可)になり、あるタスクで実行中のサブルーチンであっても、
- 別のタスクでも同時に実行する事が出来ます。
- 前回のサンプル1は2組のSWとLEDについて、モメンタリ動作の「SWを押している間LEDが点灯する」でしたが、
- ( https://pastebin.com/G7XQgu1q )
- 今回のサンプル3はオルタネート動作の「SWを押すとLEDが点灯し、もう一度押すと消灯する」です。
- したがって、SWを操作した時のチャタリング除去処理が必要になりますが、
- その目的で使用しているディレィループ「Delay_01S」はリエントラントです。
- たとえばこの「Delay_01S」ルーチンをtask1が実行中であっても、
- task2はtask1のディレィループのカウント動作に影響する事無く、
- またtask1から影響される事無く、カウント動作を正しく実行する事が出来ます。
- ・timer0割り込み処理にディレイループのカウント用レジスタタZLの-1命令が追加されていますが、
- ソフウトウェアだけでのカウント動作も可能です。
- ・タイマ割り込みのインターバルは1mSでタスク数は2個なので2~512mSのディレイとなります。
- ・ディレイループはSWのチャタリング除去だけでなく、LEDの点滅などにも使用できます。
- ・なお、このプログラムはリエントラントのサンプルであり、プログラムサイズを小さくするために、
- チャタリング除去方法を簡易的なものにしました。
- サンプル3 リエントラント
- ;***** tiny2313 vectors ***************
- C:000000 c021 rjmp RESET ;00 RESET
- C:000001 9518 reti ;01 INT0
- C:000002 9518 reti ;02 INT1
- C:000003 9518 reti ;03 timer1 Capt
- C:000004 9518 reti ;04 CompA
- C:000005 9518 reti ;05 OVF1
- C:000006 9518 reti ;06 timer0 OVF0
- C:000007 9518 reti ;07 USART RX
- C:000008 9518 reti ;08 UDRE
- C:000009 9518 reti ;09 TX
- C:00000a 9518 reti ;10 ANA_COMP
- C:00000b 9518 reti ;11 PCINT0
- C:00000c 9518 reti ;12 timer1 CompB
- C:00000d c007 rjmp IRQ13 ;13 timer0 CompA
- C:00000e 9518 reti ;14 CompB
- C:00000f 9518 reti ;15 I2C Start Condition
- C:000010 9518 reti ;16 Over Flow
- C:000011 9518 reti ;17 EEPROM EEw_Rdy
- C:000012 9518 reti ;18 WDT
- C:000013 9518 reti ;19 PCINT1
- C:000014 9518 reti ;20 PCINT2
- ;===== timer0 for dispatch ============
- ; CompA:interval 1mS
- ; execute time about 1uS at 20MHz system clock
- IRQ13:
- C:000015 93ef push ZL ;save ZL,ZH & SREG to currrent stack
- C:000016 93ff push ZH
- C:000017 b7ef in ZL,SREG
- C:000018 93ef push ZL
- C:000019 2de1 mov ZL,sv_SPL ;exchange SP task1 <--> task2
- C:00001a b61d in sv_SPL,SPL
- C:00001b bfed out SPL,ZL
- C:00001c 91ef pop ZL ;restore ZL,ZH & SREG from next stack
- C:00001d bfef out SREG,ZL
- C:00001e 91ff pop ZH
- C:00001f 91ef pop ZL
- C:000020 95ea dec ZL ;-1 for delay loop <<<追加
- C:000021 9518 reti ;exec. next task
- ***** system setup *******************
- RESET:
- ;----- Port_B
- C:000022 efef ldi ZL,0b11111111 ;b0/1:output_Hi for LED1/LED2
- C:000023 bbe8 out PortB,ZL ;b2/3:input_PullUp for SW1/SW2
- C:000024 e8e3 ldi ZL,0b10000011 ;bit7:output for check
- C:000025 bbe7 out DDRB,ZL
- ;
- ;----- stack2 for task dispatch
- C:000026 e8ef ldi ZL,stack2 ;set stack2($8F) to SPL
- C:000027 bfed out SPL,ZL
- C:000028 e4e4 ldi ZL,LOW(task2) ;push task2 strat adrs for PCL
- C:000029 93ef push ZL
- C:00002a e0e0 ldi ZL,HIGH(task2) ; PCH
- C:00002b 93ef push ZL
- C:00002c 93ef push ZL ; for dumy ZL
- C:00002d 93ef push ZL ; ZH
- C:00002e 93ef push ZL ; SREG
- C:00002f b61d in sv_SPL,SPL ;save task2 SPL
- ;
- C:000030 e7ef ldi ZL,stack1 ;set stack1($7F) to SPL
- C:000031 bfed out SPL,ZL
- ;
- ;----- timer0 for 1mS interval
- C:000032 e0e2 ldi ZL,0b00000010 ;set simple-CTC mode
- C:000033 bfe0 out TCCR0A,ZL
- C:000034 e0e4 ldi ZL,0b00000100 ;prescale system clock by 256
- C:000035 bfe3 out TCCR0B,ZL
- C:000036 e4ed ldi ZL,77 ;count up for 1mS interval
- C:000037 bfe6 out OCR0A,ZL
- C:000038 27ee clr ZL ;clear TCNT=0
- C:000039 bfe2 out TCNT0,ZL
- C:00003a e0e1 ldi ZL,0b00000001 ;enable intrpt by comp_A
- C:00003b bfe9 out TIMSK,ZL
- ;
- C:00003c 9478 sei ;intrpt enable
- ;
- ;***** task1 **************************
- task1:
- C:00003d 99b2 sbic PinB,_SW1 ;SW1 ON ?
- C:00003e cffe rjmp task1 ; No, wait ON
- C:00003f 9ab0 sbi PinB,_LED1 ; Yes, toggle LED1 ON/OFF
- task1_Dly:
- C:000040 d00a rcall Delay_01S ;delay while 0.1Sec
- C:000041 9bb2 sbis PinB,_SW1 ;SW1 OFF ?
- C:000042 cffd rjmp task1_Dly ; No, wait OFF
- C:000043 cff9 rjmp task1 ; Yes, next
- ;
- ;***** task2 **************************
- task2:
- C:000044 99b3 sbic PinB,_SW2 ;SW2 ON ?
- C:000045 cffe rjmp task2 ; No, wait ON
- C:000046 9ab1 sbi PinB,_LED2 ; Yes, toggle LED2 ON/OFF
- task2_Dly:
- C:000047 d003 rcall Delay_01S ;delay while 0.1Sec
- C:000048 9bb3 sbis PinB,_SW2 ;SW2 OFF ?
- C:000049 cffd rjmp task2_Dly ; No, wait OFF
- C:00004a cff9 rjmp task2 ; Yes, next
- ;
- ;===== 0.1Sec delay loop ==============
- Delay_01S:
- C:00004b e3e2 ldi ZL,50 ;*2 mS
- Delay_01S1:
- C:00004c 30e0 cpi ZL,0 ;time up ?
- C:00004d f7f1 brne Delay_01S1 ; No, loop
- C:00004e 9508 ret ; Yes
- ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement