TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: elgarbe en 03 de Febrero de 2014, 23:27:08

Título: Como mejorar este codigo usando punteros
Publicado 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:

Código: [Seleccionar]
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!
Título: Re: Como mejorar este codigo usando punteros
Publicado por: BrunoF en 04 de Febrero de 2014, 00:43:54
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.
Título: Re: Como mejorar este codigo usando punteros
Publicado por: elgarbe en 04 de Febrero de 2014, 07:11:14
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!
Título: Re: Como mejorar este codigo usando punteros
Publicado por: BrunoF en 04 de Febrero de 2014, 11:45:18
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.