Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2134/01 (revD) странности с RTC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
GetSmart
Запустил RTC от внешнего кварца 32768. Вроде идут. Но...
В регистре CTC должен храниться счётчик долей секунды. Обещано было что он 15 бит, соответственно пробегает от 0 до 32767. Я в старых своих проектах тупо его умножал на 1000 и сдвигал вправо на 15 бит чтобы получать значение миллисекунд. Но вчера обнаружил что он добегает от 0 до 65535. Во дела! smile.gif То есть когда он меньше 32768 - идёт первая половина секунды, больше - вторая.

Другая странность - во время работы процессора от VCC замыкаю часовой кварц и время не останавливается, а начинает бежать намного быстрее чем раньше. Раз в пять быстрее.

Третья странность - не могу запустить работу часов от PCLK, а не внешнего кварца. Устанавливаю CCR = 0x01 и часы просто останавливаются. Хотя хранят старые значения часов, минут и т.д. В PREINT и PREFRAC я естественно прописал нужные делители.
zltigo
Цитата(GetSmart @ Aug 20 2008, 07:55) *
Но вчера обнаружил что он добегает от 0 до 65535. Во дела! smile.gif То есть когда он меньше 32768 - идёт первая половина секунды, больше - вторая.

Уверены? Ну неоткуда большей частоте взяться, посему полагаю 15 бит это таки секунда, а 16 просто 2.
Цитата
начинает бежать намного быстрее чем раньше. Раз в пять быстрее.

Ничего не скажу
Цитата
Третья странность - не могу запустить работу часов от PCLK

Точно работает, просто инициализация источника при сброшеном CLKEN должна быть.
GetSmart
Цитата(zltigo)
Уверены? Ну неоткуда большей частоте взяться, посему полагаю 15 бит это таки секунда, а 16 просто 2.
Да, уверен. Раньше, на LPC2132 rev- наблюдал аналогичную аномалию вот в этом коде:
Код
rtc->mils = ((CTC * 1000) >> 15) & 1023

Странность заключалась в том, что проскакивали числа большие 1000, хотя их там не должно было быть. Теперь начинаю понимать в чём дело. Вероятно счётчик CTC на самом деле 15-битный, но нулевой бит в регистре не использается. Домой приду - проверю. А то, что CTC.15 содержит старшую/младшую половину секунды - 100%. Я от него моргаю точкой в электронных часах, и видно в какие моменты относительно него меняются показания остальных регистров RTC.

Гы smile.gif
Код
/* RTC clock tick counter register */
typedef struct{
__REG32          : 1;
__REG32 COUNTER  :15;
__REG32          :16;
} __ctc_bits;

Это из iolpc2138.h
Почему же во всех мануалах пишут по-другому?!? Вот и верь им после этого sad.gif
zltigo
Цитата(GetSmart @ Aug 20 2008, 11:38) *
Вот и верь им после этого sad.gif

Бывает smile.gif
GetSmart
Цитата(zltigo @ Aug 20 2008, 15:16) *
Цитата(GetSmart)
Третья странность - не могу запустить работу часов от PCLK
Точно работает, просто инициализация источника при сброшеном CLKEN должна быть.
Оказалось всё дело в бите PCONP_bit.PCRTC. Я его при обращении к RTC устанавливал, а перед выходом из процедуры сбрасывал. Так в какой-то эррате рекомендовалось для уменьшения потребления от батарейки. С часовым кварцем этот алгоритм прекрасно работал. Видимо этот бит подаёт питание на схему RTC от VCC проца, а бит CCR.4 подаёт туда же питание от батарейки. Получается когда они оба выключены - RTC перестаёт тикать.

Ещё проверил - изменение CCR.CLKSRC можно менять не обнуляя CCR.CLKEN. И делители PREINT и PREFRAC тоже можно на ходу.
zltigo
Цитата(GetSmart @ Aug 20 2008, 17:07) *
Ещё проверил - изменение CCR.CLKSRC можно менять не обнуляя CCR.CLKEN.

Тем не менее по документации конфигурация производится при остановленном RTC. Хотите получить какие-нибудь эффекты при неудачном стечении обстоятельств?
GetSmart
Цитата(zltigo)
Хотите получить какие-нибудь эффекты при неудачном стечении обстоятельств?

От эффекта Мёссбауэра я бы не отказался smile.gif Но думаю не прокатит. Или от эффекта низколетящего утюга smile.gif

Да, замыкая кварц часы начинают быстро бежать вперёд. А замыкая ёмкости кварца - останавливаются, как и положено.

А где указано, что нельзя менять CLKSRC "на ходу"? В мануале не нашёл такого.
zltigo
Цитата(GetSmart @ Aug 20 2008, 17:52) *
А где указано, что нельзя менять CLKSRC "на ходу"? В мануале не нашёл такого.

В описании бита CLKEN Clock Enable. When this bit is a one the time counters are enabled.
When it is a zero, they are disabled so that they may be initialized.
aaarrr
Цитата(GetSmart @ Aug 20 2008, 19:52) *
Да, замыкая кварц часы начинают быстро бежать вперёд. А замыкая ёмкости кварца - останавливаются, как и положено.

smile.gif А что еще остается делать часовому генератору, интересно?
GetSmart
Цитата(zltigo @ Aug 20 2008, 22:03) *
В описании бита CLKEN Clock Enable. When this bit is a one the time counters are enabled.
When it is a zero, they are disabled so that they may be initialized.
Тут речь только о счётчиках времени/даты. А о служебных битах речи нет. Так что я бы не стал преувеличивать смысл. Если счётчики прописывать на ходу, то ессно может перескочить секунда и в них будет не то что надо. У служебных битов таких приколов нет.

А вот я сегодня встретил приколы покруче. Из 5-ти LPC2134 четыре запустились с первого раза на ура. А один проц ни в какую не хотел. Сначала у него часы, минуты и секунды (а может и всё остальное) увеличивались каждую секунду на 1 одновременно smile.gif Потом я замкнул батарейку и они вообще перестали тикать, даже если рукой касаться кварца. Пришлось во время инициализации часов, после сброса проца, принудительно прописывать все регистры будильника, DOW и DOY еденицами. Никогда раньше такое не делал. Только после этого часики начали нормально тикать. Как у них там башню сорвало - до сих пор не понимаю smile.gif
zltigo
Цитата(GetSmart @ Aug 21 2008, 15:33) *
Тут речь только о счётчиках времени/даты. А о служебных битах речи нет.

Скажем так, нет речи о делении на "служебные" и "не служебные". Я предпочитаю остановить и сделать все без раздумий и толкований.
Цитата
Пришлось во время инициализации часов, после сброса проца, принудительно прописывать все регистры будильника, DOW и DOY еденицами. Никогда раньше такое не делал.

Наступал и инициализирую, если из регистров прочиталась ерунда
Код
    if( (MIN >= 60)||(HOUR >= 24)||(YEAR<2007)||(YEAR>2027) )
    {
          CCR &= (~CCR_CLKEN);         // Disable RTC;
        vDummyDelay_ms( 10 );
        SEC     = 0;
        MIN        = 0;
        HOUR    = 0;

        YEAR    = 2007;
        MONTH    = 2;
        DOM        = 1;
        DOY        = 58;

        ALSEC     = 0;
           ALMIN     = 0;
        ALHOUR     = 0;
        ALDOM     = 0;
        ALDOW     = 0;
        ALDOY     = 0;
        ALMON     = 0;
        ALYEAR     = 0;
....
GetSmart
Цитата(zltigo @ Aug 21 2008, 21:11) *
Код
    if( (MIN >= 60)||(HOUR >= 24)||(YEAR<2007)||(YEAR>2027) )

Маловато же у Вас девайсы жить должны.
Я обычно лет на 50 закладываюсь. А вдруг smile.gif
GetSmart
Цитата(zltigo @ Aug 21 2008, 21:11) *
Наступал и инициализирую, если из регистров прочиталась ерунда
Я почти уверен, что даже если в минутах, часах и году будут корректные значения, то часы могут глючить. ИМХО надо прописывать неиспользующиеся регистры всегда. Можно даже на ходу, особенно регистры будильника если он не используется. Кстати, все регистры RTC не инициализируются при сбросе (кроме PREINT и PREFRAC) и там может быть мусор, который надо вычищать. ХЗ как он влияет на логику часов. Приколы с увеличением всех регистров каждую секунду даже трудно объяснить.
zltigo
Цитата(GetSmart @ Aug 21 2008, 17:36) *
Я обычно лет на 50 закладываюсь. А вдруг smile.gif

Можете подправить smile.gif


Цитата(GetSmart @ Aug 21 2008, 18:42) *
ИМХО надо прописывать неиспользующиеся регистры всегда.

А я что делаю?
GetSmart
Цитата(zltigo @ Aug 21 2008, 22:45) *
А я что делаю?
Судя по коду - только в случае неправильного содержимого MIN, HOUR или YEAR. А иначе - не прописываете.

У меня когда все регистры бежали каждую секунду, они при этом имели корректные значения. Значит какие-то другие имели некорректные.
zltigo
Цитата(GetSmart @ Aug 21 2008, 18:53) *
Судя по коду - только в случае неправильного содержимого MIN, HOUR или YEAR. А иначе - не прописываете.

Ну все это при отключении батареи и слетает, как минимум, год, после чего и идет полная инициализация. Вы-же не хотите сказать, что у Вас год получается, например, 2008? Количество контролируемых регистров можно и увеличить, конечно.
GetSmart
Не могу понять проблему. Уже в двух из семи процессоров не запутился RTC. Часы не тикают. Прикасаюсь пальцем к одной ноге кварца и он начинает тикать. При этом кварц в порядке, батарейка в порядке, кондёры тоже.
zltigo
Цитата(GetSmart @ Aug 24 2008, 18:40) *
Прикасаюсь пальцем к одной ноге кварца и он начинает тикать. При этом кварц в порядке, батарейка в порядке, кондёры тоже.

Кварцы разные бывают, кондеры под них соответственно тоже. Опять-же разводку от балды лучше не делать - попадалась чужая разводка с землей на RTC кондерах затянутой издалека - запускались неcтабильно. Генератор у LPC достаточно капризен, и вдобавок плохо переносит статику - нарывался sad.gif В errata по статике есть отписка....
GetSmart
Кварц и кондёры нормальные. Перепаиваю их на другую плату - всё работает. Перепаиваю на эту плату другой проц - тоже работает. Припаиваю к этому процу другой кварц - не работает. Разводка кварца - идеальная. Земля подключена только к процу. Проводники от кварца 5 мм. Пока все подозрения на проц. Однако, судя по тому, что прикосновение к кварцу вызывает генерацию, не работает выходной драйвер генератора или какая-то несовместимость с кварцем (типом кварца). От внутреннего PCLK RTC работает нормально.
zltigo
Цитата(GetSmart @ Aug 24 2008, 19:09) *
Кварц и кондёры нормальные.

Вы купили кварцы с известными параметрами и поставили к ним рекомендованные конденсаторы? Или все, что можете сказать о кварцах, что они "нормальные", поскольку где-то работают?
GetSmart
Только что поменял кварц на отечественную лодочку и ещё на один тонкий. Не заработало. Кондёры 22пф NPO.

Не пойму, какие ещё данные нужно иметь чтобы быть уверенным в тех же кварцах. Может родословную? Или цепочку поставщиков вплоть до места распилки этого кварца?
zltigo
Цитата(GetSmart @ Aug 24 2008, 19:32) *
Не пойму, какие ещё данные нужно иметь...

Однако в документации на LPC приведены аж 3 варианта.
Цитата
Table 280: Recommended values for the RTC external 32 kHz oscillator CX1/X2 components
Crystal load capacitance
CL
Maximum crystal series
resistance RS
External load capacitors CX1, CX2
11 pF < 100 kΩ 18 pF, 18 pF
13 pF < 100 kΩ 22 pF, 22 pF
15 pF < 100 kΩ 27 pF, 27 pF

Поскольку кварцы в основном не пойми какие, то на первой паре экземпляров в лоб c кварцами "из стола" тоже в свое время тыкался. Пока вообще на одном генератор не помер. Потом купил такие, на которые бумажка у поставщика была и заработало, и в серию пошло. На Olimex-совских бордах есть и место для последовательного резистора - думаю, что и это неспроста sad.gif.
rezident
Цитата(GetSmart @ Aug 24 2008, 23:32) *
Только что поменял кварц на отечественную лодочку и ещё на один тонкий. Не заработало. Кондёры 22пф NPO.

Если я правильно помню, то изначально там стояли DT-38L(T) (CL=12,5пФ).
zltigo
Цитата(rezident @ Aug 24 2008, 20:37) *
DT-38L(T) (CL=12,5пФ).

У меня такие работают http://www.ormix.riga.lv/pdf/crystal/JU38.pdf - тоже 12,5pF
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.