|
Sub-Second interrupt от RTC |
|
|
|
Apr 6 2010, 18:09
|
![](https://electronix.ru/forum/uploads/av-1244.jpg)
Гуру
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244
![](style_images/1/spacer.gif)
|
Цитата(evgen2 @ Apr 6 2010, 19:52) ![*](style_images/1/post_snapback.gif) 1.) Сдается мне, что в доке в два раза наврано - не от 16 до 2048, а от 32 до 4096 Доказательства на бочку. Цитата 2) А почему нет аналогов CISS не только у более старших чипов, но и у более младших ? О чем это? Кто такие младшие, кто такие старшие? У всех 23xx и 24xx есть
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 6 2010, 18:28
|
Местный
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688
![](style_images/1/spacer.gif)
|
Цитата(zltigo @ Apr 6 2010, 22:09) ![*](style_images/1/post_snapback.gif) Доказательства на бочку. Считаем разницу между значениями RTC_CTC полученными в момент прерывания и предыдущего прерывания. Цитата(zltigo @ Apr 6 2010, 22:09) ![*](style_images/1/post_snapback.gif) О чем это? Кто такие младшие, кто такие старшие? У всех 23xx и 24xx есть младшие по возрасту - 17xx, старшие - 21xx
|
|
|
|
|
Apr 6 2010, 21:14
|
![](https://electronix.ru/forum/uploads/av-1244.jpg)
Гуру
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244
![](style_images/1/spacer.gif)
|
Цитата(evgen2 @ Apr 6 2010, 20:43) ![*](style_images/1/post_snapback.gif) Считаем разницу между значениями RTC_CTC полученными в момент прерывания и предыдущего прерывания. Тогда надо еще правильно считать, или банально взять осциллограф. Цитата младшие по возрасту - 17xx, старшие - 21xx Смешно
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 7 2010, 04:22
|
Местный
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688
![](style_images/1/spacer.gif)
|
Цитата(zltigo @ Apr 7 2010, 01:29) ![*](style_images/1/post_snapback.gif) Тогда надо еще правильно считать, или банально взять осциллограф. А как тут осцилограф поможет ? Секунды тикают правильно. Я так понимаю что нужно кусок кода целиком предъявить, ибо как минимум у вас такого не наблюдается ? Цитата(zltigo @ Apr 7 2010, 01:29) ![*](style_images/1/post_snapback.gif) Смешно ![sad.gif](http://electronix.ru/forum/style_emoticons/default/sad.gif) Так что делать-то с 17xx ?
|
|
|
|
|
Apr 7 2010, 05:39
|
Местный
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688
![](style_images/1/spacer.gif)
|
А вот и код целиком Код #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; }
|
|
|
|
|
Apr 7 2010, 11:30
|
![](https://electronix.ru/forum/uploads/av-1244.jpg)
Гуру
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244
![](style_images/1/spacer.gif)
|
Цитата(evgen2 @ Apr 7 2010, 06:37) ![*](style_images/1/post_snapback.gif) А как тут осцилограф поможет ? Поскольку для осциллографа, полагаю, софт Вы не писали, то он покажет Вам правильные интервалы ![smile.gif](http://electronix.ru/forum/style_emoticons/default/smile.gif) Цитата Я так понимаю что нужно кусок кода целиком предъявить Только я его читать не буду - не интересно. Цитата ибо как минимум у вас такого не наблюдается ? Все согласно документации.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 7 2010, 14:51
|
Местный
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688
![](style_images/1/spacer.gif)
|
Цитата(zltigo @ Apr 7 2010, 14:45) ![*](style_images/1/post_snapback.gif) Поскольку для осциллографа, полагаю, софт Вы не писали, то он покажет Вам правильные интервалы ![smile.gif](http://electronix.ru/forum/style_emoticons/default/smile.gif) Только я его читать не буду - не интересно. Все согласно документации. Простите, такое впечатление, что вы не только код не читаете, но все остальное. Вопрос не про временные интервалы и не про правильные интервалы или нгеправильные, а про изсенение содержимого счетчика между прерываниями. Согласно документации оно меняется на 16, в эмуляторе меняется на 16, в железе на 16 не меняется. Объхясните идиоту, как увидеть изменение регистра процессора за время между прерываниями посредством осциллоскопа. Все что нужно - запустить указанный код на своем процессоре И посмотреть содержимое массива. Понятно, что вам поднять жопу - лениво. "Этого не может быть, потому что не может быть никогда".
|
|
|
|
|
Apr 7 2010, 15:04
|
![](https://electronix.ru/forum/uploads/av-1244.jpg)
Гуру
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244
![](style_images/1/spacer.gif)
|
Цитата(evgen2 @ Apr 7 2010, 17:06) ![*](style_images/1/post_snapback.gif) Согласно документации оно меняется на 16.... В документации сие НЕ написано. Написано только через сколько тактов появится прерывание. Прерывание появляется через заданное число тактов часового кварца. Интервалы правильные. Никаких других обещаний не дано в принципе. Посему чего Вы там в своем традиционно ![sad.gif](http://electronix.ru/forum/style_emoticons/default/sad.gif) бездумно писанном коде нагородили, начитали, и насчитали меня совершенно не интересует. Цитата Понятно, что вам поднять жопу - лениво. "Этого не может быть, потому что не может быть никогда". Не лениво, могут быть и ошибки. Именно по этой причине я написал своих несколько строк и проверил на 2048 тактах. Работает, как обещано. Байка не подтвердилась. Уже сообщил об этом на форуме, дабы сплетни не растекались. Точка.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 7 2010, 18:10
|
Местный
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688
![](style_images/1/spacer.gif)
|
Цитата(zltigo @ Apr 7 2010, 19:19) ![*](style_images/1/post_snapback.gif) В документации сие НЕ написано. Написано только через сколько тактов появится прерывание. Прерывание появляется через заданное число тактов часового кварца. Интервалы правильные. Никаких других обещаний не дано в принципе. 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) ![*](style_images/1/post_snapback.gif) Посему чего Вы там в своем традиционно ![sad.gif](http://electronix.ru/forum/style_emoticons/default/sad.gif) бездумно писанном коде нагородили, начитали, и насчитали меня совершенно не интересует. Не лениво, могут быть и ошибки. Именно по этой причине я написал своих несколько строк и проверил на 2048 тактах. Работает, как обещано. Байка не подтвердилась. Уже сообщил об этом на форуме, дабы сплетни не растекались. Точка. какие могут быть ошибки ? В один регистр пихается согласно уставу, из другого - читаем в момент прерывания и сравниваем с предыдущим значением. Просто как репа. Цитата(zltigo @ Apr 7 2010, 19:19) ![*](style_images/1/post_snapback.gif) я написал своих несколько строк и проверил на 2048 тактах. Предъявить их конечно не судьба ? Чужой код обосрать не читая у вас проблем нет.
|
|
|
|
|
Apr 7 2010, 18:26
|
![](https://electronix.ru/forum/uploads/av-1244.jpg)
Гуру
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244
![](style_images/1/spacer.gif)
|
Цитата(evgen2 @ Apr 7 2010, 20:25) ![*](style_images/1/post_snapback.gif) Какая буква из документации вам непонятна ? Мне абсолютно все. А Вам нет ![sad.gif](http://electronix.ru/forum/style_emoticons/default/sad.gif) - начинаете фантазировать. Цитата Просто как репа. и "красиво", как анус ![sad.gif](http://electronix.ru/forum/style_emoticons/default/sad.gif) Цитата Чужой код обосрать не читая у вас проблем нет. Отчего не читая? С первого взгляда стало ясно, что для того, что-бы понять, что "'это", "это" пробовать не надо. А муть там в каждой строчке ![sad.gif](http://electronix.ru/forum/style_emoticons/default/sad.gif) , например, Код t0 = RTC_CTC; сразу три очевидных вывода: 1. Вы не знаете сколько битов в счетчике; 2. Вы не знаете, как эти биты расположены в регистре RTC_CTC; 3. Вы не знаете, что правильность считывания RTC_CTC регистра не гарантируется и надо принимать специальные меры; Когда Вы сможете самому себе ответить на эти вопросы, можно будет идти дальше...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 7 2010, 18:39
|
Местный
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688
![](style_images/1/spacer.gif)
|
Цитата(zltigo @ Apr 7 2010, 22:41) ![*](style_images/1/post_snapback.gif) Мне абсолютно все. А Вам нет ![sad.gif](http://electronix.ru/forum/style_emoticons/default/sad.gif) - начинаете фантазировать. и "красиво", как анус ![sad.gif](http://electronix.ru/forum/style_emoticons/default/sad.gif) Отчего не читая? С первого взгляда стало ясно, что для того, что-бы понять, что "'это", "это" пробовать не надо. А муть там в каждой строчке ![sad.gif](http://electronix.ru/forum/style_emoticons/default/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. Какая буква документации вам непонятна, какая буква говорит про "не гарантируется", какая буква говорит про расположение битов нестандартным способом ? .
|
|
|
|
|
Apr 7 2010, 19:21
|
![](https://electronix.ru/forum/uploads/av-1244.jpg)
Гуру
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244
![](style_images/1/spacer.gif)
|
Цитата(evgen2 @ Apr 7 2010, 20:54) ![*](style_images/1/post_snapback.gif) Заявленный Супер-Пупер Код - в студию. Если хотите - ответы на три вопроса и пойдем дальше. Цитата Какая буква документации вам непонятна Повторяю последний раз - мне ВСЕ понятно и у меня ВСЕ получаетя. Проблемы у Вас. Наводящие вопросы заданы. Цитата какая буква говорит про расположение битов нестандартным способом ? . Читайте документацию LPC23XX User manual Rev. 03 — 25 August 2009 полностью и внимательно.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 8 2010, 07:22
|
Местный
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688
![](style_images/1/spacer.gif)
|
Цитата(rezident @ Apr 7 2010, 23:56) ![*](style_images/1/post_snapback.gif) 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) ![*](style_images/1/post_snapback.gif) Если хотите - ответы на три вопроса и пойдем дальше.
Повторяю последний раз - мне ВСЕ понятно и у меня ВСЕ получаетя. Проблемы у Вас. Наводящие вопросы заданы.
Читайте документацию LPC23XX User manual Rev. 03 — 25 August 2009 полностью и внимательно. Хочу. Ответы даны в ответе rezident'у. Для тестового кода игнорирование 16/32 - некошерно, но допустимо, если все лишнее оказывается нулями. Если все сделать корректно - итоговый результат у меня не меняется. Чтение регистра после прерывания - на мой взгляд вполне корректный метод для чтения данного асинхронно медленно меняющегося регистра. Документация Rev 1,2,3 действительно слегка отличается друг от друга. (При этом в на сайте кейла лежит rev 2)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|