Стробоскоп на светодиодах.

Что бы еще такого сделать?... Предлагайте! Обсудим все!!!
Ответить
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 17, 2013 21:32:57

Сообщение reasonx »

Здравствуйте все.

Не стал поднимать темы 2х годичной давности, поэтому создал новую.

Закончил делать схему управления, встал вопрос в светодиодах и с этим связанного.

В электронике я глубоко начинающий, а в оптике вообще дерево беспросветное.

Отсюда несколько вопрос:

В 2х темах о светодиодных стробах что существуют на сем форуме, ни в одной не пришли к окончательному выводу на каких светодиодах лучше сделать. (Оба автора делали на небольшое помещение, но так и не отписались что получилось и на чем сделали)
Собственно что выбрать ? Пару тройку дорогих (300р+) или множество дешевых ярких.

И хотелось бы конкретные модели, которые не проблема достать, если можно конечно.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 16545
Зарегистрирован: Вт сен 07, 2010 03:01:06
Откуда: Moscow-Izmaylovo

Сообщение m.ix »

любой ставь
супер пупер мега яркий
радиатор по любому будет требоватся
но уже не такой массивный, если конечно в виде фонарика не будешь юзать их.

Изображение снимал со вспышкой!

Но не забываем про собирающие линзы.
Лечу лечить WWWашу покалеченную технику.
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 17, 2013 21:32:57

Сообщение reasonx »

И почем такие ? Можно модельку того круглого побольше и плоского пониже ? :o
Друг Кота
Аватара пользователя
Сообщения: 16545
Зарегистрирован: Вт сен 07, 2010 03:01:06
Откуда: Moscow-Izmaylovo

Сообщение m.ix »

полоски от полутора тысяч
Кругляшки маленькие тоже полторы
Большие 4-5тр
марки не записал.

На ободах надписи есть
СпойлерИзображение
сверху силикон или типа того, так что когдтём выцарапать возможно кристаллик светодиода :)))
Лечу лечить WWWашу покалеченную технику.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 17, 2013 21:32:57

Сообщение reasonx »

Не гуглятся по надписям, да и дорого через чур, мне бы пару штук по 300-400р.

Такого хватит для площади 30квМ ?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 16545
Зарегистрирован: Вт сен 07, 2010 03:01:06
Откуда: Moscow-Izmaylovo

Сообщение m.ix »

где собрался стробоскопить?
в авто - выставлять время зажигания
в клубе - выставлять .....
Лечу лечить WWWашу покалеченную технику.
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 17, 2013 21:32:57

Сообщение reasonx »

Пока выставлено 30 мс на вспышку в бит и 30мс на вспышку при мерцании. Учитывая что планирую еще 2 режима с авто выбором, то все это буду настраивать по ходу.

Пока надо работоспособный прототип сварганить.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 17, 2013 21:32:57

Сообщение reasonx »

Выбор пал на 4 штуки CXA1507-0000-000N00G40E3

Вот даташит

http://www.terraelectronica.ru/pdf/CREE/CXA1507.pdf

Как выбор господам ?
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 17, 2013 21:32:57

Сообщение reasonx »

Решил почти полностью отказаться от дисркретки и начать сразу делать на контроллере.

Кодю первый раз, можно сказать на это и учусь (Все знают с какого сайта)

Получилось примерно следующие, пока все дошло только до начала определения BPM, но для меня было то еще задание.
Прошу старожил кодинга проверить, насколько уродски и можно ли это оптимизировать ?
Спойлер

Код: Выделить всё

; RAM =================
		.DSEG			; Сегмент ОЗУ
 		
		.ORG SRAM_START+100 
BCount: .byte 2					;Переменная счетчик ударов

; FLASH ===============
		.CSEG		; Кодовый сегмент

		.ORG 0x000000
		
		JMP Reset

;######################Константы######################
		
		.equ Bar = 4			;Константа такт
		.equ Square = 16		;Константа квадрат	
		.equ DSquare = 32		;Константа двойка
		.def FBeat = R21		;Флаг первый бит
		.def AllClear = R20		;Флаг ресет выполнен
;######################################################





;========Сброс счетчика========

ClrCounter:	LDI XL,(BCount)		; Загрузка адреса счетчика
			CLR R16				; Обнуление регистра
			ST X,R16			; Запись значения счетчика
			RET

;========Инициализация========

Reset:		LDI R16,low(RAMEND) ;Инициализация стека
			OUT SPL,R16
			LDI R16,HIGH(RAMEND)
			OUT SPH,R16

			RCALL ClrCounter	;Очистка памяти

			LDI R20,1			;Флаг "Ресет выполнен"

			JMP WStart	        ;Ожидание подачи сигнала

;========Ожидание подачи сигнала========

WStart:		RCALL CheckOn		;Вызов подпрограммы проверки подачи сигнала
			CLR R20				;Очистка флага "ресет выполнен"
			JMP	MainLoop		;Пререход в диспетчер

;========Проверка сигнала включения========
			
CheckOn:	SBIC PIND,7			;Проверка пина "подачи сигнала"
			RET					;Возврат из подпрограммы (Если сигнал присутствует)
			CPI R20,1			;Проверка флага "Ресет выполнен"
			BRNE Reset			;Если ресет не выполнен, выполнить
			JMP CheckON			;Если ресет выполнен, ожидать сигнала.
			
;========Диспетчер========Диспетчер========Диспетчер========Диспетчер========

Mainloop:	RCALL CheckOn		;Вызов подпрограммы проверки подачи сигнала
			RCALL BOnCheck		;Вызов подпрограммы проверки наличия первого ударного
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			JMP Mainloop

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
			
;========Проверка 1ого ударного========

BOnCheck:	SBRC FBeat,0		;Проверка флага "1 бит"
			RET					;Если стоит, то возврат в диспетчер	с продолжением цикла
			SBIS PIND,6			;Если нет, проверка пина, на наличие сигнала
			JMP PC+4			;Если нет сигнала, прыжок на 4 такта вниз ---->		
			LDI FBeat,1		;Если есть сигнал, поднимаем флаг	
			RET					;И возвращаемся в диспетчер, с продолжением цикла.
			POP R16				;----> Вытаскиваем адрес из стека, что бы не было переполнения
			POP R16				
			JMP Mainloop		;Возврат в диспетчер, с рестартом цикла
				
Да, код для ATMega16
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 316
Зарегистрирован: Пт апр 17, 2009 22:45:42
Откуда: Minsk

Сообщение maglev »

Я-бы писал на Си.
Не вникал в код, но что-то вызываемое "RCALL BOnCheck" заканчивается таким:

POP R16 ;----> Вытаскиваем адрес из стека, что бы не было переполнения
POP R16
JMP Mainloop ;Возврат в диспетчер, с рестартом цикла

зачем? Не проще-ли RET?
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 17, 2013 21:32:57

Сообщение reasonx »

maglev писал(а):Я-бы писал на Си.
Не вникал в код, но что-то вызываемое "RCALL BOnCheck" заканчивается таким:

POP R16 ;----> Вытаскиваем адрес из стека, что бы не было переполнения
POP R16
JMP Mainloop ;Возврат в диспетчер, с рестартом цикла

зачем? Не проще-ли RET?
Если будет RET, то он продолжит цикл, а надо именно с рестартом.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 17, 2013 21:32:57

Сообщение reasonx »

Дописал счетчик BPM и поддерживающий генератор BPM

Мб кто-то все таки заинтересуется. Все прокомментировано по максимуму.
Спойлер

Код: Выделить всё

.include "tn25def.inc"  

;= Start macro.inc ====
 
;= End macro.inc  ====
 
 
; RAM =================
		.DSEG			; Сегмент ОЗУ
 		
		.ORG SRAM_START+100 
BCount: .byte 2					;Переменная счетчик ударов

; FLASH ===============
		.CSEG		; Кодовый сегмент

		.ORG 0x000000
		
		RJMP Reset

; ***** INTERRUPT VECTORS ************************************************


		.ORG  0x0001
		RJMP TC
		.ORG  0x0002
		RETI
		.ORG  0x0003
		RJMP  TC4
		.ORG  0x0004
		RJMP  TC3
		.ORG  0x0005
		RJMP  RTClock
		.ORG  0x0006
		RETI
		.ORG  0x0007
		RETI
		.ORG  0x0008
		RETI
		.ORG  0x0009
		RETI
		.ORG  0x000A
		RETI
		.ORG  0x000B
		RETI
		.ORG  0x000C
		RETI
		.ORG  0x000D
		RETI
		.ORG  0x000E
		RETI




;######################Константы######################
		
		.equ Bar = 4			;Константа такт
		.equ Square = 16		;Константа квадрат	
		.equ DSquare = 32		;Константа двойка
		.def AllClear = R20		;Флаг ресет выполнен
		.def TimerON = R21		;Флаг таймер запущен
		.def RTCHigh = R22		;Сарший байт RTC(Часы)
		.def RTCLow = R23		;Младший байт RTC(Часы)	
		.def TCO1High = R24		;Сарший байт TCO(Точка начала отсчета BTC)
		.def TCO1Low = R25		;Младший байт TCO(Точка начала отсчета BTC)
		.def TCN1High = R26		;Сарший байт TCN(Точка конца отсчета BTC)
		.def TCN1Low = R27		;Младший байт TCN(Точка конца отсчета BTC)
		.def BTCHigh = R28		;Старший байт BTC(Часы BTC)

;######################################################



;====
;========Инициализация===================
;====
Reset:		LDI R16,RAMEND ;Инициализация стека
			OUT SPL,R16		

			CLR R0
			CLR R1
			CLR R2
			CLR R3
			CLR R4
			CLR R5
			CLR R6
			CLR R7
			CLR R8
			CLR R9
			CLR R10
			CLR R11
			CLR R12
			CLR R13
			CLR R14
			CLR R15
			CLR R16
			CLR R17
			CLR R18
			CLR R19
			CLR R20
			CLR R21
			CLR R22
			CLR R23
			CLR R24
			CLR R25
			CLR R26
			CLR R27
			CLR R28
			CLR R29
			CLR R30
			CLR R31

			ORI R16,1<<6|1<<2		;Устанавливаем маску ИЛИ на 7й и 3ий биты регистра R16
			OUT GIMSK,R16			;Разрешаем внешние прерывания 
			OUT PCMSK,R16			;По пину PB3
			ORI R16,1<<1|1<<0		;Устанавливаем маску ИЛИ на 1й и 2ой биты регистра R16
			OUT MCUCR,R16			;Устанавливаем прерывания по нарастающему импульсу.
			
			LDI AllClear,1			;Флаг "Ресет выполнен"

			SEI						;Разрешаем прерывания глобально

			RJMP WStart	        ;Ожидание подачи сигнала

;====
;========Конец инициализации=============
;====





;========Ожидание подачи сигнала========

WStart:		RCALL CheckOn		;Вызов подпрограммы проверки подачи сигнала
			CLR R20				;Очистка флага "ресет выполнен"
			RJMP	MainLoop		;Пререход в диспетчер

;========Проверка сигнала включения========
			
CheckOn:	RET
			SBIC PINB,0			;Проверка пина "подачи сигнала"
			RET					;Возврат из подпрограммы (Если сигнал присутствует)
			CPI R20,1			;Проверка флага "Ресет выполнен"
			BRNE Reset			;Если ресет не выполнен, выполнить
			RJMP CheckON			;Если ресет выполнен, ожидать сигнала.
			
;========Диспетчер========Диспетчер========Диспетчер========Диспетчер========

Mainloop:	RCALL CheckOn		;Вызов подпрограммы проверки подачи сигнала
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			RJMP Mainloop

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\			
;*=*=*=*=*=*=*=*=*=*=*=*=*=Счетчик BPM*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=



;========Инициализация таймера RTC========

TC:			CLR R16
			SBRC TimerON,0		;Если таймер запущен, то переходим, если нет прыгаем через такт и запускаем
			RJMP TC1			;Таймер запущен, значит пришел 2ой удар и можно высчитать BPM и запустить внутренний таймер.
			ORI R16,1<<0		;Накладываем маску ИЛИ 00000001
			OUT TCCR0B,R16		;Закидываем в таймер (программируем на счет тактовой частоты)
			ORI R16,1<<1		;Накладываем маску ИЛИ 00000010
			OUT TIMSK,R16		;Закидываем в таймер (разрешаем прерывания по переполнению)
			LDI TimerON,1		;Ставим флаг "Таймер запущен"
			SEI					;Разрешаем прерывания глобально
			RETI				;Уходим в диспетчер

;========Инициализация таймера BTC========

TC1:		CLR R16					;Очищяем R16
			OUT TCCR1,R16			;Останавливаем таймер BPM
			MOV TCO1Low,TCN1Low		;Время нового удара, становится временем старого
			MOV TCO1High,TCN1High	;Время нового удара, становится временем старого
			IN	TCN1Low,TCNT0		;Настоящее время, становится временем нового удара
			MOV	TCN1High,RTCHigh	;Настоящее время, становится временем нового удара
			OUT TCNT1,TCO1Low		;Устанавливаем точку начала отсчета, равную точке старого удара
			MOV BTCHigh,TCO1High	;Устанавливаем точку начала отсчета, равную точке старого удара
			ORI R16,1<<0			;Накладываем маску ИЛИ на 1ый бит
			OUT TCCR1,R16			;Запускаем Таймер BPM
			IN  R16,TIMSK			;Берем регистр TIMSK	
			ORI R16,1<<2			;Накладываем маску на ИЛИ на 3ий бит
			OUT TIMSK,R16			;Запускаем прерывания по переполнению
			OUT OCR1A,TCN1Low		;Закидываем младший байт точки конца отсчета для сравнения.
			ORI R16,1<<6			;Накладываем маску ИЛИ на 6ой бит TIMSK 
			OUT TIMSK,R16			;Запускаем прерывания по совпадению с регистром A
			RETI					;JESUS CHRIST IT’S A RETI GET IN THE MAINLOOP !!!!

;========Переполнение регистра BTC========

TC3:		INC BTCHigh				;Увеличиваем стайрший байт BTC
			CPI BTCHigh,4			;Сравниваем с точкой переполнения
			BRLO PC+2				;Если не равно, проваливаем	
			CLR BTCHigh				;Если равно, обнуляем
RETII:		RETI					;Проваливаем

;========Совпадение регистра сравнения с счетным регистром BTC========

TC4:		CP BTCHigh,TCN1High		;Сравниваем старший байт BTC с старшим байтом точки конца отсчета.
			BRNE RETII				;Не равен, сваливаем
			NOP						
			NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			RETI


			
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

			
;========Это часы реального времени, они считают========

RTClock:	INC RTCHigh				;При переполнении младщего 8 битного регистра увеличиваем старший байт RTC		
			CPI RTCHigh,4			;Сравниваем с точкой переполнения	
			BRLO PC+2				;Если не равно, уходим на RETI
			CLR RTCHigh				;Если равно, очистим, прошла секунда.
			RETI					;Уходим



			

; EEPROM ==============
		.ESEG			; Сегмент EEPROM
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 17, 2013 21:32:57

Сообщение reasonx »

Вот сделал схему, если кто залезет, гляньте краем глаза.
Изображение


И новый код.
Спойлер

Код: Выделить всё

.include "tn25def.inc"  

;= Start macro.inc ====
 
;= End macro.inc  ====
 
 
; RAM =================
		.DSEG			; Сегмент ОЗУ
 		
		.ORG SRAM_START+100 
BCount: .byte 2					;Переменная счетчик ударов

; FLASH ===============
		.CSEG		; Кодовый сегмент

		.ORG 0x000000
		
		RJMP Reset
		

; ***** INTERRUPT VECTORS ************************************************


		.ORG  0x0001
		RJMP IC			;Прерывание по импульсу
		.ORG  0x0002
		RETI
		.ORG  0x0003
		RETI
		.ORG  0x0004
		RETI
		.ORG  0x0005
		RJMP RTClock	;Переполнение таймера RTC
		.ORG  0x0006
		RETI
		.ORG  0x0007
		RETI
		.ORG  0x0008
		RETI
		.ORG  0x0009
		RETI
		.ORG  0x000A
		RJMP IC2		;Совпадение регистра сравнения A таймера RTC
		.ORG  0x000B
		RJMP RTClock1	;Совпадение регистра сравнения B таймера RTC
		.ORG  0x000C
		RETI
		.ORG  0x000D
		RETI
		.ORG  0x000E
		RETI




;######################Константы######################
		
		.equ Bar = 4			;Константа такт
		.equ Square = 16		;Константа квадрат	
		.equ DSquare = 32		;Константа двойка
		.def RTCHigh = R18		;Старший байт RTC(Часы)
		.def StartTimeH = R19	;Старший байт Первого импульса
		.def StartTimeL = R20	;Младший байт Первого импульса
		.def EndTimeH = R21		;Старший байт Второго импульса
		.def EndTimeL = R22		;Младший байт Второго импульса
		.def SEndTimeH = R23	
		.def SEndTimeL = R24
		.def AEndTimeH = R25	
		.def AEndTimeL = R26

;######################################################



;====
;========Инициализация===================
;====
Reset:		LDI R16,RAMEND ;Инициализация стека
			OUT SPL,R16		

			CLR R0
			CLR R1
			CLR R2
			CLR R3
			CLR R4
			CLR R5
			CLR R6
			CLR R7
			CLR R8
			CLR R9
			CLR R10
			CLR R11
			CLR R12
			CLR R13
			CLR R14
			CLR R15
			CLR R16
			CLR R17
			CLR R18
			CLR R19
			CLR R20
			CLR R21
			CLR R22
			CLR R23
			CLR R24
			CLR R25
			CLR R26
			CLR R27
			CLR R28
			CLR R29
			CLR R30
			CLR R31
			
			;==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!

			LDI R16,7		;Грузим в R16 0000 0111
			OUT DDRB,R16	;Вводим порт PB1 режим выхода

			;==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!
			
			;==Инициализация I\O и их прерываний

			LDI R16,7		;Грузим в R16 0000 0111
			OUT PORTB,R16	;Вводим порты PB0,PB1,PB2 режим PULL UP 
			LDI R16,2		;Грузим в R16 0000 0010
			OUT DDRB,R16	;Вводим порт PB1 режим выхода
			IN	R16,MCUCR	;Загружаем регистр MCUCR 
			ORI R16,1<<1	;Применяем маску ИЛИ 0000 0010 к регистру MCUCR
			OUT MCUCR,R16	;Возвращяем регистр MCUCR обратно
			IN 	R16,GIMSK	;Загружаем регистр GIMSK
			ORI	R16,1<<6	;Применяем маску ИЛИ 0100 0000 к регистру GIMSK
			OUT	GIMSK,R16	;Возвращяем регистр GIMSK обратно

			;==Инициализация таймера RTC========
			

			;Разрешаем прерывания по переполнению таймера

			IN R16,TIMSK		;Загружаем регистр TIMSK 
			ORI R16,1<<1		;Применяем маску ИЛИ 00000010 к регистру TIMSK
			OUT TIMSK,R16		;Закидываем в таймер (разрешаем прерывания по переполнению)

			;Програмируем таймер на счет тактовой частоты и запускаем

			IN R16,TCCR0B		;Загружаем регистр TCCR0B 	
			ORI R16,1<<0		;Применяем маску ИЛИ 00000001 к регистру TCCR0B
			OUT TCCR0B,R16		;Возвращяем регистр TCCR0B обратно 
			

			SEI					;Разрешаем прерывания глобально

			RJMP MainLoop		;Ожидание подачи сигнала

;====
;========Конец инициализации=============
;====



	
			
;========Диспетчер========Диспетчер========Диспетчер========Диспетчер========

Mainloop:	NOP
			NOP
			NOP
			NOP
			NOP
			NOP
			RJMP Mainloop

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\			
;*=*=*=*=*=*=*=*=*=*=*=*=*=Счетчик BPM*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

IC:			Mov StartTimeH,EndTimeH
			Mov StartTimeL,EndTimeL
			Mov EndTimeH,RTCHigh
			IN  EndTimeL,TCNT0
			RJMP Calc
IC1:		
			;==Очистим флаг регистра сравнения A==
			IN R16,TIFR				;Загружаем регистр TIFR в R16
			ANDI R16,16         	;Накладываем маску И 0001 0000 на регистр TIFR
			OUT TIFR,R16			;Загружаем R16 в регистрн TIFR тем самым очищяя флаг регистра сравнения A

			;==Програмируем таймер генерировать прерывания по совпадению с регистром сравнения A

			OUT OCR0A,AEndTimeL		;Выводим ACT в регистр сравнения A
			IN 	R16,TIMSK			;Загружаем регистр TIMSK в R16
			ORI R16,1<<4			;Накладываем маску ИЛИ 0001 0000 на регистр TIMSK
			OUT TIMSK,R16			;Загружаем R16 в регистрн TIMSK тем самым разрешая прерывания по совпадению.
			RETI

IC2:		CP AEndTimeH,RTCHigh
			BRNE IC3
			CBI PORTB,1
			LDI R17,1
			RCALL IC
IC3:		RETI

			
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

;========Аспирант======

;EndTime subtrackt StartTime

Calc:	Mov SEndTimeL,EndTimel
			Mov SEndTimeH,EndTimeH
			sub SEndTimeL,StartTimel
			sbc SEndTimeH,StartTimeH
			Mov AEndTimeL,EndTimel
			Mov AEndTimeH,EndTimeH
			add	AEndTimeL,SEndTimeL
			adc	AEndTimeH,SEndTimeH
			CPI AEndTimeH,128
			BRLO Calc1
			SUBI AEndTimeH,128
Calc1:		RJMP IC1

;========Это часы реального времени, они считают========


RTClock:	CPI R17,1
			BRNE RTClockAB
			SBI PORTB,1
			CLR R17
RTClockAB:	INC RTCHigh				;При переполнении младщего 8 битного регистра увеличиваем старший байт RTC		
			CPI RTCHigh,128			;Сравниваем с точкой переполнения	
			BRLO RTCRETI			;Если не равно, уходим на RETI
									;Если равно, досчитываем 
			
			;==Очистим флаг регистра сравнения B==
			IN R16,TIFR				;Загружаем регистр TIFR в R16
			ANDI R16,8         	    ;Накладываем маску И 0000 1000 на регистр TIFR
			OUT TIFR,R16			;Загружаем R16 в регистрн TIFR тем самым очищяя флаг регистра сравнения B

			;==Програмируем таймер досчитать последние 128 тактов секунды

			LDI R16,128				;Загружаем в R16 128 
			OUT OCR0B,R16			;Выводим 128 в регистр сравнения B
			IN 	R16,TIMSK			;Загружаем регистр TIMSK в R16
			ORI R16,1<<3			;Накладываем маску ИЛИ 0000 1000 на регистр TIMSK
			OUT TIMSK,R16			;Загружаем R16 в регистрн TIMSK тем самым разрешая прерывания по совпадению.
RTCRETI:	RETI

			;==Прошла секунда, подготовка к подсчету следующей

RTClock1:	IN 	R16,TIMSK			;Загружаем регистр TIMSK в R16
			ANDI R16,247			;Накладываем маску И 1111 0111 на регистр TIMSK
			OUT TIMSK,R16			;Загружаем R16 в регистрн TIMSK тем самым запрещяя прерывания по совпадению.
			CLR RTCHigh				;Очистим старший байт RTC.
			RETI					;Уходим



			

; EEPROM ==============
		.ESEG			; Сегмент EEPROM
Ответить

Вернуться в «Умные мысли»