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

 
 
> Интервальный таймер PIT SAM7S128
Anton_1000
сообщение May 17 2009, 07:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 13-01-09
Из: г.Севастополь
Пользователь №: 43 288



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

КОД:
// обработчик прерываний от интервального таймера PIT
void PIT_handler (void)
{ unsigned int status;
//сброс прывания от PIT
status=AT91C_BASE_PITC->PITC_PIVR;
status=status;
// действия при прерывании
AT91F_US_PutChar ( AT91C_BASE_US0, 'P');
}

// ИНИЦИАЛИЗАЦИЯ
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC,AT91C_ID_SYS,6,AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE,
PIT_handler );
AT91F_PITInit ( AT91C_BASE_PITC,100,18432000 );
AT91F_PITEnableInt ( AT91C_BASE_PITC );
AT91F_AIC_EnableIt ( AT91C_BASE_AIC, AT91C_ID_SYS );
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
Сергей Борщ
сообщение May 17 2009, 09:57
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Anton_1000 @ May 17 2009, 10:35) *
В чем моя ошибка?
Мало информации. Не видно кода основного обработчика (того, где происходит ветвление по AIC_IVR).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Anton_1000
сообщение May 17 2009, 10:52
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 13-01-09
Из: г.Севастополь
Пользователь №: 43 288



Явного определения этого регистра в программе нет.
Правильно ли понимаю, что ветвление определяет код в файле SAM7.s компилятора КЕЙЛ.
Vectors LDR PC,Reset_Addr
LDR PC,Undef_Addr
LDR PC,SWI_Addr
LDR PC,PAbt_Addr
LDR PC,DAbt_Addr
NOP ; Reserved Vector
; LDR PC,IRQ_Addr
LDR PC,[PC,#-0xF20] ; Vector From AIC_IVR
; LDR PC,FIQ_Addr
LDR PC,[PC,#-0xF20] ; Vector From AIC_FVR

Reset_Addr DCD Reset_Handler
Undef_Addr DCD Undef_Handler
SWI_Addr DCD SWI_Handler
PAbt_Addr DCD PAbt_Handler
DAbt_Addr DCD DAbt_Handler
DCD 0 ; Reserved Address
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler

Undef_Handler B Undef_Handler
SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B FIQ_Handler
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 17 2009, 11:17
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Ну так вас и спрашивают, как же обработчик прерывания от PIT выглядит? То что вы называете организацией "ветвления" - это организация таблицы векторов прерывания ARM процессора.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 17 2009, 11:29
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Anton_1000 @ May 17 2009, 13:52) *
Явного определения этого регистра в программе нет.
Как это нет? А вот это: LDR PC,[PC,#-0xF20] ; Vector From AIC_IVR
Из этой строки следует, что обработчик у вас описан неправильно: Он должен быть с квалификатором __irq или подобным (поищите в документации на Кейла), и, кроме того, он должен заканчиваться записью в AIC_EIOCR.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Anton_1000
сообщение May 17 2009, 11:30
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 13-01-09
Из: г.Севастополь
Пользователь №: 43 288



Указание на єтот обработчик в функции AT91F_AIC_ConfigureIt

// обработчик прерываний от интервального таймера PIT
void PIT_handler (void)
{ unsigned int status;
//сброс прывания от PIT
status=AT91C_BASE_PITC->PITC_PIVR;
status=status;
// действия при прерывании
AT91F_US_PutChar ( AT91C_BASE_US0, 'P');
}
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 17 2009, 11:59
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Коллега Борщ вам явно указывает, что ваша PIT_handler объявлена неправильно, как void PIT_handler(void), а надо:
void __irq PIT_handler(void).

Вы разницу понимаете? Если не понимаете, то включите в проект пункт генерации ассемблерного листинга и посмотрите, какой код генерит компилятор в обоих случаях.

Вообще, про прерывания в ARM на форуме десятый раз, наверное, все разжевывается.
Go to the top of the page
 
+Quote Post
Anton_1000
сообщение May 17 2009, 13:23
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 13-01-09
Из: г.Севастополь
Пользователь №: 43 288



Спасибо я понял свою ошибку с __irq.
Просто пробовал код из книги Редькина "Микроконтроллеры АРМ7", а там оказалась засада.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 17 2009, 15:31
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Anton_1000 @ May 17 2009, 16:23) *
Спасибо я понял свою ошибку с __irq.
Кроме этого еще должна быть запись в AIC_EIOCR.
Цитата(Anton_1000 @ May 17 2009, 16:23) *
Просто пробовал код из книги Редькина "Микроконтроллеры АРМ7"
Вверху справа есть ссылка поиск по форуму. Наберите там "Редькин".

И еще посмотрите вот это сообщение. Мне почему-то кажется, что в данном случае Редькин не при чем, просто для используемого вами метода обработки (без __irq) вы выбрали не тот стартап.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 07:47
Рейтинг@Mail.ru


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