[PROJEKT] Wielokanałowy termometr i termostat z wyświetlaczem OLED [1]

Inicjalizację można podzielić na kilka etapów:

  • wyzerowanie liczników: kolumn, stron pamięci i linii początkowej. Domyślnie po włączeniu zasilania (POR) te liczniki są wyzerowane,
  • ustawienie powiązania zawartości pamięci RAM obrazu z pozycją na panelu OLED (orientacja wyświetlania),
  • ustawienie kontrastu, przetwornicy DC/DC zasilającej drivery, i częstotliwości taktowania, oraz włączenie wyświetlenia.

Matryca wyświetlacza jest monochromatyczna i jednemu pikselowi odpowiada jeden bit w pamięci obrazu. Pamięć ma rozmiar 132×64 bity, ale w rzeczywistości jest zorganizowana bajtowo. Host wysyła kolejne bajty po magistrali SPI pod lokacje określone przez liczniki kolumn i stron. Jeden bajt w pamięci obrazu odpowiada pionowej linijce o długości 8 pikseli. Najmłodszy bit tego bajta jest pikselem położonym najwyżej w linijce, a bit najstarszy pikselem położonym najniżej. Położenie linijki w poziomie określa licznik kolumn zmieniający się w zakresie 0…131, a położenie w pionie określa licznik stron zmienia się w zakresie 0…7. Po ustaleniu numeru strony kolejne zapisywane bajty tworzą pasek o szerokości 8 pikseli. Każdy zapis danej powoduje inkrementację licznika kolumn i nowa dana jest zapisywana po kolejna lokację. Kiedy licznik kolumn osiągnie wartość 131, to po następnym zapisie danych jest zerowany. Przepełnienia licznika kolumn nie powoduje inkrementacji licznika stron i jeżeli ni zmodyfikujemy go wykorzystując do tego celu komendę „ustawienie licznika stron”, to kolejne wpisy do pamięci będą nadpisywać dane począwszy od pozycji zerowej (wyzerowanie licznika kolumn). To ważna właściwość, o której trzeba pamiętać. Na listingach 6 i 7 pokazano procedury ustawienia licznika kolumn i licznika stron.

List. 6. Ustawienie licznika kolumn

List. 7. Ustawienie licznika stron

Pamięć EEPROM

Pamięć EEPROM typu 24C04 ma wbudowany interfejs I2C. Do komunikacji z pamięcią został wykorzystany sprzętowy interfejs I2C2 wbudowany w mikrokontroler. Dostęp do pamięci jest realizowany przez 2 sekwencje: zapisu pojedynczej komórki pamięci i odczytu pojedynczej komórki pamięci.

Zapisanie komórki pamięci zaczyna się sekwencją START, po niej wysyłany jest adres slave z bitem R/W=0. Kolejne 2 bajty to adres komórki i bajt do zapisania w pamięci i na koniec sekwencja STOP.

Na listingu 8 został pokazana procedura zapisywania danej do komórki pamięci pod konkretny adres. Dla linii adresowych A0=A1=A2=0 adres slave jest równy 0xA0.

List. 8. Zapis danej do komórki pamięci EEPROM

Odczytywanie danej z konkretnej lokalizacji rozpoczyna się od wysłania sekwencji START, adresu slave z bitem RW=0, a po nim bajtu z adresem w pamięci EEPROM. Po tym na magistralę jest ponownie wysyłana sekwencja START, a po niej adres slave z bitem RW=1 informującym pamięć, ze ma odesłać dane. Po wysłaniu tego adresu mikrokontroler wywyła sekwencję odczytania danej z pamięci i kończy wszystko sekwencja STOP.

List. 9. Sekwencja odczytywania danej z pamięci EEPROM

Czujnik temperatury DS18B20

W prezentowanym urządzeniu do jednej magistrali 1-wire dołączamy wiele czujników. Program najpierw musi wykryć ile czujników jest podłączonych, odczytać i zapamiętać ich identyfikatory zapisane w pamięci ROM każdego z czujników. Potem na podstawie tablicy identyfikatorów cyklicznie odczytywać i wyświetlać temperatury z każdego z czujników. Napisanie procedury identyfikacji nie jest zadaniem prostym, ale na szczęście firma Maxim, obecny producent DS18B20 udostępnia notę katalogową numer 162 „Interfacing DS18X20/DS1822 -1wire Temperature Sensor In a Microcontroller Enviroment. W tej nocie są dokładnie opisane czynności, które należy wykonać żeby identyfikacja została wykonana prawidłowo. Oprócz wyczerpującego opisu zamieszczono tam przykładowe fragmenty programów. Procedury obsługi magistrali 1-wire i wyszukiwania termometrów na magistrali są napisane w oparciu o informacje zawarte w tej nocie.

Na listingu 10 pokazano procedury zerowanie magistrali DS._reset, zapisania bitu na magistrali write_bit i odczytanie bitu na magistrali red_bit. Opóźnienia czasowe są generowane przez funkcję biblioteczną kompilatora MPLAB XC16.

List. 10. Procedury zerowania magistrali oraz zapisu i odczytu bitu z magistrali

Do realizacji magistrali 1-wire wykorzystano możliwości portów w mikrokontrolerach Microchipa. Kierunek przesyłania danych na linii portu jest określony przez zapisanie odpowiedniego bitu w rejestrze SFR TRISx. Jeżeli na przykład bit TRISB4 dla linii portu RB4 jest wyzerowany, to linia jest wyjściowa, a jeżeli ustawiony to linia jest wejściowa. Drugi rejestr PORT odpowiada za odczytywanie stanu linii ustawionej jako wejściowa, lub zapisywanie stanu linii ustawionej jako wyjściowa. Załóżmy, że do rejestru PORTB4 linii RB4 zapiszemy zero, a linia będzie podciągnięta do plusa zasilania przez rezystor. Po wpisaniu do TRISB zera linia staje się wyjściową i pojawi się na niej stan niski, bo do PORTB4 zostało wpisane zero. Kiedy do TRISB4 wpiszemy jedynkę, to linia staje się wejściową i rezystor wymusza na niej stan wysoki. Manipulowanie stanem jest realizowane przez zapisywanie rejestru TRISB4. Inicjalizacja portów została na listingu 11.

List. 11. Inicjalizacja linii DQ i wyszukiwanie czujników

Procedura Find devices (listing 12) wyszukuje czujniki na magistrali i tworzy tablicę FoundROM z odczytanymi numerami seryjnymi DS18B20.

List. 12. Wyszukiwanie czujników

Procedury First i Next używane do wyszukiwania zostały pokazane na listingach 13 i 14.

List. 13. Wyszukiwanie pierwszego czujnika na magistrali

List. 14. Wyszukiwanie kolejnych czujników

O autorze

Absolwent Wydziału Elektroniki Politechniki Wrocławskiej, współpracownik miesięcznika Elektronika Praktyczna, autor książek o mikrokontrolerach Microchip i wyświetlaczach graficznych, wydanych nakładem Wydawnictwa BTC. Zawodowo zajmuje się projektowaniem zaawansowanych systemów mikroprocesorowych.