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 - Obsługa przerwań, nie działa program

Mientek007 04 Kwi 2016 21:13 546 5
  • #1 04 Kwi 2016 21:13
    Mientek007
    Uczeń

    Witam.
    Niestety program który chcę napisać nie działa już w początkowej fazie. Nie wiem dlaczego, dlatego proszę aby ktoś na to zerknął i powiedział co jest nie tak.

    Generalnie program ma działać tak, że po wciśnięciu przycisku program leci do przerwania, w przerwaniu sprawdza czy przyciśnięcie było krótkie lub długie, po czym ustawia odpowiednią zmienną (KEY == 1 (krótkie) lub KEY == 10 (długie))

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Analizowałem działanie programu w pracy krokowej.
    Program w pętli głównej programu (czyli for(;;)) nie chce sprawdzać raz za razem warunków "if". Przejdzie do drugiego warunku i na nim stoi (nie przechodzi do górnego warunku... ).
    I to jest chyba główny problem.

    Ktoś wie dlaczego?
    Pozdrawiam

    0 5
  • #2 04 Kwi 2016 22:05
    BlueDraco
    Specjalista - Mikrokontrolery

    Po pierwsze, przerwania portów w zasadzie nie mogą być używane do wykrywania zmiany stanu przycisku.

    Po drugie, każda lini portu jest domyślnei wejściem, więc linia:
    P1DIR &=~ BIT3;
    jest bez sensu.

    Po trzecie, najpierw konfiguruje się przerwanie, a potem je włącza, a nie odwrotnie.

    Po czwarte, KEY nie powinna być pisana wielkii literami, bo to nie makro i, i powinna być typu _Bool ew. uint8_t.

    Po piąte - w deklaracji KEY brakuje magicznego słowa na "v". Bez tego nie zadziała.

    0
  • #3 04 Kwi 2016 22:31
    Mientek007
    Uczeń

    1. Przerwanie ma tylko stwierdzić czy nastapiło krótkie czy długie wciśnięcie na podstawie ilości cykli (wiem, że powinno być na timerze, ale tak daleko jeszcze nie jestem).
    Chyba tak można zrobić, no nie?

    2. No rozumiem, ale to chyba nie jest jakiś wielki błąd?

    3. W moim kodzie przecież najpierw jest deklaracja.
    P1IE = BIT3;
    P1IES = BIT3;
    A włączenie następuje później w programie
    (No chyba że ja to źle rozumiem, całkiem możliwe)

    4. OK, key z małych liter. Czy jednak nie może to być zmienna typu int?

    5. void? Czyli że jakoś w funkcji to zrobić czy jak?

    Sorry za być może głupie pytania, ale dopiero co się uczę i jeszcze nie wszystko do końca rozumiem

    Dodano po 16 [minuty]:

    Zrobiłem uproszczoną wersję programu, bez zmiennych pomocniczych, oraz tylko rozpoznawanie krótkiego wciśnięcia przycisku.

    Tak to wygląda:

    Kod: c
    Zaloguj się, aby zobaczyć kod




    Problem jest taki, że jeżeli jest komenda
    Kod: c
    Zaloguj się, aby zobaczyć kod
    To program nie działa
    Natomiast jeżeli dam
    Kod: c
    Zaloguj się, aby zobaczyć kod
    (lub dowolna inna liczba)- program działa.

    Dlaczego tak się dzieje?
    Gdzie jest przyczyna, że przy bardziej złożonym if'ie program nie działa?

    0
  • #4 04 Kwi 2016 22:32
    BlueDraco
    Specjalista - Mikrokontrolery

    ad 1. Przerwanie jest na ogół zgłaszane przy zmianie stanu przycisku, chyba, że w MSP430 jest inaczej - już ponad 6 lat tego nie programowałem.

    ad 3. To nie są żadne deklaracje,a instrukcje. Pierwsza włącza przerwanie portu, druga je konfiguruje.

    ad. 4. Czemu nie double? Jest jeszcze dłuższa i wygląda jeszcze poważniej.

    ad. 5. Nie, nie void, ale też na "vo". Bez tego nie zadziała.

    0
  • #5 04 Kwi 2016 22:51
    Mientek007
    Uczeń

    Dzięki wielkie.

    volatile unsigned int

    To robię resztę poprawek, choć program już działa

    0
  • #6 05 Kwi 2016 10:44
    Radek
    Poziom 13  

    BlueDraco napisał:

    Po czwarte, KEY nie powinna być pisana wielkii literami


    Warto byłoby jeszcze dodać, że jest to pewna konwencja, a nie wymóg języka. Więc składniowo zarówno KEY jak i key jest poprawne, ponadto oba nie są tożsame - mogłyby być użyte w programie jednocześnie, choć byłoby "brzydko".

    0