;■■■■■■■■■■■■■ ; ; 色を拾う ; 1MHz Tyny26L ; ; PA0 CDS明るさ入力(明るければ高電位) ; PA1 Red LED(K側) ; PA2 Green LED(K側) ; PA3 Blue LED(K側) ; ; PB0 R 色情報出力(H is T) ; PB1 G 色情報出力(H is T) ; PB2 B 色情報出力(H is T) ; ; PINB4 閾値取得スイッチ(内部プルアップ) ; ; RESET system disable ; ; EEPROM 0x01:Red閾値 0x02:Green閾値 0x03:Blue閾値 ; ;■■■■■■■■■■■■■ .include "tn26def.inc" .equ RLED=1 .equ GLED=2 .equ BLED=3 .def TR=r2 .def TG=r3 .def TB=r4 .def A=r16 .def B=r17 .def Rv=r18 .def Gv=r19 .def Bv=r20 .def dark=r21 .def flags=r23 ;0b00000### ; ||+-B脈あり ; |+--G脈あり ; +---R脈あり rjmp RESET ; reti ;INT0 reti ;PIN_CHG reti ;TMCOMPA reti ;TMCOMPB reti ;TMOVF1 reti ;TMOVF0 reti ;USI_STRT reti ;USI_OVF reti ;EE_RDY reti ;ANA_COMP reti ;ADC ;▼▼▼▼▼初期化 RESET: ;▼スタックポインタ初期化 LDI A,LOW(RAMEND) out sp,A ;▼IO初期化 ldi A,0b11111110 out DDRA,A ldi A,0 out PORTA,A ldi A,0b00000111 out DDRB,A ldi A,0b00010000 out PORTB,A ;▼AD初期化 ldi A,0b00100000 ; |||+++++-入力チャンネル ; ||+------左揃え ; ++-------基準電圧 out ADMUX,A ldi A,0b11000111 ; |||||+++-ADクロック ; ||||+----割り込み許可 ; |||+-----割り込み要求 ; ||+------連続変換 ; |+-------変換開始 ; +--------AD電源 out ADCSR,A ;▼EEPROMより閾値読み込み ldi A,1 rcall ReadEEP mov TR,B ldi A,2 rcall ReadEEP mov TG,B ldi A,3 rcall ReadEEP mov TB,B MAIN: rcall wait100ms ;▼Red読み込み rcall AD ;暗い値 in dark,ADCH cbi PORTA,RLED ;R点灯 rcall wait10ms rcall AD sbi PORTA,RLED ;R消灯 in Rv,ADCH sub Rv,dark ;暗い値との差分をとる rcall wait10ms ;▼Green読み込み rcall AD ;暗い値 in dark,ADCH cbi PORTA,GLED ;G点灯 rcall wait10ms rcall AD sbi PORTA,GLED ;G消灯 in Gv,ADCH sub Gv,dark ;暗い値との差分をとる rcall wait10ms ;▼Blue読み込み rcall AD ;暗い値 in dark,ADCH cbi PORTA,BLED ;B点灯 rcall wait10ms rcall AD sbi PORTA,BLED ;B消灯 in Bv,ADCH sub Bv,dark ;暗い値との差分をとる ;▼閾値所得要求確認 sbis PINB,4 rcall GetThreshold ;▼判定 distinction: cbr flags,0b00000111 ;▼R判定 mov A,TR cp Rv,A; brcs D1 sbr flags,0b00000100 ; cbi PORTA,RLED D1: ;▼G判定 mov A,TG cp Gv,A; brcs D2 sbr flags,0b00000010 ; cbi PORTA,GLED D2: ;▼B判定 mov A,TB cp Bv,A; brcs D3 sbr flags,0b00000001 ; cbi PORTA,BLED D3: ;▼結果を出力 in A,PORTB andi A,0b11111000 mov B,flags andi B,0b00000111 or A,B out PORTB,A ; rjmp D5;■待たない ; ;黒なら待たない ; sbrc flags,2 ; rjmp D4 ; sbrc flags,1 ; rjmp D4 ; sbrc flags,0 ; rjmp D4 ; rjmp D5 ;D4: ; rcall wait100ms ; rcall wait100ms ; rcall wait100ms ; rcall wait100ms ; rcall wait100ms ; rcall wait100ms ; rcall wait100ms ; rcall wait100ms ; rcall wait100ms ; rcall wait100ms ;D5: DEnd: ; sbi PORTA,RLED ; sbi PORTA,GLED ; sbi PORTA,BLED rjmp MAIN ;▼閾値取得 GetThreshold: mov TR,Rv mov TG,Gv mov TB,Bv ldi A,1 mov B,TR rcall WriteEEP ldi A,2 mov B,TG rcall WriteEEP ldi A,3 mov B,TB rcall WriteEEP rcall wait100ms ret ;▼サブルーチンコールを含めて1msピッタリ ; 3+1+(4*248-1)+1+4=1000 wait1ms: ;3 ldi A,248 ;1 w1A: nop ;1 subi A,1 ;1 brcc w1A ;2 nop ;1 ret ;4 wait10ms: rcall wait1ms ;1000 rcall wait1ms ;1000 rcall wait1ms ;1000 rcall wait1ms ;1000 rcall wait1ms ;1000 rcall wait1ms ;1000 rcall wait1ms ;1000 rcall wait1ms ;1000 rcall wait1ms ;1000 ret ;▼ 3+((1*7+1000+1+2)*99)+4=99997 wait100ms: ;3 ldi B,99 ;1 w100A: nop ;1 1 nop ;1 2 nop ;1 3 nop ;1 4 nop ;1 5 nop ;1 6 nop ;1 7 rcall wait1ms ;1000 subi B,1 ;1 brcc w100A ;2 ret ;4 ;▼AD変換 AD: AD1: sbic ADCSR,6 ;前の変換が完了するまで待つ rjmp AD1 sbi ADCSR,6 ;変換開始。 AD2: sbic ADCSR,6 ;変換が完了するまで待つ rjmp AD2 ret ;▼内臓EEPROM書き ;A:アドレス、B:データ WriteEEP: sbic EECR,1 ;EEWEが0になるのを待つ rjmp WriteEEP out EEAR,A ;アドレスをセット out EEDR,B ;データをせっと cli ;割り込み禁止 sbi EECR,2 ;EEPROMマスタ書き込み許可 sbi EECR,1 ;書き込み sei ;割り込み許可 ret ;▼内臓EEPROM読み ;A:アドレス、B:帰り値 ReadEEP: sbic EECR,1 ;EEWEが0になるのを待つ rjmp ReadEEP out EEAR,A ;アドレスをセット sbi EECR,0 ;読み込み in B,EEDR ret