Перейти к содержанию
    

SAM7 + IAR

Почему в теле обработчика не видится статус АЦП-а 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 все эти биты выдны сразу....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

А в main все эти биты выдны сразу....

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да нет же....это опрос статуса АЦП (всего лишь) прерываний от АЦП я не разрешаю, да и в main - то ожидаемые биты устанавливаются!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

__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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вынул содержимое "загадочных" функций - история та же - затык на опросе флажков окончания преобразования в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Испольовал АЦП на SAN7A3 с применением запуска по таймеру, PDC и прерываний. Никаких проблем с чтением каких либо регистров не было.

Очень может быть, что не всё настроено так, как надо. А, поскольку настройка самого АЦП не приведена, трудно даже предположить, как всё должно работать в донном случае.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...