; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************

.include "C:\VMLAB\include\m8def.inc"

;/*
;Date    : 11.05.2018
;Author  : Ibragimov Adam
;Chip type           : Atmega8
;Clock frequency     : 16,000000 MHz
;Memory model        : Mega
;*/

;.include "m8def.inc"			;загрузка предопределений для ATmega8
.list							;подключение генерации листинга

.cseg							;начало сегмента кода
.org 0x00						;начальное значение для адресации

.def temp = R16                 ; === Определения имени для регистра R16
.def count_bits = R17

		; === Регистры ниже используются для обработки и создания цветов =======
			   								
.def color= R18
.def byte = R19
.def B = R20
.def R = R21
.def G = R22
			; =============================================================
.org 0x00
rjmp restart

								; +++++++ Векторы прерываний +++++++

.org 0x001                      ; === Вектор прерывания по событию INT0
rjmp blink_l                     ; === Переходим на blink_l
.org 0x002						; === Вектор преривания по событию INT1
rjmp blink_r					; === Переходим на blink_r



blink_l:				; === Прерывание по событию INT0
reti
blink_r:				; === Прерывание по событию INT0
reti


restart:

								; ++++++ инициализация стека +++++++

ldi   R16,low(RAMEND) ;скопируем в R16 младщий байт из константы RAMEND, которая определена в m8def.inc и хранит размер SRAM
out   SPL,R16         ;скопируем значение из R16 в SPL
ldi   R17,high(RAMEND);скопируем в R16 старший байт из константы RAMEND, которая определена в m8def.inc
out   SPH,R17         ;скопируем значение из R17 в SPH

								; ++++++ Инициализация портов ВВ +++++++
ldi R16, 0b00000001
out DDRD, R16
ldi R16, 0b11111110
out PORTD, R16
		
ldi temp, 0b11000000 ; === Разрешаем внешние прерывания INT0 и INT1
out GICR, temp
ldi temp, 0b00000000 ; Настройка возникновение прерывания
out MCUCR, temp

							 ; +++++ Начало программы ++++++
sei

start:		
						ldi temp, 17			; == Загрузка количества светодиодов
dh: 					rcall blue				
						dec temp
						brne dh
cycle:
						rjmp cycle





						; =============== Предустановки цветов ==============================
white:	; Белый
			cli
			ldi B, 0xFF ; === Биты синего цвета от 0 до 8
			ldi G, 0xFF ; === Биты зеленого цвета от 0 до 8	
			ldi R, 0xFF ; === Биты красного цвета от 0 до 8
			rcall rgb
			ret

blue:		cli
			ldi B, 0xFF ; === Биты синего цвета от 0 до 8
			ldi G, 0 ; === Биты зеленого цвета от 0 до 8	
			ldi R, 0 ; === Биты красного цвета от 0 до 8
			rcall rgb
			ret
;			/*Далее создаем нужные цвета копируя блоки что наверху и подставляя нужные цифры,
;			  другого оригинального решения я не нашел, так как новичок в программировании.
;			*/




						; === Обработка цветов ===============================================
RGB:
			cli
			ldi	count_bits,24
cyc_rgb:
			cbi	portd,0
			clc
			lsl	B
			rol	R
			rol	G
			brcc		lo_out
			sbi portd, 0
			rjmp		count
lo_out:
			sbi portd, 0
			nop
			cbi portd, 0
count:
			dec	count_bits
			brne	cyc_rgb
			cbi portd, 0
			ret	


