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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> проблема с Timer/Counter, AT91SAM7X
Sergei_K
сообщение Oct 10 2007, 13:35
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 49
Регистрация: 14-02-07
Пользователь №: 25 346



Проблема в следующем: пытаюсь заставить работать примитивную программку со счетчиком: работаю в wave mode 10, то есть записываю некое значение в регистр RC, затем жду сравнения, после чего дергаю ногой.. На выходе имею ступеньку с определенной частотой, которая зависит от кидаемого в RC числа..

Так вот, в результате записи числа, скажем 0xCB, имею частоту, скажем 82,98кГц (для удобства цифры беру из результатов), далее при уменьшении данного числа на 1 вместо ожидаемого изменения частоты имею предыдущую частоту (с точностью до сотых, осциллографу верить можно..) Такая же картина наблюдается при изменении числа на 10 единиц, после чего (то есть на значении 0xС1) наблюдается резкий скачек частоты (84,59кГц) и снова это значение остается при уменьшении числа на 10 единиц.. и т.д.

Теоретические расчеты показавают, что 84,59кГц - адекватная величина, однако.. куда делись промежуточные значения?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Oct 10 2007, 13:42
Сообщение #2


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Цитата(Sergei_K @ Oct 10 2007, 17:35) *
затем жду сравнения, после чего дергаю ногой..


Не совсем понятно, кто дергает ногой. Если сам таймер-счечик, то действительно непонятный глюк. Если же приложение по прерыванию от таймера-счетчика то это естественно.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 10 2007, 13:54
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Sergei_K @ Oct 10 2007, 17:35) *
...с точностью до сотых, осциллографу верить можно

Я бы скорее не поверил осциллографу. 10 единиц - очень неподходящая величина для каких-либо глюков контроллера.

Цитата(Sergei_K @ Oct 10 2007, 17:35) *
Теоретические расчеты показавают, что 84,59кГц - адекватная величина

Хм. А у меня получается 87,26кГц...
Go to the top of the page
 
+Quote Post
Sergei_K
сообщение Oct 11 2007, 06:45
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 49
Регистрация: 14-02-07
Пользователь №: 25 346



Ногой дергает PIO контроллер..

Насчет рассчетов: судя по симмуляции Keil на выставление и снятие высокого уровня на ноге контроллеру нужно выполнить 7 команд.. Осциллограф показывает при этом длительность импульса 140ns, то есть на выполнение одной команды требуется 20ns (50MHz).. Далее, из даташита вычитываем, что на увеличение значения счетчика на одну единицу Timer/Counterу требуется один цикл тактовой частоты.. Таким образом, 20ns * 10, получаем 200ns (реальное же число не 10, а 11.. ранее я округлил.. то есть реально 220ns).. высчитываем частоту: 82,98kHz -> 12,051us, тогда новая частота 12,051-0,220=11,831us -> 84,52kHz
Практическая частота 84,59кГц..

Цитата
Я бы скорее не поверил осциллографу. 10 единиц - очень неподходящая величина для каких-либо глюков контроллера.


не уверен, что правильно вас понял.. Осциллограф современный, тектроникс.. причин не доверять ему у меня нет..
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 11 2007, 07:29
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Sergei_K @ Oct 11 2007, 10:45) *
Ногой дергает PIO контроллер..

Тогда не понятно, как это дерганье связано с таймером. Опишите всю систему.

Цитата(Sergei_K @ Oct 11 2007, 10:45) *
Далее, из даташита вычитываем, что на увеличение значения счетчика на одну единицу Timer/Counterу требуется один цикл тактовой частоты..

Где такое написано? Максимальная частота таймера - MCK/2.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Oct 11 2007, 07:47
Сообщение #6


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Если Вы ногой дергаете из прерывания - тогда "дисктретность" перестройки вполне понятна... Прерывание епроисходит не моментально и время реакции зависит от текущего состояния. Чем Вас не устраивает "RA Compare Effect on TIOA" и иже с ними?..


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Sergei_K
сообщение Oct 11 2007, 09:56
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 49
Регистрация: 14-02-07
Пользователь №: 25 346



Цитата
Где такое написано? Максимальная частота таймера - MCK/2


это я действительно просчитался, забыл про делитель..

Цитата
Тогда не понятно, как это дерганье связано с таймером. Опишите всю систему


думаю, проще будет привести отрывок из программы..
.....................
pTC_int->TC_RC = Fr_int; // write value to RC

pTC_int->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; // enable clock, start clock

while ((pTC_int->TC_SR & AT91C_TC_CPCS) == 0); // wait for TC RC compare


pPIOB_int->PIO_SODR = 0x80000; // set 1 to PB19

pPIOB_int->PIO_CODR = 0x80000; // clear PB19
.....................

Цитата
Если Вы ногой дергаете из прерывания - тогда "дисктретность" перестройки вполне понятна...


с прерываниями там еще интересней получается, поэтому пока программа максимально упрощена..
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 11 2007, 10:34
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Sergei_K @ Oct 11 2007, 13:56) *
while ((pTC_int->TC_SR & AT91C_TC_CPCS) == 0); // wait for TC RC compare

На частоте таймера MCK/2, конечно, получится ерунда - эта проверка выполняется много дольше, чем за 2 такта процессора. Если хотите генерировать стабильный сигнал наружу, используйте выходы TIOA/TIOB.
Go to the top of the page
 
+Quote Post
Sergei_K
сообщение Oct 12 2007, 09:46
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 49
Регистрация: 14-02-07
Пользователь №: 25 346



Цитата(aaarrr @ Oct 11 2007, 17:34) *
На частоте таймера MCK/2, конечно, получится ерунда - эта проверка выполняется много дольше, чем за 2 такта процессора. Если хотите генерировать стабильный сигнал наружу, используйте выходы TIOA/TIOB.


Что-то я вас не понял.. ну и что, что она выполняется болше, чем 2 такта.. При одном значении регистра RC она выполняется одно время.. запишем в регистр число немного большее (меньшее), и она будет выполняться немного дольше (быстрее).. разве не так?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 12 2007, 09:55
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Я не о том. Вот этот фрагмент кода:
Код
while ((pTC_int->TC_SR & AT91C_TC_CPCS) == 0); // wait for TC RC compare

выполняется за время большее, чем нужно таймеру для инкремента.
То есть если, допустим, в RC записано значение 100, то на момент выхода из цикла while таймер будет иметь значение больше 100 (102 - 110, в зависимости от оптимизации, расположения звезд и т.п.), и это число будет плавать от цикла к циклу.
Go to the top of the page
 
+Quote Post
Sergei_K
сообщение Oct 12 2007, 10:59
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 49
Регистрация: 14-02-07
Пользователь №: 25 346



Цитата(aaarrr @ Oct 12 2007, 16:55) *
Я не о том. Вот этот фрагмент кода:
Код
while ((pTC_int->TC_SR & AT91C_TC_CPCS) == 0); // wait for TC RC compare

выполняется за время большее, чем нужно таймеру для инкремента.
То есть если, допустим, в RC записано значение 100, то на момент выхода из цикла while таймер будет иметь значение больше 100 (102 - 110, в зависимости от оптимизации, расположения звезд и т.п.), и это число будет плавать от цикла к циклу.



Так хорошо бы оно плавало, но, как я уже говорил, реально ничего не плавает.. идут 11 одинаковых значений, затем скачок.. Показания осциллографа проверены, полностью совпадают с показаниями частотомера.. (до сотых)

Попробовал использовать TIOA, результат полностью аналогичен предыдущему..
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 12 2007, 11:09
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Sergei_K @ Oct 12 2007, 14:59) *
Так хорошо бы оно плавало, но, как я уже говорил, реально ничего не плавает.. идут 11 одинаковых значений, затем скачок.. Показания осциллографа проверены, полностью совпадают с показаниями частотомера.. (до сотых)

Оно может плавать, а может и не плавать - зависит, как я уже писал, от многих факторов.

Цитата(Sergei_K @ Oct 12 2007, 14:59) *
Попробовал использовать TIOA, результат полностью аналогичен предыдущему..

Как пробовали? Настройками таймера?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Oct 12 2007, 11:53
Сообщение #13


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Я думаю Вам хотели сказать, что Ваша конструкция while ((pTC_int->TC_SR & AT91C_TC_CPCS) == 0); состоит из нескольких команд. Поэтому вы получаете "степеньку" при перестройке частоты.

Например в виде машинных кодов это выглядит так:

0) загрузить pTC_int->TC_SR
1) применить маску AT91C_TC_CPCS
2) сравнить результат с 0
3) если нет прыжок на 5
4) если да - прыжок на 0.

И это все у вас бесконечно крутиться. Теперь представьте, что перед тем как бит AT91C_TC_CPCS взвелся эта проверка прокрутилась 9 раз и сейчас выполняется команда 1. Т.к. в неком регистре соедержится еще старое значение регистра pTC_int->TC_SR с НЕВЗВЕДЕННЫМ флагом AT91C_TC_CPCS то цикл все равно повторяется 10 раз. Теперь вы меняете значение делителя на 1 (2, 3...) и в этот раз эта проверка выполняется все те же 9 раз, только бит взводится на 2, 3, 4 команде. Какое время пройдет до "прыжка на 5"? Все то же.

Именно поэтому Вам советуют использовать спечиальные выводы, которыми счетчик-таймер будет управлять независимо от ядра. Читайте раздел по таймеру и pio.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Ivan_Petrov
сообщение Oct 13 2007, 19:23
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 12-10-07
Пользователь №: 31 293



Частоты переферийного блока и процессора могут отличатся, и для того чтобы их синхронизировать через регистры управления может понадобится какоето время (если писали подобные блоки под плисы, то думаю поймете о чем я). Как вариант, можно попробовать сбрасывать переферийны блок перед каждой инициализацией, синхронный сброс обычно проходит за 1 такт.
Если важна стабилность отклика, то лучше использовать
Цитата
TIOA, TIOB
или выводы PWM контроллера.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 13 2007, 19:52
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Таймер и так сбрасывается по SWTRG, только вот на делители входных частот этот сброс не распространяется.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:56
Рейтинг@Mail.ru


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