Страница 2 из 2
Re: Электронные часы с будильником на микроконтроллере AT90S
Добавлено: Пт янв 22, 2016 05:16:30
Alkul
Jetetex писал(а):прошу прощения если не в тему, помогите посчитать значение компаратора на 1сек при частоте кварца 4Мгц, делитель СК/64. AT90S2313. А то я что то не пойму - вроде правильно почитал, а он отстаёт примерно на 10 сек в минуту.
у меня получилось 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
Re: Электронные часы с будильником на микроконтроллере AT90S
Добавлено: Пт янв 22, 2016 13:55:17
Jetetex
Привожу кусок кода.
Спойлер
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, или там другие регистры таймеров? Даташит пробовал читать, но с англ проблемы
