Si está utilizando el oscilador incorporado, no necesita retrasar tanto tiempo durante 15 segundos. En un bucle for
ajustado, creo que una demora de 15 segundos está más cerca de 1500000 bucles. Además, no puedes multiplicar por un número tan grande.
Creo que el otro problema es con su declaración if/else
. Está usando | = en ambos casos, por lo que cuando presiona el botón, no está alternando los bits: BIT0, BIT4, BIT6 y BIT7 eventualmente serán altos. Si puede proporcionar más información sobre lo que está haciendo con todos los bits, y tal vez un diagrama de circuito, eso me ayudará a ayudarlo más.
EDITAR - Para abordar la parte de implementación de retraso de su pregunta, jsolarski ciertamente tiene la mejor solución para el temporizador. Lo examiné un poco más ya que no he usado los temporizadores con el MSP430, y terminé con algunas preguntas propias. Pondré mis hallazgos aquí solo por el bien de la discusión, y espero que jsolarski pueda agregar comentarios donde sea apropiado.
Tienes varias fuentes de reloj central, que incluyen LFXT1CLK, XT2CLK, DCOCLK y VLOCLK. Personalmente, usaré una fuente de reloj interna para mi aplicación y probaré VLOCLK primero.
Una vez que haya seleccionado una fuente de reloj, ahora tiene que determinar dónde se originarán otras tres fuentes de reloj generadas internamente. Estos otros tres relojes son ACLK, MCLK y SMCLK. Convenientemente, VLOCLK es una fuente de reloj válida para los tres. También puede establecer un preescalador para estos relojes, en caso de que no necesite una sincronización de alta velocidad.
Querrá configurar el WDT para usar el modo de intervalo a través de WDTTMSEL. Esto también requiere que establezca un bit WDTIE en IE1. También querrá configurar la fuente de su reloj a través de WDTSSEL y el prescaler a través de WDTISx.
No pude averiguar a qué equivale WDT_MDLY_64
, en función de sus números, pero se espera que no hayas especificado qué fuente de reloj pretendes usar.
Esperamos que esta edición a mi respuesta te haya dado más información sobre cómo configurar el WDT para intervalos, en caso de que decidas intentarlo. Sin embargo, creo que su problema es más fundamental como lo indicó mi respuesta original, con respecto a su uso de |=
, y si usa un ciclo o intervalos ajustados de for
, simplemente no funcionaría.