Spisu treści:

CZĘŚĆ 2 - MONTAŻ RAMION GPIO - RGB - WYWOŁANIA FUNKCJI - Przełączniki: 6 kroków
CZĘŚĆ 2 - MONTAŻ RAMION GPIO - RGB - WYWOŁANIA FUNKCJI - Przełączniki: 6 kroków

Wideo: CZĘŚĆ 2 - MONTAŻ RAMION GPIO - RGB - WYWOŁANIA FUNKCJI - Przełączniki: 6 kroków

Wideo: CZĘŚĆ 2 - MONTAŻ RAMION GPIO - RGB - WYWOŁANIA FUNKCJI - Przełączniki: 6 kroków
Wideo: Jak wymienić wymiana zamontować montaż tylne ramię wycieraczki 2024, Lipiec
Anonim
CZĘŚĆ 2 - MONTAŻ RAMIENIA GPIO - RGB - WYWOŁANIA FUNKCJI - Przełączniki
CZĘŚĆ 2 - MONTAŻ RAMIENIA GPIO - RGB - WYWOŁANIA FUNKCJI - Przełączniki

W części 1 dowiedzieliśmy się, jak przełączać pojedynczą czerwoną diodę LED na płytce rozwojowej MSP432 LaunchPad firmy Texas Instruments, używając asemblacji zamiast C / C++.

W tej instrukcji zrobimy coś podobnego - sterujemy diodą LED RGB, która również znajduje się na tej samej płycie.

Po drodze mamy nadzieję pogłębić naszą wiedzę na temat montażu ARM, a nie tylko bawić się oświetleniem niektórych diod LED.

Krok 1: Wskoczmy od razu

Naprawdę, pierwszy film mówi wszystko. Niewiele więcej do dodania.

Głównym celem jest urzeczywistnienie idei, że każdy port I/O na MSP432 składa się z bloku adresów „rejestru”, które z kolei składają się z kilku bitów.

Ponadto bity są pogrupowane w sposób ortogonalny. Oznacza to, że bit 0 każdego adresu rejestru odnosi się do tego samego zewnętrznego pinu we/wy.

Powtórzyliśmy pomysł, że potrzeba kilku adresów rejestrów dla tego portu, aby zrobić coś z choćby jednym bitem lub pinem.

Ale w tym przypadku, ponieważ mamy do czynienia z diodą LED RGB, musimy mieć do czynienia z trzema bitami na każdy adres rejestru.

Podkreśliliśmy, że potrzebujemy kilku rejestrów: rejestru DIR, rejestru SEL0, rejestru SEL1 i rejestru OUTPUT. I za każdym razem trzy bity.

Krok 2: Ulepsz kod - Dodaj funkcję

Image
Image

Jak widzieliśmy w powyższym kroku, główna pętla programu miała dużo powtarzającego się kodu, a mianowicie, kiedy wyłączamy diody.

Możemy więc dodać funkcję do programu. Nadal musimy wywoływać tę funkcję za każdym razem, gdy chcemy wyłączyć diody, ale powoduje to zwinięcie części kodu do pojedynczej instrukcji.

Gdyby nasz kod wyłączający diodę LED był bardziej zaangażowany w wiele innych instrukcji, byłby to prawdziwy sposób na oszczędzanie pamięci.

Częścią programowania wbudowanego i mikrokontrolerów jest znacznie większa świadomość rozmiaru programu.

Film wyjaśnia.

Zasadniczo dodajemy instrukcję rozgałęzienia do naszego głównego kodu i mamy kolejny blok kodu, który jest funkcją, do której rozgałęziamy. A kiedy skończymy, lub na końcu funkcji, przechodzimy z powrotem do następnej instrukcji w głównym programie.

Krok 3: Dodaj opóźnienie pętli zajętości

W sekcji Deklaracje kodu dodaj stałą, aby ułatwić dostosowanie do żądanego czasu:

; dowolne słowa po średniku (';') rozpoczynają komentarz.

; kod w tej części przypisuje nazwę do wartości.; mogłeś również użyć „.equ”, ale są one nieco inne.; „.equ” (chyba) nie może zostać zmienione, podczas gdy „.set” oznacza, że możesz; jeśli chcesz, zmień wartość „DLYCNT” w dalszej części kodu.;'DLYCNT' będzie używane jako wartość odliczania w podprogramie opóźnienia. DLYCNT.set 0x30000

Dodaj nową funkcję opóźnienia:

opóźnienie:.asmfunc; początek podprogramu lub funkcji „opóźnienie”.

MOV R5, #DLYCNT; załaduj rejestr rdzenia procesora R5 z wartością przypisaną do „DLYCNT”. pętla dlyloop; oznacza to początek pętli opóźnienia. asembler określa adres. SUB R5, #0x1; odejmij 1 od bieżącej wartości w rejestrze rdzenia procesora R5. CMP R5, #0x0; porównaj bieżącą wartość w R5 z 0. BGT dlyloop; branch, jeśli wartość w R5 jest większa od 0, do etykiety (adresu) 'dlyloop'. BX LR; jeśli dotarliśmy tutaj, oznacza to, że wartość R5 wynosiła 0. powrót z podprogramu..endasmfunc; oznacza koniec podprogramu.

Następnie w głównym ciele, w głównej pętli, wywołaj lub wywołaj tę funkcję opóźnienia:

; jest to fragment kodu głównego ciała lub głównej funkcji (patrz plik 'main.asm').

; jest to pętla w 'main' i pokazuje, jak wywołujemy lub używamy tej nowej funkcji 'delay'.; '#REDON' i '#GRNON' są również deklaracjami (stałymi) (patrz początek 'main.asm').; są po prostu łatwym sposobem na ustawienie określonego koloru LED RGB. pętla MOV R0, #REDON;Czerwony - ustaw rejestr rdzenia procesora R0 o wartości przypisanej do 'REDON'. STRB R0, [R4];rejestr podstawowy R4 był wcześniej ustawiony z adresem wyjścia GPIO.;wpisz to, co jest w R0, pod adres podany przez R4. Opóźnienie BL;rozgałęzienie do nowej funkcji 'delay'. BL ledsoff;odgałęzienie do istniejącej wcześniej funkcji 'ledsoff'. Opóźnienie BL;jak również MOV R0, #GRNON;Zielony - jak również STRB R0, [R4]; i tak dalej. Opóźnienie BL BL ledsoff Opóźnienie BL

Film wchodzi w szczegóły.

Krok 4: Standard wywoływania procedur architektury ARM (AAPCS)

To chyba dobry moment, żeby coś przedstawić. To konwencja w języku asemblera. Znany również jako standard wywoływania procedur dla architektury ARM.

Jest tego wiele, ale to tylko standard. Nie powstrzymuje nas to przed nauką programowania w asemblerze i możemy zaadaptować fragmenty tego standardu na bieżąco, gdy poczujemy się komfortowo z pewnymi koncepcjami, których się uczymy.

W przeciwnym razie możemy poczuć się, jakbyśmy pili z ogromnego węża z wodą. Zbyt wiele informacji.

Rejestry podstawowe

Ponieważ zaznajomiliśmy się z podstawowymi rejestrami MSP432, spróbujmy teraz zaadoptować niektóre z tych standardów. Dostosujemy się do tego, gdy napiszemy następną funkcję (włączanie / wyłączanie diody LED).

1) Powinniśmy używać R0 jako parametru funkcji. Jeśli chcemy przekazać wartość do funkcji (podprogramu), powinniśmy w tym celu użyć R0.

2) Mamy używać rejestru linków zgodnie z jego przeznaczeniem - zawiera adres, który wskazuje, dokąd wrócić po zakończeniu podprogramu.

Zobaczysz, jak je stosujemy.

Krok 5: Funkcja z parametrem - funkcje zagnieżdżone

Możemy wyczyścić nasz kod i zmniejszyć ilość zajmowanej przez niego pamięci, łącząc powtarzające się sekcje w jedną funkcję. Jedyną różnicą w głównej pętli jest to, że potrzebujemy parametru, abyśmy mogli przekazać różne różne kolory diody LED RGB, które chcemy zobaczyć.

Obejrzyj film, aby poznać szczegóły. (przepraszam za długość)

Krok 6: Wejście GPIO - Dodaj przełączniki

Uczyńmy to bardziej interesującym. Czas dodać sterowanie przełącznikami do naszego programu montażowego.

Ta instrukcja zawiera obrazy pokazujące, w jaki sposób dwa przełączniki na płycie są podłączone do MSP432.

Zasadniczo: Przełącznik 1 (SW1 lub S1) jest podłączony do P1.1, a Przełącznik 2 (SW2 lub S2) jest podłączony do P1.4.

To sprawia, że jest to trochę interesujące nie tylko dlatego, że mamy do czynienia z wejściami zamiast z wyjściami, ale także dlatego, że te dwa przełączniki zajmują lub zajmują dwa bity tego samego bloku adresu rejestru, tak jak pojedyncza czerwona dioda LED, która jest wyjściem.

Zajmowaliśmy się przełączaniem pojedynczej czerwonej diody LED w tej instrukcji, więc wystarczy dodać kod do obsługi przełączników.

Blok adresu rejestru portu 1

Pamiętaj, że omówiliśmy je w poprzednim Instructable, ale musimy uwzględnić nowy:

  • Adres rejestru wejściowego portu 1 = 0x40004C00
  • Adres rejestru wyjściowego portu 1 = 0x40004C02
  • Adres rejestru kierunku portu 1 = 0x40004C04
  • Adres rejestru włączenia rezystora portu 1 = 0x40004C06
  • Port 1 Wybierz 0 Adres rejestru = 0x40004C0A
  • Port 1 Wybierz 1 Adres rejestru = 0x40004C0C

Używając portów jako wejść, dobrze jest użyć wewnętrznych rezystorów pull-up lub pull-down MSP432.

Ponieważ płyta rozwojowa Launchpad podłączyła dwa przełączniki do masy (po naciśnięciu LOW), oznacza to, że powinniśmy użyć rezystorów podciągających, aby upewnić się, że mamy stałe WYSOKIE, gdy nie są wciśnięte.

Rezystory podciągające / ściągające

Powiązanie tych wejść przełącznika z rezystorami podciągającymi wymaga dwóch różnych adresów rejestru Portu 1.

1) Użyj rejestru Port 1 Resistor-Enable (0x40004C06), aby wskazać, że chcesz rezystory (dla tych dwóch bitów), 2) a następnie użyj rejestru wyjściowego Port 1 (0x40004C02), aby ustawić rezystory jako podciągane lub podciągane. Może wydawać się mylące, że używamy rejestru wyjściowego na wejściach. Rejestr wyjściowy ma prawie podwójne przeznaczenie.

Tak więc, aby zmienić stan w inny sposób, rejestr wyjściowy może albo wysłać WYSOKI lub NISKI do wyjścia (takiego jak pojedyncza czerwona dioda LED) i / lub jest używany do ustawiania rezystorów podciągających lub obniżających dla wejść, ALE TYLKO jeśli ta funkcja została włączona za pomocą rejestru Resistor-Enable.

Ważne w powyższym przypadku - wysyłając/ustawiając LOW lub HIGH do dowolnego bitu wyjściowego, musisz jednocześnie utrzymywać stan pull-up/pull-down bitów wejściowych.

(film próbuje wyjaśnić)

Odczytywanie bitu wejściowego portu

  • Ustaw SEL0 / SEL1 dla funkcjonalności GPIO
  • Ustaw rejestr DIR jako wejście dla bitów przełącznika, ale jako wyjście dla diody LED (jednocześnie w tym samym bajcie)
  • Włącz rezystory
  • Ustaw je jako rezystory podciągające
  • Przeczytaj port
  • Możesz filtrować odczytaną wartość, aby wyizolować tylko potrzebne bity (przełącznik 1 i 2)

Zalecana: