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
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
}