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

Обсуждаем контроллеры компании Atmel.
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

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

Сообщение Alkul »

Jetetex писал(а):прошу прощения если не в тему, помогите посчитать значение компаратора на 1сек при частоте кварца 4Мгц, делитель СК/64. AT90S2313. А то я что то не пойму - вроде правильно почитал, а он отстаёт примерно на 10 сек в минуту. :shock:
у меня получилось 62500 (F424)

Правильно получилось, но это ведь количество "тиков", которое таймер должен отсчитать до переполнения, а не константа, загружаемая в регистр TCNT
Если вы хотите, чтобы прерывание по переполнению таймера срабатывало через 1 секунду при тактовой частоте 4 МГц и коэфф.предделителя 64, то в регистр TCNT нужно загружать константу 0x0BDC (число, обратное количеству "тиков").

Jetetex писал(а):И еще вопрос - когда идет обработка прерывания компаратора таймер щитает дальше, или ждет окончания обработки?

Если таймер включен, он считает всегда. Даже когда выполняется обработчик его собственного прерывания.
Последний раз редактировалось Alkul Пт янв 22, 2016 06:41:04, всего редактировалось 1 раз.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Можно записать в TCNT1=-62500 или использовать CTC1
Последний раз редактировалось akl Пт янв 22, 2016 15:11:27, всего редактировалось 1 раз.
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

AKL, а можно схемку для этого исходника? Если не жалко.
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

На прошлой странице, разве не она.
viewtopic.php?p=2595109#p2595109
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение 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 проф+исходник. Если кто может проверить степень моей криворукости, буду оч благодарен. :)
Вложения
Jet.rar
(31.03 КБ) 153 скачивания
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

Вопрос снят. Я по недосмотру при обработке прерывания обнулял не тот регистр.

Всем спасибо за помощь.
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

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

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

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

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

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

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

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

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

СпойлерИзображение
Вложения
Alarm_Clock.rar
(53.98 КБ) 128 скачиваний
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение 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
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

Спасибо а советы, в седующем проекте учту (отставание 42 сек в месяц). Раз в мес всеравно свет отрубят.
По поводу 1 вход-1 выход не совсем понял.

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

Вернуться в «AVR»