Страница 2 из 2

Re: Электронные часы с будильником на микроконтроллере AT90S

Добавлено: Пт янв 22, 2016 05:16:30
Alkul
Jetetex писал(а):прошу прощения если не в тему, помогите посчитать значение компаратора на 1сек при частоте кварца 4Мгц, делитель СК/64. AT90S2313. А то я что то не пойму - вроде правильно почитал, а он отстаёт примерно на 10 сек в минуту. :shock:
у меня получилось 62500 (F424)
Правильно получилось, но это ведь количество "тиков", которое таймер должен отсчитать до переполнения, а не константа, загружаемая в регистр TCNT
Если вы хотите, чтобы прерывание по переполнению таймера срабатывало через 1 секунду при тактовой частоте 4 МГц и коэфф.предделителя 64, то в регистр TCNT нужно загружать константу 0x0BDC (число, обратное количеству "тиков").
Jetetex писал(а):И еще вопрос - когда идет обработка прерывания компаратора таймер щитает дальше, или ждет окончания обработки?
Если таймер включен, он считает всегда. Даже когда выполняется обработчик его собственного прерывания.

Re: Электронные часы с будильником на микроконтроллере AT90S

Добавлено: Пт янв 22, 2016 06:29:12
akl
Можно записать в TCNT1=-62500 или использовать CTC1

Re: Электронные часы с будильником на микроконтроллере AT90S

Добавлено: Пт янв 22, 2016 12:56:46
Jetetex
AKL, а можно схемку для этого исходника? Если не жалко.

Re: Электронные часы с будильником на микроконтроллере AT90S

Добавлено: Пт янв 22, 2016 13:09:50
akl
На прошлой странице, разве не она.
http://radiokot.ru/forum/viewtopic.php? ... 9#p2595109

Re: Электронные часы с будильником на микроконтроллере AT90S

Добавлено: Пт янв 22, 2016 13:55:17
Jetetex
:oops:


Привожу кусок кода.
Спойлерreset: ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp

ldi Temp,0b01000000 ;разрешить прерывание компаратора
out TIMSK,Temp

ldi Temp,0b00000011 ;тактовый сигнал = CK
out TCCR1B,Temp

ldi Temp,0xF4 ;инициализация компаратора
out OCR1AH,Temp
ldi Temp,0x24
out OCR1AL,Temp

ldi Temp1,RamEnd ;инициализация стека
out SPL,Temp1

sei

ldi Temp,0b11111111 ;настройка портов
out ddrb,Temp

ldi Temp,0b01111000
out ddrd,Temp

=================

Кусок программы

=================

;=============
;Обработчик прерывания компаратора
;=============

Timer1_comp1:
ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp
cpi Temp5,0b00000000
breq point_on
ldi Temp5,0b00000000
rjmp Shift
Если я правильно все понял и посчитал, то таймер должен досчитать до 62500, дать команду прерывания по совпадению компаратора, обнулить таймер и ждать следующего совпадения. И это все должно происходить 1 раз в секунду.

Исходя из этого возникает вопрос - все проверяется пока в протеусе 7, может он что-то глючит?

в архиве проэкт для протеус 7 проф+исходник. Если кто может проверить степень моей криворукости, буду оч благодарен. :)

Re: Электронные часы с будильником на микроконтроллере AT90S

Добавлено: Вт янв 26, 2016 10:17:26
Jetetex
Вопрос снят. Я по недосмотру при обработке прерывания обнулял не тот регистр.

Всем спасибо за помощь.

Re: Электронные часы с будильником на микроконтроллере AT90S

Добавлено: Сб мар 19, 2016 22:12:28
Jetetex
Попробовал собрать часы с будильником Коваля. компилятор на исходник очень ругался и не захотел его компилить, а HEX в протеусе так и не запустился. Пришлось изобретать велосипед :)
И тут мне попался корпус от "Электроника 15"

Предлагаю вашему вниманию и критике свой проект часов с будильником на AT90S2313.
Алгоритм работы в принципе довольно понятен из исходника. В двух словах выглядит так:

Раз в секунду вызывается прерывание, в котором идет основная работа часов: счет времени, сравнение будильника, обработка кнопок.

секунды считаются до 60, дальше обнуляем сек, и добавляем 1 минуту. По достижении минут "10" обнуляем минуты, добавляем десятки минут...... и так далее.

Сравнение будильника происходит по порядку минуты - дес минут - часы - дес часов. Если при проверке совпадения не было - выходим, если совпадают все 4 знака - выводим в порт PD1 лог 1 при помощи операции "или" перед инициализацией разряда. Выключение будильника происходит кнопкой с фиксацией. Я использовал пищалку, потому просто отдаю лог единицу на сигнал.

Чтение нажатых кнопок проходит при выводе разрядов относительно порта PD1, а обработка при обработке прерывания, таким образом нет необходимости писать кусок кода для обработки нажатий.

В архиве весь мой проект,включая исходный код, в Proteus 7. HEX файл в папке "output".

Данный код является производной из обучалки. Статьи "динамическая индикация" и "динамический опрос кнопок"
СпойлерИзображение

Re: Электронные часы с будильником на микроконтроллере AT90S

Добавлено: Вс мар 20, 2016 05:00:14
akl
Jetetex писал(а):...Предлагаю вашему вниманию и критике свой проект часов с будильником на AT90S2313...
Для начала неплохо. Раз критика разрешена, позволю себе несколько замечаний по коду.
- т.к. прерывание по сравнению может возникнуть в строго определенный момент, а программа болтается в цикле, нужно сохранять SREG при входе в оное.
Спойлер

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

Timer1_comp1:
	IN	R15,SREG	; сохранить SREG в неиспользуемый до этого момента R15
	ldi Temp,0            ;обнуление таймера
			out TCNT1H,Temp
			out TCNT1L,Temp

Point:		com PointBlink
			cbr PointBlink,0b01111111
			
SecondInc:	inc Second				;инкремент переменной секунд
			rcall TimeCalc			;счет времени в знаках
			rcall KeyScan			;проверка кнопок

	OUT	SREG,R15	; восстановить SREG из R15
	reti			;выход из обработчика
-прерывание по сравнению вызывается в следующем цикле, поэтому для более точного отсчёта интервала нужно записать код сравнения на 1 меньше. А сейчас каждый секундный интервал формируется на 16мкс длиннее.
Спойлер

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

.equ	Fo=4000000
;
;
;
;
	LDI	XH,HIGH(Fo/64-1)
	LDI	XL,LOW(Fo/64-1)
	OUT	OCR1AH,XH
	OUT	OCR1AL,XL

	ldi Temp,0b01000000   	;разрешить прерывание компаратора
	out TIMSK,Temp
	out TIFR,Temp

	ldi Temp,0b00000011   	;тактовый сигнал = CK/64
	out TCCR1B,Temp
;        ldi Temp,0xF4        	;инициализация компаратора
 ;       out OCR1AH,Temp
  ;      ldi Temp,0x24
   ;     out OCR1AL,Temp

;		ldi Temp1,RamEnd		;инициализация стека
 ;       out SPL,Temp1

          sei
-в подпрограммах желательно, для начала, использовать принцип "1 вход - 1 выход"
Спойлер

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

Selection:
	brts SelectA
;			brtc SelectT
;			ret
			
SelectT:	lds Temp1,Time
			sts Digit,Temp1
			
			lds Temp1,Time+1
			sts Digit+1,Temp1
			
			lds Temp1,Time+2
			sts Digit+2,Temp1
			
			lds Temp1,Time+3
			sts Digit+3,Temp1

			ldi AlarmOn,128
			
	RJMP	Selection_OUT
;			ret
			
SelectA:	lds Temp1,Alarm
			sts Digit,Temp1
			
			lds Temp1,Alarm+1
			sts Digit+1,Temp1
			
			lds Temp1,Alarm+2
			sts Digit+2,Temp1
			
			lds Temp1,Alarm+3
			sts Digit+3,Temp1

			ldi AlarmOn,0
Selection_OUT:			
			ret

Re: Электронные часы с будильником на микроконтроллере AT90S

Добавлено: Вс мар 20, 2016 08:29:45
Jetetex
Спасибо а советы, в седующем проекте учту (отставание 42 сек в месяц). Раз в мес всеравно свет отрубят.
По поводу 1 вход-1 выход не совсем понял.

И еще вопрос не по теме - как инициализировать прерывания на тини 13? Также каки на 2313, или там другие регистры таймеров? Даташит пробовал читать, но с англ проблемы :-)