So-net無料ブログ作成
検索選択

Tiny2313のタイマーとPWMの実験 [text]


P1010004.JPG

;内部タイマーをカウントしてPWMを働かせ、逆動作をポートに出します。
;design by nonnno@6.hobby-web.net
;Low: 11100100
;_____||||++++-- CKSEL[3:0] システムクロック選択
;_____||++-- SUT[1:0] 起動時間
;_____|+-- CKOUT (0:PD2にシステムクロックを出力)
;_____+-- CKDIV8 クロック分周初期値 (1:1/1, 0:1/8)
;
;High:11-11111
;_____|||||||+-- RSTDISBL (RESETピン 1:有効, 0:無効(PA2))
;_____||||+++-- BODLEVEL[2:0] (111:Off, 110:1.8, 101:2.7, 100:4.3)
;_____|||+-- WDTON (WDT 0:常時ON, 1:通常)
;_____||+-- SPIEN (1:ISP禁止, 0:ISP許可) ※Parallel時のみ
;_____|+-- EESAVE (消去でEEPROMを 1:消去, 0:保持)
;_____+-- DWEN (On-Chipデバッグ 1:無効, 0:有効)
;
;Ext: -------1
;__________+-- SPMEN (SPM命令 1:無効, 0:有効)
;
;Cal: 109 110
;
; tiny2313 書き込み 外部回路
;1 (RESET/dW) PA2 ISP1 47k-to-VCC
;2 (RXD) PD0
;3 (TXD) PD1
;4 (XTAL2)
;5 (XTAL1)
;6 (CKOUT/XCK/INT0) PD2
;7 (INT1) PD3
;8 (T0) PD4
;9 (OC0B/T1) PD5
;10 GND ISP3 GND

;20 VCC ISP2 VCC-to-5V
;19 PB7 (UCSK/SCL/PCINT7) ISP6
;18 PB6 (MISO/DO/PCINT6) ISP5
;17 PA1 PB5 (MOSI/DI/SDA/PCINT5) ISP4
;16 PA0 PB4 (OC1B/PCINT4) 2.2k-LED_R
;15 PB3 (OC1A/PCINT3)
;14 PB2 (OC0A/PCINT2) 2.2k-LED_G
;13 PB1 (AIN1/PCINT1)
;12 PB0 (AIN0/PCINT0)
;11 PD6 (ICP)
.include "tn2313def.inc" ;
;fuse Low-E4 High-DF Ex-FF
; 定数定義
; タイマカウント
; out TCCR0B,acc ; タイマ0スタート。プリスケール設定
;0 0 1 clkI/O/1 (No prescaling) 1/8000
;0 1 0 clkI/O/8 (From prescaler) 1/1000
;0 1 1 clkI/O/64 (From prescaler) 1/125
;1 0 0 clkI/O/256 (From prescaler) 1/31.25 =32ns
;1 0 1 clkI/O/1024 (From prescaler) 1/7.8125
; .equ T1MSEC = 256-122 ; CLOCK=8MHz、Pre Scale=1/1、1msec 122up134ovf
.equ T1MSEC = 256-1 ; CLOCK=8MHz、Pre Scale=1/1、1msec 122up134ovf
; .equ PRE_SCALE = 0x01 ; 1/1。タイマスタート
; .equ PRE_SCALE = 0x02 ; 1/8。タイマスタート
; .equ PRE_SCALE = 0x03 ; 1/64。タイマスタート
.equ PRE_SCALE = 0x04 ; 1/256。タイマスタート
; .equ PRE_SCALE = 0x05 ; 1/1024。タイマスタート

;1 0x0000 RESET External Pin, Power-on Reset, Brown-out Reset,
;and Watchdog Reset
; 2 0x0001 INT0 External Interrupt Request 0
;3 0x0002 INT1 External Interrupt Request 1
;4 0x0003 TIMER1 CAPT Timer/Counter1 Capture Event
; 5 0x0004 TIMER1 COMPA Timer/Counter1 Compare Match A
; 6 0x0005 TIMER1 OVF Timer/Counter1 Overflow
; 7 0x0006 TIMER0 OVF Timer/Counter0 Overflow
;8 0x0007 USART0, RX USART0, Rx Complete
;9 0x0008 USART0, UDRE USART0 Data Register Empty
;10 0x0009 USART0, TX USART0, Tx Complete
; 11 0x000A ANALOG COMP Analog Comparator
;12 0x000B PCINT Pin Change Interrupt
;13 0x000C TIMER1 COMPB Timer/Counter1 Compare Match B
; 14 0x000D TIMER0 COMPA Timer/Counter0 Compare Match A
;15 0x000E TIMER0 COMPB Timer/Counter0 Compare Match B
;16 0x000F USI START USI Start Condition
;17 0x0010 USI OVERFLOW USI Overflow
;18 0x0011 EE READY EEPROM Ready
;19 0x0012 WDT OVERFLOW Watchdog Timer Overflow

.def s_save = R0 ; SREG保存用
.def acc = R16 ; アキュムレーター
.def t1ms = R17 ; 約1msecタイマカウンタ

; SRAM定義 スタック
.equ STACK_INIT = 0xDF ; スタック初期値

.dseg ; データセグメント=SRAM
.org STACK_INIT ;
stack_top: .byte 1 ; 昇順で使用。ダミーの1バイトを確保

; プログラム
.cseg ; CODE SEGMENT
; リセットスタートベクター
.org 0 ; リセットスタートベクタ
start:
rjmp main ; mainへ
; 外部割り込み0
.org 0x0001 ; INT0 External Interrupt Request 0
rjmp intr_0I ; intr_0Iへ
; 外部割り込み1
; .org 0x0002 ; INT1 External Interrupt Request 1
; rjmp intr_1I ; intr_1Iへ
; タイマ1オーバーフロー割込みベクター
.org 5 ; タイマ/カウンタ0オバーフロベクタ
rjmp intr_time1OV ; intr_time1OVへ
; タイマ0オーバーフロー割込みベクター
.org 6 ; タイマ/カウンタ0オバーフロベクタ
rjmp intr_time0OV ; intr_time0OVへ
; アナログコンパレーター割り込み
.org 0x000A ; ANALOG COMP Analog Comparator
rjmp ANALOG_COMP ; ANALOG_COMPへ
; タイマ0Aコンペア割込みベクター
.org 0x000D ; タイマ/カウンタ0オバーフロベクタ
rjmp intr_time0AC ; intr_time0ACへ
; タイマ0Bコンペア割込みベクター
; .org 0x000E ;TIMER0 COMPB Timer/Counter0 Compare Match B
; rjmp intr_time0BC ; intr_time0BCへ

main:
; スタックポインター初期化
ldi acc,low(STACK_INIT) ;
out spl,acc ; スタックポインター下位設定

; PORTB 初期化
ldi acc,0x00 ; 出力データ
out PORTB,acc ; PORTBの全ビットをLowに設定
ldi acc,0xFF ; PORTB全ビット出力
out DDRB,acc ; PORTB入出力方向設定

; アナログ比較器初期化
sbi ACSR,ACD ; アナログ比較器電源オフ

; ウォッチドッグ(WD)禁止
wdr ; WDタイマリセット
in acc,MCUSR ; MCUSR値を取得
andi acc,~(1<<WDRF) ; WDRF=0
out MCUSR,acc ; WD RESETフラグ(WDRF)解除
in acc,WDTCR ; 現WDTCR値を取得
ori acc,(1<<WDCE)|(1<<WDE)
; WDCE=WDE=1を設定
out WDTCR,acc ; WDCEとWDEに書き込み
ldi acc,0x00 ; WDCE=WDE=0を設定
out WDTCR,acc ; WD禁止

; Timer/Counter 1 初期化
; TCCR1A=0x00 ; 標準動作
;TIMSK TOIE1 OCIE1A OCIE1B - ICIE1 OCIE0B TOIE0 OCIE0A
;TIFR TOV1 OCF1A OCF1B - ICF1 OCF0B TOV0 OCF0A

in acc,TIMSK ; タイマ割込みマスクレジスタ取得
sbr acc,(1<<TOIE1)|(1<<TOIE0)|(1<<OCIE0A) ; オーバーフロー割込み許可ビットセット
; sbr acc,(1<<TOIE1) ; オーバーフロー割込み許可ビットセット
out TIMSK,acc ; タイマ0 タイマ1 OVF タイマ0ACOMP 割込み許可
ldi acc,T1MSEC ; 256-1
out TCNT1H,acc ; タイマ1Hカウンタ設定
ldi acc,0xDF ; Lカウント値
out TCNT1L,acc ; タイマ1Lカウンタ設定
ldi acc,PRE_SCALE ; プリスケール値0x04 1/256。32nsec。
out TCCR1B,acc ; タイマ1スタート。プリスケール設定

; 高速PWM設定。 PB2(OC0A,14pin)にPWM出力
; *高速PWM設定。 PD5(OC0B,9pin)予備
; PWMポート PORTB,3 ; PORTBのbit3(OC1A,15pin)にPWM出力
; PWMポート PORTB,4 ; PORTBのbit4(OC1A,16pin)にPWM出力
;TCCR0A COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00
; 1 1 0 0 0 0 1 1 = 0xC3
;TCCR0B FOC0A FOC0B - - WGM02 CS02 CS01 CS00
; 0 0 0 0 0 0 0 1 = 0x09
eor acc,acc ;
out OCR0A,acc ; 比較レジスター設定 T0

; ldi acc,(1<<COM0A1)|(1<<COM0A0)|(0<<WGM01)|(0<<WGM00);
ldi acc,(1<<COM0A1)|(1<<COM0A0)|(1<<WGM01)|(1<<WGM00);
out TCCR0A,acc ; 8ビット高速PWM
ldi acc,(0<<WGM02)|(1<<CS00)|(0<<CS02)|(0<<CS01);
out TCCR0B,acc ; clk/1,スタート

clr t1ms ; 1msecカウンタ初期化

sei ; 全割込み許可

serrulation_wave:
; ノコギリ波出力(PB2,14PIN)
out OCR0A,t1ms ; 比較レジスター設定

rjmp serrulation_wave ; ループ

; 外部割り込み0
intr_0I: ; intr_0I
in s_save,SREG ; ステータスを退避
;カウント
;方向決定
out SREG,s_save ; ステータスを復帰
reti ;

; 外部割り込み1
;intr_1I: ; intr_1I
; in s_save,SREG ; ステータスを退避

; out SREG,s_save ; ステータスを復帰
; reti ;

; タイマ1オーバー割込み
intr_time1OV:
in s_save,SREG ; ステータスを退避
push acc ; acc退避

; bset TOV1 ;TIFR 7 TOV1→0
ldi acc,T1MSEC ; 1msecカウント値
out TCNT1H,acc ; タイマ1Hカウンタ設定 ldi acc,T1MSEC ; 1msecカウント値
ldi acc,0xDF ; 1msecカウント値
out TCNT1L,acc ; タイマ1Hカウンタ設定

inc t1ms ; 1msecカウント

pop acc ; acc復帰
out SREG,s_save ; ステータスを復帰
reti ;

; タイマ0オーバー割込み
intr_time0OV:
in s_save,SREG ; ステータスを退避

cbi PORTB,3 ; PORTBのbit3→0
sbi PORTB,4 ; PORTBのbit4→1

out SREG,s_save ; ステータスを復帰
reti ;
; タイマ0コンペア割込み
intr_time0AC:
in s_save,SREG ; ステータスを退避

sbi PORTB,3 ; PORTBのbit3→1
cbi PORTB,4 ; PORTBのbit4→0

out SREG,s_save ; ステータスを復帰
reti ;

; アナログコンパレーター割り込み
ANALOG_COMP: ; ANALOG_COMP
in s_save,SREG ; ステータスを退避

cbi PORTB,3 ; PORTBのbit3→0
cbi PORTB,4 ; PORTBのbit4→0

out SREG,s_save ; ステータスを復帰
reti ;

; タイマ0Bコンペア割込みベクター
;intr_time0BC ; intr_time0BC
; in s_save,SREG ; ステータスを退避

; out SREG,s_save ; ステータスを復帰
; reti ;

; END

arduino [text]

3.3VZD-CHEG [text]

以前のキャパシタ放電タイミングリスト [text]

.include "tn2313def.inc"
.EQU DISCHG = 7 ;PB7
.EQU CAPIN = 7 ;PB7
.EQU LED1 = 6 ;PB6
.EQU LED2 = 5 ;PB5
.EQU CKSEL = 0100

;R0 ;G1 0x0000
;R1 ;G2
;R2 ;G3
;R3 ;G4
;R4 ;G5
;R5 ;G6
;R6 ;G7
;R7 ;G8
;R8 ;G9
;R9 ;G10
;R10 ;G11
;R11 ;G12
;R12 ;G13
;R13 ;G14
;R14 ;G15
;R15 ;G16

;R16 ;W1
;R17 ;W2
;R18 ;W3
;R19 ;W4
;R20 ;W5
;R21 ;W6
;R22 ;W7
;R23 ;W8
;R24 ;W9
;R25 ;W10

;R26 ;XL
;R27 ;XH

;R28 ;YL
;R29 ;YH

;R30 ;ZL
;R31 ;ZH 0x001f

;ior; 0x0020 to 0x005f
;isram ;0x0060 to 0x00df
;$00 to $1f Acss CBI & SBI ; BitTest CBIS & SBIS
;$00 to $3f Acss in & out
;GPIOR2 $15 ($35) ;LD/LDS/LDD & ST/STS/STD
;GPIOR1 $14 ($34)
;GPIOR0 $13 ($33)
; in r16, MCUSR
; out WDTCSR, r16
; cbi UCSRB,TXB8
; sbi UCSRB,TXB8
; sbis UCSRA,UDRE
; cbis UCSRA,UDRE
;
;

.cseg
.org $0000
 rjmp RESET ; Reset Handler
 rjmp INT0 ; External Interrupt0 Handler
 rjmp INT1 ; External Interrupt1 Handler
 rjmp TIM1_CAPT ; Timer1 Capture Handler
 rjmp TIM1_COMPA ; Timer1 CompareA Handler
 rjmp TIM1_OVF ; Timer1 Overflow Handler
 rjmp TIM0_OVF ; Timer0 Overflow Handler
 rjmp USART0_RXC ; USART0 RX Complete Handler
 rjmp USART0_DRE ; USART0,UDR Empty Handler
 rjmp USART0_TXC ; USART0 TX Complete Handler
 rjmp ANA_COMP ; Analog Comparator Handler
 rjmp PCINT ; Pin Change Interrupt
 rjmp TIMER1_COMPB ; Timer1 Compare B Handler
 rjmp TIMER0_COMPA ; Timer0 Compare A Handler
 rjmp TIMER0_COMPB ; Timer0 Compare B Handler
 rjmp USI_START ; USI Start Handler
 rjmp USI_OVERFLOW ; USI Overflow Handler
 rjmp EE_READY ; EEPROM Ready Handler
 rjmp WDT_OVERFLOW ; Watchdog Overflow Handler

RESET: ldi r16, low(RAMEND); Main program start
; out SPL,r16 Set Stack Pointer to top of
;RAM
; sei ; Enable interrupts
;  xxx

TIM1_CAPT:
TIM1_COMPA:
TIM1_OVF:
TIM0_OVF:
USART0_RXC:
USART0_DRE:
USART0_TXC:
ANA_COMP:
PCINT:
TIMER1_COMPB:
TIMER0_COMPA:
TIMER0_COMPB:
USI_START:
USI_OVERFLOW:
EE_READY:
WDT_OVERFLOW:
;
; PORTBの設定
 CBI PORTB,CAPIN ;検出ポートのプルアップしない
; CBI PORTB,LED1 ;LED1ポートのプルアップしない
; CBI PORTB,LED2 ;LED2ポートのプルアップしない
; SBI DDRB,LED1 ;LED1ポートを出力ポートに設定
; SBI DDRB,LED2 ;LED2ポートを出力ポートに設定
;
LOOP1:
 CBI DDRB,CAPIN ;CAPINを入力ポートに設定
; SBI PORTB,LED1 ;LED1を点灯
; CBI PORTB,LED2 ;LED2を消灯
;
LOOP2:
 NOP
 SBIS PINB,CAPIN ;CAPINの状態を調べる
 RJMP LOOP2 ;CAPIN=="0"でジャンプ
;
LOOP3:
 SBI DDRB,CAPIN ;DISCHGを出力ポートに設定(CBI PORTB,CAPINでLに成っている)
 NOP
 SBIC PINB,CAPIN ;CAPINの状態を調べる(これが有効?か)
 RJMP LOOP3 ;CAPIN=="0"でジャンプ
; CBI PORTB,LED1 ;LED1を消灯(NOPの処に入れると短縮できる?か)
; SBI PORTB,LED2 ;LED2を点灯
;
 RJMP LOOP1

LOOP4:
 NOP
 SBIS PINB,CAPIN ;CAPINの状態を調べる
 RJMP LOOP4 ;CAPIN=="0"でジャンプ
;Cs Frag0
;CountH +1
;Cs Frag1
LOOP5:
 NOP
 SBIC PINB,CAPIN ;CAPINの状態を調べる
 RJMP LOOP5 ;CAPIN=="0"でジャンプ
;Cs Frag1
;CountL
;Cs Frag0
 RJMP LOOP4 


将来PWMを使っても出来るようにポート配列を替えましたWS000733.JPG
メッセージを送る

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。