Zajęcia stacjonarne:

  • STM32
  • FreeRtos

Zadanie 1

Utworzyć program, każdy punkt jako osobną funkcję który:

  • mruga diodą LED z częstotliwością 1Hz,
  • po naciśnięciu przycisku (symulacja przewodem), co każde 200ms zwiększa licznik globalny (zmienna int i=0;),
  • wyświetla na ekranie/terminalu wartość licznika jeśli uległa ona zmianie.

jak zrobić taki program? Jak zrobić oczekiwanie/opóźnienie bez blokowania całego programu?

 

Zadanie 2

Dodać do programu system czasu rzeczywistego FreeRTOS (vTaskDelay).

Zmodyfikować poprzednie zadanie aby każda funkcja była osobnym wątkiem programu, jak działa teraz program?

 

Zadanie 3

Synchronizacja działania pomiędzy wątkami z wykorzystaniem semaforów (xSemaphoreCreateBinary).

Dodać do funkcji obsługującej przycisk ustawienie semafora kiedy nastąpi zmiana wartości.

Dodać do funkcji wyświetlania na ekranie aby wyświetlała tylko jeśli semafor jest ustawiony.

 

Zadanie 4

Problem producenta i konsumenta – wykorzystanie kolejek (xQueueCreate).

Utworzyć nowy program:

  • Zadanie 4a
    • utworzyć kolejkę 10 dwuelementową, przechowującą strukturę (uint8_t numerWatku, int krokWatku),
    • utworzyć 3 wątki będące producentami, dodają elementy do kolejki, gdzie każdy ma swój unikatowy numer, i wykonuje dodaje wątku przy jednoczesnej inkrementacji licznika (krokWatku). Wątki dodają do kolejki, co 3 sekundy,
    • jeśli kolejka jest pełna to wątki są blokowane,
    • dodać wątek konsumenta, pobiera informacje z kolejki i wyświetla komunikat o pobranych danych na terminalu. Wątek działa, co w 2 sekundy, i pobiera tylko jedną dostępną pozycje kolejki,
    • czy dojdzie do zablokowania kolejki? Kiedy?

    Zadanie 4b

    • zmienić czas wykonywania wątku konsumenta, tak aby pobierał natychmiast informacje z kolejki,
    • czy dojdzie do zapełnienia kolejki?
    • czy odbierane komunikaty są zawsze w takiej samej kolejności?

 

Zajęcia zdalne:

Zakres laboratorium:
  • powtórzenie zakresu materiału z przedmiotu
  • obsługa portów
  • obsługa przetwornika A/D
  • wykorzystanie układów licznikowych do generowania sygnału PWM
  • komunikacja z zastosowaniem interfejsu UART

Zadania wykonujemy na płytce Arduino MEGA.

należy podłączyć:

  • 8x dioda LED
  • 8x przycisk typu “Switch (all)”
  • 1x Servo
  • 1x potencjometr zadający napięcie 0-5V

Każdy program po uruchomieniu wyświetla na terminalu (komunikacja UART) swoją nazwę i numer indeksu autora.

Zadanie 1 – ocena 3

Utworzyć program, który w zależności od stanu przycisku ustawia stan diody LED – program działa na 8 diodach LED. Dodatkowo każda zmiana stanu jest wyświetlana za pomocą terminala  w postaci “Ustawiono: 00001001” – gdzie 1 to dioda świeci/przycisk wciśnięty, cyfra najbardziej po lewej stronie to dioda pierwsza.

Zadanie 2 – ocena 3,5

Uruchomić przetwornik A/D do pomiaru napięcia z potencjometru. Wykonywać pomiar co 1 sekundę i wysyłać wartość w woltach na terminal. Do odczytu napięcia wykorzystać funkcję “analogRead”.

Zadanie 3 – ocena 4

Podłączyć serwomechanizm do odpowiedniego wyjścia i napisać program do sterowania jego położeniem. Położenie powinno być zadawane z poziomu terminala w zakresie 0-100%. Można wykorzystać bibliotekę Arduino “Servo”

Zadanie 4 – ocena 5

Utworzyć jeden program integrujący zadania 1-3. Stworzyć menu do obsługi programu przy użyciu terminala.

  • program po uruchomieniu wyświetla menu z opisem dostępnych funkcji,
  • funkcje numerujemy od 1-4, gdzie 4 to funkcja wyświetlająca menu programu,
  • funkcje 1-3 to podprogramy realizujące funkcjonalność zadań 1-3,
  • wyjście z podprogramów odbywa się po przesłaniu znaku “c”.
Zadanie 5 – ocena 5.5

Podłączyć dodatkowo wyświetlacz LCD, przykładowe użycie wyświetlacza z Arduino link.

  • zmodyfikować program z zadania 4, tak aby wyświetlał informacje o poszczególnych funkcjach na wyświetlaczu LCD:
    • zadanie 1 – wyświetla stan przycisków w postaci  “00001001”,
    • zadanie 2 – wyświetla mierzone napięcie w woltach
    • zadanie 3 – wyświetla stan serwomechanizmu- ustawioną pozycję
    • zadanie 4 – dla wybrania opcji 4 wyświetla numer indeksu autora projektu,