Elektroda.pl
Elektroda.pl
X

Search our partners

Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

MSP430 (Launch Pad). Zastosowanie Timerów

Mientek007 08 May 2016 20:13 915 4
Texa Poland
  • #1
    Mientek007
    Pupil
    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.
  • Texa Poland
  • #2
    atom1477
    Level 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ę.
  • Texa Poland
  • #3
    Mientek007
    Pupil
    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.




    Code: c
    Log in, to see the code



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

    Pozdrawiam
  • #4
    atom1477
    Level 43  
    Czyli sam nie zrobiłeś nic w sprawie tego Timera?
    No nic. Tutaj masz przykład od samego TI:
    Code: c
    Log in, to see the code


    Ł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.
  • #5
    lehastar
    Level 16  
    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;
        }
     }
    }