Powrót

Mikroprocesorowa ośla łączka, część 13

Każdy system mikroprocesorowy musi mieć możliwość wprowadzania danych. To może być złożone rozwiązanie poprzez kanał szeregowy lub w najprostszym wariancie niewielka klawiatura, jako zbiór kilku przycisków.

Możliwych rozwiązań jest wiele i są one często uwarunkowane rzeczywistymi potrzebami. Powszechnie stosowanym rozwiązaniem jest wykorzystanie przycisku typu SPST-NO (ang. Single Pole, Single Throw – Normally Open – przełącznik jednobiegunowy normalnie otwarty). W stanie „spoczynkowym” jego styki są rozwarte i dopiero naciśnięcie prowadzi do elektrycznego połączenia styków. Równie częstym określeniem jest: mikroprzełącznik TACT. Obecnie coraz częściej używane są klawiaturki bazujące na przyciskach membranowych – przykładowe warianty pokazuje fotografia 1.

Fotografia 1

W każdym rozwiązaniu sprzętowym obsługa programowa realizuje wręcz identyczne działania, przede wszystkim musi eliminować szkodliwe zjawisko związane z dzwonieniem styków, polegające na kilkukrotnym ich połączeniu i rozłączeniu w chwili naciśnięcia jak i zwolnienia przycisku. Ten efekt trwa kilka milisekund, po upływie tego czasu stan zwarcia/rozwarcia jest stabilny. Warto mieć świadomość, że w ciągu tego interwału czasu mikrokontroler wykonuje kilkadziesiąt/kilkaset tysięcy instrukcji, toteż nie jest problemem „zauważenie” tego zjawiska. Naturalnie nasuwającym się rozwiązaniem eliminacji tego efektu jest odczekanie odpowiedniego czasu od chwili wykrycia „pierwszego” naciśnięcia. Tu może pojawić się koncepcja zastosowania używanej wcześniej do różnych celów funkcji delay_ms, ale nie jest to dobrym rozwiązaniem, można je uznać za marnotrawstwo mocy obliczeniowej procesora – są lepsze rozwiązania. Dodatkowym występującym problemem jest pewna synchronizacja zdarzeń: nigdy się nie zdarza tak, by użytkownik nacisnął przycisk w chwili, gdy program tego potrzebował. W ogromnej liczbie przypadków oczekuje on na zdarzenie, jakim jest naciśnięcie przycisku.

Kolejka typu FIFO

Dobrym rozwiązaniem umożliwiającym „synchronizację” naciśnięć przycisków klawiatury z potrzebami programu jest wykorzystanie kolejek typu FIFO (od ang. First In First Out – pierwsze weszło pierwsze wyszło). Obsługa klawiatury wykrywając naciśnięcie przycisku „nagarnia” dane do takiej kolejki, natomiast program realizujący swoją funkcję w chwili potrzeby może sprawdzić, czy w takiej kolejce znajduje się cokolwiek do odczytania oraz ewentualnie pobrać dane z tej kolejki. Koncepcja działania kolejki FIFO była opisana w artykule „Pamięci typu FIFO” (ZE, marzec 2024) i choć tam dotyczyła realizacji sprzętowej, jej działanie w wersji programowej się nie zmienia.

Nowy typ danych

Przy okazji „zabaw” z klawiaturą zrobimy duży krok naprzód zaznajamiając się z nowym typem danych – strukturą. Dotychczas w oprogramowaniu były używane proste zmienne jedno-, dwu- lub czterobajtowe (identyfikowane w programach jako uint8_t, uint16_t lub uint32_t jako typy zmiennych bez znaku lub int8_t, int16_t lub int32_t jako typy liczb mogących przyjmować wartości dodatnie lub ujemne). Nawet jeżeli były złożone do tablic (array) wraz z indeksem zapisywanym w nawiasach kwadratowych, to nadal każdy taki konkretny element tablicy jest zmienną prostą. W języku C istnieje inny ciekawy typ danych określany jako struktura. Jeżeli przypomnimy sobie interpretację pamięci RAM jako komody z szufladkami („Mikroprocesorowa ośla łączka, cz. 6”, ZE listopad, 2024), to zmienna jest taką pojedynczą szufladką. Nawet jeżeli jest kilkubajtową zmienną, to ewentualnie szufladka jest większa. Strukturę można sobie również wyobrazić jako szufladkę (ewentualnie dużą szufladę), ale jak zajrzymy do środka, to można dostrzec, że szufladka zawiera przegródki. Każda z nich może być innego typu. Tych ileś przegródek jest integrowane do pojedynczego elementu (szufladki).

W języku C ten typ należy zdefiniować samemu, sam język daje jedynie możliwości, natomiast „budowę” musimy zrealizować sami. Ilustracją problematyki dotyczącej budowy i działania struktur będzie rozwiązanie zgodne z koncepcją działania kolejek FIFO. Niezbędne tu są trzy elementy: wskaźnik zapisu, wskaźnik odczytu oraz sam bufor przechowujący dane. Niech wielkość kolejki FIFO wynosi 4 elementy, co w zastosowaniu do obsługi klawiatury będzie oznaczać, że może przechowywać maksymalnie cztery znaki (użytkownik naciskając przyciski dodaje elementy do kolejki natomiast program pobiera je i raczej są małe szanse, by się ona przepełniła). Odpowiednia definicja struktury może być taka, jak pokazuje listing 1, który odpowiada rysunkowi 2. Poszczególne jej elementy są określane jako pola struktury (tutaj FifoWrIndex, FifoRdIndex oraz FifoBuffer).
Listing 1:

#define BuffSize                   4
 
typedef struct { uint8_t FifoWrIndex ;
                 uint8_t  FifoRdIndex ;
                 uint8_t  FifoBuffer [ BuffSize ] ;
                } FifoStructT ;

Rysunek 2

 

(…)

——– ciach! ——–

To jest tylko fragment artykułu, którego pełna wersja ukazała się w czerwcowym numerze czasopisma Zrozumieć Elektronikę (ZE 6/2025). Pełną wersję czasopisma znajdziesz pod tym linkiem. Natomiast niepełna, okrojona wersja, pozwalająca zapoznać się z zawartością numeru ZE 6/2025 znajduje się tutaj.

Andrzej Pawluczuk
apawluczuk@vp.pl

 

Uwaga! Osoby, które nie są (jeszcze) stałymi Patronami ZE, mogą nabyć PDF-y z pełną wersję tego numeru oraz wszystkich innych numerów czasopisma wydanych od stycznia 2023, „stawiając kawę” (10 złotych za jeden numer czasopisma w postaci pliku PDF).
W tym celu należy kliknąć link (https://buycoffee.to/piotr-gorecki), lub poniższy obrazek
Postaw mi kawę na buycoffee.to
Następnie wybrać – Postaw kawę za:
– jeśli jeden numer ZE – 10 zł,
– jeśli kilka numerów ZE – Własna kwota. I tu wpisać kwotę zależną od liczby zamawianych numerów – wydań (N x 10 zł),
Wpisać imię nazwisko.
Podać adres e-mail.
Koniecznie zaznaczyć: „Chcę dodać dedykację/Wiadomość dla Twórcy” i tu zawsze trzeba wpisać, który numer lub numery ZE mamy wysłać na podany adres e-mailowy. Jeśli ma to być numer z tym artykułem trzeba zaznaczyć, że chodzi o ZE 6/2025.
UWAGA!!! E-mail z linkiem do materiałów (Smash) wysyłamy zazwyczaj w ciągu 24 godzin. Czasem zdarza się jednak, że trafia do spamu. Jeśli więc nie pojawi się w ciągu 48 godzin prosimy sprawdzić w folderze spam, a ewentualny problem zgłosić na adres: kontakt@piotr-gorecki.pl.