Úvod
Při vytváření tohoto článku jsem hledal praktický příklad využití takového propojení a nejjednodušším případem by bylo logování teplot naměřených v externím zařízení. Jako platformu jsem zvolil vývojovou desku PSoC MINI TOOL, její konstrukci jsem již na tomto serveru uvedl. Pokud zrovna PSoC nepatří mezi vaše oblíbence, pak jistě vyhoví jakýkoliv jiný mikrokontrolér vybavený sériovou linkou. Pro měření teploty je k desce připojen teploměr DS18S20. Tato velmi často propíraná součástka komunikuje po jednodrátové sběrnici, což může někomu činit potíže, ale opět ani její není využití nijak závažné a lze použít téměř jakýkoliv jiný obvod pro měření teploty. O využitý HW tu vlastně prakticky nejde. Přesto SW pro vývojovou desku a DS18S20 uvádím na konci článku ke stažení.
Hlavní náplní článku je grafický skript pro prostředí LabVIEW. Ten obstarává odesílání požadavků na konverzi teploty a následné zpracování naměřené hodnoty. Komunikace probíhá podle jednoduchého protokolu, kdy požadavek na konverzi je zaslán prostřednictvím příkazu „RD_TEMP“. Naměřená hodnota je pak zaslána v řetězci „TT“, tedy například „28“, pro 28°C.
SW část
Při vytváření grafického skriptu pro LabVIEW budeme vycházet z ukázkového příkladu Basic Serial Read and Write (k nalezení Help-> Find Examples… -> Hardware Input and Output -> Seriál -> Basic Serial Read and Write. Příklad již sám o sobě umožňuje jednorázově zaslat předem definovaný řetězec, dále počká na odpověď čas určený uživatelem (standardně 500 ms) a poté vyzvedne z bufferu sériové linky řetězec (je-li tam). Tento příklad upravíme a použijeme pro naše účely. Nejprve upravíme ovládací panel a to do této podoby:
Obrázek 1: Upravený ovládací panel
Se změnou ovládacího panelu se z funkčního schéma vymaže několik vstupních a výstupních prvků, ty je nutné nahradit jinými. Opět přikládám hotové řešení uvedené na následujícím obrázku. Na konci článku je samozřejmě celý projekt ke stažení. Mimo změn v oblasti vstupních a výstupních prvků je funkční schéma doplněno o blok cyklu „while“. Ten zajišťuje cyklické zasílání žádosti na konverzi teploty a zpracování odpovědi. V této chvíli předpokládám alespoň částečné znalosti prostředí LabVIEW. Jeho výklad by zabral více než tento článek. Pokud vám takové znalosti chybí, doporučuji se poohlédnout u nakladatelství BEN – technická literatura, které minulý rok vydalo knihu s touto tématikou.
Jak to celé funguje
V prvním kroku se provede inicializace sériové linky dle parametrů nastavených v zadávacích polích. V LabVIEW 8.2 ji lze nalézt v Instrument IO -> Serial -> VISA configure serial port. Parametry jsou název portu, baudová rychlost, databity, parita a další. Následuje blok pro odeslání dat prostřednictvím sériového kanálu, k tomu je využita komponenta VISA write, k nalezení je na stejném místě. Je jí předáván COM port, na kterém má vysílat a buffer, ve kterém se nacházejí data (také řetězec) k odeslání.
Po odeslání řetězce je vhodné chvíli počkat, až příjemce zprávu zpracuje a zašle odpověď. Pak už nezbývá nic jiného než vyzvednout data z bufferu pro UART a zobrazit je v zobrazovacím poli „Teplota“ a přidat do grafu. Roztřídění jednotlivých kroků do struktur typu CASE jistě není nezbytné, ale při úpravě výchozího VI by jejich odstraňování přineslo jen zbytečnou práci. Jejich ponechání žádné nevýhody nepřinese.
Zdrojový kód pro PSoC
Jak už jsem uvedl, níže uvedený program byl vyvinut na vývojové desce PSoC MINI TOOL s procesorem CY8C29666. Teplotní čidlo DS18S20 je k němu připojno v režimu "parasite power", tedy je napájeno přes datový pin a napájení je spojeno se zemí. Není to však podmínkou. Datový spoj je připojen na port P1.3
#include#include "PSoCAPI.h" #include "stdlib.h" #include "string.h" extern BYTE Port_1_Data_SHADE; void main() { char * strPtr; // ukazatel na misto v pameti kam se ukladaj prijaty prikazy char strOut[5]; // ukazatel na 5 znaku konverze INT2STR (DEC) // globlani povoleni preruseni M8C_EnableGInt; // start a povoleni 16bit citace (neni vlastne potreba, ale je tam :-) ) Counter16_Start(); Counter16_EnableInt(); // start BD generatoru Counter8_Start(); // start a povoleni preruseni pro prijimac UARTU RX8_Start(RX8_PARITY_NONE ); RX8_EnableInt(); RX8_CmdReset(); // start vysilace UARTU TX8_Start(TX8_PARITY_NONE ); // zapnuti napajeni termostatu NAPAJENI_Start(); NAPAJENI_On(); // start modulu 1-wire OneWireSW_Start(); while(1) { // pokud prijde nejaky prikaz if(RX8_bCmdCheck()) { // prevezme prvni slovo if(strPtr = RX8_szGetParam()) { // parsuje.. if (!cstrcmp("RD_TEMP",strPtr)) { // pokud prijde pozadavek na precteni teploty // odesle pozadavek na konverzi // pocka az bude teplota zkonvertovana // a potom ji vycte a preposle pres seriovou linku OneWireSW_Reset(); // Reset the 1-Wire device OneWireSW_WriteByte(0xCC); // Skip ROM command OneWireSW_WriteByte(0x44); // Convert Temperature command OneWireSW_Delay10mTimes(75); // Wait 750 ms for the temperature conversion OneWireSW_Reset(); // Reset the 1-Wire device OneWireSW_WriteByte(0xCC); // Skip ROM command OneWireSW_WriteByte(0xBE); // Read Scratch Pad command utoa(strOut,OneWireSW_ReadByte()/2,10); TX8_PutString(strOut); } } RX8_CmdReset(); } } }
DOWNLOAD & Odkazy
- LabVIEW
- Teploměr DS18S20
- Teploměr VI
- Program pro procesor
- PSoC MINI TOOL,
- Mikrokontroléry PSoC (Cypress.com, PSoC Developer, PSoC.cz)
Komentáře
DOTAZ
Zdravím,
chtěl bych se zeptat zda je možné přepsat soubor VI tak, aby byl použitelný pro čidlo DS18S20 a převodník DS9097E? Prosím