|
|
 |
Ответов
|
May 27 2010, 08:20
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 24-05-10
Пользователь №: 57 488

|
Извиняюсь, что влезаю в чужой топик. Возникла непонятка со спецификатором static, поэтому решил запостить сюда вопрос. Программа осуществляет ЦАП с помощью ШИМ. Запись в регистр сравнения осущетсвляется по прерыванию при переполнению счетчика. Функция обработки прерывания выглядит следующим образом: Код __interrupt void T1_OVF_Handler() { static unsigned int num = 0; temp = sin(2*pi*Fsin*num/Fpwm); // OCR1A = short(temp*TOP_PWM); num++; if (num >= Fpwm) num = 0; IntToChar(UART_out, 4, OCR1A); PutTextToUART(UART_out, 4); } При пошаговой отладке после вычисления синуса, значение num меняется на 22016 (причем Fpwm=7844), и соответственно при сравнении обнуляется. Если сделать глобальное объявление переменной, то проблема исчезает. Но почему так происходит, к сожалению понять так и не смог.
|
|
|
|
|
May 27 2010, 10:31
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 24-05-10
Пользователь №: 57 488

|
Цитата(aaarrr @ May 27 2010, 12:31)  Стеком поди затирается. Вообще, использование sin() и прочей плавучки внутри обработчика прерывания - это ну совсем нехорошо по целому ряду причин. Действительно стек на 32 байта, заполнен полностью. А можете рассказать про причины, или дать ссылку? Знаю, что прерывания не должны "подвешивать" программу. Но в данном случае я проверял по количеству циклов, все вычисления уложаться до начала реверсивного счета. Цитата Попробуйте сделать табличку значений синуса с нужным шагом во флеши. И ещё у Вас UART буферизован? Проблема в том, что потребуется слишком много значений. Можно по идее ограничиться десятью и постепенно подгружать новые, но при этом нужно будет основную программу синхронизировать с прерыванием, чтобы в функцию обработки попадали только "нужные" значения. Это отдельная задача, и я еще над ней не задумывался. Та же проблема с UARTом, который тоже должен работать независимо.
|
|
|
|
Сообщений в этой теме
John851 спецификатор static May 26 2010, 12:30 MrYuran Цитата(John851 @ May 26 2010, 16:30) в ка... May 26 2010, 12:46 John851 абсолютно все переменные попадают в ОЗУ? или есть ... May 26 2010, 12:54 Сергей Борщ Цитата(John851 @ May 26 2010, 15:54) абсо... May 26 2010, 13:11 sigmaN static лишь ограничивает область видимости перемен... May 26 2010, 15:01 xelax Цитата(sigmaN @ May 26 2010, 19:01) stati... May 27 2010, 06:03 swisst Цитата(John851 @ May 26 2010, 15:30) есть... May 26 2010, 16:44 John851 Еще немного про ОЗУ:
А как происходит работа с ОЗУ... May 27 2010, 05:30 MrYuran Цитата(John851 @ May 27 2010, 09:30) Еще ... May 27 2010, 05:43  demiurg_spb Попробуйте сделать табличку значений синуса с нужн... May 27 2010, 09:30   MrYuran Цитата(eracer @ May 27 2010, 14:31) Дейст... May 27 2010, 10:37    eracer Цитата(MrYuran @ May 27 2010, 14:37)
Да... May 27 2010, 11:15 John851 хм, в чем разница объявления глобальной переменной... May 27 2010, 12:27 MrYuran Цитата(John851 @ May 27 2010, 16:27) Разн... May 27 2010, 12:35 aaarrr Цитата(John851 @ May 27 2010, 16:27) Разн... May 27 2010, 12:36 mempfis_ Цитата(John851 @ May 27 2010, 15:27) Разн... May 27 2010, 14:35  Сергей Борщ Цитата(mempfis_ @ May 27 2010, 17:35) Есл... May 27 2010, 23:24  _Pasha Цитата(mempfis_ @ May 27 2010, 17:35) Есл... May 28 2010, 05:52   MrYuran Цитата(_Pasha @ May 28 2010, 09:52) А шо,... May 28 2010, 06:25    MrYuran Цитата(MrYuran @ May 28 2010, 10:25) Это ... Jun 1 2010, 06:57 sigmaN ЦитатаВобщем IMHO static это ненужный расход опера... May 27 2010, 21:42 mempfis_ Цитата(sigmaN @ May 28 2010, 00:42) IMHO ... May 28 2010, 07:04  demiurg_spb Цитата(mempfis_ @ May 28 2010, 11:04) В г... May 28 2010, 09:29 sigmaN ЦитатаВ глобальных не приходилось применять - небы... May 28 2010, 07:44 John851 хм, а если я создам массив большой >1 Кб а памя... May 28 2010, 10:02 demiurg_spb Цитата(John851 @ May 28 2010, 14:02) хм, ... May 28 2010, 10:13 XVR ЦитатаВопрос на засыпку: локальную переменную созд... Jun 1 2010, 08:47
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|