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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Sub-Second interrupt от RTC
evgen2
сообщение Apr 6 2010, 17:52
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Вот в LPC2378 есть в RTC регистр:

CISS Counter Increment select mask for R/W * 0xE002 4040 Sub-Second interrupt


The CISS register provides a way to obtain millisecond-range periodic CPU interrupts
from the Real Time Clock. This can allow freeing up one of the general purpose timers, or
support power saving by putting the CPU into a reduced power mode between periodic
interrupts.
Carry out signals from different stages of the Clock Tick Counter are used to generate the
sub-second interrupts. The possibilities range from 16 counts of the CTC (about
488microseconds), up to 2,048 counts of the CTC (about 62.5milliseconds). The
available counts and corresponding times are given in

1.) Сдается мне, что в доке в два раза наврано - не от 16 до 2048, а от 32 до 4096
2) А почему нет аналогов CISS не только у более старших чипов, но и у более младших ?

Сообщение отредактировал evgen2 - Apr 6 2010, 17:53
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 6 2010, 18:09
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(evgen2 @ Apr 6 2010, 19:52) *
1.) Сдается мне, что в доке в два раза наврано - не от 16 до 2048, а от 32 до 4096

Доказательства на бочку.
Цитата
2) А почему нет аналогов CISS не только у более старших чипов, но и у более младших ?

О чем это? Кто такие младшие, кто такие старшие? У всех 23xx и 24xx есть


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
evgen2
сообщение Apr 6 2010, 18:28
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(zltigo @ Apr 6 2010, 22:09) *
Доказательства на бочку.

Считаем разницу между значениями RTC_CTC полученными в момент прерывания и предыдущего прерывания.

Цитата(zltigo @ Apr 6 2010, 22:09) *
О чем это? Кто такие младшие, кто такие старшие? У всех 23xx и 24xx есть


младшие по возрасту - 17xx, старшие - 21xx
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 6 2010, 21:14
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(evgen2 @ Apr 6 2010, 20:43) *
Считаем разницу между значениями RTC_CTC полученными в момент прерывания и предыдущего прерывания.

Тогда надо еще правильно считать, или банально взять осциллограф.
Цитата
младшие по возрасту - 17xx, старшие - 21xx

Смешно sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
evgen2
сообщение Apr 7 2010, 04:22
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(zltigo @ Apr 7 2010, 01:29) *
Тогда надо еще правильно считать, или банально взять осциллограф.


А как тут осцилограф поможет ? Секунды тикают правильно.
Я так понимаю что нужно кусок кода целиком предъявить, ибо как минимум у вас такого не наблюдается ?

Цитата(zltigo @ Apr 7 2010, 01:29) *
Смешно sad.gif


Так что делать-то с 17xx ?
Go to the top of the page
 
+Quote Post
evgen2
сообщение Apr 7 2010, 05:39
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



А вот и код целиком

Код
#include "LPC23xx.H"                        /* LPC23xx/24xx definitions */
#define ILR_RTCCIF    0x01
#define ILR_RTCALF    0x02
#define ILR_RTSSF    0x04
#define CCR_CLKEN    0x01
#define CCR_CTCRST    0x02
#define CCR_CLKSRC    0x10

int nclock = 0, nclocks = 0, t0=0, dt0=0;

volatile int alarm_on = 0;

__irq  void RTCHandler (void)
{  
//  RTC_ILR |= ILR_RTCCIF;        /* clear interrupt flag */
    RTC_ILR |= ILR_RTSSF;
    alarm_on = 1;
    VICVectAddr = 0;        /* Acknowledge Interrupt */
}

int stat[256];
/*****************************************************************************
**   Main Function  main()
******************************************************************************/
int main (void)
{    int i, dtmin, dtmax;
    for(i=0;i<256; i++) stat[i]=0;
    /*--- Initialize registers ---*/    
    RTC_AMR = 0;
    RTC_CIIR = 0;
    RTC_CCR = CCR_CTCRST; //Сброс
    RTC_CCR = CCR_CLKSRC; //

VICIntSelect   = 0x00000000;  
VICVectAddr13 = (unsigned) RTCHandler;
VICVectCntl13 = 0x00000013;            /* Set channel =RTC */
VICIntEnable = (1<<13);                /* Enable the interrupt */

    /*--- Start RTC counters ---*/
    RTC_CCR |= CCR_CLKEN;
    RTC_ILR = ILR_RTCCIF;
    RTC_CISS = 0x81; //subsecondes interrupt enable 0x80 = 488 мкс; 0x87 = 62.5 мс;

    t0 = RTC_CTC;
    dtmax = 0;
    dtmin = 1000000;
    while (1)
    {    /* Loop forever */
        nclocks++;
        if ( alarm_on != 0 )
        {    dt0 = RTC_CTC - t0;
            t0 = RTC_CTC;

// RTC_CISS = 0x80;
//Simulator:  dtmin = 0x20 dtmax = 0x20 RTC_CISS = 0x80;  stat[]= 0,0,0,0.....     stat[16] = много
//JTAG debug: dtmin = 0x0  dtmax = 0x20 RTC_CISS = 0x80;  stat[]= 1,0,1,0.....     stat[32] = много
// RTC_CISS = 0x81;
//Simulator: dtmin = 0x40 dtmax = 0x40 RTC_CISS = 0x80;  stat[]= 0,0,0,0.....     stat[32] = много
//JTAG debug:dtmin = 0x0  dtmax = 0x40 RTC_CISS = 0x80;  stat[]= 1,0,1,0.....     stat[64] = много
            if(dt0 >= 0)
            {  if(dt0 > dtmax) dtmax = dt0;
               if(dt0 < dtmin) dtmin = dt0;
               if(dt0<256)
                 stat[dt0]++;
            }
            alarm_on = 0;
            nclock++;
        }
    }
    return 0;
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 7 2010, 11:30
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(evgen2 @ Apr 7 2010, 06:37) *
А как тут осцилограф поможет ?

Поскольку для осциллографа, полагаю, софт Вы не писали, то он покажет Вам правильные интервалы smile.gif
Цитата
Я так понимаю что нужно кусок кода целиком предъявить

Только я его читать не буду - не интересно.
Цитата
ибо как минимум у вас такого не наблюдается ?

Все согласно документации.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
evgen2
сообщение Apr 7 2010, 14:51
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(zltigo @ Apr 7 2010, 14:45) *
Поскольку для осциллографа, полагаю, софт Вы не писали, то он покажет Вам правильные интервалы smile.gif

Только я его читать не буду - не интересно.

Все согласно документации.


Простите, такое впечатление, что вы не только код не читаете, но все остальное. Вопрос не про временные интервалы и не про правильные интервалы или нгеправильные, а про изсенение содержимого счетчика между прерываниями. Согласно документации оно меняется на 16, в эмуляторе меняется на 16, в железе на 16 не меняется. Объхясните идиоту, как увидеть изменение регистра процессора за время между прерываниями посредством осциллоскопа.

Все что нужно - запустить указанный код на своем процессоре И посмотреть содержимое массива. Понятно, что вам поднять жопу - лениво. "Этого не может быть, потому что не может быть никогда".
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 7 2010, 15:04
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(evgen2 @ Apr 7 2010, 17:06) *
Согласно документации оно меняется на 16....

В документации сие НЕ написано. Написано только через сколько тактов появится прерывание. Прерывание появляется через заданное число тактов часового кварца. Интервалы правильные. Никаких других обещаний не дано в принципе. Посему чего Вы там в своем традиционно sad.gif бездумно писанном коде нагородили, начитали, и насчитали меня совершенно не интересует.
Цитата
Понятно, что вам поднять жопу - лениво. "Этого не может быть, потому что не может быть никогда".

Не лениво, могут быть и ошибки. Именно по этой причине я написал своих несколько строк и проверил на 2048 тактах. Работает, как обещано. Байка не подтвердилась.
Уже сообщил об этом на форуме, дабы сплетни не растекались. Точка.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
evgen2
сообщение Apr 7 2010, 18:10
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(zltigo @ Apr 7 2010, 19:19) *
В документации сие НЕ написано. Написано только через сколько тактов появится прерывание. Прерывание появляется через заданное число тактов часового кварца. Интервалы правильные. Никаких других обещаний не дано в принципе.



4.2.5 Counter Increment Select Mask Register (CISS - 0xE002 4040)
The CISS register provides a way to obtain millisecond-range periodic CPU interrupts from the Real Time Clock. This can allow freeing up one of the general purpose timers, or support power saving by putting the CPU into a reduced power mode between periodic interrupts.

Carry out signals from different stages of the Clock Tick Counter are used to generate the sub-second interrupts. The possibilities range from 16 counts of the CTC (about 488microseconds), up to 2,048 counts of the CTC (about 62.5milliseconds). The available counts and corresponding times are given in Table 26–469.

Table 469. Counter Increment Select Mask register (CISS - address 0xE002 4040) bit description Bit Symbol Value Description Reset value
2:0 SubSecSel SubSecSelSub-Second Select. This field selects a count for the sub-second interrupt as NC follows:

000 An interrupt is generated on every16 counts of the Clock Tick Counter. At 32.768 kHz, this generates an interrupt approximately every 488 microseconds.
001 An interrupt is generated on every 32 counts of the Clock Tick Counter. At 32.768 kHz, this generates an interrupt approximately every 977 microseconds.
010 An interrupt is generated on every 64 counts of the Clock Tick Counter. At 32.768 kHz, this generates an interrupt approximately every 1.95 milliseconds.
011 An interrupt is generated on every 128 counts of the Clock Tick Counter. At 32.768 kHz, this generates an interrupt approximately every 3.9 milliseconds.
100 An interrupt is generated on every 256 counts of the Clock Tick Counter. At 32.768 kHz, this generates an interrupt approximately every 7.8 milliseconds.
101 An interrupt is generated on every 512 counts of the Clock Tick Counter. At 32.768 kHz, this generates an interrupt approximately every 15.6 milliseconds.
110 An interrupt is generated on every 1024 counts of the Clock Tick Counter. At 32.768 kHz, this generates an interrupt approximately every 31.25 milliseconds.
111 An interrupt is generated on every 2048 counts of the Clock Tick Counter. At 32.768 kHz, this generates an interrupt approximately every 62.5 milliseconds.

Какая буква из документации вам непонятна ?

Цитата(zltigo @ Apr 7 2010, 19:19) *
Посему чего Вы там в своем традиционно sad.gif бездумно писанном коде нагородили, начитали, и насчитали меня совершенно не интересует.

Не лениво, могут быть и ошибки. Именно по этой причине я написал своих несколько строк и проверил на 2048 тактах. Работает, как обещано. Байка не подтвердилась.
Уже сообщил об этом на форуме, дабы сплетни не растекались. Точка.


какие могут быть ошибки ? В один регистр пихается согласно уставу, из другого - читаем в момент прерывания и сравниваем с предыдущим значением. Просто как репа.

Цитата(zltigo @ Apr 7 2010, 19:19) *
я написал своих несколько строк и проверил на 2048 тактах.


Предъявить их конечно не судьба ? Чужой код обосрать не читая у вас проблем нет.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 7 2010, 18:26
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(evgen2 @ Apr 7 2010, 20:25) *
Какая буква из документации вам непонятна ?

Мне абсолютно все. А Вам нет sad.gif - начинаете фантазировать.
Цитата
Просто как репа.

и "красиво", как анус sad.gif
Цитата
Чужой код обосрать не читая у вас проблем нет.

Отчего не читая? С первого взгляда стало ясно, что для того, что-бы понять, что "'это", "это" пробовать не надо.
А муть там в каждой строчке sad.gif, например,
Код
        t0 = RTC_CTC;

сразу три очевидных вывода:
1. Вы не знаете сколько битов в счетчике;
2. Вы не знаете, как эти биты расположены в регистре RTC_CTC;
3. Вы не знаете, что правильность считывания RTC_CTC регистра не гарантируется и надо принимать специальные меры;
Когда Вы сможете самому себе ответить на эти вопросы, можно будет идти дальше...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
evgen2
сообщение Apr 7 2010, 18:39
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(zltigo @ Apr 7 2010, 22:41) *
Мне абсолютно все. А Вам нет sad.gif - начинаете фантазировать.

и "красиво", как анус sad.gif

Отчего не читая? С первого взгляда стало ясно, что для того, что-бы понять, что "'это", "это" пробовать не надо.
А муть там в каждой строчке sad.gif, например,
Код
        t0 = RTC_CTC;

сразу три очевидных вывода:
1. Вы не знаете сколько битов в счетчике;
2. Вы не знаете, как эти биты расположены в регистре RTC_CTC;
3. Вы не знаете, что правильность считывания RTC_CTC регистра не гарантируется и надо принимать специальные меры;


Заявленный Супер-Пупер Код - в студию.
----------------
4.2.2 Clock Tick Counter Register (CTCR - 0xE002 4004)
The Clock Tick Counter is read only. It can be reset to zero through the Clock Control
Register (CCR). The CTC consists of the bits of the clock divider counter.

14:0 Clock Tick Prior to the Seconds counter, the CTC counts 32,768 clocks per NA
Counter second. Due to the RTC Prescaler, these 32,768 time increments may
not all be of the same duration. Refer to the Section 26–8.1 “Reference
Clock Divider (Prescaler)” on page 508 for details.

15 - Reserved, user software should not write ones to reserved bits. The NA
value read from a reserved bit is not defined.

Какая буква документации вам непонятна, какая буква говорит про "не гарантируется", какая буква говорит про расположение битов нестандартным способом ? .
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 7 2010, 19:21
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(evgen2 @ Apr 7 2010, 20:54) *
Заявленный Супер-Пупер Код - в студию.

Если хотите - ответы на три вопроса и пойдем дальше.
Цитата
Какая буква документации вам непонятна

Повторяю последний раз - мне ВСЕ понятно и у меня ВСЕ получаетя. Проблемы у Вас. Наводящие вопросы заданы.
Цитата
какая буква говорит про расположение битов нестандартным способом ? .

Читайте документацию LPC23XX User manual Rev. 03 — 25 August 2009 полностью и внимательно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 7 2010, 19:41
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(evgen2 @ Apr 8 2010, 00:54) *
Какая буква документации вам непонятна, какая буква говорит про "не гарантируется", какая буква говорит про расположение битов нестандартным способом ?
zltigo, видимо имеет в виду раздел 7.2.2 из User's Manual. Я лично сразу нашел упомянутые им особенности RTC. Проблемы с чтением регисторов, имеющих асинхронное по отношению к ядру тактирование, встречаются весьма часто и у других микроконтроллеров.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
evgen2
сообщение Apr 8 2010, 07:22
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(rezident @ Apr 7 2010, 23:56) *
zltigo, видимо имеет в виду раздел 7.2.2 из User's Manual. Я лично сразу нашел упомянутые им особенности RTC. Проблемы с чтением регисторов, имеющих асинхронное по отношению к ядру тактирование, встречаются весьма часто и у других микроконтроллеров.

1. Если в указанном выше коде заменить RTC_CTC на (RTC_CTC&0x7fff) - результат не изменится.
2. В ревизии 1 указанного дополнения к описанию CTCR нет. (и вообще удивительно - ревизия 2 занимает 4Мб, ревизия 1 - 11мб), но приведенный код читает этот регистр после прерывания, поэтому у регистра CTCR нет времени еще раз измениться.

Цитата(zltigo @ Apr 7 2010, 23:36) *
Если хотите - ответы на три вопроса и пойдем дальше.

Повторяю последний раз - мне ВСЕ понятно и у меня ВСЕ получаетя. Проблемы у Вас. Наводящие вопросы заданы.

Читайте документацию LPC23XX User manual Rev. 03 — 25 August 2009 полностью и внимательно.

Хочу.
Ответы даны в ответе rezident'у.
Для тестового кода игнорирование 16/32 - некошерно, но допустимо, если все лишнее оказывается нулями. Если все сделать корректно - итоговый результат у меня не меняется. Чтение регистра после прерывания - на мой взгляд вполне корректный метод для чтения данного асинхронно медленно меняющегося регистра.
Документация Rev 1,2,3 действительно слегка отличается друг от друга. (При этом в на сайте кейла лежит rev 2)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th June 2024 - 11:41
Рейтинг@Mail.ru


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