реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Работа таймера TMR0 (PIC16)
loghir
сообщение May 26 2011, 17:39
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
я убедился в том, что удивительный лодырь, обладающий определенным талантом напрячь окружающих на решение ваших задач. Сами думать вы, почему то, категорически не хотите.

Я всего лишь прошу инфу по работе предделителя. А применю формулу расчета частоты прерываний самостоятельно. Лодырь тот, кто не написал ее в даташите. Я понимаю, что надо все делать через...осциллограф в данном случае. Может, сразу частотомер купить? (ну не даст осциллоскоп нужной точности...) Для эмпирического нахождения секретной формулы, которую никто не знает, а я напрягаю бедный форум ее выводить?
Go to the top of the page
 
+Quote Post
xemul
сообщение May 26 2011, 19:11
Сообщение #17



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 26 2011, 20:03) *
Но вот связать настройку предделителя с частотой на выходе... При кварце 4 МГц Fosc/4 = 1 МГц. Как считать частоту прерываний при коэфф. деления предделителя 2, 4... 256 ?

Можно в уме, можно в столбик на бамажке, можно в куркуляторе. По-любому, сначала нужно представлять, как оно работает.
1. Задаёте частоту тактирования таймера и желаемую частоту F (или период) его прерываний.
2. Находите частное (или произведение) первого и второго. Обзовём его A.
3. (ceil(log2(A)) - (разрядность таймера)) даст Вам требуемый коэффициент деления прескейлера
4. A/2^(ceil(log2(A)) - (разрядность таймера)) даст Вам TMRx_PRESET

В случае, если у Вас есть причины заставить TMRx работать с определённым коэффициентом деления прескейлера, п.3. пропускается.

Когда надоедает считать самому, после недолгих раздумий эта работа поручается препроцессору. Правда, п.1 таки приходится выполнять самому.

Цитата
Я всего лишь прошу инфу по работе предделителя... Лодырь тот, кто не написал ее в даташите.

Предделитель делит. Трансформатор делает "у-у-у-у". "- Лодка? Она утонула."
Капитан Очевидность уже спешит к Вам на помощь.
Цитата
Я понимаю, что надо все делать через...осциллограф в данном случае.

В МПЛаб есть симулятор (МПСим), View->Logic Analizer позволит Вам в данном случае съэкономить на частотомере и осциллоскопе.
Если ещё и ман к МПСим прочитаете, то не придётся так часто менять ZF-сокет. А потом и до ICSP доберётесь.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 26 2011, 20:36
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Вот-вот. Именно про это я писал. Выдавил таки топик-стартер кучу информации с форума, вместо персонального шевеления мозгами! Не хочет человек сам думать, хоть режь его. Чудеса, да и только. И при этом все излагает с фантастическим ехидством.

P.S. Осциллограф - главнейший прибор электронщика.
Go to the top of the page
 
+Quote Post
loghir
сообщение May 27 2011, 02:20
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



xemul, спасибо.
Буду разбираться. Проблема в том, что без предзагрузки таймер физически не может выдать желаемую частоту прерываний...
Пока что считаю для 8-разрядного таймера так:
Частота прерываний TMR0 (при Fosc/4, для 4 МГц, коэфф. - 256) = (1000000)/256/256 = 15,2587890625 Гц
Частота прерываний TMR0 (при Fosc/4, для 4 МГц, коэфф. - 64) = (1000000)/256/64 = 61,03515625 Гц
Частота прерываний TMR0 (при Fosc/4, для 4 МГц, коэфф. - 16) = (1000000)/256/16 = 244,184375 Гц

P.S. srergeeff, Мозги - вот главный прибор разработчика электронной аппаратуры. Тому, кто первый начал, нечего жаловаться по поводу ответного ехидства. rolleyes.gif
Go to the top of the page
 
+Quote Post
xemul
сообщение May 27 2011, 06:39
Сообщение #20



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 27 2011, 06:20) *
Буду разбираться. Проблема в том, что без предзагрузки таймер физически не может выдать желаемую частоту прерываний...
Пока что считаю для 8-разрядного таймера так:
Частота прерываний TMR0 (при Fosc/4, для 4 МГц, коэфф. - 256) = (1000000)/256/256 = 15,2587890625 Гц
Частота прерываний TMR0 (при Fosc/4, для 4 МГц, коэфф. - 64) = (1000000)/256/64 = 61,03515625 Гц
Частота прерываний TMR0 (при Fosc/4, для 4 МГц, коэфф. - 16) = (1000000)/256/16 = 244,184375 Гц

Ну объясните мне, с чем здесь разбираться? Всё на уровне арифметики, если держать в голове 2^n для n хотя бы до 16.
Пусть хочется получить 50 Гц.
1000000/50 = 20000 - столько периодов тактовой частоты таймера помещается в 1 период требуемой частоты.
Сначала ищете требуемый прескейлер: (1000000/50)/256 = 78.125
Округляете вверх до степени 2: = 128 (в предыдущем посте я сначала неправильно написал, что округлять нужно вниз)
Считаете предустановку таймера: (1000000/50)/128 = 156

Далее в симуляторе ставите точку останова в нужном месте и смотрите, насколько врёт таймер. (а врать он будет и из-за целочисленности арифметики, и из-за сброса прескейлера при записи в таймер)

Если считать ручками, можно ещё проще.
20000 округляете вверх до степени 2: = 32768 = 2^15
Из 15 на таймер приходится 8 разрядов, значит степень предделителя 7.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 27 2011, 09:02
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(loghir @ May 27 2011, 06:20) *
Мозги - вот главный прибор разработчика электронной аппаратуры


99% ошибок работы с железом состоит в том, что мы думаем или предполагаем, что оно должно работать так-то, а на самом деле работает оно по-другому. Вы зря ехидничаете насчет осциллографа. Это инструмент для действительного контроля работы вашей программы на реальном железе (в том случае, если это можно вообще как-то проанализировать или померять). Или у вас его нет? Тогда, пардон.
Go to the top of the page
 
+Quote Post
loghir
сообщение May 27 2011, 10:05
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
Ну объясните мне, с чем здесь разбираться?

с информацией из #17. С Протеусом пока нехочу связываться - на реальном железе быстрее. Ненадо ни инсталляху искать, ни разбираться с управлением.
Цитата
Это инструмент для действительного контроля работы вашей программы на реальном железе

не спорю. Но в моем случае глазом видно, что при суммировании временных промежутков прерываний TMR0 частота слишком велика. Мой С1-68 все равно ее точно не покажет, не цифровик чай. (Лодырям вот сюда, на калькулятор http://pictimer.picbingo.com/download/index.php который просчитает и настройку, и предзагрузку, и даже код на С выдаст.)

Сообщение отредактировал loghir - May 27 2011, 10:06
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 27 2011, 10:44
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Вопрос на засыпку: откуда вы знаете, что ваш обработчик прерывания по таймеру 0 работает?
Go to the top of the page
 
+Quote Post
xemul
сообщение May 27 2011, 11:10
Сообщение #24



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 27 2011, 14:05) *
С Протеусом пока нехочу связываться - на реальном железе быстрее.

Заниматься такими странностями Вам никто и не предлагал.
Отладка в железе может быть быстрее только при наличии железного отладчика или продуманного и отлаженного самопального способа общения с программой. У Вас нет ни того, ни другого, поэтому и тычетесь наугад в потёмках.
Я не понимаю, почему Вы упорно не желаете отлаживать свои программы в симуляторе МПЛаба - используемые Вами фичи контроллера он показывает во всех подробностях. А если ещё поймёте, зачем нужны стимулы, то можете справиться и с не-симулируемыми фичами. Через неделю Вы или поймёте, как оно (и контроллер, и симулятор) работает, или ... не поймёте.
Go to the top of the page
 
+Quote Post
loghir
сообщение May 29 2011, 14:19
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
Вопрос на засыпку: откуда вы знаете, что ваш обработчик прерывания по таймеру 0 работает?

цифры на индикаторе меняются. Но очень быстро.
Код
void interrupt isr (void)
{
if (T0IF)
{
while (tmp100 < 100) // выполняется до тех пор, пока истинно (tmp100 < 100)
{
    T0IE = 0;                // Запрет прерываний по переполнению TMR0
    tmp100 = tmp100 + 1;    // прибавление до 100 (в сумме 1 сек)
    TMR0 = TMR0 + 100;        // предзагрузка TMR0
    PS2  = 1;    // bit 2 Настройка предделителя
    PS1  = 0;    // bit 1 Настройка предделителя
    PS0  = 1;    // bit 0 Настройка предделителя
    GIE = 1;                // разрешены все немаскированные прерывания
    T0IF = 0;                 // сброс флага прерывания по переполнению TMR0
    T0IE = 1;                // Разрешение прерывания по переполнению TMR0
}
time1 = time1 + 1;            // счет сотен циклов TMR0. Это число выводится 7-сегментный индикатор.
tmp100 = 0;                    // обнуление счетчика
}
}

где-то ошибка... Но где?
Цитата
Отладка в железе может быть быстрее только при наличии железного отладчика или продуманного и отлаженного самопального способа общения с программой. У Вас нет ни того, ни другого, поэтому и тычетесь наугад в потёмках.

В процессе тыканья отрабатываю самопальный способ. Всего-то надо 2 таймера запустить.
Цитата
Я не понимаю, почему Вы упорно не желаете отлаживать свои программы в симуляторе МПЛаба

нет времени и смысла разбираться, как он работает. (Там наверняка свои глюки есть. Вот будет смеху, если в в симуляторе МПЛаба все заработает, а в железе - нет.) Ради запуска 2-х таймеров?! В моей задаче точность не нужна. Всегда можно положить на таймеры и сделать простым суммированием машинных циклов.
Go to the top of the page
 
+Quote Post
sargein
сообщение May 29 2011, 14:36
Сообщение #26


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 31-01-10
Из: Минск
Пользователь №: 55 176



смутная программка sm.gif
а не могли бы вы еще раз уточнить, что конкретно нужно в итоге получить?
Go to the top of the page
 
+Quote Post
xemul
сообщение May 29 2011, 14:58
Сообщение #27



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 29 2011, 18:19) *
где-то ошибка... Но где?

"- В ДНК." (из анекдота)
(я устал комментировать бездумное нагромождение букафф)
Цитата
В процессе тыканья отрабатываю самопальный способ. Всего-то надо 2 таймера запустить.

нет времени и смысла разбираться, как он работает. (Там наверняка свои глюки есть. Вот будет смеху, если в в симуляторе МПЛаба все заработает, а в железе - нет.) Ради запуска 2-х таймеров?! В моей задаче точность не нужна. Всегда можно положить на таймеры и сделать простым суммированием машинных циклов.

Флаг в руки, барабан на шею. Каждый сам себе злобный буратин.
Go to the top of the page
 
+Quote Post
loghir
сообщение May 29 2011, 15:34
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



xemul
в #14 я всего-навсего спросил, как рассчитать частоту прерываний TMR0 в зависимости от записанного в битах PS0...PS2. И более ничего! Нужную мне частоту я получу простым суммированием. Если много информации, я просто в ней теряюсь. Поэтому я не принимаю во внимание некоторые советы, ибо стараюсь делать программу (и процесс ее написания) попроще.

по поводу обработчика прерываний TMR0: он точно запускается, поскольку цифры на индикаторе меняются, и после нажатия RA1 счет прекращается. Частота прерываний TMR0 после предделителя у меня 100 Гц. Суммируя 100 временных интервалов прерываний я получаю 1 Гц, что и требуется. В #25 я написал мой обработчик прерываний для TMR0. Но цифры на индикаторе очень быстро меняются! Что-то там не так...
Go to the top of the page
 
+Quote Post
SKov
сообщение May 29 2011, 16:48
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119



Цитата(loghir @ May 29 2011, 19:34) *
xemul
в #14 я всего-навсего спросил, как рассчитать частоту прерываний TMR0 в зависимости от записанного в битах PS0...PS2. И более ничего!

Эта информация есть в даташите в том месте,где описаны биты PS0...PS2. (описание регистра OPTION).
Коэффициент деления, вносимый пресалером, там указан в виде таблички.
Точно вычислить коэффициент предзагрузки TMR0 "по формуле" не представляется возможным,
поскольку не определен интервал времени между моментом прерывания и моментом предзагрузки - этот интервал
зависит от того, как написана ваша подпрограммы обработки прерывания(ППОП).
Обычно сначала грубо расчитывается частота прерваний, а более точно она подгоняется в дебагере.
Там все очень просто. Ставите точку останова на первом операторе ППОП
и замеряете время между двумя остановами (для этого надо открыть и обнулить окно StopWatch).
Затем вы корректируете константу предзагрузки в нужную сторону.

Цитата
по поводу обработчика прерываний TMR0: он точно запускается, поскольку цифры на индикаторе меняются, и после нажатия RA1 счет прекращается. Частота прерываний TMR0 после предделителя у меня 100 Гц. Суммируя 100 временных интервалов прерываний я получаю 1 Гц, что и требуется. В #25 я написал мой обработчик прерываний для TMR0. Но цифры на индикаторе очень быстро меняются! Что-то там не так...

У вас там все не так.
Не надо трогать в ППОП никаких флагов, кроме флага запроса прерывания. Т.е кроме T0IF = 0; все остальное, включая установки для
PS0...PS2. надо делать один раз вначале основной программы.
Все переменные, которые вы используете а ППОП (tmp100) надо описывать как volatile .
Предзагрузка делается не так: TMR0 = TMR0 + 100; а вот так TMR0 = 100;
И еще, если позволите, маленький совет.
Позиция "какие м...ки пишут эти даташиты!! Там ничего нельзя понять! Да и советы тут дают бестолковые.." не является оптимальной.
Гараздо более продуктивно встать в такую "позу" :
"Да, я, конечно, ламер и туго соображаю, но .. Братцы, выручайте!! Курсовик горит, а препод-зверь смотрит на меня как удав на кролика. ПАМАЖИТЕ!!!"
Такая позиция, как мне кажется, сможет вызвать к вам сочувствие и желание помочь. В отличие от первой позиции.
Удачи!
Go to the top of the page
 
+Quote Post
sargein
сообщение May 29 2011, 17:14
Сообщение #30


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 31-01-10
Из: Минск
Пользователь №: 55 176



ну как то примерно так

Код
unsigned char tmp100 = 0;
unsigned char time1 = 0;

void main(void) {
бла бла настройки таймера и прочей фигни

for (;;) {
if (tmp100 == 100) {
                           time1++;
                           tmp100 = 0;
                           функция вывода числа time1 на индикатор ();
                           }
}


}

void interrupt isr (void)
{
if (T0IF)
{
TMR0 = 100;
tmp100++;
T0IF = 0;
}
}
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 05:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01503 секунд с 7
ELECTRONIX ©2004-2016