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

 
 
11 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Atmel SAM3U4, Различные вопросы
aaarrr
сообщение Jul 1 2011, 12:36
Сообщение #16


Гуру
******

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



Цитата(sonycman @ Jul 1 2011, 15:20) *
Но оперативка, как я понимаю, относится к ядру, и, если она не тактируется, то и DMA не сможет её читать\записывать... sad.gif

Не относится. Шины работать будут:
Цитата
When Processor Sleep Mode is entered, the current instruction is finished before the clock is
stopped, but this does not prevent data transfers from other masters of the system bus.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 1 2011, 13:50
Сообщение #17


Любитель
*****

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



Цитата(aaarrr @ Jul 1 2011, 16:36) *
Не относится. Шины работать будут:

Что-же, тогда замечательно.

ЗЫ: а на практике Вы пробовали?
Вот эта табличка тоже говорит, что память перестаёт тактироваться:
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 1 2011, 14:13
Сообщение #18


Гуру
******

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



Цитата(sonycman @ Jul 1 2011, 17:50) *
ЗЫ: а на практике Вы пробовали?
Вот эта табличка тоже говорит, что память перестаёт тактироваться:

Нет, не пробовал. К табличкам нужно относится осторожнее, как мы знаем sm.gif
В Sleep Mode отключается HCLK, память и шины тактируются от MCK.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 1 2011, 14:29
Сообщение #19


Любитель
*****

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



Цитата(aaarrr @ Jul 1 2011, 18:13) *
В Sleep Mode отключается HCLK, память и шины тактируются от MCK.

Отлично, тогда отправлять CPU в сон, загрузив DMA по самые гланды, ничего не помешает sm.gif

Цитата
Нет, не пробовал. К табличкам нужно относится осторожнее, как мы знаем sm.gif

Это верно!
Блин, чем больше читаю мануал, тем больше кажется, что американцы не далеко ушли от русских в плане раздолбайства (в основном, правда, при написании документации).
Вот ещё один момент:
Прикрепленное изображение

и цитата из текста:
Цитата
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.

Каким образом клок процессора может быть не то что быстрее, а вообще хоть как то отличаться от мастер клока, не понятно sm.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 1 2011, 14:42
Сообщение #20


Гуру
******

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



Цитата(sonycman @ Jul 1 2011, 18:29) *
Каким образом клок процессора может быть не то что быстрее, а вообще хоть как то отличаться от мастер клока, не понятно sm.gif

Скопипастили откуда-нибудь, это сплошь и рядом.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 4 2011, 10:10
Сообщение #21


Любитель
*****

Группа: Свой
Сообщений: 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.
Чего я как то не ожидал, поэтому угрохал на вычисление проблемы целый день sm.gif

Пришлось задать настройки для компараторов вот так:
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, отсюда получаем "бегущий" таймер.
Пока что это предположение, надо будет проверить его на практике.

В мануале, жать, не приводятся точные цифры по различным режимам счётчиков... sad.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 4 2011, 11:22
Сообщение #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) *
В мануале, жать, не приводятся точные цифры по различным режимам счётчиков... sad.gif

Не понял, какие цифры?

Все же не понимаю вашу систему. Зачем такое сумасшедшее разрешение? А еще ведь при чтении счетчика придется проверять граничные условия с запретом прерываний и корректировать при необходимости старшее слово.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 4 2011, 12:29
Сообщение #23


Любитель
*****

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



Цитата(aaarrr @ Jul 4 2011, 15:22) *
Не понял, какие цифры?

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

Цифры значений счетчика, потактово,чтобы было понятно на 100%, когда происходит инкремент/сброс и т.п, иначе лично у меня возникли неясности...

Что касается разрешения - мне так удобно на стадии отладки и разных тестов.
Считывать половинки действительно приходится несколько раз (старшую половину), но запрещать прерывания не нужно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 4 2011, 12:37
Сообщение #24


Гуру
******

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



Цитата(sonycman @ Jul 4 2011, 16:29) *
Цифры значений счетчика, потактово,чтобы было понятно на 100%, когда происходит инкремент/сброс и т.п, иначе лично у меня возникли неясности...

Так из картинок и текста все в общем-то понятно, они его давно уже копипастят sm.gif

Цитата(sonycman @ Jul 4 2011, 16:29) *
Считывать половинки действительно приходится несколько раз (старшую половину), но запрещать прерывания не нужно.

Если прерывания гарантированно укладываются в 65мс, то не нужно.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 4 2011, 13:28
Сообщение #25


Любитель
*****

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



Кстати, ещё одна фишка по поводу странной работы счётчика в режиме upcounter со сбросом по Compare C.

При вот таких параметрах TC0: RA = 0, RC = 47, совпадение по RC устанавливает TIOA0, совпадение по RA его сбрасывает - инкремента TC1 не происходит вообще.
Если в RA записать 1 - всё работает.
Странно... sad.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 4 2011, 14:41
Сообщение #26


Гуру
******

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



Цитата(sonycman @ Jul 4 2011, 17:28) *
Странно... sad.gif

Всё законно sm.gif:
Цитата
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

В вашем случае это условие нарушается - импульс слишком короткий.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 4 2011, 16:25
Сообщение #27


Любитель
*****

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



Цитата(aaarrr @ Jul 4 2011, 18:41) *
В вашем случае это условие нарушается - импульс слишком короткий.

Понятно, спасибо sm.gif
Что-то не подумал, что это "внешний" сигнал...

Теперь осталось только выяснить, почему счётчик "бежит" вперёд на две минуты в час.
Хз, может быть, косячу при замере, а может дебаггер как то влияет (через него смотрю состояние переменных/регистров)...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 4 2011, 21:46
Сообщение #28


Любитель
*****

Группа: Свой
Сообщений: 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!
Теперь понятно, почему была такая погрешность.

К слову, весьма необычная особенность аппаратуры, первый раз сталкиваюсь с таким поведением sad.gif
Цитата
Так из картинок и текста все в общем-то понятно...

А Вы говорите, что всё понятно в мануале. Вот если бы была диаграмма с растактовкой переполнения\сброса\установки (что встречается довольно часто), тогда действительно многих вопросов бы не возникало, и не приходилось бы прибегать к практическим исследованиям, с чём Вы сами соглашаетесь sm.gif

Цитата(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 минуте.
Всё, что меньше этого периода, внести ошибку не в состоянии, по моему...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 5 2011, 06:31
Сообщение #29


Гуру
******

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



Цитата(sonycman @ Jul 5 2011, 01:46) *
К слову, весьма необычная особенность аппаратуры, первый раз сталкиваюсь с таким поведением sad.gif

А Вы говорите, что всё понятно в мануале. Вот если бы была диаграмма с растактовкой переполнения\сброса\установки (что встречается довольно часто), тогда действительно многих вопросов бы не возникало, и не приходилось бы прибегать к практическим исследованиям, с чём Вы сами соглашаетесь sm.gif

Странно действительно, так как прямо противоречит описанию 36.5.6 Trigger sad.gif Посмотрю на досуге.

Цитата(sonycman @ Jul 5 2011, 01:46) *
Хм, да хоть прерывания будут длиться 650 миллисекунд - что изменится?

Да, все правильно. С прерываниями я погорячился.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 5 2011, 08:27
Сообщение #30


Любитель
*****

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



Цитата(aaarrr @ Jul 5 2011, 10:31) *
Странно действительно, так как прямо противоречит описанию 36.5.6 Trigger sad.gif Посмотрю на досуге.

Наверное, это бага. Но в еррате про неё ничего нет.
Впрочем, легко обходится sm.gif
Go to the top of the page
 
+Quote Post

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

 


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


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