Бегло просмотрев, заметил следующее:
При входе в прерывание вы не сохраняете в стеке статус-регистр (SREG) и регистры, которые используются не только в прерывании. Совет: лучше настроить таймер в режим CTC, тогда таймер не нужно будет обнулять в прерывании, точность повысится.
Бегло просмотрев, заметил следующее: При входе в прерывание вы не сохраняете в стеке статус-регистр (SREG) и регистры, которые используются не только в прерывании. .
как их настроить??
СТС в смысле писать за место
mov st,temp1
через
.dseg
Digit: .byte 6
sts Digit+1Temp1 и т.д. ????
_________________ Чем больше думаеш, тем дольше уснуть не можеш...
Я вам конечно помогу, но вы литературу почитайте, на этом сайте обучалка есть и в интернете информации полно. Для начала узнайте и что такое стек, что такое указатель стека и для чего они используется.
Объясню кратко: стек - область ОЗУ, организованная по принципу первым вошел-последним вышел.
Теперь собственно по теме.
1. Сохранение регистров общего назначения (r0-r31)
Код:
push r16 ; "заталкиваем" регистр r16 в стек push r17 ; "заталкиваем" регистр r17 в стек ; теперь мы може пользоваться сохраненными регистрами как нам угодно ...some code pop r17; "вынимаем " регистры из стека обязательно в порядке обратном "заталкиванию" pop r16; ; теперь в регистрах появилисль значения, которые были в них до прерывания
2. Сохранение регистра SREG в стеке:
Код:
push r16; "заталкиваем" регистр r16 в стек in r16, SREG; читаем в r16 регистр SREG push r16; сохраняем прочитанное значение в стеке. .... some code pop r16 ; читаем в r16 из стека значение, соответствующее регистру SREG до вход в обработчик прерывания out SREG, r16; пишем это значение в SREG pop r16; читаем из стека значение r16. ; после данных действий и в SREG и в r16 значения которые были в них до входа в обработчик прерывания.
Важное замечание: при операциях со стеком порядок извлечения регистров из стека всегда должен быть обратным относительно порядка сохранения "заталкивания" регистров в стек.
СТС в смысле писать за место mov st,temp1 через .dseg Digit: .byte 6
sts Digit+1Temp1 и т.д. ????
Нет, CTC (clear timer on compare) - это режим работы таймера, при котором он автоматически очищается при совпадении с регистром сравнения. Используется для обеспечения точного отсчета временных интервалов. Скачайте даташит на контроллер и посмотрите в нем (искать по слову CTC).
Вот сейчас еще косяк заметил:
Вы выходите из обработчика прерывания командой ret. это значит, что после выхода у вас глобально запрещены прерывания, поскольку при входе в обработчик прерывания, автоматически глобально запрещаются прерывания (равносильно команде cli).
Если вы хотите, чтобы при выходе из обработчика прерывания, глобально разрешались прерывания, то следует использовать команду reti. Собственно отличие reti от ret состоит именно в том что первая глобально разрешает прерывания при выходе из подпрограммы, а вторая - нет.
Писал прошивку на основе http://radiokot.ru/circuit/digital/home/33/.
В этих исходниках ничего подобного не было. В коментах пишут что часы работают нормально. А я максимум чего добился (расчетом и подборкой задержки) это отставание на 2 минуты за 4 часа.
Немогу понять как расчитывать
ldi Temp1,0b00000100
out Tccr1b,Temp1 ;тактовый сигнал /256
ldi Temp1,0x7a
out Ocr1ah,Temp1
ldi Temp1,0x12
out Ocr1al,Temp1 ;запись числа сравнения 31250 (0.4сек. при 8мгц)
и где ставить
ldi Temp1,0
out Tcnt1h,Temp1
out Tcnt1l,Temp1 ;обнуление счетчика
_________________ Чем больше думаеш, тем дольше уснуть не можеш...
А. Во-первых работают скорее вопреки всему, во-вторых не знаю как их тестили, в-трерьих покажите мне эти коменты.
SeamaNCOS писал(а):
я максимум чего добился (расчетом и подборкой задержки) это отставание на 2 минуты за 4 часа.
Б. По-моему ваш исходник все-же отличается от оригинала.
SeamaNCOS писал(а):
Немогу понять как расчитывать
В. Я вам уже ответил куда копать, еще раз поясню: скачайте даташит и прочитайте хотя бы про таймеры (а желательно весь). Если плохо с английсиким, то на сайте www.gaw.ru есть некоторая информация на русском языке, хотя я рекоммендую все-таки читать даташит на английском.
Сделал бинарные часики на Attiny2313 но настроить никак не могу. Число сравнения не работает сколько не меняю все равно отстают на 13 сек за минуту.
Здравствуйте.
- Проверьте, как запрограммированы биты CSEL3...0=1111 и SUT1,0=11.
- откорректировал Ваш текст, проверил формирование интервала 1 сек.
При резонаторе 8.(0) МГц интервал формируется 1 сек
С индикацией не разбирался. Часы в таком представлении индикации выше моего понимания
Вдогонку. Добавить еще одну строку
"
...
inc sek ; увелечение секунд
cpi sek,60 ; разность 60*1.0c=60c=1мин
;cpi sek,150 ; разность 150*0.4c=60c=1мин
brne Out3 ; если не ноль то выход
Как запрограммировать правильно FUSE-биты Вашим программатором, не знаю, потому что пользуюсь другими (AS1...AS4).
Если будет выложена схема, будет проще. Пока по программе не видно, куда выводится секунда.
Расчет простой
за 60 секунд при частоте 8000000:256 будет 31250 прерываний.
Если часы отстают на 1 секунду в минуту, то те же 31250 прерываний придут за 61 секунду. Значит частота кварца ниже, чем 8 МГц. Тогда 60:61*Х=31250 и Х=30737,705. Реальная частота кварца получается 30737,709*256=7868852 Гц.
Здравствуйте. Да, конечно, это FUSE. И еще, в обработчике прерывания вставьте две команды.
Timer1_comp1:
;*******************************************
IN R1,SREG
;*******************************************
.
.
.
;**********
out3:
;*******************************************
OUT SREG,R1
;*******************************************
RETI
Для повышения временнОй стабильности попробуйте (после получения удовлетворительных результатов) "загрунтовать" корпус резонатора и убрать конденсаторы с его лап. Если кварц достаточно активен и SUT1,0 =11 (настроены на задержку 65 ms) выиграите пару порядков по стабильности. Далее, для повышения точности можно организовать иной алгоритм, который позволит уменьшить дискрет подстройки с 32 мкс до 0.125 мкс.
Уже 2а трупика есть с корявыми фьюзами.
uniprof не хочет считывать заводские настройки. А другие проги с программатором 5 проводков работать не хотят. Собрал программатор из обучалки и он неработает.
Подскожите пожалуйста(Хватит трупов с откл ISP)
какие галки должны стоять при проге фьюзов(рис проги выше)???
_________________ Чем больше думаеш, тем дольше уснуть не можеш...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения