logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

MSP430FG4618 - Mruganie diodami LED z przerwaniem od Basic Timera

panicz74 14 Sty 2015 14:52 3444 0
REKLAMA
  • #1 14329220
    panicz74
    Poziom 13  
    Bardzo proszę was o pomoc bo już mi witki opadają. Co robię źle w tym programie? Nikt nie potrafi mi pomóc.

    Zadanie:
    [syntax]
    Ć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[/code]

    Moje rozwiązanie (poniekąd nieoptymalne i nie działa):
    [syntax]
    #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
    }
    [/syntax]
    Może ktoś wie jak to zrobić inaczej???
  • REKLAMA
REKLAMA