Estoy aprendiendo a codificar en un microcontrolador de Texas Instruments, MSP430FR6969 ( enlace ), usando la plataforma de lanzamiento MSP-EXP430FR6969 ( enlace ).
También estoy usando un IDE CCS 6.1.0 ( enlace ).
Estoy haciendo un odómetro simple, donde el programa cuenta de 0 a 99 999 y luego se reinicia nuevamente.
código a continuación
#include <msp430.h>
#define DEVELOPMENT 0x5A80
#define ENABLE_PINS 0xFFFE
int main(void)
{
WDTCTL = DEVELOPMENT;//disable WDT
PM5CTL0 = ENABLE_PINS;//this is needed in order to enable pins
P1DIR = 0x01;//P1.1 is output
P1OUT = 0x00;//port 1 = 0x00
unsigned int tnth, thou, hund, tens, ones;
unsigned long km = 0;
while(1)
{
for(tnth = 0;tnth < 10;tnth++)
{
for(thou = 0;thou<10;thou++)
{
for(hund = 0;hund<10;hund++)
{
for(tens = 0;tens<10;tens++)
{
for(ones = 0;ones<10;ones++)
{
km = 10000*tnth + 1000*thou + 100*hund +10*tens+
ones;
}
}
}
}
}
P1OUT = ~P1OUT;//I added a breakpoint there.
km = 0;
}
return 0;
}
Agregué un punto de interrupción en P1OUT = ~P1OUT;
, lo construí y lo depuré como en la imagen a continuación.
Cuando el depurador alcanza el punto de interrupción, veo en la ventana de visualización de variables unidades, decenas, centenas, mil y tnth todas iguales a 10, que es lo que espero.
Pero también esperaba km = 99999
, en cambio tengo km = 34463
, lo cual no tiene sentido ya que km
es ununsigned long
También.
Cuando modifico el código y cambio unsigned int tnth, thou, hund, tens, ones
a signed int
, coloco un punto de interrupción en P1OUT = ~P1OUT
la compilación y la depuración me aparece km = 4294936223
en la ventana de visualización de variables.
Hice la pregunta en el foro de TI ( enlace ), y un miembro dijo que en mi compilación
"../main.c", línea 16: advertencia #552-D: se configuró la variable "km" pero nunca se usó
Amablemente ayúdame en este asunto, y perdón por la larga publicación.
Su MSP430 es una máquina de 16 bits, por lo que el compilador lo hace (10000*tnth)
como una multiplicación de números de 16 bits y trunca el resultado a 16 bits antes de continuar con el resto del cálculo.
10000 * 9 = 90000 = 0x15F90
truncate to 16-bits = 0x5F90 = 24464
24464 + 9999 = 34463
Si convierte la constante entera de 10000 a 32 bits con algo como 10000UL
y/o convierte la variable con (unsigned long)tnth
debería ver los resultados esperados.
Se espera la advertencia para 'la variable "km" se configuró pero nunca se usó'.
Está asignando valores a km
, pero nunca los vuelve a leer ni los usa km
de ninguna otra manera, pero esto no tiene nada que ver con su comportamiento no deseado.
Cuando cambió su tipo de datos de 16 bits de sin firmar a firmado, lo que sucede es que el valor 34463 (0x869F) se trata como un valor negativo de 16 bits de -31073 (ya que el MSB es un 1).
Al convertir esto en un valor de 32 bits, primero se extiende el signo a un valor con signo de 32 bits, por lo que ahora es 0xFFFF869F.
Pero dado que está colocando esto en una variable entera de 32 bits sin signo, este valor ahora se representa como 4294936223.
km > 4000000
, no debería obtener 34463
también?unsigned int tnth
a int tnth
90,000 seguirá siendo 24465, lo que debería darmekm = 34463
tyler