nameless 0 26 июля, 2006 Опубликовано 26 июля, 2006 · Жалоба Почему в теле обработчика не видится статус АЦП-а 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 все эти биты выдны сразу.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nameless 0 26 июля, 2006 Опубликовано 26 июля, 2006 · Жалоба Неужели никто не пользовался АЦПом и другой периферией по прерываниям ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 26 июля, 2006 Опубликовано 26 июля, 2006 · Жалоба Почему в теле обработчика не видится статус АЦП-а TWI-я и др.??? while(!((AT91F_ADC_GetStatus(AT91C_BASE_ADC))&(1<<last_ch)));// ВОТ ЗДЕСЬ ЗАТЫК мертвый!!! А в main все эти биты выдны сразу.... Значит надо смотреть что делают эти дивные функции. Поскольку они не являются частью компилятора то о содержании их можно только гадать. А за ожидание внутри обработчика прерывания нужно бить больно. Первое, что приходит в голову - эти функции используют прерывания которые не могут выполнится потому что ты уже в прерывании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nameless 0 26 июля, 2006 Опубликовано 26 июля, 2006 · Жалоба Да нет же....это опрос статуса АЦП (всего лишь) прерываний от АЦП я не разрешаю, да и в main - то ожидаемые биты устанавливаются! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 26 июля, 2006 Опубликовано 26 июля, 2006 · Жалоба Да нет же....это опрос статуса АЦП (всего лишь) прерываний от АЦП я не разрешаю, да и в 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nameless 0 26 июля, 2006 Опубликовано 26 июля, 2006 · Жалоба Вынул содержимое "загадочных" функций - история та же - затык на опросе флажков окончания преобразования в 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tws 0 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба Испольовал АЦП на SAN7A3 с применением запуска по таймеру, PDC и прерываний. Никаких проблем с чтением каких либо регистров не было. Очень может быть, что не всё настроено так, как надо. А, поскольку настройка самого АЦП не приведена, трудно даже предположить, как всё должно работать в донном случае. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться