Poprzedni temat «» Następny temat
MSP430 - mruganie diodami
Autor Wiadomość
panicz74 
Nowy na forum


Wiek: 31
Dołączył: 14 Sty 2015
Posty: 1
Skąd: Opole
Wysłany: 2015-01-14, 14:48   MSP430 - mruganie diodami

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

Zadanie:
Kod:
Ć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:

#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???
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  


Powered by phpBB modified by Przemo © 2003 phpBB Group
Strona wygenerowana w 0,02 sekundy. Zapytań do SQL: 10