Я пытаюсь написать код для микроконтроллера msp430g2452. Он должен циклически переключаться между несколькими режимами включения и выключения светодиода с помощью прерывания и оператора switch. Я только начинаю учиться кодировать, c и python :), поэтому я не уверен, что происходит не так.
Насколько я могу судить, все работает нормально, за исключением того, что я не перехватываю прерывание на p1.3, которое является кнопкой на моей панели эмуляции / разработки панели запуска. Если я отлаживаю с помощью code composer studio 5 и приостанавливаю эмуляцию, затем меняю бит для P1IFG.3 и возобновляю эмуляцию, происходит правильная цепочка событий. Поэтому мне кажется, что проблема заключается в захвате этого края переключателя.
Если у кого-то есть идеи относительно того, что здесь происходит, я был бы очень признателен. техническое описание микроконтроллера для тех, кто заинтересован. И код, который я использую, чтобы следовать:
#include <msp430g2452.h>
#define button BIT3 // set button to p1.3
#define grnLED BIT6 // set green led to p1.6
#define redLED BIT0 // set red led to p1.0
volatile unsigned int stateID = 0; // declare and clear stateID
void main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
P1DIR |= (grnLED + redLED); // set bit0 and bit6 to output, led's
P1OUT &= ~(grnLED + redLED); // both led's off
P1IE |= button; // enable interrupts on button
P1REN |= button; // enable pull-up resistor on button
P1IFG &= ~button; // flag for button off
_EINT(); // enable interrupts
// loop forever
while (1){
switch(stateID){ //switch based on state of stateID
case 1:
{
P1OUT = grnLED; //turn green led on
break;
}
case 2:
{
P1OUT = redLED; //turn red led on
break;
}
case 3:
{
P1OUT = (grnLED + redLED); // turn both led's on
break;
}
case 4:
{
stateID = 0; // reset stateID
break;
}
default:
{
P1OUT &= ~(grnLED + redLED); // turn both led's off again
break;
}
}
}
}
// interrupt handler
#pragma vector=PORT1_VECTOR
__interrupt void Port_1 (void){
_DINT(); // disable interrupts to avoid nesting
stateID=(stateID+1); // increment stateID
P1IFG &= ~button; // clear interrupt flag on button
_EINT(); // re-enable interrupts
}
вот фиксированный код
#include <msp430g2553.h>
/* written by: rob j loranger
* date: april 2013
*
* this program should emulate a typical headlamp operation,
* from a power off state one button press should turn on the lamp in mode one.
* each successive press should cycle through modes until it returns to an off state
*
* main.c
*/
#define button BIT3 // set button to p1.3
#define grnLED BIT6 // set green led to p1.6
#define redLED BIT0 // set red led to p1.0
volatile unsigned int stateID = 0; // declare and clear stateID
void main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
P1DIR |= (grnLED + redLED); // set bit0 and bit6 to output, led's
P1OUT &= ~(grnLED + redLED); // both led's off
P1OUT |= button; // set button to output
/* i set button to an output and i set the edge high
* for the interrupt as well.
*/
P1IE |= button; // enable interrupts on button
P1IES |= button; // set edge high
P1REN |= button; // enable pull-up resistor on button
P1IFG &= ~button; // flag for button off
_EINT(); // enable interrupts
/* i then made some changes to my loop to prevent the output
* state on button from being changed
*/
// loop forever
while (1){
switch(stateID){ //switch based on state of stateID
case 1:
{
P1OUT |= grnLED; //turn green led on
break;
}
case 2:
{
P1OUT &= ~grnLED; // turn green led off
P1OUT |= redLED; //turn red led on
break;
}
case 3:
{
P1OUT |= grnLED; // turn green led on, both are on now
break;
}
case 4:
{
stateID = 0; // reset stateID
break;
}
default:
{
P1OUT &= ~(grnLED + redLED); // turn both led's off again
break;
}
}
}
}
// interrupt handler
#pragma vector=PORT1_VECTOR
__interrupt void Port_1 (void){
_DINT(); // disable interrupts to avoid nesting
stateID=(stateID+1); // increment stateID
P1IFG &= ~button; // clear interrupt flag on button
_EINT(); // re-enable interrupts
}