Zakres laboratorium:
  1. aplikacja konsolowa – standard VT100
  2. podstawowe informacje o magistrali I2C
  3. zegar czasu rzeczywistego DS1307
  4. przerwania

Przygotować kartkę, podpisać imionami członków grupy. Uzupełniać kartkę zgodnie z poleceniami, na koniec zajęć kartkę oddać prowadzącemu – podlega ocenie.

1. Aplikacja konsolowa – standard VT100 (Link1, Link2)

Uruchomić projekt z poprzednich zajęć – obsługa interesu UART. Połączyć się przy pomocy programu Putty:

Putty - Serial
Konfiguracja programu Putty do pracy z portem szeregowym

Zadania:

  1. Czyści okno terminala i ustawia kursor na początek ekranu
  2. Wyświetla tekst: “To ja na czystym ekranie”, czeka 2 sekundy
  3. Czyści ekran, wyświetla tekst: “To znowu ja ale na czystym ekranie” czeka 2 sekundy
  4. Wraca do podpunktu 1

W celu wyczyszczenia ekranu terminala należy wysłać odpowiednią komendę to terminala: “Erase Screen” (standard terminalowy VT100).

 

Zadania:

  1. Zmodyfikować program z poprzednich zajęć aby przed wyświetleniem nowego komunikatu czyścił ekran.
  2. Dodać do menu nagłówek o treści “Menu”, który będzie wyświetlany na żółtym tle (czarne napisy)
  3. Zmienić kolor napisów w menu.
2. Podstawowe informacje o magistrali I2C

I2C jest popularnym interfejsem komunikacyjnym wykorzystywanym przez wiele układów zewnętrznych:

  • układy czasowe-RTC
  • pamięci EEPROM
  • czujniki temperatury
  • czujniki przyśpieszenia i położenia
  • przetworniki A/D i D/A
  • expandery portów
  •  itd.

Z powodu swojej dużej popularności jest  jednym z podstawowych interfejsów komunikacyjnych wbudowywanych w mikrokontolery przez producentów. Mikrokontolery AVR mają sprzętowe wsparcie dla tego typu komunikacji, skutkuje to zminimalizowaniem potrzebnej pracy jaką musi wykonać programista do zapoznania się z dokumentacją i ustawienia odpowiednich rejestrów mikrokontrolera. Firma Atmel w dokumentacji rodziny AVR korzysta z innej nazwy takiej jak TWO-wire Serial Interface lub TWI. Główną zaletą I2C jest prosta implementacja i zminimalizowanie  zapotrzebowania na ilość linii transmisji danych. Potrzebne są tylko dwie linie:

  • SDA – linia danych
  • SCL – linia zegara
Schemat podłączenia magistrali I2C
Schemat podłączenia magistrali I2C

Wykorzystane linie powinny być  podciągnięte te przez rezystory do napięcia zasilania (R1 i R2). Każde urządzenie podłączone tej magistrali I2C  musi posiadać swój unikatowy adres. Zastosowanie adresów pozwala na wykorzystanie
wielu układów w jednej magistrali danych.

 

Zadania:

  • dodać do projektu pliki z paczki (I2Czip) i dołączyć klasę “I2C″ do pliku “main.cpp”
  • zapoznać się z funkcjami klasy I2C i ich implementacją
  • przygotować program, który będzie realizował funkcję skanera podłączonych urządzeń do magistrali I2C. Wykorzystać funkcję “I2C::checkAddress(uint8_t address)”, skanowanie przeprowadzić w zakresie adresów 1-127. Program powinien wyświetlić adresy znalezionych urządzeń w terminalu
  • dopasować znaleziony adresy do układów w module – zapisać na kartce
3. Zegar czasu rzeczywistego DS1307

Moduł zawiera układ RTC DS1307 i pamięc EEPROM AT24C32. Układ DS1307 jest zegarem czasu rzeczywistego, który precyzyjnie odmierza czas. Dodatkowo moduł  został wyposażony w baterię CR2032, która dostarcza zasilania dla zegarka. Taka konfiguracja jest powszechnie stosowana (płyty główne w komputerach), ponieważ pozwala układowi RTC pracować przy odłączonym zasilaniu, i tym samym utrzymywać prawidłową datę i godzinę. Bateria powinna wytrzymać około 4 lat ciągłej pracy.

Moduł RTC - DS1307 zastosowany w Module328
Moduł RTC – DS1307 zastosowany w Module328

Zadania:

  • do czego służy nóżka SQW/OUT w układzie DS1307 – jakie może być jej praktyczne zastosowanie? (zapisać na kartce)
  • dodać do projektu pliki z paczki (DS1307zip) i dołączyć klasę “RTC_DS1307″ do pliku “main.cpp”
  • zapoznać się z funkcjami klasy “RTC_DS1307” i ich implementacją, co robią poniższe funkcje – zapisać wyjaśnienia na kartce:

  • zapoznać się z dokumentacją układu: pdfDokumentacja układu DS1307
  • zaimplementować program, który będzie odczytywał z układu DS1307 sekundy “uint8_t RTC_DS1307::getSecond()”- kolejne wartości (sekundy) powinny być wyświetlane w terminalu.
    Jeśli nie są wyświetlane poprawne wartości (kolejne sekundy) oznacza to, że układ jest wyłączony (układ nowy, wyciągnięto baterie). Uruchomienie układu następuje przez ustawienie sekund, należy wykorzystać poniższy fragment kodu:
  • uzupełnić implementacje pozostałych funkcji z przedrostkiem “get”, adresy rejestrów można znaleźć w dokumentacji układu – wyświetlać w pierwszej linii terminala aktualny czas ” 1 Marzec 2014 12:05:01″
  • zapoznać się z działaniem funkcji “void RTC_DS1307::setSecond(uint8_t val)” – po uruchomieniu programu niech sekundy będą resetowane
  • uzupełnić implementacje pozostałych funkcji z przedrostkiem “set”, adresy rejestrów można znaleźć w dokumentacji układu, po uruchomieniu programu czas jest ustawiany na “1 Styczeń 2014 12:00:00” wyświetlać w pierwszej linii terminala aktualny czas
  • skasować z początku programu funkcje ustawiająca domyślny czas, uruchomić układ i odczekać 1 minutę – zapisać na kartce aktualną wartość czasu i odłączyć układ od komputera. Obecnie Moduł328 jest odłączony zasilania, ale układ zegara RTC pracuje (zasilanie bateryjne), odczekać 1 minutę i ponownie podłączyć układ do komputera i odczytać czas (zapisać na kartce) jaki wyświetli się na terminalu? Czy zegar pracuje poprawnie?
  • przygotować program, który umożliwia ustawianie czasu za pomocą terminala i przycisków – wykonać odpowiednie menu, które wywoływane jest przez klawisz “?”. Gdy program jest w menu, wyłączona jest funckja wyświetlania aktualnego czasu, wyjście z menu za pomocą klawisza “k” powoduje powrócenie do standardowego trybu pracy. Działanie funkcji ustawiania: po przyciśnięciu klawisza “s” uruchamia się tryb edycji sekund (“m” – minut, “h” – godzin) – przycisk czerwony powoduje zwiększanie, przycisk zielony powoduje zmniejszanie, przyciśnięcie klawisza “enter” powoduje zapisanie ustawień itd.
  • dodać funkcję budzika – czas alarmu ustawiany w podobny sposób jak w zadaniu wcześniejszym (ustawiana godzina i czas alarmu). Wyświetlać na terminalu: “Czas: 1 Marzec 2014 12:05:01 – budzik:  12:05:01”. Gdy zostanie osiągnięty czas alarmu należy wyświetlić w terminalu napis “Wstawaj śpiochu!!!”, jednocześnie diody w module powinny mrugać. Wyłączenie alarmu następuje po przyciśnięciu dowolnego przycisku w układzie.
4. Przerwania

Przerwania wewnętrzne:

  • wykorzystać wewnętrzny licznik (Timer1 – 16 bitowy) do wygenerowania przerwania o częstotliwości 1Hz. W przerwaniu zrobić wyświetlanie czasu na komputerze w czasie normalnej pracy. W programie głównym zrobić tryb konfiguracyjny (ustawianie czasu):
    • uruchomienie przerwań: “sei()”
    • konfiguracja Timer1:
      • CTC z TOP na OCR1A
      • wartość OCR1A i prescaler dobrać dla 1Hz
      • TIMSK1 – uruchomić odpowiednie przerwanie
    • funkcja do obsługi przerwania: “ISR(TIMER1_…)” – “…” zastąpić odpowiednim parametrem

 

Przerwania zewnętrzne:

  • uruchomić przerwania zewnętrzne dla przycisków:
    • EICRA – skonfigurować zdarzenie wywołania przerwania
    • EIMSK – uruchomić przerwania
    • funkcja do obsługi przerwania: “ISR(INT…)” – “…” zastąpić odpowiednim parametrem

 

  • po przyciśnięciu przycisku zielonego pojawia się napis: “Przerwanie INT0 – zielone działa”
  • po przyciśnięciu przycisku czerwonego pojawia się napis: “Przerwanie INT1 – czerwone działa”
  • porównać reakcję przerwań przy różnych ustawieniach w rejestrze EICRA