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

MSP430 - Jak dobierać sygnały zegarowe i ich źródła?

Honndo 18 Mar 2013 20:37 4293 19
  • #1 12079351
    Honndo
    Poziom 10  
    Witam,
    dość niedawno zacząłem zabawę z mikrokontrolerem MSP430. Jest to mój pierwszy uC i powoli na nim ćwiczę wszystkie podstawy. Przeanalizowawszy wszystkie przykłady z diodami i przerwaniami przyszedł czas na ustawianie sygnałów zegarowych.

    Co wiem na tym etapie?
    - mamy trzy typy sygnałów zegarowych (MCLK, SMCLK, ACLK )
    - do każdego z nich można podpiąć jedno ze źródeł LFXT1CLK, XT2CLK, DCOCLK, VLOCLK

    I tutaj rodzi się moje pierwsze pytanie. Jak dobierać typy sygnały,jego źródło i dlaczego tak a nie inaczej?

    I kolejna rzecz. Znalazłem przykładowe programy, których treść była następująca. "Zmianę częstotliwości pracy MCLK można dokonać na dwa sposoby:
    1) Poprzez zmianę prędkości DCO,
    2) Poprzez zmianę wartości dzielnika MCLK"

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Jak dla mnie to są to dwa i te same programy. Jak powinny być napisane, aby były one zgodne z treścią?
  • #2 12079789
    BlueDraco
    Specjalista - Mikrokontrolery
    Zegary dobierasz do zastosowania. W zastosowaniach nie-energooszczędnych pędzisz wszystko z jednego - najczęściej jest to szybki oscylator zewnętrzny XT2CLK. Prz zasilaniu bateryjnym wszystko zależy od cyklu budzenia, wymaganych częstotliwości pracy, czasu odpowiedzi m wymaganej dokładności - ie ma tu jednej recepty.

    Na początek proponuję użyć jednego źródła przebiegu zegarowego do wszystkiego. Jak już przećwiczysz wszystkie peryferia, wtedy zacznij zabawy z zegarem.

    Te dwa przykłady to prawdopodobnie pomyłka autora. Dopóki nie musisz nic dzielić - użyj XT2CLK bez podzielnika do wszystkiego.
  • #3 12079792
    alagner
    Poziom 26  
    Launchpad i G2553? CCS czy GCC? Tak czy siak, z tego co pamiętam to:
    DCOLCK to jest wewnętrzny oscylator.
    LFXT to skrót od low freq xtal, czyli kwarc 'zegarkowy', który może stosowany przy wymaganym niskim poborze mocy.

    Co do konfiguracji tego - zajrzyj do do SLAU144i + plików nagłówkowych Texasa (obojętne czy z CCS czy GCC, w dużej mierze są kompatybilne). TI robi to - jak dla mnie przynajmniej - dość dziwnie, tzn. pozwala korzystać z iluś predefiniowanych zegarów. Popatrz do pliku odpowiedzialnego Twój egzemplarz procka, to wszystko stanie się jasne.

    Pzdr.
  • #4 12079908
    Honndo
    Poziom 10  
    Mój model to MSP430G2553.

    Program, który właśnie piszę ma na celu zwykłe, naprzemienne mruganie diodami: żadna, czerwona, zielona, czerwona + zielona. Zmiana koloru następują poprzez przerwanie zewnętrzne gdzie w moim przypadku jest to przycisk. I ten fragment programu mam napisany i działa mi bez zarzutu.
    Teraz chciałbym do tego dorzucić timer.
  • #5 12080088
    alagner
    Poziom 26  
    Draco, ale w Launchpadzie chyba nie ma XT2 ;)
  • #6 12145411
    Honndo
    Poziom 10  
    BCSCTL1 = CALBC1_1MHZ | DIVA_0; // Set range ACLK/1

    mógłby mi ktoś wytłumaczyć dlaczego tutaj ustawiamy ACLK?

    Dodano po 1 [godziny] 37 [minuty]:

    Pytanie nieaktualne już sam doszedłem do odpowiedzi...

    BCSCTL1 = CALBC1_1MHZ | DIVA_0; // Set range ACLK/1

    to, że ustawiamy zakres ACLK możemy wnioskować z tego, że mamy DIVA. Gdybyśmy ustawiali MCLK linia kodu wyglądałaby następująco:

    BCSCTL1 = CALBC1_1MHZ | DIVM_0;

    To w ramach wyjaśnienia, gdyby ktoś miał podobne wątpliwości.
  • #7 12179191
    Honndo
    Poziom 10  
    Potrzebuje dobrze ustawić Timer w trybie up. Szczególnie interesuje mnie jak skonfigurować wektor przerwania.
  • #8 12179348
    alagner
    Poziom 26  
    A z czym konkretnie jest problem?
  • #9 12179408
    Honndo
    Poziom 10  
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Mniej więcej doszedłem do tego czego chciałem. Teraz np. chciałbym ustawić, żeby dioda mrugała co 1s. Jak to zrobić?
  • #10 12179463
    BlueDraco
    Specjalista - Mikrokontrolery
    W obsłudze przerwania inkremementujesz licznik od 0 do wartości równej połowie częstotliwości przerwań, a po osięgnięciu tej wartośc zmieniasz stan diody i zerujesz licznik. Ew. odwrotnie - inicjujesz licznik na tę wartość, dekrementujesz, po osiągnięciu zera przeładowujesz licznik i migasz.
  • #11 12179491
    Honndo
    Poziom 10  
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Ten kod edytowałem pod swoje zadanie. Chodzi o to, że diody mają mrugać i ma zmieniać się stan mrugania po wciśnięciu przycisku czyli takie konfiguracje: zielona, czerwona, obie, żadna.
    Teraz kod wykonuje się w ten sposób, że diody mrugają niezauważalnie czyli program jest wykonywany bardzo szybko i robią to samowolnie. Obsługa przerwania od przycisku w ogóle nie działa.
    Gdzie jest błąd?
  • #12 12179505
    alagner
    Poziom 26  
    albo ustawiasz inną (większą) wartość PER i odpowiednio używasz Compare Mode dla innego kanału.
    EDIT: dodaj dla tych d1 i d2 atrybut volatile.
  • #13 12179554
    BlueDraco
    Specjalista - Mikrokontrolery
    Błędy są wszędzie. Pierwszy - to użycie przerwania zmiany portu zamiast sprawdzania stanu przycisków w przerwaniu timera. Drugi - to użycie delay w przerwaniu. Trzeci - to źle napisane if else w przerwaniu timera. Czwarty - użycie własnego bool zamiast standardowego _Bool. To tak na początek.
  • #14 12179580
    Honndo
    Poziom 10  
    Cytat:
    Pierwszy - to użycie przerwania zmiany portu zamiast sprawdzania stanu przycisków w przerwaniu timera.

    tego nie rozumiem

    Cytat:
    Drugi - to użycie delay w przerwaniu.
    Czwarty - użycie własnego bool zamiast standardowego _Bool.

    gdy program był napisany bez użycia timerów to tak napisany działał bez zarzutów i z if też nie było problemu
  • #15 12179720
    alagner
    Poziom 26  
    Klawisz się sprawdza w przerwaniu timera z uwagi na drgania styków, to raz.
    Dwa (zakładając, że masz filtry RC na klawiszach) - gdzie kasujesz flagę przerwania od portu (klawisza). One się nie czyszczą przy wejściu do przerwania.

    Bool a _Bool - w AVR gcc jest <stdbool.h> który należy zainclude'ować. Nie pamiętam jak tutaj.

    pzdr.
  • #16 12180172
    Honndo
    Poziom 10  
    Ale ja mam zainkuludowany <stdbool.h>...

    W wektorze przerwania od przycisku dodałem zerowanie flagi i program działa tak jak powinien a diody mrugają według ustalonego schematu, kompilator nie wyrzuca żadnego błędu.
  • #17 12180369
    alagner
    Poziom 26  
    stdbool.h przeoczyłem, sorry.

    to teraz przejdź z Debuga na Release i zobacz czy nadal wszystko działa, imho raczej się posypie, bo d1 i d2 powinny być volatile.
    A tak w ogóle: kompilator masz z CodeComposera, czy MSPGCC? Bo jak ten pierwszy, to owszem, i bez volatile'a może podziałać, defaultowe opcje optymalizacji puszczają tam takie cuda, ale to nie jest dobra praktyka.
    No i wywal z przerwania delay, tak się nie pisze po prostu. Po to jest przerwanie, żeby działało szybko.
  • #18 12180649
    Honndo
    Poziom 10  
    Ja korzystam z IAR.

    Bez Delay czasem mi przeskakuje i zamiast zapalać diody: cz, ziel, obie, żadna działa następująco: cz, obie, cz... drgania styków więc opóźnienie musi być.
  • #20 12181040
    Honndo
    Poziom 10  
    Ale ja sprawdzam stan przycisków i mimo to występuje takie zjawisko.

    if (P1IFG & 0x08){
REKLAMA