|
|
  |
Atmel SAM3U4, Различные вопросы |
|
|
|
Jul 1 2011, 14:29
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(aaarrr @ Jul 1 2011, 18:13)  В Sleep Mode отключается HCLK, память и шины тактируются от MCK. Отлично, тогда отправлять CPU в сон, загрузив DMA по самые гланды, ничего не помешает  Цитата Нет, не пробовал. К табличкам нужно относится осторожнее, как мы знаем  Это верно! Блин, чем больше читаю мануал, тем больше кажется, что американцы не далеко ушли от русских в плане раздолбайства (в основном, правда, при написании документации). Вот ещё один момент:
и цитата из текста: Цитата The Master Clock Controller is made up of a clock selector and a prescaler. It also contains a Master Clock divider which allows the processor clock to be faster than the Master Clock. Каким образом клок процессора может быть не то что быстрее, а вообще хоть как то отличаться от мастер клока, не понятно
|
|
|
|
|
Jul 4 2011, 10:10
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Провозился вчера весь день с блоком таймеров, реализовывая свою задумку сформировать путём соединения цепочкой один 32 битный таймер с разрешением в 1 микросекунду. Сделал так: TC0->TC1->TC2, выход TC0 (TIOA0) завожу на вход TC1, а выход TC1 (TIOA1) завожу на вход TC2. TC0: играет роль прескалера с входной частотой MCK\2, равной 48 МГц, по событию RA Compare (RA = 24) выход TIOA0 устанавливается в 1, по событию RC Compare (RC = 47) счётчик сбрасывается и выход TIOA0 сбрасывается в 0, получаем меандр с частотой 1 МГц. TC1: младшая половинка 32 битного счётчика, по событию RA Compare (RA = 0xFFFF) выход TIOA1 устанавливается в 1, по событию RC Compare (RC = 0) счётчик сбрасывается и выход TIOA1 устанавливается в 0, получаем импульсы с частотой 1/65536 МГц. Но тут оказалась первая непонятка - такая конфигурация давала инкремент старшей половины 32 битного счётчика сразу по достижении 0xFFFF младшей, что есть переход выглядел так: 0x0000FFFE->0x0001FFFF->0x00010000. Чего я как то не ожидал, поэтому угрохал на вычисление проблемы целый день  Пришлось задать настройки для компараторов вот так: TC1: младшая половинка 32 битного счётчика, по событию RA Compare (RA = 0) выход TIOA1 устанавливается в 1, по событию RC Compare (RC = 0x8000) счётчик сбрасывается и выход TIOA1 устанавливается в 0, получаем меандр с частотой 1/65536 МГц. Ну а последний счётчик TC2 является старшей половинкой получившегося 32 битного регистра и просто тупо инкрементируется 0->0xFFFF безо всяких компараторов. По мере тестов теперь возникла ещё одна проблема - таймер немного "бежит", за час на минуту-другую. Оценка грубая, но видно это хорошо. Отсюда возникли вопросы к "прескалеру" на базе TC0, который должен считать от 0 до 47 и снова с 0 до 47, но, вероятно, считает от 0 до 46, а на 47 происходит сброс сразу на 0, отсюда получаем "бегущий" таймер. Пока что это предположение, надо будет проверить его на практике. В мануале, жать, не приводятся точные цифры по различным режимам счётчиков...
|
|
|
|
|
Jul 4 2011, 11:22
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sonycman @ Jul 4 2011, 14:10)  Пришлось задать настройки для компараторов вот так: TC1: младшая половинка 32 битного счётчика, по событию RA Compare (RA = 0) выход TIOA1 устанавливается в 1, по событию RC Compare (RC = 0x8000) счётчик сбрасывается и выход TIOA1 устанавливается в 0, получаем меандр с частотой 1/65536 МГц. На самом деле, достаточно было бы просто отинвертировать входной клок для TC2 (бит CLKI). Цитата(sonycman @ Jul 4 2011, 14:10)  Ну а последний счётчик TC2 является старшей половинкой получившегося 32 битного регистра и просто тупо инкрементируется 0->0xFFFF безо всяких компараторов. А здесь все же был бы уместен программный счетчик. Но хозяин - барин. Цитата(sonycman @ Jul 4 2011, 14:10)  Отсюда возникли вопросы к "прескалеру" на базе TC0, который должен считать от 0 до 47 и снова с 0 до 47, но, вероятно, считает от 0 до 46, а на 47 происходит сброс сразу на 0, отсюда получаем "бегущий" таймер. Нет, он обязан считать до 47. Цитата(sonycman @ Jul 4 2011, 14:10)  В мануале, жать, не приводятся точные цифры по различным режимам счётчиков...  Не понял, какие цифры? Все же не понимаю вашу систему. Зачем такое сумасшедшее разрешение? А еще ведь при чтении счетчика придется проверять граничные условия с запретом прерываний и корректировать при необходимости старшее слово.
|
|
|
|
|
Jul 4 2011, 12:37
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sonycman @ Jul 4 2011, 16:29)  Цифры значений счетчика, потактово,чтобы было понятно на 100%, когда происходит инкремент/сброс и т.п, иначе лично у меня возникли неясности... Так из картинок и текста все в общем-то понятно, они его давно уже копипастят  Цитата(sonycman @ Jul 4 2011, 16:29)  Считывать половинки действительно приходится несколько раз (старшую половину), но запрещать прерывания не нужно. Если прерывания гарантированно укладываются в 65мс, то не нужно.
|
|
|
|
|
Jul 4 2011, 14:41
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sonycman @ Jul 4 2011, 17:28)  Странно...  Всё законно  : Цитата Note: In all cases, if an external clock is used, the duration of each of its levels must be longer than the master clock period. The external clock frequency must be at least 2.5 times lower than the master clock В вашем случае это условие нарушается - импульс слишком короткий.
|
|
|
|
|
Jul 4 2011, 16:25
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(aaarrr @ Jul 4 2011, 18:41)  В вашем случае это условие нарушается - импульс слишком короткий. Понятно, спасибо  Что-то не подумал, что это "внешний" сигнал... Теперь осталось только выяснить, почему счётчик "бежит" вперёд на две минуты в час. Хз, может быть, косячу при замере, а может дебаггер как то влияет (через него смотрю состояние переменных/регистров)...
|
|
|
|
|
Jul 4 2011, 21:46
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(aaarrr @ Jul 4 2011, 15:22)  Нет, он обязан считать до 47. А вот и нет! На практике оказалось не так! Уже был уверен, после Ваших слов, что глюк с "убеганием" таймера вносит мой софт, но всё же когда пришёл с работы решил прогнать простенький цикл и сохранить значения счётчика TC0 на протяжении его цикла так: Код byte dbuf[4096]; for (int i = 0; i < sizeof(dbuf); i++) { dbuf[i] = (byte)AT_TC0->TC_CV; } то есть считав все его значения на протяжении относительно большого времени. Напомню, конфигурация счётчика была такая: Код AT_TCB0->TCB_TC0.TC_CMR = AT_TC_CLKS_TIMER_DIV32_CLOCK | AT_TC_WAVESEL_UP_AUTO | AT_TC_WAVE | AT_TC_ACPA_SET | AT_TC_ACPC_CLEAR; //| AT_TC_ASWTRG_CLEAR; AT_TCB0->TCB_TC0.TC_RA = 24; AT_TCB0->TCB_TC0.TC_RC = 48; то есть upcounter со сбросом по RC compare, RC = 48(!). И что же получил: Код 00 00 00 01 01 01 01 02 02 02 02 03 03 03 03 04 04 04 04 05 05 05 05 06 06 06 06 06 07 07 07 08 08 08 08 08 09 09 09 09 0a 0a 0a 0a 0b 0b 0b 0b 0c 0c 0c 0c 0d 0d 0d 0d 0e 0e 0e 0e 0e 0f 0f 0f 10 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 13 14 14 14 14 14 15 15 15 16 16 16 16 16 17 17 17 17 18 18 18 18 19 19 19 19 1a 1a 1a 1a 1b 1b 1b 1b 1c 1c 1c 1c 1c 1d 1d 1d 1e 1e 1e 1e 1e 1f 1f 1f 1f 20 20 20 20 21 21 21 21 22 22 22 22 23 23 23 23 24 24 24 24 25 25 25 25 25 26 26 26 27 27 27 27 27 28 28 28 28 29 29 29 29 2a 2a 2a 2a 2b 2b 2b 2b 2c 2c 2c 2c 2d 2d 2d 2d 2d 2e 2e 2e 2f 2f 2f 2f 2f 00 00 00 то есть прекрасно видно, что значением 48 - 0x30 - и не пахнет! Сброс идёт мгновенно и после 0х2f сразу получается 0! Теперь понятно, почему была такая погрешность. К слову, весьма необычная особенность аппаратуры, первый раз сталкиваюсь с таким поведением  Цитата Так из картинок и текста все в общем-то понятно... А Вы говорите, что всё понятно в мануале. Вот если бы была диаграмма с растактовкой переполнения\сброса\установки (что встречается довольно часто), тогда действительно многих вопросов бы не возникало, и не приходилось бы прибегать к практическим исследованиям, с чём Вы сами соглашаетесь  Цитата(aaarrr @ Jul 4 2011, 16:37)  Если прерывания гарантированно укладываются в 65мс, то не нужно. Хм, да хоть прерывания будут длиться 650 миллисекунд - что изменится? Код считывания таймера такой: Код dword sys_counter() { dword hw, lw; do { hw = AT_TCB0->TCB_TC2.TC_CV; lw = AT_TCB0->TCB_TC1.TC_CV; } while (hw != AT_TCB0->TCB_TC2.TC_CV); return (hw << 16) | lw; } Переполнение 32 битного счётчика возможно за период равный 71 минуте. Всё, что меньше этого периода, внести ошибку не в состоянии, по моему...
|
|
|
|
|
Jul 5 2011, 06:31
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sonycman @ Jul 5 2011, 01:46)  К слову, весьма необычная особенность аппаратуры, первый раз сталкиваюсь с таким поведением  А Вы говорите, что всё понятно в мануале. Вот если бы была диаграмма с растактовкой переполнения\сброса\установки (что встречается довольно часто), тогда действительно многих вопросов бы не возникало, и не приходилось бы прибегать к практическим исследованиям, с чём Вы сами соглашаетесь  Странно действительно, так как прямо противоречит описанию 36.5.6 Trigger  Посмотрю на досуге. Цитата(sonycman @ Jul 5 2011, 01:46)  Хм, да хоть прерывания будут длиться 650 миллисекунд - что изменится? Да, все правильно. С прерываниями я погорячился.
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|