Инициализирую таймеры
Для изернета, взято из примера
Код
T1MCR = (3 << 0);
T1MR0 = TCNT - 1;
T1TCR = 1;
T1MR0 = TCNT - 1;
T1TCR = 1;
Для АЦП
Код
PINSEL3 |= (3 << 26);
T0MCR = (1 << 4); // MR1: Reset
T0MR1 = 0x00100000;
T0EMR = (1 << 1) | // MAT0.1 P1[29]
(3 << 6); //
T0TCR = 1;
T0MCR = (1 << 4); // MR1: Reset
T0MR1 = 0x00100000;
T0EMR = (1 << 1) | // MAT0.1 P1[29]
(3 << 6); //
T0TCR = 1;
На выходе P1.29 имею меандр, частота управляется (T0MR1).
Инициализирую АЦП, взято из примера
Код
PCONP |= (1 << 12);
AD0CR = ( 0x01 << 0 ) | /* SEL=1,select channel 0~7 on ADC0 */
( ( Fpclk / ADC_Clk - 1 ) << 8 ) | /* CLKDIV = Fpclk / 4000000 - 1 */
( 1 << 16 ) | /* BURST = 1, BURST */
( 0 << 17 ) | /* CLKS = 0, 11 clocks/10 bits */
( 1 << 21 ) | /* PDN = 1, normal operation */
( 0 << 22 ) | /* TEST1:0 = 00 */
( 4 << 24 ) | /* MAT0.1 */
( 1 << 27 ); /* EDGE = 1 */
/* If POLLING, no need to do the following */
AD0INTEN = 0x1FF; /* Enable interrupts */
install_irq( ADC0_INT, (void *)ADC0, HIGHEST_PRIORITY );
AD0CR = ( 0x01 << 0 ) | /* SEL=1,select channel 0~7 on ADC0 */
( ( Fpclk / ADC_Clk - 1 ) << 8 ) | /* CLKDIV = Fpclk / 4000000 - 1 */
( 1 << 16 ) | /* BURST = 1, BURST */
( 0 << 17 ) | /* CLKS = 0, 11 clocks/10 bits */
( 1 << 21 ) | /* PDN = 1, normal operation */
( 0 << 22 ) | /* TEST1:0 = 00 */
( 4 << 24 ) | /* MAT0.1 */
( 1 << 27 ); /* EDGE = 1 */
/* If POLLING, no need to do the following */
AD0INTEN = 0x1FF; /* Enable interrupts */
install_irq( ADC0_INT, (void *)ADC0, HIGHEST_PRIORITY );
Процедура прерывания АЦП, взято из примера
Код
__irq void ADC0 (void) {
IENABLE; /* handles nested interrupt */
val = AD0DR0; // Read A/D Data Register
SendBuff[NumSBuff][cnt] = ((val >> 5) & 0x3FF); // Extract AD00 Value
cnt++;
if (cnt == SENDLEN)
{
cnt = 0;
BuffFull = 1;
NumSBuff ^= 1;
}
IDISABLE;
VICVectAddr = 0;
}
IENABLE; /* handles nested interrupt */
val = AD0DR0; // Read A/D Data Register
SendBuff[NumSBuff][cnt] = ((val >> 5) & 0x3FF); // Extract AD00 Value
cnt++;
if (cnt == SENDLEN)
{
cnt = 0;
BuffFull = 1;
NumSBuff ^= 1;
}
IDISABLE;
VICVectAddr = 0;
}
С АЦП данные идут правильные, проверил в отладчике.
BURST и нулём и единицей делал, запрещал MAT0.1 выходить наружу (PINSEL3 &=~ (3 << 26); ). Ни чего не помогает. Прерываний или вообще нет или они всё забивают.
Дайте пример правильной инициализации АЦП и таймера.
Ещё одно. Таймер для АЦП программирую для инверсии выхода T0EMR = (3 << 6);, следовательно, частота таймера должна быть в два раза больше необходимой частоты отсчёта, т.к. запуск АЦП программируется только на спад или фронт. А как программно изменить состояние MATx.x не знаю?