Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

MSP430 (Launch Pad). Zastosowanie Timerów

Mientek007 08 Maj 2016 20:13 666 4
  • #1 08 Maj 2016 20:13
    Mientek007
    Uczeń

    Witam.
    Programuję układ MSP430G2553 (LaunchPad).
    Robię coś w rodzaju zamka szyfrowego. Obsługę klawiatury 3x3 już zrobiłem, działa bez zarzutów.

    To, co pozostało do zrobienia to timery.
    Zaprogramowanie czasu 5 minut po wprowadzeniu poprawnego kodu oraz po 3-krotnym wprowadzeniu złego kodu blokadę na powiedzmy 30 minut.

    Niestety, potrzeba mi tutaj pomoc.
    Jest to mój pierwszy program, który piszę na mikrokontroler. Nie jestem w stanie poradzić sobie z timerami, a w internecie raczej ciężko dostać jasny i klarowny opis jak skonfigurować timery na określony czas w MSP430.

    Dlatego proszę o pomoc. Fajnie by było jakby mi to ktoś pomógł zrobić, dał jasne instrukcje co i jak należy zrobić (lub ewentualnie mogę przesłać kod programu, żeby ktoś zrobił a w komentarzach opisał co i jak).

    Kodu programu nie chcę tutaj umieszczać, gdyż program ten prawdopodobnie będzie wykorzystany również w pracy dyplomowej, a każda praca przechodzi przez programy anty plagiatowe. Dlatego kodu nie chcę umieszczać. CHętnie wyślę jednak na PW osobie, która we jak zaprogramować timery.

    Pozdrawiam i z góry dziękuję za pomoc.

    0 4
  • #2 08 Maj 2016 20:30
    atom1477
    Poziom 43  

    Ja programowałem MSP430 a w tym oczywiście Timery też.
    Ale nie wyobrażam sobie pomocy za pomocą PW.
    Jakieś kawałki kodu mógł byś tutaj mieścić. Nazwy rejestrów procesora czy ify nie są zastrzeżone. Jak antyplagiat wywali zgodność w taki miejscu to promotor może pójść do dziekanatu i załatwić żeby tego nie brali pod uwagę.

    0
  • #3 08 Maj 2016 21:42
    Mientek007
    Uczeń

    Oto fragment kodu programu.
    Zmienne KEY_1, KEY_2, KEY_3, KEY_4 służą do przechowywania kolejno wpisanych liczb z klawiatury.
    Po podaniu 4 cyfr z klawiatury, zmienna "sprawdzenie" przyjmuje wartość 1 i następuje sprawdzenie poprawności wpisanego kodu. Jezeli kod jest poprawny, to zrealizują się komendy zawarte w "if".
    Jest tam między innymi komenda P1OUT|=BIT6.
    Zależy mi, aby P1OUT|=BIT6 był załączany na czas 5 minut.




    Kod: c
    Zaloguj się, aby zobaczyć kod



    Umiałby ktoś ustawić odpowiednią konfigurację timera na 5 minut i powiedzieć krok po kroku jak to się robi?

    Pozdrawiam

    0
  • #4 09 Maj 2016 09:50
    atom1477
    Poziom 43  

    Czyli sam nie zrobiłeś nic w sprawie tego Timera?
    No nic. Tutaj masz przykład od samego TI:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Łatwo przerobić większe czasy.
    Całość odliczania można też zrobić inaczej niż tutaj (bez usypiania). Wystarczy wywalić te funkcje włączające i wyłączające tryb oszczędzania energii LPM3.
    Można też nie przerabiać funkcji odliczającej na większe czasy, tylko ustawić ją na stałe na np. 1s. Ale zamiast tego zrobić żeby pracowała ciągle.
    A w przerwaniu TimerB_ISR po prostu dodatkowo zliczać czas. Czyli zliczać te sekundy.
    Dać licznik co będzie zliczał, i jak zliczy 300 sekund to znaczy żeby minęło 5 minut.
    Tak jest nawet prościej bo łatwo sterować zliczaniem (można w trakcie zliczania z innego miejsca programu łatwo ingerować w sposób zliczania).
    W każdym razie, skoro na razie nie miałeś z tym w ogóle do czynienia, to po prostu pobaw się funkcjami które przedstawiłem.
    Najwięcej nauczysz się samemu coś modyfikując i sprawdzając, niż pytając o każdy szczegół tutaj.

    0
  • #5 09 Maj 2016 15:36
    lehastar
    Poziom 14  

    Code:

    #define TIMERA_DIVIDER      2
    #define SYSTEM_TICK         10
    #define TIMERA_INT_PERIOD   (XTAL/TIMERA_DIVIDER/(1000/SYSTEM_TICK))   
    #define TIME_DOOR_OPEN      (5*60*(1000/SYSTEM_TICK))
    #define TIME_BRAK_CODE      (30*60*(1000/SYSTEM_TICK))

    u32_t timer;

    void TIMER1_Init(void)
    {
      TACCR0 = TIMERA_INT_PERIOD;
      TACCTL0 = CCIE;
      TACTL = TASSEL_2 + MC_1 + ID_1;
    }


    #pragma vector=TIMERA0_VECTOR
    __interrupt  void TIMERA0_Interrupt(void)
    {
      Correct_Main_Timers();
    }

    void Correct_Main_Timers(void)
    {
      if(timer != 0) timer--;
    }

    int main( void )
    {
      System_Init();

      __enable_interrupt();

      while(1)
      {
        switch (state)
        {
        case READY:
          switch (Check_Code())
          {
          case GOOD:
            Door_Open();
            timer = TIME_DOOR_OPEN;
            state = DOOR_OPEN;
            break;

          case BAD:
            timer = TIME_BRAK_CODE;
            state = BRAK_CODE;
            break;
          }
          break;

        case DOOR_OPEN:
          if(timer == 0)
          {
            Door_Close();
            state = READY;
          }
          break;

        case BRAK_CODE:
          if(timer == 0)
          {
            state = READY;
          }
          break;
        }
     }
    }

    0