PDA

Ver la versión completa : [Ayuda] Tengo que programar en C para un micro ARM y me estoy volviendo loco!



Endher
14/10/2011, 00:24
Buenas!

Vereis, para una práctica de la facultad tengo que programar sobre un micro ARM Cortex-M. Llevo toda la noche liado (es que te dan la placa para que te la lleves a casa :D) y me estoy volviendo loco!

Por un lado, tengo que mostrar por pantalla una variable. La función que usamos para mostrar algo por pantalla es:
LCD_GLASS_DisplayString((uint8_t*)"texto");
Pero como neceisto que sea el valor d euna variable y no un texto predefinido, lo cambié por:
LCD_GLASS_DisplayString((uint8_t*)"%d ", c);
Y no aprece que eso sea correcto :D. El caso es que he estado buscando por inernet y no encuentro nada concreto... y con la documentación que me han dado, poco más puedo hacer.

La otra es que tienen que encenderse alternativamente unos leds cuando pulse un botón, pero esto básicamente hace lo que le sale de los cojones :D. Si le pongo que se encienda una cuando no esté pulsado y otra luz cuando lo está, va perfecto. Cuando intento que lo haga de forma alternativa, pasa de mi :D. El código de esa parte es:



#elif defined USE_STM32L_DISCOVERY
/* Check if the User Button is pressed */
int c=0;
if ((GPIOA->IDR & USER_GPIO_PIN) != 0x0)
{

if ((c%2)==0)
{
GPIO_TOGGLE(LD_PORT,LD_BLUE);
c++;

}
else
{
GPIO_TOGGLE(LD_PORT,LD_GREEN);
c++;

}
}
else
{
LCD_GLASS_DisplayString((uint8_t*)"PULSA ");
/* Toggle green LED */
GPIO_TOGGLE(LD_PORT,LD_GREEN);

}

#endif


A ver si alguien me puede echar un cable :D. Gracias :)

Jurk
14/10/2011, 00:29
y si en vez de utilizar %d para mostrar con un printf una variable entera en formato decimal, utilizas la funcion itoa (http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/)??

Malenko
14/10/2011, 00:31
o un sprintf creo que era...

Jurk
14/10/2011, 00:31
Sobre tu segunda pregunta...

cada vez que cambies de estado, enciende una y apaga la otra

#elif defined USE_STM32L_DISCOVERY
/* Check if the User Button is pressed */
int c=0;
if ((GPIOA->IDR & USER_GPIO_PIN) != 0x0)
{

if ((c%2)==0)
{
GPIO_TOGGLE(LD_PORT,LD_BLUE);
GPIO_TOGGLE(LD_PORT,LD_GREEN);
c++;

}
else
{
GPIO_TOGGLE(LD_PORT,LD_GREEN);
GPIO_TOGGLE(LD_PORT,LD_BLUE);
c++;

}
}
else
{
LCD_GLASS_DisplayString((uint8_t*)"PULSA ");
/* Toggle green LED */

}

#endif


------------------------------------

mejor aun



#elif defined USE_STM32L_DISCOVERY
/* Check if the User Button is pressed */
int c=0;
if ((GPIOA->IDR & USER_GPIO_PIN) != 0x0)
{

GPIO_TOGGLE(LD_PORT,LD_BLUE);
GPIO_TOGGLE(LD_PORT,LD_GREEN);

}
else
{
LCD_GLASS_DisplayString((uint8_t*)"PULSA ");
/* Toggle green LED */
GPIO_TOGGLE(LD_PORT,LD_GREEN);

}

#endif

juanvvc
14/10/2011, 00:45
Pues eso, lo que te dice todos: LCD_GLASS_DisplayString() no es tan lista como printf() y no se le pueden pasar formatos.

Si tu entorno incluye la libc (no siempre la incluyen), el código es más o menos:



char buffer[32];
int c=5;
sprintf(buffer, "%d", c); /* sprintf es igual que printf, pero en vez de "imprimir" en pantalla el resultado se mete a una cadena */
LCD_GLASS_DisplayString((uint8_t*)buffer);

Endher
14/10/2011, 00:53
Gracias a todos!

Sobre tu segunda pregunta...

cada vez que cambies de estado, enciende una y apaga la otra

#elif defined USE_STM32L_DISCOVERY
/* Check if the User Button is pressed */
int c=0;
if ((GPIOA->IDR & USER_GPIO_PIN) != 0x0)
{

if ((c%2)==0)
{
GPIO_TOGGLE(LD_PORT,LD_BLUE);
GPIO_TOGGLE(LD_PORT,LD_GREEN);
c++;

}
else
{
GPIO_TOGGLE(LD_PORT,LD_GREEN);
GPIO_TOGGLE(LD_PORT,LD_BLUE);
c++;

}
}
else
{
LCD_GLASS_DisplayString((uint8_t*)"PULSA ");
/* Toggle green LED */

}

#endif


------------------------------------

mejor aun



#elif defined USE_STM32L_DISCOVERY
/* Check if the User Button is pressed */
int c=0;
if ((GPIOA->IDR & USER_GPIO_PIN) != 0x0)
{

GPIO_TOGGLE(LD_PORT,LD_BLUE);
GPIO_TOGGLE(LD_PORT,LD_GREEN);

}
else
{
LCD_GLASS_DisplayString((uint8_t*)"PULSA ");
/* Toggle green LED */
GPIO_TOGGLE(LD_PORT,LD_GREEN);

}

#endif
Esto es para que de un solo toque se enciendan las dos, pero lo que necesito es que al dar el primer toque, se encienda la verda. A la siguiente pulsación, azul. La siguiente, verde. Y así sucesivamente, por eso metí los if-else.


Parece que tu función imprime una cadena, pero no admite modificadores de formato, así que usaría sprintf para generar una variable de cadena con el formato deseado, y luego eso es lo que imprimiría con tu función.
He hecho esto:
char buffer[50];
int b;
b=sprintf(buffer, "%d", c);
LCD_GLASS_DisplayString((uint8_t*)"%d", b);

Pero al tratar de compilarlo me da error, y dice que defino demasiados argumentos en la función LCD_GLASS_DisplayString...

Endher
14/10/2011, 01:05
He probado lo que han puesto juanvvc y civantoz y yeah! Funciona ^^. Mañana a ver si ajusto lo de las luces de las narices :D. Gracias chicos!

Jurk
14/10/2011, 01:06
Gracias a todos!

Esto es para que de un solo toque se enciendan las dos, pero lo que necesito es que al dar el primer toque, se encienda la verda. A la siguiente pulsación, azul. La siguiente, verde. Y así sucesivamente, por eso metí los if-else.


He hecho esto:
char buffer[50];
int b;
b=sprintf(buffer, "%d", c);
LCD_GLASS_DisplayString((uint8_t*)"%d", b);

Pero al tratar de compilarlo me da error, y dice que defino demasiados argumentos en la función LCD_GLASS_DisplayString...


Si no entiendo maal la funcion TOOGLE te cambia el estado del led: si esta encendido lo apaga y si esta apagado lo enciende, verdad?

Entonces si el estado inicial es verde 1, azul 0.... te los intercambiara...

Endher
14/10/2011, 13:08
Si, era lo que dices Jurk :). Me he dado cuenta de que el motivo por el cual hacia lo que le daba la real gana es que por muy rápido que haga la pulsación, el sistema la cuenta como varias. Por eso se comportaba de forma incomprensible y hacía cosas extrañas. ¿Hay alguna manera de regular eso por soft? Gracias :)