Estoy intentando usar el DTC para actualizar continuamente una variable sin la intervención de la CPU. Sin embargo, no estoy obteniendo ningún resultado y no puedo entender por qué. Cualquier ayuda sería apreciada.
Aquí está el método para inicializar el DTC:
void initializeDTC(unsigned int channel,unsigned int *pointer){
// Disable ADC before configuration.
ADC10CTL0 &= ~ENC;
// Turn ADC on in single line before configuration.
ADC10CTL0 = ADC10ON;
// Set channel, Use SMCLK, 1/8 Divider, Repeat single channel.
ADC10CTL1 = channel | ADC10SSEL_3 | ADC10DIV_7 | CONSEQ_2;
// 0 clock ticks, Use Reference, Reference on, ADC On, Multi-Sample Conversion, Interrupts enabled.
ADC10CTL0 |= ADC10SHT_1 | SREF_1 | REFON | MSC;
// Put results at specified place in memory.
ADC10SA = (int)pointer;
// Only one conversion at a time.
ADC10DTC1 = 0x01;
// Repeat conversion.
ADC10DTC0 = ADC10CT;
// Start conversion.
ADC10CTL0 |= ENC | ADC10SC;
// I've read that trying to start the conversion twice is necessary.
ADC10CTL0 |= ENC | ADC10SC;
}
Lo llamo así:
unsigned int temperature;
initializeDTC(INCH_10,&temperature);
// Do stuff with temperature in a loop.
Si he entendido la documentación correctamente, después de cada conversión, el ADC debería iniciar la siguiente conversión debido al bit MSC
. Al mismo tiempo, el DTC debe transferir el valor de ADC10MEM
al valor en la dirección en ADC10SA
(el valor de mi puntero). El valor de mi variable temperature
permanece en el valor predeterminado de lo que había en la memoria anteriormente (35 mil y algo para mí).
Consideré la posibilidad de que el DTC no haya finalizado antes de la siguiente conversión, pero la documentación indica que el DTC tendrá un máximo de 4% de ciclos de MCLK
. En mi aplicación, I SMCLK
= MCLK
y como la conversión toma 8 SMCLK
ciclos, debería estar bien a este respecto.