ADuCino360: termometr cyfrowy na mikrokontrolerze ADuCM360 (Cortex-M3 z Analog Devices)
Układ ADuCM360 to kolejny „analogowy” mikrokontroler z oferty Analog Devices, wyposażony w rdzeń Cortex-M3 oraz liczne peryferia. Ze szczególną starannością zaprojektowano bloki analogowe, czego należało oczekiwać po producencie. Nie zapomniano też o typowych interfejsach, bez których trudno dziś wyobrazić sobie nowoczesny mikrokontroler. W prezentowanym projekcie przedstawiono realizację termometru cyfrowego z zastosowaniem płytki ewaluacyjnej ADuCino (z mikrokontrolerem ADuCM360) i modułu KAmodTFT2.
Na płytce ewaluacyjnej ADuCino 360 (schemat przedstawiono na rysunku 1) zamontowany jest m.in. czujnik temperatury ADT7420. Jest to układ o ultraniskim dryfcie temperaturowym, równym 0,0073?C i dużej, 16-bitowej rozdzielczości, mierzący temperaturę w zakresie od –40 do +150°C.
Rys. 1. Schemat ideowy płytki ewaluacyjnej ADuCino360 dla mikrokontrolera ADuCM360
Układ komunikuje się z mikrokontrolerem za pośrednictwem interfejsu I2C. Odpowiednie połączenia wykonano na płytce. Uwzględniono przy tym rezystory podciągające 2,2 k ? . Układ ADT7420 ma dwa wejścia adresowe A0 i A1. Na płytce ewaluacyjnej są one dołączone do masy, tym samym adres bazowy czujnika jest ustalony na sztywno i jest równy 0x48. Szczegóły wyjaśniono w dokumentacji układu ADT7420. Należy pamiętać o tym, że adresowanie układów na szynie I2C jest uzupełniane bitem ustalającym kierunek transmisji. Taki bit (READ=1/WRITE=0) zajmuje najmłodszą pozycję, a bazowy adres jest przesunięty o jeden bit w lewo. Ostatecznie cały adres układu zmienia się w zależności od kierunku transmisji, co musi być uwzględnione w programie. Zasadę adresowania układów w interfejsie I2C wyjaśniono na rysunku 2, a w dalszej części artykułu przedstawiono kod źródłowy związany z obsługą transmisji.
Rys. 2. Zasada adresowania układów w interfejsie I2C
Urządzeniem wyjściowym, na którym wizualizowane są wyniki pomiaru temperatury jest moduł wyświetlacza LCD – KAmodTFT2. Zamontowano na nim popularny wyświetlacz od telefonu Nokia6100 ze sterownikiem PCF8833 (uwaga: spotykane są również wersje wyświetlaczy ze sterownikiem Epsona, obie wersje nie są ze sobą kompatybilne). Matryca 132×132 punkty, mimo stosunkowo niewielkich rozmiarów ekranu (25×25 mm) umożliwia wyświetlanie grafiki z dużą liczbą szczegółów. Wyświetlacz jest skonfigurowany do pracy z 12-bitowym kolorem. Moduł komunikuje się z procesorem via interfejs SPI, przy czym w projekcie ograniczono się jedynie do komunikacji w kierunku od procesora do wyświetlacza. Jest on zerowany sygnałem Reset generowanym przez port P0.0 mikrokontrolera. Schemat połączenia modułu KAmodTFT2 przedstawiono na rysunku 3.
Rys. 3. Schemat połączenia modułu wyświetlacza KAmodTFT2 do płytki ewaluacyjnej mikrokontrolera ADuCM360
Inicjalizacja systemu
Po włączeniu zasilania (lub po zerowaniu) mikrokontroler ADuCM360 nie jest gotowy do pracy. Wszystkiej jego bloki funkcjonalne muszą być odpowiednio do potrzeb skonfigurowane. Te peryferia, które nie są wykorzystywane w aplikacji mogą, a nawet powinny być wyłączone. Konfiguracji wymaga również układ taktowania procesora. Fragment programu odpowiedzialny za prawidłową inicjalizację systemu przedstawiono na listingu 1. W aplikacji nie przewidziano wykorzystywania watchdoga, jest on więc wyłączony. Interfejs I2C zajmuje linie P2.0 (SCL) i P2.1 (SDA), zaś interfejs SPI jest programowo emulowany na liniach P1.7 (CS), P1.6 (MOSI), P1.5 (SCLK). Port P0.0 jest skonfigurowany jako wyjście cyfrowe. W programie konieczne jest ustalenie źródła przebiegu taktującego i jego częstotliwości (przyjęto 16 MHz). Konfigurowane są pozostałe peryferia wykorzystywane w aplikacji. Należy też pamiętać o włączeniu przerwań. W opisywanym programie nie było jednak takiej potrzeby, przerwania są więc wyłączone. Pozostawiono natomiast zakomentowane odpowiednie instrukcje konfigurujące.
List. 1. Inicjalizacja systemu
//inicjalizacja systemu WdtGo(T3CON_ENABLE_DIS); //watchdog wylaczony DioCfg(pADI_GP2,0x05); //P2.0 P2.1 jako piny I2C //DioCfg(pADI_GP1,0xaa00); //P1.7..4 jako SPI0 (SS, MOSI, SCLK, MISO) w realizacji sprzetowej DioOen(pADI_GP1,0xe0); //P1.7 - CS, realizacja programowa SPI //P1.6 - MOSI, //P1.5 - SCLK DioOen(pADI_GP0,0x01); //P0.0 - reset LCD //konfiguracja zegarow ClkCfg(CLK_CD0,CLK_HF,CLKSYSDIV_DIV2EN_DIS,CLK_UCLKCG); //system 16MHz ClkSel(CLK_CD0,CLK_CD0,CLK_CD7,CLK_CD7); //SPI: 8MHz, I2C: 16MHz, UART: - (125kHz), PWM: - (125kHz) - istotne tylko I2C ClkDis(CLKDIS_DISSPI0CLK|CLKDIS_DISSPI1CLK|CLKDIS_DISUARTCLK|CLKDIS_DISPWMCLK|CLKDIS_DIST0CLK|CLKDIS_DIST1CLK|CLKDIS_DISDACCLK|CLKDIS_DISDMACLK|CLKDIS_DISADCCLK); //blokuj niewykorzystywane //Konfiguracja SPI0 (w tej wersji programu tryb ten nie jest jednak wykorzysywany SpiBaud(pADI_SPI0,0,SPIDIV_BCRST_DIS); //8MHz bez detekcji bledu linii CS SpiCfg(pADI_SPI0,SPICON_MOD_TX2RX2,SPICON_MASEN_EN,SPICON_CON_EN| SPICON_RXOF_EN|SPICON_ZEN_EN|SPICON_TIM_TXWR|SPICON_CPHA_SAMPLETRAILING|SPICON_ENABLE_EN); //przerwanie po 1 wpisie do TX, tryb master, tryb ciagly //zezwolenie na nadmpisanie RX, transmituj 00 jesli brak nowych danych w TX //inicjaclizacja transmisji po wpisie do TX, probkowanie na opadajacym zboczu SCLK //SPI0 wlaczone //Konfiguruj I2C jako Master 100kHz I2cMCfg(I2CMCON_TXDMA_DIS|I2CMCON_RXDMA_DIS,I2CMCON_IENCMP|I2CMCON_IENRX|I2CMCON_IENTX,I2CMCON_MAS_EN); I2cBaud(0x4E,0x4F); // 100kHz //NVIC_EnableIRQ(I2CM_IRQn); //przerwania I2C nie beda wykorzystywane //NVIC_EnableIRQ(SPI0_IRQn); //uaktywnij przerwania SPI0 - w tej wersji programu nie ma przerwan InitLcd(); //inicjalizacjaa wywietlacza LCD ZapiszKomendeSpi(SETCON); ZapiszDanaSpi(48); //ustaw optymalny kontrast=45 LcdClearScreen(WHITE); //czysc ekran