MSP430 - mruganie diodami

Forum pasjonatów mikrokontrolerów MSP430.
ODPOWIEDZ
panicz74
-
Posty: 1
Rejestracja: 14 sty 2015, 14:42
Lokalizacja: Opole

MSP430 - mruganie diodami

Post autor: panicz74 » 14 sty 2015, 14:48

Bardzo proszę was o pomoc bo już mi witki opadają. Co robię źle w tym programie? Nikt nie potrafi mi pomóc.

Zadanie:

Kod: Zaznacz cały

Ćwiczenie  Nr 3 /Elektrotechnika

Napisać program dla mikrokontrolera MSP430FG4618, który w przerwaniu od Basic Timera – mruga jedną
z diod LED podłączonych do portu P2 (P2.1 i P2.2). Czas pomiędzy zmianą stanu na diodach LED to:

0,1 s
0,2 s
0,3 s
0,4 s
0,55 s
0,6 s
0,7 s
0,8 s
0,9 s
1,05 s
1,1 s
1,2 s
1,3 s
1,4 s

Dodatkowo jeden z mikrostyków podłączonych do portu P1 (P1.0 lub P1.1) ma za zadanie włączanie
lub wyłączanie mrugania diodą. Do tego celu należy wykorzystać przerwanie zewnętrzne od portu P1.
W programie głównym należy przejść do trybu oszczędzania energii LPM3.

Przykładowy program: msp430xG46x_P1_02.c i msp430xG46x_bt_01.c
Moje rozwiązanie (poniekąd nieoptymalne i nie działa):

Kod: Zaznacz cały

#include  <msp430xG46x.h>
int i=0;
int flaga=0;
void main(void)
{
 
  WDTCTL = WDTPW + WDTHOLD;                 //zatrzymanie watchdoga
 

  FLL_CTL0 |= XCAP18PF;                     //Set load cap for 32k xtal
 
 

  P2DIR |= 0x02;                            //piny na wyjscia
  P1DIR &= 0xFC;                            //piny na wejscia
  P2OUT &= 0x06;                            //zerowanie stanów wyjść
  BTCTL = BT_ADLY_2;                        //ustawienie wywołań basic timera
  IE2 |= BTIE;                              //przerwanie od basic timera
  P1IE |= 0x01;                             //przerwanie od przycisku
  P1IES |= 0x01;                            //reakcja na przerwania od przerwania
  P1IFG &= ~0x01;                           //zerowanie flagi
 

  _BIS_SR(LPM3_bits + GIE);                 
  
}
 

// Basic Timer Interrupt Service Routine
#pragma vector=BASICTIMER_VECTOR                   //podprogram przerwania obsługi
__interrupt void basic_timer_ISR(void)
 

{
  i=i+1;                 
  if(i==525)
  {
if (flaga==0)
    {
      P2OUT ^= 0x02;
    }
else
    {
      P2OUT&=~0x02;                        //jeśli flaga zero migaj diodą jeśli nie wyłącz wyjście diody
    }                                            
      i=0;                                 //zerowanie zmiennej odpowiadającej za zliczanie wywołań basic timera
  }                                              // Toggle P2.1                                                 
}
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR (void)          //przerwanie od przycisku
{
  if (flaga==0)
  {
    flaga = 1;                             //zmiana flagi na na stan przeciwny za każdym wywołaniem przerwania od przycisku
  }                            
  else if (flaga==1)
  {
    flaga =0;
  }
  P1IFG &= ~0x01;                          //wyzerowanie flagi przerwania
}
Może ktoś wie jak to zrobić inaczej???

ODPOWIEDZ