Я считаю так- таймер1=16 разрядный, тикает 65535 раз,
(1/16 мгц) х 65535 = 0,004 сек. Прерывание будет каждые 0,004 сек. это если TCNT=0, надо высчитать с какой цифры начинать считать, чтобы прерывание происходило например за 0,001 сек, потом внутри прерывания тикай и считай, почему обязательно за 1 сек. прерывание нужно..
Ну у тебя еще на 256 делить.. забыл..
Тогда, да, каждые 1,04 сек. будет прерывание.
Тогда такие вычисления-
16 мгц/ 256= 62500 Гц
1/62500 х 65535=1,04856 сек
Amstron писал(а):таймер начинает считать с 3035. далее , за 1 секунду таймер переполнется 256.
Вы полагаете, что таймер знает что-либо о значении прескалера, т.е. о числе 256?
Так вот, я думаю он нифига не переполнится за 1 секунду 256 раз.
Таймер считает импульсы с частотой 62500 Гц (это уже ПОСЛЕ деления 16 мегациклов на 256!).
И далее таймер умеет сравнить число, которое он насчитал со значением специального регистра.
И вот если сравнение прошло успешно, то возникает прерывание. Кроме того, если установлен режим таймера CTC - сброс при совпадении, счетные регистры таймера обнулятся автоматом.
Имеем: при наличии на входе таймера 62500 Гц, и значениях:
OCR1AH=0xF4;
OCR1AL=0x23;
прерывание возникнет 1 раз в секунду.
В полном соответствии с рекомендациями
zero648 писал(а):Устанавливаешь режим СТС таймера1:
; Включаем режим СТС Timer1, запускаем Timer1 делитель частоты 1:256 (001=1:1;010=1:8;011=1:64;100=1:256;101=1:1024) TCCR1B = (0b01<<WGM12)|(0b100<<CS10);
и компаратор: OCR1A=62500-1
dm211 писал(а):Я считаю так- таймер1=16 разрядный, тикает 65535 раз,
(1/16 мгц) х 65535 = 0,004 сек. Прерывание будет каждые 0,004 сек. это если TCNT=0, надо высчитать с какой цифры начинать считать, чтобы прерывание происходило например за 0,001 сек, потом внутри прерывания тикай и считай, почему обязательно за 1 сек. прерывание нужно..
Ну у тебя еще на 256 делить.. забыл..
Тогда, да, каждые 1,04 сек. будет прерывание.
Тогда такие вычисления-
16 мгц/ 256= 62500 Гц
1/62500 х 65535=1,04856 сек
Вы правы, именно так оно и работает!
Я был не прав, я не знал, что делитель делит частоту!
я думал, что таймер работает именно так как написанно в первом посту в этой теме.
dm211 писал(а):16 мгц/ 256= 62500 Гц
1/62500 х 65535=1,04856 сек
Это что за формула? бред какой-то, мы тут коэффициент расчитываем чтоли? зачем умножать на 65535, че за хрень то?
Сами же писали, что нужно, мол, значение TCNT расчитать:
dm211 писал(а):надо высчитать с какой цифры начинать считать, чтобы прерывание происходило например за 0,001 сек, потом внутри прерывания тикай и считай
Делитель таймера 256, значит тикает с частотой 62500 раз в секунду, перевожу это в секунды- 1/62500 , 65535(6)- это столько раз пройдет время 1/62500 и будет прерывание. Где тут бред ?
dm211 писал(а):Делитель таймера 256, значит тикает с частотой 62500 раз в секунду, перевожу это в секунды- 1/62500 , 65535(6)- это столько раз пройдет время 1/62500 и будет прерывание. Где тут бред ?
Чтобы прерывание по переполнению таймера1 сработало ровно через секунду нужно в TCNT1 записать разницу вот этих чисел 62500 и 65536, а потом в прерывании снова обновлять TCNT1 таким же образом, т.е. TCNT1=65536-62500 и тогда прерывания будут происходить каждую секунду.
dm211 писал(а):Делитель таймера 256, значит тикает с частотой 62500 раз в секунду, перевожу это в секунды- 1/62500 , 65535(6)- это столько раз пройдет время 1/62500 и будет прерывание. Где тут бред ?
Чтобы прерывание по переполнению таймера1 сработало ровно через секунду нужно в TCNT1 записать разницу вот этих чисел 62500 и 65536, а потом в прерывании снова обновлять TCNT1 таким же образом, т.е. TCNT1=65536-62500 и тогда прерывания будут происходить каждую секунду.
zero648 писал(а):
в TCNT1 записать разницу вот этих чисел 62500 и 65536, а потом в прерывании снова обновлять TCNT1 таким же образом
Ну так.,ясно дело, я сразу же написал,что TCNT надо прописать внутри обработчика, просто лень было думать, сколько этот TCNT должен быть, а принцип то правильно написал.
В даташитах все написано, в описаниях иногда написано даже по-русски. Какая религия мешает прочитать про работу таймеров (Normal, CTC, PWM, FastPWM и прочие режимы, предделители) и уже потом, если что-то не получается, спрашивать на форуме. В гугле первой же ссылкой отличная книга в которой описаны практически все режимы и особенности ядра и переферии.
Народ я вам за асемблер под 8 мегу реально скоро руки оторву... В даташитах он указан под юникод чтобы не парить мозг с разными синтаксисами... В каждой среде разработке присутствует таблица перевода асм команд в си или бейсик как в баскоме, да и асм библеотеки никто не отменял. каково черта вы все пхаете в флеш память контролерра она предназначина только для выполнения основных функций.
И часы можно активировать в 8 меге одной командой, а не городить ваш гавнокод
В баскоме Config clock=Soft
В СИ такимже образом...
JeysonRou писал(а):
В баскоме Config clock=Soft
В СИ такимже образом...
Какие часы?,тут не про часовой кварц разговор, в си каким таким же образом?
Твоюж нафиг что у тебя нет 8 центов на нормальный кварц??? Нахрена лепить часы на 16 кварце если можно взять 32768 и не гадить себе в мозг разбором таймеров . Кстати даташиты читаем и не тормозим для меги 8 рекомендуются кварцы определенных кратных чисел а тоесть 1,4,8,12... На 16 уже указано что работа не стабильная будет ибо осцилятор расчитан на определеный такт счета. Ну и дальше 32,768 сугубо часовой и 1 Кгц честно не знаю точно зачем сам не разу не применял.
Вот вам бляха не подходит как можно и нужно и описано в даташите вам надо через жопу и в левое ухо приетом повесив 16 кварц... Нафига спрашивается!!!!????
Хочешь знать как на си сформировать часы сначала скажи какой компилятор яж тебе не экстрасенс....
Вопрос был как таймер прерывать раз в секунду. И с часовым кварцом в си точно также-делитель ставишь на таймере на 128 и раз в секунду будет прерывание таймера . И это не профессиональный форум программистов, а радиолюбителей,как я понял, Вам нужно идти поорать так на форум разработчиков электроники на профессионалов
А что за этой строчкой скрыто знаеш? Во что БасКом это превратит? Похоже что нет. А именно оно тут и обсуждается. Так что не надо тут "пальцы веером, сопли пузырями". По делу давай, а не выпендривайся.
dm211 писал(а):16 мгц/ 256= 62500 Гц
1/62500 х 65535=1,04856 сек Делитель таймера 256, значит тикает с частотой 62500 раз в секунду, перевожу это в секунды- 1/62500 , 65535(6)- это столько раз пройдет время 1/62500 и будет прерывание. Где тут бред ?
С терминами как то не ладиться. Ну да ладно. dm211, вы с считаете время для прерывания по переполнению (1/62500 х 65535). А достаточно прерывания по совпадению и режима CTC. Тогда "потолок" у таймера можно установить в 62500 и прерывание будет ровно через 1 секунду.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
dm211 писал(а): А достаточно прерывания по совпадению и режима CTC. Тогда "потолок" у таймера можно установить в 62500 и прерывание будет ровно через 1 секунду.
Ну я типа начинающий или нечасто этим занимающийся, а когда нужно только, так что не знал, щас буду знать этот способ, спасибо.