Zakres laboratorium:
- aplikacja konsolowa – standard VT100
- podstawowe informacje o magistrali I2C
- zegar czasu rzeczywistego DS1307
- 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:
Zadania:
- Czyści okno terminala i ustawia kursor na początek ekranu
- Wyświetla tekst: “To ja na czystym ekranie”, czeka 2 sekundy
- Czyści ekran, wyświetla tekst: “To znowu ja ale na czystym ekranie” czeka 2 sekundy
- Wraca do podpunktu 1
W celu wyczyszczenia ekranu terminala należy wysłać odpowiednią komendę to terminala: “Erase Screen” (standard terminalowy VT100).
1 2 |
UART0::sendText("\x1b[2J"); //Erase Screen UART0::sendText("\x1b[1;1H"); //Cursor Home |
Zadania:
- Zmodyfikować program z poprzednich zajęć aby przed wyświetleniem nowego komunikatu czyścił ekran.
- Dodać do menu nagłówek o treści “Menu”, który będzie wyświetlany na żółtym tle (czarne napisy)
- 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
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 (I2C) 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.
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 (DS1307) 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:
1 2 3 4 5 6 7 8 |
uint8_t RTC_DS1307::bcd2bin(uint8_t val) { // TODO Auto-generated destructor stub return val - 6 * (val >> 4); } uint8_t RTC_DS1307::bin2bcd(uint8_t val) { return val + 6 * (val / 10); } |
- zapoznać się z dokumentacją układu: Dokumentacja 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:
12RTC_DS1307 rtc = RTC_DS1307();rtc.setSecond(5); - 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