Таймер в 18F2520 настроить.

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Сообщение AVT-28 »

Добрый день.
Вопрос конечно чайниковский до ужаса но вот туплю по страшному.
В общем собирал я некоторые устройства на пиках но там никогда не использовались не часы не таймеры больше 1 минуты.
А тут понадобился таймер на 3 часа.
И тут вот и началось.
В данный момент вот так и конечно же не точно считает.

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

if (TMR0IF)
	{ 
        sys1++;
        TMR0=63500; 
        TMR0IF = 0;
	}
В регистрах включен 16 битный таймер.
Прескалер выключен вообще то есть 1:1.

Я в инете нашел несколько примеров но по ним не работает.
Частота тактовая 8Мгц проца.

Может кто рассчитает для моего??
Или формулу киньте пожалуйста. Я задолбался, вообще туго даётся программирование и математика, но оочень интересно это. :)
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

не точно считает
Что значит "неточно" ? И что для Вас будет "точно" ?
Точность, в первую очередь, будет зависеть от точности исходной частоты. В данном случае - от частоты тактирования таймера.
Или формулу киньте пожалуйста.
Формулу чего ? Крабсбургера ? :)
Реклама
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт янв 11, 2013 10:54:43

Сообщение Vano79 »

AVT-28 писал(а):Я в инете нашел несколько примеров но по ним не работает.
.. но оочень интересно это. :)
А чему там не работать? В нете примеров рабочих до кучи с интервалами хоть годы.
Как вариант: делаете тик на 10 мс, далее 1 с, 1мин, 1 час,

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

тик на 10мс.
if (TMR0IF)
   {
        tmr_ms++;
        if (tmr_ms  == 100) { tmr_ms = 0;   tmr_Sec++;} //1 sec
        if (tmr_Sec == 60)   { tmr_Sec = 0;  tmr_Min++;} //1 min
...
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

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

       sys1++; // этой переменной выдерживаем нужный интервал (выбрать нужную разрядность)
        TMR0=63500; // этим регистром можно ловить точность
Docendo discimus
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Сообщение AVT-28 »

Вот точность я ловил но замучаешься, как то поидее рассчитать надо.
Хотелось бы в sys1 получать 1 миллисекунду.
Тогда все мои счётчики что я намутил заработают точно. :)
Это программа расчёта расхода энергии, ваттметр в общем.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Сообщение AVT-28 »

Vano79 писал(а):
AVT-28 писал(а):Я в инете нашел несколько примеров но по ним не работает.
.. но оочень интересно это. :)
А чему там не работать? В нете примеров рабочих до кучи с интервалами хоть годы.
Как вариант: делаете тик на 10 мс, далее 1 с, 1мин, 1 час,

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

тик на 10мс.
if (TMR0IF)
   {
        tmr_ms++;
        if (tmr_ms  == 100) { tmr_ms = 0;   tmr_Sec++;} //1 sec
        if (tmr_Sec == 60)   { tmr_Sec = 0;  tmr_Min++;} //1 min
...
Это всё понятно, не понятно как TMR0 рассчитать для 8 мегагерц.
Я так понимаю что 1 такт проца занимает судя по калькулятору для 8 мгц 0.000000125 сек. без делителя???
Или делитель есть какой то уже по умолчанию?? 1:2 например? может в этом ошибка?
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

AVT-28,Вы привыкли только сами задавать вопросы, и не отвечать на другие ?
не понятно как TMR0 рассчитать
выходная частота = входная частота / предделитель / кол-во отсчётов таймера. Это же очевидно :)
Вот и выражайте из этой формулы любой элемент.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Сообщение AVT-28 »

Аlex писал(а):AVT-28,Вы привыкли только сами задавать вопросы, и не отвечать на другие ?
Да я бы с радостью отвечал если бы знал что. :)
На одних формах я много чего знаю на других ничего не знаю. :)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Сообщение AVT-28 »

Мне что бы понять что то самому нужно вникнуть полностью в каждую мелочь, иногда просто не могу понять какую то мелочь и не могу понять вообще ничего.
Если разбирать камень по полочкам то TMR0 прибавляет каждый такт, это верно или нет??
И если включить делитель к примеру 1:2 то TMR0 тикает каждые 2 такта, так??
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Для периодично-повторяющихся отсчётов времени лучше взять таймер с аппаратным сбросом при соответствии с установленным значением. Для этого никаких лишних "телодвижений" (типа переустановка таймера на n-ное кол-во тактов) не нужно выполнять. Такие таймеры в PIC'ах существуют, курите даташит. Благо документация у Микрочипа путёвая. По таймерам достаточно рисунков с архитектурой таймера, чтобы понять что он из себя представляет.
Если разбирать камень по полочкам то TMR0 прибавляет каждый такт, это верно или нет??
И если включить делитель к примеру 1:2 то TMR0 тикает каждые 2 такта, так??
Да, так.
Я же Вам привёл формулу :
выходная частота = входная частота / предделитель / кол-во отсчётов таймера
Что в ней непонятного ? :)
Мало того, картинка из даташита :
Изображение
Неужели по ней Вам ничего не понятно ? :)
Вложения
TMR0.JPG
(151.63 КБ) 852 скачивания
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Сообщение AVT-28 »

Ура спасибо.
Теперь я могу всё рассчитать, понято. :)
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Много ли человеку нужно для счастья ? Всего-лишь привести кусок из даташита :))
Не забывайте, что даташит - это документация. И сделана она специально для того, чтобы не ходить по форумам и не выпрашивать объяснений :)
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

AVT-28 писал(а):Теперь я могу всё рассчитать
Можно посмотреть на ваши рассчёты? В плане, не обманывается ли Аlex в пользе выкладок даташита?
Docendo discimus
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Сообщение AVT-28 »

у меня вообще пока что при 16 bit таймере, 8 бит не выходит точно считать, или отстаёт или бежит сильно.
В общем TMR0=63649
дёргаю ногу через таймер, получилось ровно 500.018 герц.
Я думаю если и будет вперёд время бежать то за 3 часа далеко не убежит.

До формулы я так и не добрался, я решил сперва просто изучить вообще таймер и как он работает, просто основы.
Посмотрел даташит, поклацал калькулятором.
Потом решил просто TMR0=0 посмотреть осциллографом и TMR=255 посмотреть в 8 бит режиме таймера. так вот TMR=255 это 3.09кгц а если 0 то блин потерял цифру, заново измерять не могу, собрал в корпус уже всё.
Вообще выяснилось что у меня уже стоит предделитель /4 то есть тактовая частота 8мгц выставлена а на самом деле буд то 2мгц, а кстати может я чего и там накосячил, может на самом деле на 2 мгц и работает.
Но OSCCON = 0b01111110; PLLx4 выключен точно.
PSA = 1; то есть делители выключены.
Получается что всеж таки по умолчанию делитель на 4 есть.

В общем переключился я на 16 бит а тут ну совсем же другая задница, в общем выставил от фонаря 63000 и прям почти точно попал в точку, ну тут уже спортивный интерес,
63500 выставил и прям почти совсем попал. :) В общем доподбирался до 63649.
затем по такой формуле посчитал уже после подбора, 65535 - (частота/1000/(делитель 4)) но вот нихрена не точно получается. Все равно подобралось точнее.
по формуле 63535 получается 499 с чем то кгц, у меня встроенный генератор и может поэтому гуляет тактовая.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Сообщение AVT-28 »

Ну вот 1 час прошел , секунда в секунду, что надо, даже если бы на 1 сек уходило это ерунда.
Задача выпонена. Конечно опыта мало хотя я 5 лет назад уже начал заниматься МК, но практики очень мало.
Вообще нужен по любому кварц 32768, просто я заранее не подумал об этом, а щас плату переделывать уже никак не охото..
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Получается что всеж таки по умолчанию делитель на 4 есть.
Получается, что Вы плохо изучаете даташит. А особенно невнимательно посмотрели на картинку, которую я выложил.
Обратите внимание на источник тактов.
PSA = 1; то есть делители выключены.
PSA=1 - предделитель ВКЛЮЧЕН ! Внимательнее смотрите !
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Сообщение AVT-28 »

PSA: Timer0 Prescaler Assignment bit
1 = TImer0 prescaler is not assigned. Timer0 clock input bypasses prescaler.
0 = Timer0 prescaler is assigned. Timer0 clock input comes from prescaler output.

Да я увидел но не сразу что /4 изначально.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

AVT-28 писал(а): 1 = TImer0 prescaler is not assigned. Timer0 clock input bypasses prescaler.
0 = Timer0 prescaler is assigned. Timer0 clock input comes from prescaler output.
Ха, вот это ляп в даташите. А по картинке - наоборот :)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Сообщение AVT-28 »

В том то и дело что не ляп. На самом деле так.
Включаешь делитель и всё жууутко тормозит.
Вот в схеме ляп.
Прежде чем отписаться специально 0 поставил и всё стало тормозить жутко, то есть делитель включился.
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

А что происходит на самом деле - вообще неизвестно никому.
Docendo discimus
Контактная информация:
Ответить

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