Spisu treści:

Samouczek asemblera AVR 9: 7 kroków
Samouczek asemblera AVR 9: 7 kroków

Wideo: Samouczek asemblera AVR 9: 7 kroków

Wideo: Samouczek asemblera AVR 9: 7 kroków
Wideo: Лекция 4. Архитектура AVR. Ассемблер 2024, Lipiec
Anonim
Samouczek asemblera AVR 9
Samouczek asemblera AVR 9

Witamy w samouczku 9.

Dzisiaj pokażemy, jak sterować zarówno wyświetlaczem 7-segmentowym, jak i wyświetlaczem 4-cyfrowym za pomocą naszego kodu języka asemblera ATmega328P i AVR. W trakcie tego będziemy musieli zorientować się, jak używać stosu, aby zmniejszyć liczbę rejestrów, które musimy powiązać. Dodamy kilka kondensatorów (filtrów dolnoprzepustowych), aby spróbować zredukować szumy na naszej klawiaturze. Stworzymy wzmacniacz napięcia z kilku tranzystorów, aby nasz przełącznik przerwań INT0 działał lepiej dla przycisków niższego napięcia w dolnym rzędzie klawiatury. I będziemy trochę walić głową w ścianę, próbując uzyskać odpowiednie rezystory, aby wszystko działało poprawnie.

Będziemy używać naszej klawiatury z samouczka 7

Aby wykonać ten samouczek, oprócz standardowych rzeczy, będziesz potrzebować:

  1. 7-segmentowy wyświetlacz

    www.sparkfun.com/products/8546

  2. 4-cyfrowy wyświetlacz

    www.sparkfun.com/products/11407

  3. Przycisk

    www.sparkfun.com/products/97

  4. Arkusze danych dla wyświetlacza, które można pobrać z odpowiednich stron, do których prowadzą linki powyżej.
  5. Kondensator ceramiczny 68 pf, kilka kondensatorów 104, wiązka rezystorów, dwa tranzystory 2N3904 NPN.

Oto link do pełnej kolekcji moich samouczków asemblera AVR:

Krok 1: Okablowanie wyświetlacza 7-seg

Okablowanie wyświetlacza 7-seg
Okablowanie wyświetlacza 7-seg
Okablowanie wyświetlacza 7-seg
Okablowanie wyświetlacza 7-seg
Okablowanie wyświetlacza 7-seg
Okablowanie wyświetlacza 7-seg

Użyjemy tego samego kodu, którego użyliśmy w samouczku 7, aby klawiatura sterowała wyświetlaczem 7-segmentowym. Musisz więc zrobić kopię tego, a my to zmodyfikujemy.

Zmapujemy segmenty na piny naszego mikrokontrolera w następujący sposób:

(dp, g, f, e, d, c, b, a) = (PD7, PD6, PB5, PB4, PB3, PB2, PB1, PB0)

gdzie litery segmentów są pokazane na rysunku wraz z pinoutem odpowiadającym wspólnemu 5V i każdym z segmentów LED wraz z kropką dziesiętną (dp) w prawym dolnym rogu wyświetlacza. Powodem tego jest to, że możemy wprowadzić całą liczbę do jednego rejestru i wyprowadzić rejestr do portów B i D, aby podświetlić segmenty. Jak widać, bity są ponumerowane kolejno od 0 do 7, dzięki czemu będą mapowane do właściwych pinów bez konieczności ustawiania i kasowania poszczególnych bitów.

Jak widać po kodzie dołączonym w następnym kroku, przenieśliśmy naszą procedurę wyświetlania do makra i zwolniliśmy piny SDA i SCL do wykorzystania w przyszłości w następnym samouczku.

Dodam, że pomiędzy wspólną anodą wyświetlacza a szyną 5V trzeba włożyć rezystor. Jak zwykle wybrałem rezystor 330 omów, ale jeśli chcesz, możesz obliczyć minimalną rezystancję potrzebną do uzyskania maksymalnej jasności wyświetlacza bez smażenia. Oto jak to zrobić:

Najpierw spójrz na arkusz danych i zauważ, że na pierwszej stronie podaje różne właściwości wyświetlacza. Ważnymi wielkościami są „Prąd przewodzenia” (I_f = 20 mA) i „Napięcie przewodzenia” (V_f = 2,2 V). Mówią one, że chcesz, aby spadek napięcia na wyświetlaczu był równy, jeśli prąd jest równy prądowi przewodzenia. Jest to maksymalny prąd, jaki wyświetlacz przyjmie bez smażenia. W konsekwencji jest to również maksymalna jasność, jaką można uzyskać z segmentów.

Użyjmy więc prawa Ohma i reguły pętli Kirchoffa, aby dowiedzieć się, jaki minimalny opór musielibyśmy połączyć szeregowo z wyświetlaczem, aby uzyskać maksymalną jasność. Reguła Kirchoffa mówi, że suma zmian napięcia wokół zamkniętej pętli w obwodzie jest równa zeru, a prawo Ohma mówi, że spadek napięcia na oporniku o rezystancji R wynosi: V = I R gdzie I jest prądem płynącym przez opornik.

Tak więc przy napięciu źródła V i obejściu naszego obwodu mamy:

V - V_f - I R = 0

co oznacza (V - V_f)/I = R. Czyli opór potrzebny do uzyskania maksymalnej jasności (i prawdopodobnie smażenia segmentów) wynosiłby:

R = (V - V_f)/I_f = (5,0 V - 2,2 V)/0,02 A = 140 omów

Więc jeśli chcesz, możesz bez obaw korzystać z 150 omów. Myślę jednak, że 140 omów sprawia, że jest zbyt jasny jak na mój gust, dlatego używam 330 omów (co jest rodzajem mojej osobistej odporności na Złotowłosą dla diod LED)

Krok 2: Kod montażu i wideo

Załączam kod montażowy oraz film pokazujący działanie manipulatora z wyświetlaczem. Jak widać, po prostu zmapowaliśmy klawisz ponownego wybierania na „r”, klawisz flash na „F”, gwiazdkę na „A” i znak krzyża na „H”. Można je przypisać do różnych operacji, takich jak Backspace, Enter i inne, jeśli chcesz nadal używać klawiatury do wpisywania cyfr na wyświetlaczach LCD lub wyświetlaczach 4-cyfrowych. Tym razem nie będę przechodził przez kod wiersz po wierszu, ponieważ jest on bardzo podobny do tego, co już zrobiliśmy w poprzednich samouczkach. Różnice to głównie po prostu więcej tych samych rzeczy, które już umiemy robić, takich jak przerwania i tablice przeglądowe. Powinieneś po prostu przejrzeć kod i przyjrzeć się nowym rzeczom, które dodaliśmy, i rzeczom, które zmieniliśmy, i stamtąd to rozgryźć. Powrócimy do analizy linia po linii w następnym samouczku, kiedy przedstawimy nowe aspekty kodowania w języku asemblera na mikrokontrolerach AVR.

Spójrzmy teraz na 4-cyfrowy wyświetlacz.

Krok 3: Okablowanie 4-cyfrowego wyświetlacza

Podłączanie 4-cyfrowego wyświetlacza
Podłączanie 4-cyfrowego wyświetlacza
Podłączanie 4-cyfrowego wyświetlacza
Podłączanie 4-cyfrowego wyświetlacza

Zgodnie z arkuszem danych 4-cyfrowy wyświetlacz ma prąd przewodzenia 60 mA i napięcie przewodzenia 2,2 wolta. Tak więc, według tych samych obliczeń, co poprzednio, mógłbym użyć rezystora 47 omów, gdybym chciał. Zamiast tego użyję… hrm.. zobaczę… co powiesz na 330 omów.

Sposób podłączenia 4-cyfrowego wyświetlacza polega na tym, że są 4 anody, po jednej dla każdej cyfry, a pozostałe piny kontrolują, który segment jest włączany w każdej z nich. Możesz wyświetlać 4 cyfry jednocześnie, ponieważ są one multipleksowane. Innymi słowy, tak jak w przypadku pary kości, po prostu przełączamy zasilanie kolejno przez każdą z anod, a one będą migać jedna po drugiej. Zrobi to tak szybko, że nasze oczy nie zobaczą mrugania i będzie wyglądało na to, że wszystkie cztery cyfry są włączone. Jednak, dla pewności, sposób, w jaki to zakodujemy, polega na ustawieniu wszystkich czterech cyfr, a następnie cyklowaniu anod, a nie ustawianiu, przesuwaniu, ustawianiu, przesuwaniu itp. W ten sposób możemy uzyskać dokładny czas między zapaleniem każdej cyfry.

Na razie przetestujmy, czy wszystkie segmenty działają.

Umieść rezystor 330 omów między dodatnią szyną płytki stykowej a pierwszą anodą na wyświetlaczu. Arkusz danych mówi nam, że piny są ponumerowane od 1 do 16 w kierunku przeciwnym do ruchu wskazówek zegara, zaczynając od dolnego po lewej stronie (kiedy normalnie patrzysz na wyświetlacz… z kropkami dziesiętnymi na dole) i stwierdza, że anody mają numery pinów 6., 8, 9 i 12.

Więc podłączamy pin 6 do 5V, a następnie bierzemy ujemny przewód z szyny GND i wtykamy go do wszystkich pozostałych pinów i widzimy, że wszystkie segmenty zapalają się na cyfrze, której odpowiada (która jest w rzeczywistości drugą cyfrą z prawo). Upewnij się, że zaświeciły się wszystkie 7 segmentów i kropka dziesiętna.

Teraz włóż przewód GND do jednego z pinów, aby zapalić jeden z segmentów, a tym razem przesuń rezystor do pozostałych 3 anod i zobacz, że ten sam segment zapala się w każdej z pozostałych cyfr.

Coś niezwykłego?

Okazuje się, że pinezka w arkuszu danych jest błędna. Dzieje się tak, ponieważ jest to arkusz danych i pinout dla 12-pinowego, 4-cyfrowego wyświetlacza. Tj. jeden bez dwukropka lub górnego przecinka dziesiętnego. Wyświetlacz, który otrzymałem przy zamówieniu to 16-pinowy, 4-cyfrowy wyświetlacz. W rzeczywistości, w moim, anody segmentowe znajdują się na pinach 1, 2, 6 i 8. Anoda dwukropka to pin 4 (styk katody 12), a górna anoda dp to pin 10 (katoda to pin 9)

Ćwiczenie 1: Użyj rezystora i przewodu uziemiającego, aby zmapować, który pin odpowiada jakiemu segmentowi i przecinkowi dziesiętnemu na wyświetlaczu, abyśmy otrzymali właściwe segmenty zapalające się podczas kodowania.

Sposób, w jaki chcemy zakodować mapę segmentów jest dokładnie taki, jak zrobiliśmy to z jednocyfrowym 7-segmentowym wyświetlaczem powyżej -- nie musimy niczego zmieniać w kodzie, zmieniamy tylko sposób podłączenia przewodów na pokładzie. Wystarczy podłączyć właściwy pin portu na mikrokontrolerze do odpowiedniego pinu na 4-cyfrowym wyświetlaczu tak, aby np. PB0 nadal szedł do pinu odpowiadającego segmentowi a, PB1 do segmentu B itd.

Jedyna różnica polega na tym, że teraz potrzebujemy 4 dodatkowych pinów do anod, ponieważ nie możemy już po prostu przejść do szyny 5V. Potrzebujemy mikrokontrolera, aby zdecydować, która cyfra otrzyma sok.

Więc użyjemy PC1, PC2, PC3 i PD4 do sterowania anodami 4 cyfr.

Równie dobrze możesz iść dalej i podłączyć przewody. (nie zapomnij o rezystorach 330 omów na przewodach anodowych!)

Krok 4: Kodowanie 4-cyfrowego wyświetlacza

Kodowanie 4-cyfrowego wyświetlacza
Kodowanie 4-cyfrowego wyświetlacza

Zastanówmy się, jak chcemy zakodować ten wyświetlacz.

Chcielibyśmy, aby użytkownik naciskał przyciski na klawiaturze i aby numery pojawiały się sekwencyjnie na wyświetlaczu po naciśnięciu każdego przycisku. Więc jeśli nacisnę 1, a następnie 2, pojawi się na wyświetlaczu jako 12. Chciałbym również zapisać tę wartość, 12, do użytku wewnętrznego, ale przejdziemy do tego nieco później. Na razie chcę tylko napisać nowe makro, które pobiera twoje naciśnięcia klawiszy i wyświetla je. Ponieważ jednak mamy tylko 4 cyfry, chcę się upewnić, że pozwala to wpisać tylko cztery liczby.

Inną kwestią jest to, że sposób, w jaki działa multipleksowany 4-cyfrowy wyświetlacz, polega na przełączaniu anod tak, aby każda cyfra była włączona tylko przez ułamek sekundy, zanim wyświetli następną, a następnie następną i wreszcie z powrotem do pierwszej itd. Potrzebuję sposobu, aby to zakodować.

Chcemy również, aby przesunął „kursor” w prawo o spację, gdy wpisujemy następną cyfrę. Tak więc, jeśli chcę na przykład wpisać 1234, po wpisaniu 1, kursor przesunie się tak, że następna cyfra, którą wpiszę, pojawi się na następnym wyświetlaczu 7-segmentowym i tak dalej. Podczas gdy to się dzieje, nadal chcę widzieć, co wpisałem, więc nadal musi przewijać cyfry i wyświetlać je.

Brzmi jak trudne zadanie?

Rzeczywiście jest jeszcze gorzej. Potrzebujemy 4 rejestrów ogólnego przeznaczenia, których możemy użyć do przechowywania bieżących wartości 4 cyfr, które chcemy wyświetlić (jeśli mamy je przeglądać, musimy je gdzieś przechowywać), a problem polega na tym, że mamy używamy rejestrów ogólnego przeznaczenia jak szalony i jeśli nie będziemy uważać, nie będziemy mieć żadnych. Więc prawdopodobnie dobrym pomysłem jest rozwiązanie tego problemu raczej wcześniej niż później i pokazanie, jak zwolnić rejestry za pomocą stosu.

Zacznijmy więc od uproszczenia, użyj stosu i zwolnij trochę rejestrów, a następnie spróbujemy wykonać zadanie odczytania i wyświetlenia naszych liczb na 4-cyfrowym wyświetlaczu.

Krok 5: Push 'n Pop

Push 'n pop
Push 'n pop

Do dyspozycji mamy tylko kilka „Rejestrów ogólnego przeznaczenia”, a po ich wykorzystaniu nie ma już więcej. Tak więc dobrą praktyką programistyczną jest używanie ich tylko dla kilku zmiennych, które są używane jako tymczasowe przechowywanie, które są potrzebne do odczytu i zapisu do portów i pamięci SRAM, lub te, które będą potrzebne w podprogramach wszędzie i tak Nazwij je. Więc to, co zrobiłem, teraz, gdy zainicjalizowaliśmy się i uczymy się korzystać ze stosu, to przejrzenie kodu i znalezienie nazwanych rejestrów ogólnego przeznaczenia, które są używane tylko wewnątrz pojedynczego podprogramu lub przerwania i nigdzie indziej w kodzie i zastąpienie je z jednym z naszych rejestrów temp oraz push i pop na stos. W rzeczywistości, jeśli spojrzysz na kod napisany dla mniejszych mikrokontrolerów, lub jeśli cofniesz się w czasie, kiedy wszystkie chipy były mniejsze, zobaczysz tylko kilka rejestrów ogólnego przeznaczenia, które musiały być używane do wszystkiego, więc nie możesz po prostu zapisz tam wartość i zostaw ją w spokoju, ponieważ na pewno będziesz potrzebować tego rejestru do innych rzeczy. Więc zobaczysz pchanie i trzaskanie w całym kodzie. Może powinienem nazwać nasze tymczasowe rejestry ogólnego przeznaczenia AX i BX jako wyraz szacunku dla tych minionych dni.

Przykład pomoże to wyjaśnić.

Zauważ, że w naszym przerwaniu konwersji analogowo-cyfrowej ADC_int używamy rejestru ogólnego przeznaczenia, który nazwaliśmy buttonH, którego użyliśmy do załadowania wartości ADCH i porównania jej z naszą tablicą wyszukiwania konwersji analogowych na naciśnięcie przycisku. Używamy tego przycisku H rejestru tylko w podprogramie ADC_int i nigdzie indziej. Zamiast tego użyjemy naszej zmiennej temp2, której używamy jako zmiennej tymczasowej, której możemy użyć w ramach dowolnego podprogramu a jej wartość nie wpłynie na nic poza tym podprogramem (tzn. wartość, którą podamy w ADC_int nie będzie nigdzie użyta w przeciwnym razie).

Innym przykładem jest nasze makro opóźnienia. Mamy rejestr, który nazwaliśmy "milisekundami", który zawiera nasz czas opóźnienia w milisekundach. W tym przypadku jest to makro i pamiętamy, że sposób działania makra polega na tym, że asembler umieszcza cały kod makra w miejscu programu, w którym jest wywoływane. W tym przypadku chcielibyśmy pozbyć się zmiennej "milisekundy" i zastąpić ją jedną z naszych zmiennych tymczasowych. W tym przypadku zrobię to nieco inaczej, aby pokazać, że nawet jeśli wartość zmiennej będzie potrzebna gdzie indziej, nadal możemy jej użyć, używając stosu. Więc zamiast milisekund używamy "temp" i aby nie schrzanić innych rzeczy, które również używają wartości temp, po prostu zaczynamy makro "opóźnienie" od "wpychania" temp na stos, a następnie go używamy zamiast milisekund, a następnie na końcu makra „zrzucamy” jego poprzednią wartość z powrotem ze stosu.

Wynik netto jest taki, że „pożyczyliśmy” temp i temp2 do tymczasowego użytku, a następnie przywróciliśmy je do poprzednich wartości po zakończeniu.

Oto procedura przerwania ADC_int po wprowadzeniu tej zmiany:

ADC_int:

naciśnij temp; zapisz temp, ponieważ modyfikujemy go tutaj push temp2; zapisz temp2 lds temp2, ADCH; załaduj naciśnięcie klawisza ldi ZH, high(2*cyfry) ldi ZL, low(2*cyfry) cpi temp2, 0 breq return; jeśli wyzwalacze hałasu nie zmieniają się 7segnumber setkey: lpm temp, Z+; obciążenie z tabeli i przyrostu po clc cp temp2, temp; porównaj naciśnięcie klawisza z tabelą brlo PC+4; jeśli ADCH jest niższy, spróbuj ponownie lpm 7segnumber, Z; w przeciwnym razie załaduj tabelę par kluczy inc digit; zwiększ liczbę cyfr rjmp return; i powrót adiw ZH:ZL, 1; przyrost Z rjmp setkey; i wróć do góry powrót: pop temp2; przywrócić temp2 pop temp; przywrócić temp. reti

Zauważ, że sposób działania stosu polega na tym, że pierwszy włączony jest ostatnim wyłączonym. Zupełnie jak stos papierów. Widzisz, że w naszych pierwszych dwóch wierszach odkładamy wartość temp na stos, następnie wstawiamy temp2 na stos, potem używamy ich w podprogramie do innych rzeczy, a na koniec przywracamy je do poprzednich wartości ponownie przez najpierw popping temp2 off (ponieważ był ostatnim, który został wciśnięty, znajduje się na szczycie stosu i będzie pierwszym, który wyskoczymy), a następnie popping temp.

Więc od teraz zawsze będziemy używać tej metody. Jedynym przypadkiem, w którym faktycznie wyznaczymy rejestr dla czegoś innego niż zmienna temp, jest sytuacja, w której będziemy jej potrzebować wszędzie. Na przykład rejestr o nazwie „przepełnienia” to taki, którego używamy w kilku różnych miejscach w programie i dlatego chcielibyśmy nadać mu nazwę. Oczywiście nadal moglibyśmy używać go tak, jak zrobiliśmy to z temp i temp2, ponieważ przywrócimy jego wartość po zakończeniu. Ale to by zbytnio spaghetti. Są one nazwane nie bez powodu, a dla tego stanowiska mamy już wyznaczone temp i temp2.

Krok 6: Filtry dolnoprzepustowe i wzmacniacz napięcia

Filtry dolnoprzepustowe i wzmacniacz napięcia
Filtry dolnoprzepustowe i wzmacniacz napięcia
Filtry dolnoprzepustowe i wzmacniacz napięcia
Filtry dolnoprzepustowe i wzmacniacz napięcia

Aby trochę oczyścić szum i poprawić działanie naszej klawiatury, chcemy dodać kilka filtrów dolnoprzepustowych. Odfiltrowują one szumy o wysokiej częstotliwości i przepuszczają sygnał o niskiej częstotliwości. Zasadniczo sposobem na to jest po prostu dodanie kondensatora 68 pf między naszym wejściem analogowym a masą, a także kondensatora 0,1 mikrofarada (tj. 104) między naszym przerwaniem PD4 (INT0) a masą. Jeśli pobawisz się nimi, naciskając przyciski na klawiaturze, będziesz mógł zobaczyć, co robią.

Następnie chcemy zrobić wzmacniacz napięcia. Okazuje się, że dolny rząd klawiszy na manipulatorze (a także klawisz ponownego wybierania) podaje zbyt niskie napięcie, aby wyzwolić przerwanie INT0. Port analogowy jest wystarczająco czuły, aby odczytać niskie napięcia z tych klawiszy, ale nasz pin przerywający nie ma wystarczająco dobrej krawędzi narastającej, aby przerwać, gdy naciskamy te klawisze. Dlatego chcielibyśmy mieć jakiś sposób na upewnienie się, że ładne zbocze narastające napięcia uderza w PD4, ale to samo niskie napięcie uderza w ADC0. Jest to dość wysokie zamówienie, ponieważ oba sygnały pochodzą z tego samego przewodu wyjściowego naszej klawiatury. Istnieje wiele wyrafinowanych sposobów, aby to zrobić, ale po tym samouczku nie będziemy już używać naszej klawiatury, więc po prostu połączmy ze sobą metodę, która działa (ledwo).

Należy najpierw podłączyć zewnętrzny przycisk zastępujący przerwanie INT0 i sterować wyświetlaczem przytrzymując klawisz na klawiaturze i klikając przycisk. Ma to mniej problemów z klawiaturą i daje pewność, że napięcia są prawidłowo ustawione w tabeli przeglądowej klawiatury. Gdy już wiesz, że klawiatura jest prawidłowo okablowana, pozbądź się przycisku i przywróć przerwanie INT0. Istnieje kilka poważnych problemów z zakłóceniami i napięciem sterującym manipulatorem w ten sposób, więc dobrze jest wiedzieć, że wszystko działa, aby przyszłe problemy można było odizolować od klawisza INT0.

Kiedy podłączysz klawiaturę i wzmacniacz napięciowy, jest bardzo prawdopodobne, że te same wartości rezystorów, których użyłem, nie zadziałają. Więc będziesz musiał poeksperymentować, aby uzyskać wartości, które działają dla Ciebie.

Jeśli spojrzysz na schemat, który dołączyłem do tego kroku, zobaczysz, jak będzie działał wzmacniacz napięciowy. Używamy kilku rezystorów i dwóch tranzystorów. Sposób działania tranzystorów (patrz arkusze danych!) polega na tym, że istnieje minimalne napięcie, które należy wprowadzić do styku bazy na tranzystorze (środkowy styk), co spowoduje jego nasycenie i umożliwi przepływ prądu między stykiem kolektora a emiterem Szpilka. W przypadku tranzystora 2N3904, którego tu używamy, napięcie wynosi 0,65V. Teraz pobieramy to napięcie z naszego wyjścia z klawiatury i nie chcemy zmieniać tego wyjścia, więc wstawimy duży rezystor między wyjście z klawiatury a bazę pierwszego tranzystora (użyłem 1Mohm). Na schemacie oznaczyłem to jako R_1. Następnie chcemy ustawić dzielnik napięcia, aby baza tranzystora miała już „prawie” 0,65 wolta, a tylko malusieńka odrobina więcej przesunie go nad górę i nasyci. Ten malusieńki kawałek będzie pochodził z wyjścia klawiatury, gdy naciśniemy przycisk. Ponieważ dolne klawisze na klawiaturze emitują tylko niewielkie napięcie, musimy być już bardzo blisko nasycenia, aby były wystarczające. Rezystory dzielnika napięcia są oznaczone na schemacie R_a i R_b. Użyłem R_a = 1Mohm i R_b = 560Kohm, ale jest prawie pewne, że będziesz musiał pobawić się tymi liczbami, aby dopasować je do swoich ustawień. Możesz chcieć mieć ścianę w pobliżu, o którą możesz walić głową i dwie lub trzy szklanki szkockiej pod ręką (polecam Laphroaig - drogi, ale warto, jeśli lubisz palić. Jeśli robi się naprawdę szalony, po prostu weź dzbanek BV i zadomowić się na noc)

Teraz przyjrzyjmy się, w jaki sposób tranzystory zapewnią nam ładne narastające zbocze wchodzące do klawisza INT0 i wygenerują nasze przerwanie naciśnięcia klawisza. Najpierw spójrzmy, co się dzieje, gdy nie naciskam klawisza. W takim przypadku pierwszy tranzystor (oznaczony T1 na schemacie) jest wyłączony. Więc prąd nie płynie między pinami kolektora i emitera. W ten sposób baza drugiego tranzystora (oznaczonego T2) zostanie wyciągnięta wysoko, a tym samym nasyci się, umożliwiając przepływ prądu między jego pinami. Oznacza to, że emiter T2 zostanie ściągnięty nisko, ponieważ jest podłączony do kolektora, który sam jest podłączony do ziemi. W ten sposób wyjście, które trafia do naszego pinu przerwania naciśnięcia klawisza INT0 (PD4), będzie niskie i nie będzie żadnego przerwania.

Co się stanie, gdy nacisnę klawisz? Cóż, wtedy podstawa T1 przekracza 0,65 V (w przypadku dolnych klawiszy ledwo przekracza!), a wtedy będzie mógł płynąć prąd, który pociągnie podstawę T2 do niskiego napięcia, a to wyłączy T2. Ale widzimy, że gdy T2 jest wyłączony, to wyjście jest podciągnięte w górę i stąd do naszego pinu INT0 dostaniemy sygnał 5V i spowoduje to przerwanie.

Zwróć uwagę, jaki jest wynik netto. Jeśli wciśniemy klawisz 1, otrzymamy 5V idące do PD4 bez znaczącej zmiany wyjścia przechodzącego do ADC0, a co ważniejsze, nawet jeśli wciśniemy Asterisk, 0, Hash lub Redial, otrzymamy również sygnał 5V idący do INT0, a także powodując przerwanie! Jest to ważne, ponieważ gdybyśmy po prostu przeszli bezpośrednio z wyjścia klawiatury do pinu INT0, te klawisze prawie nie generują napięcia i nie będą wystarczające do wyzwolenia tego pinu przerwania. Nasz wzmacniacz napięciowy rozwiązał ten problem.

Krok 7: 4-cyfrowy kod wyświetlacza i wideo

To wszystko dla samouczka 9! Załączam kod i filmik pokazujący operację.

To będzie ostatni raz, kiedy użyjemy klawiatury analogowej (dzięki Bogu). Był trudny w użyciu, ale był również bardzo przydatny, aby pomóc nam dowiedzieć się o konwersji analogowo-cyfrowej, portach analogowych, przerwaniach, multipleksowaniu, filtrach szumów, wzmacniaczach napięcia i wielu aspektach kodowania asemblera, od tablic przeglądowych do timerów/liczników, itp. Dlatego zdecydowaliśmy się z niego skorzystać. (plus fajnie jest zbierać różne rzeczy).

Teraz ponownie przyjrzymy się komunikacji i zmusimy nasz 7-segmentowy i 4-cyfrowy wyświetlacz do odczytywania naszych kostek z rolki w taki sam sposób, jak zrobiliśmy to z naszym analizatorem rejestrów. Tym razem użyjemy interfejsu dwuprzewodowego, a nie naszej zhakowanej metody kodu Morse'a.

Gdy komunikacja działa, a rolki pojawiają się na wyświetlaczach, możemy wreszcie wykonać pierwszy element naszego produktu końcowego. Zauważysz, że bez tych wszystkich portów analogowych nasz kod będzie znacznie krótszy i prawdopodobnie łatwiejszy do odczytania.

Dla tych z Was, którzy są ambitni. Oto „projekt”, który możesz wypróbować, a na pewno masz wiedzę do wykonania w tym momencie, jeśli przeszedłeś przez wszystkie te samouczki do tego momentu:

Projekt: Zrób kalkulator! Użyj naszego 4-cyfrowego wyświetlacza i naszej klawiatury i dodaj zewnętrzny przycisk, który będzie działał jak klawisz „enter”. Zmapuj gwiazdkę na „times”, hash, aby „podzielić” ponowne wybieranie na „plus”, a flash na „minus” i napisz procedurę kalkulatora, która działa jak jeden z tych starych kalkulatorów HP „odwrotnego polerowania”, które mieli wszyscy inżynierowie z powrotem w dzień. Tj. sposób ich działania polega na wpisaniu numeru i naciśnięciu klawisza „enter”. To odkłada tę liczbę na stos, następnie wpisujesz drugą liczbę i wciskasz „enter”, co odkłada drugą liczbę na stos. Na koniec naciskasz jedną z operacji takich jak X, /, + lub - i zastosuje tę operację do dwóch najwyższych liczb na stosie, wyświetli wynik i odłoży wynik na stos, aby można było go użyć ponownie, jeśli lubić. Na przykład, aby dodać 2+3, należy wykonać: 2, „enter”, 3, „enter”, „+”, a na wyświetlaczu pojawi się 5. Wiesz, jak korzystać ze stosu, wyświetlacza, klawiatury i mieć już napisaną większość kodu tła. Wystarczy dodać klawisz Enter i podprogramy potrzebne do kalkulatora. Jest to nieco bardziej skomplikowane, niż mogłoby się wydawać, ale jest zabawne i wykonalne.

Do zobaczenia następnym razem!

Zalecana: