.INCLUDE "tn13DEF.INC"
.list

#define led_r_on  sBI PORTB, PINB2
#define led_r_off cBI PORTB, PINB2

#define led_g_on  sBI PORTB, PINB1
#define led_g_off cBI PORTB, PINB1

#define led_b_on  sBI PORTB, PINB0
#define led_b_off cBI PORTB, PINB0


.def tmp=r16
.def tmp0=r17
.def cyclecount=r19
.def LEDrV=r20
.def LEDgV=r21
.def LEDbV=r22
.def cnt=r23
.def led_max=r24
.def led_min=r25

.DSEG

;obr:		.byte 1
rgb:		.byte 1
;shim:		.byte 1
ckeyh:		.byte 1
nmenu:		.byte 1

.cseg
.org $0a

RESET:
	ldi tmp,low(RAMEND)
	out spl,tmp

ldi tmp,0b00000111
out ddrb,tmp
ldi tmp,0b00000000
out portb,tmp

.macro   OUTI
	LDI   R16,@1
	OUT   @0,R16
.endm
	OUTI   ADCSRA,(1<<ADEN)|(1<<ADIE)|(0<<ADPS2)|(1<<ADPS0) ;Включаем АЦП, его прерывание, настраиваем предделитель тактовой частоты
	OUTI ADCSRB,0 ;источник автосрабатывания отключен
	OUTI   ADMUX,(1<<ADLAR)|(1<<MUX1) ;выравнивание влево (ADCH - 8 старших бит), 

	ldi tmp,$20
	out mcucr,tmp

	ldi tmp,(1<<toie0)
	out timsk0,tmp


	ldi tmp,$01	;предделитель
	out tccr0b,tmp
	sei

ldi LEDrV,$00
ldi LEDgV,$00
ldi LEDbV,$00


ldi led_min,$01
ldi led_max,$ff
clr tmp0
main:
;	SBI   ADCSRA,ADSC	;опрашиваем АЦП
;	ldi tmp,10
;noop:
;	subi tmp,1
;	brne noop			;ждем ответа АЦП
;rjmp r_shim

	ldi zh,high(2*prn1)
	ldi zl,low(2*prn1)


	add zl,tmp0
	clr tmp
	adc zh,tmp
	mov tmp,zh
	
	
	lpm
	sts rgb,r0
push tmp0
rcall delay_s
rcall delay_s
rcall delay_s
rcall delay_s
rcall delay_s
rcall delay_s
pop tmp0
	inc tmp0
	ldi tmp,$13
	cp tmp,tmp0
	brsh main_n
	clr tmp0

main_n:

rjmp main
;$01 красный
;$02 зеленый
;$04 синий
;$03 желтый
;$05 фиолетовый
;$06 голубой
;$07 белый
prn1:
.db $01,$03,$02,$06,$04,$05,$00,$07,$07,$00,$05,$04,$06,$02,$03,$01,$00,$07,$07,$00
prn2:
.db $01,$00,$02,$00,$04,$00,$01,$02,$04,$00,$01,$03,$07,$00,$02,$06,$07,$00,$07,$00

adc_inc:		;мы тут если сработала SBI ADCSRA,ADSC
		push tmp	;сохраняем все подряд
		push tmp0	;сохраняем все подряд
		in tmp,sreg	;сохраняем все подряд
		push tmp	;сохраняем все подряд

	IN cnt,ADCH	;запихиваем значение АЦП в регистр 
;sbi portb,2	;это для проверки

		pop tmp		;востанавливаем сохраненное все ранее	
		out sreg,tmp;востанавливаем сохраненное все ранее	
		pop tmp0	;востанавливаем сохраненное все ранее
		pop tmp		;востанавливаем сохраненное все ранее
	reti



tim0_ovf:

		push tmp	;сохраняем все подряд
		push tmp0	;сохраняем все подряд
		in tmp,sreg	;сохраняем все подряд
		push tmp	;сохраняем все подряд



INC cyclecount
cp cyclecount,led_max
brlo TSTLEDr
clr cyclecount


rgb_dec:
	lds tmp,rgb
	sbrs tmp,0
	rjmp r_minus
	rjmp r_plus
r_plus:
	cp ledrv,led_max
	brsh r_dec
;	rcall delay_10ms
	inc ledrv	
	rjmp r_dec
r_minus:
	cp ledrv,led_min
	brlo r_dec
;	rcall delay_10ms
	dec ledrv	
	rjmp r_dec
r_dec:

	lds tmp,rgb
	sbrs tmp,1
	rjmp g_minus	
	rjmp g_plus
g_plus:
	cp ledgv,led_max
	brsh g_dec
;	rcall delay_10ms
	inc ledgv	
	rjmp g_dec
g_minus:
	cp ledgv,led_min
	brlo g_dec
;	rcall delay_10ms
	dec ledgv	
	rjmp g_dec
g_dec:

	lds tmp,rgb
	sbrs tmp,2
	rjmp b_minus	
	rjmp b_plus
b_plus:
	cp ledbv,led_max
	brsh b_dec
;	rcall delay_10ms
	inc ledbv	
	rjmp b_dec
b_minus:
	cp ledbv,led_min
	brlo b_dec
;	rcall delay_10ms
	dec ledbv	
	rjmp b_dec
b_dec:

; Проверяем совпадения c установленными уровнями яркости.
;----- начало блока проверок ------
; ==== КРАСНЫЙ ====
TSTLEDr:
	CP cyclecount,LEDrV		; результат = cyclecount - LEDrV
	BRSH TSTLEDr_off		; Переход больше или равно, cyclecount >= LEDrV
	led_r_on
	rjmp TSTLEDg
TSTLEDr_off:
	led_r_off

; ==== ЗЕЛЕНЫЙ ====
TSTLEDg:
	CP cyclecount,LEDgV		; результат = cyclecount - LEDrV
	BRSH TSTLEDg_off		; Переход больше или равно, cyclecount >= LEDrV
	led_g_on
	rjmp TSTLEDb
TSTLEDg_off:
	led_g_off

; ==== СИНИЙ ====
TSTLEDb:
	CP cyclecount,LEDbV		; результат = cyclecount - LEDrV
	BRSH TSTLEDb_off		; Переход больше или равно, cyclecount >= LEDrV
	led_b_on
	rjmp TSTLED_end
TSTLEDb_off:
	led_b_off


TSTLED_end:
;----- конец блока проверок ------


		pop tmp		;востанавливаем сохраненное все ранее	
		out sreg,tmp;востанавливаем сохраненное все ранее	
		pop tmp0	;востанавливаем сохраненное все ранее
		pop tmp		;востанавливаем сохраненное все ранее
	reti

delay_s:
rcall delay_100ms
rcall delay_100ms
rcall delay_100ms
rcall delay_100ms
rcall delay_100ms
rcall delay_100ms
rcall delay_100ms
rcall delay_100ms
rcall delay_100ms
rcall delay_100ms

delay_100ms:
	ldi tmp0,$a0
	rjmp delay_ms1
delay_10ms:
	ldi tmp0,$10
	rjmp delay_ms1
delay_ms:
	ldi tmp,0
delay_ms1:
	rcall delay_us
	rcall delay_us
	rcall delay_us
	rcall delay_us
	subi tmp0,1
	brne delay_ms
	ret

delay_us:
	subi tmp,1
	nop
	brne delay_us
	ret




;		Address Labels Code Comments
.org $00
rjmp RESET ; Reset Handler
reti	;rjmp EXT_INT0 ; IRQ0 Handler
	reti	;rjmp PCINT0 ; PCINT0 Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
	reti	;rjmp EE_RDY ; EEPROM Ready Handler
	reti	;rjmp ANA_COMP ; Analog Comparator Handler
	reti	;rjmp TIM0_COMPA ; Timer0 CompareA Handler
	reti	;rjmp TIM0_COMPB ; Timer0 CompareB Handler
	reti	;rjmp WATCHDOG ; Watchdog Interrupt Handler
rjmp ADC_inc ; ADC Conversion Handler

.exit
