TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: elgarbe en 03 de Febrero de 2014, 23:27:08
-
Tengo esta función que estoy creando para modificar el duty cicle de 6 canales PWM posible:
void pwm_set_duty(char canal, int on_time){
switch (canal){
case 1: LPC_PWM1->MR1 = on_time; // Actualizo el tiempo que va a estar en ON
break;
case 2: LPC_PWM1->MR2 = on_time;
break;
case 3: LPC_PWM1->MR3 = on_time;
break;
case 4: LPC_PWM1->MR4 = on_time;
break;
case 5: LPC_PWM1->MR5 = on_time;
break;
case 6: LPC_PWM1->MR6 = on_time;
break;
}
LPC_PWM1->LER = 127; // Activo el Latch para tomar en cuenta MR0 a MR6
}
El tema es que estimo podría modifcar el registro MRx usando el dato "canal" usando punteros.
La dirección del MR1 es 0x4001801C y es de 32 bits. Como podría usar punteros para referenciar el registro?
Saludos y gracias!
-
Hola Leo,
lo más directo:
uint32_t * ptrMR1 = 0x4001801C;
para escribir en el contenido del puntero:
*ptrMR1 = on_time;
pero fijate que MR3 y MR4 no son consecutivos en la memoria por lo que veo. Hay dos grupos: MR1, MR2 y MR3 por un lado y MR4, MR5 y MR6 por otro.
Saludos.
-
Hola Leo,
lo más directo:
uint32_t * ptrMR1 = 0x4001801C;
para escribir en el contenido del puntero:
*ptrMR1 = on_time;
pero fijate que MR3 y MR4 no son consecutivos en la memoria por lo que veo. Hay dos grupos: MR1, MR2 y MR3 por un lado y MR4, MR5 y MR6 por otro.
Saludos.
Bien, hasta ahí perfecto, pero como haría el desplazamiento para apuntar al MR correspondiente al canal que he pasado como parámetro?
yo había pensado en
uint32_t * ptrMR = 0x4001801C;
ptrMR += (siezof(uint32_t) * (canal -1));
*ptrMR = on_time;
pero tendría que ver el tema del 3 y el 4... no sé si se justifica cambiar mi código por punteros...
Sds!
-
El incremento del puntero viene dado siempre según el tamaño de la variable a la que apunta.
en este caso, por ejemplo, hacer ptrMR++; incrementa el puntero en 4 bytes, por ser declarado como puntero a un uint32_t.
Un reemplazo del switch podría ser:
if (canal > 0 && canal < 7)
{
uint32_t* ptrMR = (uint32_t*) 0x40018018;
*(ptrMR + canal + (canal>>2) * 6) = on_time;
}
Saludos.