Autor Tema: Como mejorar este codigo usando punteros  (Leído 2883 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Como mejorar este codigo usando punteros
« 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!
-
Leonardo Garberoglio

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Como mejorar este codigo usando punteros
« Respuesta #1 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Como mejorar este codigo usando punteros
« Respuesta #2 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!
-
Leonardo Garberoglio

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Como mejorar este codigo usando punteros
« Respuesta #3 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything