|
проблема с Timer/Counter, AT91SAM7X |
|
|
|
Oct 10 2007, 13:35
|
Участник

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

|
Проблема в следующем: пытаюсь заставить работать примитивную программку со счетчиком: работаю в wave mode 10, то есть записываю некое значение в регистр RC, затем жду сравнения, после чего дергаю ногой.. На выходе имею ступеньку с определенной частотой, которая зависит от кидаемого в RC числа..
Так вот, в результате записи числа, скажем 0xCB, имею частоту, скажем 82,98кГц (для удобства цифры беру из результатов), далее при уменьшении данного числа на 1 вместо ожидаемого изменения частоты имею предыдущую частоту (с точностью до сотых, осциллографу верить можно..) Такая же картина наблюдается при изменении числа на 10 единиц, после чего (то есть на значении 0xС1) наблюдается резкий скачек частоты (84,59кГц) и снова это значение остается при уменьшении числа на 10 единиц.. и т.д.
Теоретические расчеты показавают, что 84,59кГц - адекватная величина, однако.. куда делись промежуточные значения?
|
|
|
|
|
Oct 10 2007, 13:54
|
Гуру
     
Группа: Свой
Сообщений: 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кГц...
|
|
|
|
|
Oct 11 2007, 06:45
|
Участник

Группа: Новичок
Сообщений: 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 единиц - очень неподходящая величина для каких-либо глюков контроллера. не уверен, что правильно вас понял.. Осциллограф современный, тектроникс.. причин не доверять ему у меня нет..
|
|
|
|
|
Oct 11 2007, 07:29
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Oct 11 2007, 09:56
|
Участник

Группа: Новичок
Сообщений: 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 ..................... Цитата Если Вы ногой дергаете из прерывания - тогда "дисктретность" перестройки вполне понятна... с прерываниями там еще интересней получается, поэтому пока программа максимально упрощена..
|
|
|
|
|
Oct 12 2007, 09:46
|
Участник

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

|
Цитата(aaarrr @ Oct 11 2007, 17:34)  На частоте таймера MCK/2, конечно, получится ерунда - эта проверка выполняется много дольше, чем за 2 такта процессора. Если хотите генерировать стабильный сигнал наружу, используйте выходы TIOA/TIOB. Что-то я вас не понял.. ну и что, что она выполняется болше, чем 2 такта.. При одном значении регистра RC она выполняется одно время.. запишем в регистр число немного большее (меньшее), и она будет выполняться немного дольше (быстрее).. разве не так?
|
|
|
|
|
Oct 12 2007, 09:55
|
Гуру
     
Группа: Свой
Сообщений: 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, в зависимости от оптимизации, расположения звезд и т.п.), и это число будет плавать от цикла к циклу.
|
|
|
|
|
Oct 12 2007, 10:59
|
Участник

Группа: Новичок
Сообщений: 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, результат полностью аналогичен предыдущему..
|
|
|
|
|
Oct 12 2007, 11:09
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

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

Профессионал
    
Группа: Свой
Сообщений: 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.
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
Oct 13 2007, 19:23
|
Участник

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

|
Частоты переферийного блока и процессора могут отличатся, и для того чтобы их синхронизировать через регистры управления может понадобится какоето время (если писали подобные блоки под плисы, то думаю поймете о чем я). Как вариант, можно попробовать сбрасывать переферийны блок перед каждой инициализацией, синхронный сброс обычно проходит за 1 такт. Если важна стабилность отклика, то лучше использовать Цитата TIOA, TIOB или выводы PWM контроллера.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|