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

 
 
 
Reply to this topicStart new topic
> SAM7 + IAR, прерывания нужна помощь...
nameless
сообщение Jul 26 2006, 07:06
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 9-07-04
Пользователь №: 305



Почему в теле обработчика не видится статус АЦП-а TWI-я и др.???

__arm void timer0_c_irq_handler(void)
{
u32 dummy;
dummy = AT91C_BASE_TC0 -> TC_SR;//Acknowledge interrupt status
dummy = dummy;//Suppress warning <<variable "dummy" was set but never used>>
timer0_int_counter++;
AT91C_BASE_PIOA -> PIO_ODSR = (u32)(timer0_int_counter<<31);//ODSR write

AT91F_ADC_StartConversion(AT91C_BASE_ADC);
while(!((AT91F_ADC_GetStatus(AT91C_BASE_ADC))&(1<<last_ch)));// ВОТ ЗДЕСЬ ЗАТЫК мертвый!!!

STATUS[7] = (u8)(AT91F_ADC_GetConvertedDataCH4(AT91C_BASE_ADC));
STATUS[8] = (u8)((AT91F_ADC_GetConvertedDataCH4(AT91C_BASE_ADC)) >> 8);

AT91C_BASE_AIC -> AIC_EOICR = AT91C_ID_TC0;
}
//******************************************************************************
void timer0_init(void)
{
unsigned int dummy;
AT91C_BASE_PMC -> PMC_PCER = 1 << 12;//Enable the clock of the timer0 module ([PMC_PCER]: id = 12)
AT91C_BASE_TC0 -> TC_CCR = 1 << 1;//Disable clock [TC_CCR\CLKDIS {p366}] =1
AT91C_BASE_TC0 -> TC_IDR = 0x000000FF;//Disable all interrupts[TC_IDR {p379}]
dummy = AT91C_BASE_TC0 -> TC_SR;//Clear all status by read [TC_SR {p376}]
dummy = dummy;//Suppress warning variable "dummy" was set but never used
AT91C_BASE_TC0 -> TC_CMR = (1 << 14)|4;//CLKI[3]=0;BURST[5:4]=0;LDBSTOP[6]=0;
//LDBDIS[7]=0;ETRGEDG[9:8]=0;ABETRG[10]=0;CPCTRG[14]=1;WAVE[15]=0;
//LDRA[17:16]=0;LDRB[19:18]=0
AT91C_BASE_TC0 -> TC_CCR = 1 << 0;//Enable clock [TC_CCR\CLKEN {p366}] =1
AT91C_BASE_TC0 -> TC_RC = 46875;//Period/MCK/1024 = 46875 (48 MHz / 1024 / 46875 = 1 sec)
void (*handler)(void);
handler = timer0_c_irq_handler;
AT91C_BASE_AIC -> AIC_IDCR = (1 << 12);//Disable the interrupt on the interrupt controller
AT91C_BASE_AIC -> AIC_SVR[12] = (unsigned int)handler;//Interrupt handler routine pointer
AT91C_BASE_AIC -> AIC_SMR[12] = (1 << 0)|(1 << 5);//(priority =1);[AIC_SMR\SRCTYPE]=0 (Level sensitive)
AT91C_BASE_AIC -> AIC_ICCR = (1 << 12);//[AIC_ICCR\PID12 {p146}]Clear the interrupt
AT91C_BASE_TC0 -> TC_IER = (1 << 4 ); //[TC_IER\CPCS[4]]=1 (RC Compare IRQ enable)
AT91C_BASE_AIC -> AIC_IECR = (1 << 12);//Interrupt enable [AIC_IECR\PID12 {p145}]=1
AT91C_BASE_AIC -> AIC_ISCR = (1 << 12);//Generate interrupt by software [AIC_ISCR\PID12 {p147}]=1
AT91C_BASE_TC0 -> TC_CCR = (1 << 2 );//Start timer [TC_CCR\SWTRG {p366}] =1
}

А в main все эти биты выдны сразу....
Go to the top of the page
 
+Quote Post
nameless
сообщение Jul 26 2006, 07:21
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 9-07-04
Пользователь №: 305



Неужели никто не пользовался АЦПом и другой периферией по прерываниям ???
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 26 2006, 07:58
Сообщение #3


Гуру
******

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



Цитата(nameless @ Jul 26 2006, 10:06) *
Почему в теле обработчика не видится статус АЦП-а TWI-я и др.???

while(!((AT91F_ADC_GetStatus(AT91C_BASE_ADC))&(1<<last_ch)));// ВОТ ЗДЕСЬ ЗАТЫК мертвый!!!

А в main все эти биты выдны сразу....
Значит надо смотреть что делают эти дивные функции. Поскольку они не являются частью компилятора то о содержании их можно только гадать.

А за ожидание внутри обработчика прерывания нужно бить больно. Первое, что приходит в голову - эти функции используют прерывания которые не могут выполнится потому что ты уже в прерывании.


--------------------
На любой вопрос даю любой ответ
"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
nameless
сообщение Jul 26 2006, 08:11
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 9-07-04
Пользователь №: 305



Да нет же....это опрос статуса АЦП (всего лишь) прерываний от АЦП я не разрешаю, да и в main - то ожидаемые биты устанавливаются!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 26 2006, 08:17
Сообщение #5


Гуру
******

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



Цитата(nameless @ Jul 26 2006, 11:11) *
Да нет же....это опрос статуса АЦП (всего лишь) прерываний от АЦП я не разрешаю, да и в main - то ожидаемые биты устанавливаются!
Ну так опубликуйте код этой функции. А еще лучше вместе с ассемблерным листингом этого цикла.


Цитата(nameless @ Jul 26 2006, 10:06) *
__arm void timer0_c_irq_handler(void)
{
u32 dummy;
dummy = AT91C_BASE_TC0 -> TC_SR;//Acknowledge interrupt status
dummy = dummy;//Suppress warning <<variable "dummy" was set but never used>>
Вот здесь возможна проблема. Т.е. warning может и изчезнет, но вместе с ним и чтение TC_SR.
предлагаю
volatile u32 dummy;
dummy = AT91C_BASE_TC0 -> TC_SR;//Acknowledge interrupt status


--------------------
На любой вопрос даю любой ответ
"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
nameless
сообщение Jul 26 2006, 08:35
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 9-07-04
Пользователь №: 305



Вынул содержимое "загадочных" функций - история та же - затык на опросе флажков окончания преобразования в ADC_SR. Что странно: устанавливаются флажки PDC в ADC_SR, чего в main-е нет...

__arm void timer0_c_irq_handler(void)
{
volatile u32 dummy;
dummy = AT91C_BASE_TC0 -> TC_SR;
dummy = dummy;
timer0_int_counter++;
AT91C_BASE_ADC -> ADC_CR = AT91C_ADC_START;//0x02
while(!(( (AT91C_BASE_ADC -> ADC_SR))&(1<<last_ch)));//last_ch = 0x05
STATUS[7] = (u8)(AT91F_ADC_GetConvertedDataCH4(AT91C_BASE_ADC));
STATUS[8] = (u8)((AT91F_ADC_GetConvertedDataCH4(AT91C_BASE_ADC)) >> 8);
AT91C_BASE_AIC -> AIC_EOICR = AT91C_ID_TC0;
}


АСМ:

__arm void timer0_c_irq_handler(void)
{
timer0_c_irq_handler:
00000C70 E52DE004 STR LR, [SP, #-4]!
00000C74 E24DD004 SUB SP, SP, #0x4
dummy = AT91C_BASE_TC0 -> TC_SR; //Acknowledge interrupt status
00000C78 E59F1134 LDR R1, [PC, #+308] ; [0xDB4] =TC0_SR (0xFFFA0020)
00000C7C E5911000 LDR R1, [R1, #+0]
00000C80 E58D1000 STR R1, [SP, #+0]
dummy = dummy;
00000C84 E59D1000 LDR R1, [SP, #+0]
00000C88 E58D1000 STR R1, [SP, #+0]
timer0_int_counter++;
00000C8C E59F0068 LDR R0, [PC, #+104] ; [0xCFC] =timer0_int_counter (0x200028)
00000C90 E59F1064 LDR R1, [PC, #+100] ; [0xCFC] =timer0_int_counter (0x200028)
00000C94 E5911000 LDR R1, [R1, #+0]
00000C98 E2911001 ADDS R1, R1, #0x1
00000C9C E5801000 STR R1, [R0, #+0]
AT91C_BASE_ADC -> ADC_CR = AT91C_ADC_START;//0x02
00000CA0 E59F0058 LDR R0, [PC, #+88] ; [0xD00] =ADC_CR (0xFFFD8000)
00000CA4 E3A01002 MOV R1, #0x2
00000CA8 E5801000 STR R1, [R0, #+0]
while(!(( (AT91C_BASE_ADC -> ADC_SR))&(1<<last_ch)));//last_ch = 0x05
00000CAC E59F0050 LDR R0, [PC, #+80] ; [0xD04] =ADC_SR (0xFFFD801C)
00000CB0 E5900000 LDR R0, [R0, #+0]
00000CB4 E3100020 TST R0, #0x20
00000CB8 0AFFFFFB BEQ 0x000CAC
STATUS[7] = (u8)(AT91F_ADC_GetConvertedDataCH4(AT91C_BASE_ADC)); //
00000CBC E59F003C LDR R0, [PC, #+60] ; [0xD00] =ADC_CR (0xFFFD8000)
00000CC0 EB00003F BL AT91F_ADC_GetConvertedDataCH4::??rA ; 0xDC4
00000CC4 E59F103C LDR R1, [PC, #+60] ; [0xD08] =0x20043F
00000CC8 E5C10000 STRB R0, [R1, #+0]
STATUS[8] = (u8)((AT91F_ADC_GetConvertedDataCH4(AT91C_BASE_ADC)) >> 8); //
00000CCC E59F002C LDR R0, [PC, #+44] ; [0xD00] =ADC_CR (0xFFFD8000)
00000CD0 EB00003B BL AT91F_ADC_GetConvertedDataCH4::??rA ; 0xDC4
00000CD4 E1B00420 MOVS R0, R0, LSR #8
00000CD8 E59F102C LDR R1, [PC, #+44] ; [0xD0C] =0x200440
00000CDC E5C10000 STRB R0, [R1, #+0]
AT91C_BASE_AIC -> AIC_EOICR = AT91C_ID_TC0; //see Forum_reports and {p171}
00000CE0 E3E000CF MVN R0, #0xCF
00000CE4 E3C00EE0 BIC R0, R0, #0xE00
00000CE8 E3A0100C MOV R1, #0xC
00000CEC E5801000 STR R1, [R0, #+0]
}
00000CF0 E28DD004 ADD SP, SP, #0x4
00000CF4 E49DE004 LDR LR, [SP], #+4
00000CF8 E12FFF1E BX LR
00000CFC 00200028 EOREQ R0, R0, R8, LSR #32
00000D00 FFFD8000 SWINV 0xFD8000
00000D04 FFFD801C SWINV 0xFD801C
00000D08 0020043F EOREQ R0, R0, PC, LSR R4
00000D0C 00200440 EOREQ R0, R0, R0, ASR #8
Go to the top of the page
 
+Quote Post
tws
сообщение Aug 3 2006, 13:26
Сообщение #7





Группа: Новичок
Сообщений: 2
Регистрация: 12-02-06
Пользователь №: 14 255



Испольовал АЦП на SAN7A3 с применением запуска по таймеру, PDC и прерываний. Никаких проблем с чтением каких либо регистров не было.
Очень может быть, что не всё настроено так, как надо. А, поскольку настройка самого АЦП не приведена, трудно даже предположить, как всё должно работать в донном случае.
Go to the top of the page
 
+Quote Post

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

 


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


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