;; TIMER0のPWMを使ってLEDの明るさを変える ;; 入力はPD0に接続したトグルスイッチの入力により明暗を切り替える ;; 赤LEDは PD5に接続, 黄LEDは PD6に接続 ;; PD0 = 1 -> 黄:明、 赤:暗 ;; PD0 = 0 -> 黄:暗、 赤:明 ;; ;; 1. PWM出力はPD5, PD6 -> PD5, PD6を出力に設定 ;; 2. TCCR0BレジスタのWGM02(Bit3) ;; TCCR0AレジスタのWGM01(Bit1), WGM00(Bit0)でPWMの動作を選択 ;; WGM02 WGM01 WGM00 動作 ;; 0 0 1 8bit位相基準PWM ;; 3. コンペアレジスタOCR0A, OCR0Bとタイマ/カウンタTCNT0を比較してPWM出力 ;; 4. TCCR0AレジスタのCOM0A1(Bit7),COM0A0(Bit6),COM0B1(Bit5),COM0B0(Bit4) ;; でPWMの出力を選択 ;; OC0A, OC0Bともにカウントアップ時の一致で「0」、 ;; カウントダウン時の一致で「1」と設定する ;; COM0A1 COM0A0 COM0B1 COM0B0 ;; 1 1 1 1 ;; ;*************************************************************** ;*  デバイスの定義ファイルのインクルード * ;*************************************************************** ; .include "m88def.inc" ; ;*************************************************************** ;*    レジスターにシンボル名を定義    * ;*************************************************************** ; .def temp =r16 .def cnt1 =r17 .def cnt2 =r18 .def LEDA =r19 ; OC0A 現在表示している明るさを保存 .def LEDB =r20 ; OC0B 現在表示している明るさを保存 ; .equ bright =$E0 ; 明るい = 224/255 の明るさ .equ dark =$30 ; 暗い  = 48/255 の明るさ ; ;*************************************************************** ;* ベクトルエリア * ;*************************************************************** rjmp reset ; reset vector reti ; INT0 vector reti ; INT1 vector reti ; PCINT0 reti ; PCINT1 reti ; PCINT2 reti ; WDT reti ; Timer2 COMPA reti ; Timer2 COMPB reti ; Timer2 overflow reti ; Timer1 capture reti ; Timer1 COMPA reti ; Timer1 COMPB reti ; Timer1 overflow reti ; Timer0 COMPA reti ; Timer0 COMPB reti ; Timer0 overflow reti ; SPI STC reti ; USART/Rx complete reti ; USART/ Data register empty reti ; USART/Tx complete reti ; ADC reti ; EEPROM EE_RDY reti ; Analog comparator reti ; TWI reti ; SPM_RDY ; ;*************************************************************** ;* リセットルーチン             * ;*************************************************************** reset: ldi temp,high(RAMEND) out SPH,temp ; set stuck pointer ldi temp,low(RAMEND) out SPL,temp ; set stuck pointer ldi temp,$FF out DDRB,temp ; set portB to output out PORTB,temp ; PORTB =$FF ldi temp,$F0 out DDRD, temp ; PD0-3 input, PD4-6 output sbi PORTD, 0 ; PD0 pull up ldi temp,0b11110001 ; COM0A=1, COM0A0=1 (OC0A High output) ; COM0B=1, COM0B0=1 (OC0B High output) ; (WGM02=0), WGM01=0 WGM00=1 (8bit phase-PWM) out TCCR0A,temp ; TIMER0 8bit PWM, OC0A/B-high output ldi temp,0b00000011 ; WGM02=0, CS02=0, CS01=1, CS00=1 out TCCR0B,temp ; TIMER0 ck 1/64 ldi LEDA, bright ; OC0A: 始めは明をセット ldi LEDB, dark ; OC0B: 始めは暗をセット ; ;*************************************************************** ;* * ;* メインプログラム * ;* * ;*************************************************************** ; main: out OCR0A,LEDA out OCR0B,LEDB rcall delay ; 1 msec delay sbis PIND,0 rjmp disp_dark disp_bright: ; A:明, B:暗 ldi LEDA,bright ldi LEDB,dark rjmp main disp_dark: ; A:暗, B:明 ldi LEDA,dark ldi LEDB,bright rjmp main ;*************************************************************** ;* 1 msec. ディレイ ルーチン * ;* * ;* dl2: 5 clock * 200回 - 1 = 999 clock * ;* dl1: (dl3 + 4 clock) * 8.............回 - 1 + 5 + 3 = 4,019 clock * ;* * ;*************************************************************** ; delay: ; ldi cnt1,8 ; (1) dl1: ; (dl3 + 4 ) * 4 -1 + 4 + 3 ldi cnt2,200 ; (1) dl2: ; 5 * 200 -1 = 999 clock nop ; (1) nop ; (1) dec cnt2 ; (1) brne dl2 ; if non-zero jump to dl2 (2/1) dec cnt1 ; (1) brne dl1 ; if non-zero jump to dl1 (2/1) ret ; (4)