k_vychodilova

mikro?teplota

Nov 15th, 2018
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.24 KB | None | 0 0
  1. /*
  2. * Ukazkovy program pro Programovani mikropocitacu
  3. * Komunikace pres I2C
  4. * Program ukazuje cteni dat z teplomeru a vlhkometu pres I2C.
  5. * Namerene hodnoty zobrazuje na LCD displeji.
  6. *
  7. *
  8. * Postup vytvoreni projektu s ovladacem I2C
  9. * 1) Pridat do projektu soubor RTE_Devices.h z CMSIS_Driver/Config.
  10. * Vhodne je zkopirovat (Copy file) do projektu a ne linkovat (Link to file),
  11. * aby mohl mit kazdy projekt svou konfiguraci ovladacu.
  12. *
  13. * 2) vlozit do zdrojoveho kodu #include "RTE_Device.h"
  14. *
  15. * 3) Pridat do projektu zdrojove kody ovladace (ovladacu).
  16. * I2C: I2C_MKL25Z4.c
  17. *
  18. * 4) Pridat slozku KSDK do projektu, pretazenim z Pruzkumnika na projekt
  19. * a volbou "Link to files and folders". Vznikne tak slozka "KSDK" v projektu.
  20. *
  21. * 4) Pridat cesty k nasledujicim umistenim do nastaveni C Compiler Includes:
  22. * CMSIS_Driver
  23. * KSDK/hal
  24. * KSDK/mkl25z4
  25. * Muzeme pridat absolutni cesty. Pro cesty v KSDK muzeme take pridat odkazy
  26. * pres tlacitko Workspace.
  27. * Priklad konkretnich cest v seznamu Includes:
  28. * "../../../CMSIS_Driver"
  29. * "${workspace_loc:/${ProjName}/KSDK/hal}"
  30. * "${workspace_loc:/${ProjName}/KSDK/mkl25z4}"
  31. *
  32. * Pro vypis na displej kitu je treba vlozit take ovladac LCD.
  33. *
  34. */
  35.  
  36. #include "MKL25Z4.h"
  37. #include "RTE_Device.h"
  38. #include <stdio.h>
  39. #include "drv_lcd.h" // ovladac displeje
  40. #include "drv_systick.h" // pro delay_ms
  41. #include "drv_uart.h" //komunikace
  42. #include <time.h>
  43.  
  44. // Adresy obvodu na I2C sbernici
  45. #define I2C_ADR_RTC (0b1010000)
  46. #define I2C_ADR_TEMP_SENSOR (0b1001000)
  47. #define I2C_ADR_HMDT_SENSOR (0b0100111)
  48.  
  49. // Registry teplotniho snimace LM75
  50. #define LM75_REG_TEMP (0)
  51. /*
  52. #define LM75_REG_CONF (1)
  53. #define LM75_REG_THYST (2)
  54. #define LM75_REG_TOS (3)
  55. */
  56.  
  57. // Prototypy
  58. void i2c0_event(uint32_t event);
  59. void delay(void);
  60. uint32_t MeasureHumidity(void); // zmereni vlhkosti
  61. uint32_t MeasureTemperature(void);
  62. void vypisMenu();
  63. void vypisTeplotu(char buffer[]);
  64. void vypisVlhkost(char buffer[]);
  65.  
  66. int main(void) {
  67. ARM_I2C_STATUS status;
  68. char buffer[16];
  69.  
  70. // Inicializace a konfigurace ovladace I2C
  71. Driver_I2C1.Initialize(i2c0_event);
  72. Driver_I2C1.PowerControl(ARM_POWER_FULL);
  73. Driver_I2C1.Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_STANDARD);
  74.  
  75. // Inicializace ovladace displeje
  76. //LCD_initialize();
  77.  
  78. // Inicializace ovladace pro cekani
  79. SYSTICK_initialize();
  80.  
  81. // Mereni
  82.  
  83. uint8_t vypis = 0;
  84. uint8_t ukazMenu = 1;
  85. char c;
  86.  
  87. // Nastaveni preruseni od casovace SysTick na 1 ms periodu
  88. // vyuzito v delay_ms
  89. SysTick_Config(SystemCoreClock / 1000u);
  90.  
  91. //9600 rychlost
  92. UART0_Initialize(BD9600);
  93.  
  94. while (1) {
  95. if (UART0_Data_Available()) {
  96. c = UART0_getch();
  97. }
  98.  
  99. switch (c) {
  100. case 't':
  101. vypisTeplotu(buffer);
  102. break;
  103. case 'h':
  104. vypisVlhkost(buffer);
  105. break;
  106. case 'm':
  107. vypisMenu();
  108. break;
  109. default:
  110. break;
  111. }
  112.  
  113. SYSTICK_delay_ms(1000);
  114. }
  115. /* Never leave main */
  116. return 0;
  117. }
  118.  
  119. void vypisMenu() {
  120. UART0_puts("t: Teplota h: Vlhkost m: Menu\n");
  121. }
  122.  
  123. void vypisTeplotu(char buffer[]) {
  124. uint32_t temperature = MeasureTemperature();
  125. sprintf(buffer, "Teplota: %.1f %cC\n", (float) temperature / 10, 176);
  126. UART0_puts(buffer);
  127. }
  128.  
  129. void vypisVlhkost(char buffer[]) {
  130. uint32_t measureHumidity=MeasureHumidity();
  131. sprintf(buffer, "Vlhkost: %d %% \n", measureHumidity );
  132. UART0_puts(buffer);
  133.  
  134. }
  135.  
  136. /*
  137. * Zmeri vlhkost.
  138. * Vraci vlhkost v procentech.
  139. */
  140. uint32_t MeasureHumidity(void) {
  141. uint8_t hih_measure_status;
  142. uint8_t dataSend[2] = { 0 }; // data to send
  143. uint8_t sendSize = 0; // number of bytes to send
  144. uint8_t dataReceive[4];
  145. uint32_t humidity;
  146. ARM_I2C_STATUS status;
  147.  
  148. // Zahajime mereni poslanim slave adresy a R/W bitu 0 (prikaz write bez dat)
  149. Driver_I2C1.MasterTransmit(I2C_ADR_HMDT_SENSOR, dataSend, 0, false);
  150. status = Driver_I2C1.GetStatus();
  151. while (status.busy) {
  152. status = Driver_I2C1.GetStatus();
  153. }
  154. // Senzoru trva 37 ms nez dokonci prevod.
  155. // Muzeme take zjistovat status bity v prijatych datech, ale
  156. // to je komplikovanejsi.
  157. SYSTICK_delay_ms(40);
  158.  
  159. Driver_I2C1.MasterReceive(I2C_ADR_HMDT_SENSOR, dataReceive, 4, false);
  160. // Cekame na prijem dat
  161. status = Driver_I2C1.GetStatus();
  162. while (status.busy) {
  163. status = Driver_I2C1.GetStatus();
  164. }
  165.  
  166. humidity = 256 * (dataReceive[0] & 0b00111111) + dataReceive[1];
  167.  
  168. // Vypocet vlhkosti
  169. humidity = ((int) humidity * 100) / 16383;
  170. return humidity;
  171.  
  172. }
  173.  
  174. /*
  175. Cteni teploty z LM75A
  176. Vraci teplotu ve stupnich x 10, napr. 205 znamena 20.5 C
  177.  
  178. Poznamky:
  179. Obvod ma "pointer" ktery urcuje, co chceme cist nebo zapisovat.
  180. adresa 0 = teplota (2 B)
  181. adresa 1 = config (1B)
  182. a dalsi nepodstatne adresy :)
  183. V config registru je defaultne hodnota 0 a ta vyhovuje pro mereni teploty.
  184. Presto se zda nutne do nej zapsat nejprve tuto 0.
  185. */
  186. uint32_t MeasureTemperature(void) {
  187. // Inicializacni prikaz pro teplotni senzor LM75
  188. const uint8_t cmd_lm75_init[] = { 0b00000001, 0b00000000 }; // zapis defaultnich hodnot do config registru
  189.  
  190. uint8_t dataSend[2] = { 0 }; // data to send
  191. uint8_t sendSize = 0; // number of bytes to send
  192. uint8_t dataReceive[2];
  193. uint32_t temperature;
  194. ARM_I2C_STATUS status;
  195.  
  196. // Inicializace teplotniho snimace
  197. Driver_I2C1.MasterTransmit(I2C_ADR_TEMP_SENSOR, cmd_lm75_init, 2, false);
  198. // Cekame na odeslani dat
  199. status = Driver_I2C1.GetStatus();
  200. while (status.busy) {
  201. status = Driver_I2C1.GetStatus();
  202. }
  203.  
  204. #if 1
  205. // Varianta a) - cteni teploty s poslanim pointer hodnoty
  206. // tj. posilam prikaz "precti registr s teplotou":
  207. // pointer = 0 (teplota;
  208. // cti(pointer)
  209.  
  210. dataSend[0] = LM75_REG_TEMP; // hodnota = 0 = pointer
  211. sendSize = 1;
  212. Driver_I2C1.MasterTransmit(I2C_ADR_TEMP_SENSOR, dataSend, sendSize, true);
  213. // Cekame na odeslani dat
  214. status = Driver_I2C1.GetStatus();
  215. while (status.busy)
  216. status = Driver_I2C1.GetStatus();
  217.  
  218. Driver_I2C1.MasterReceive(I2C_ADR_TEMP_SENSOR, dataReceive, 2, false);
  219. // Cekame na odeslani dat
  220. status = Driver_I2C1.GetStatus();
  221. while (status.busy)
  222. status = Driver_I2C1.GetStatus();
  223.  
  224. temperature = (256 * dataReceive[0] + dataReceive[1]) >> 5;
  225. temperature = (temperature * 1270) / 0x3f8; // prepocet na st.C
  226. return temperature;
  227. #endif
  228.  
  229. #if 0
  230. //
  231. // Varianta b) - cteni teploty with preset pointer - funguje taky
  232. // tj. posilam prikaz precti posledni registr (a to je registr teploty, pokud
  233. // jsem na nej predtim nastavil pointer:
  234. // Stav:
  235. // nefunguje; arbitration lost po prvnim cteni...
  236. dataSend[0] = LM75_REG_TEMP;// hodnota = 0 = pointer
  237. sendSize = 1;
  238. Driver_I2C1.MasterTransmit(I2C_ADR_TEMP_SENSOR, dataSend, sendSize, true);
  239. status = Driver_I2C1.GetStatus();
  240. while (status.busy)
  241. status = Driver_I2C1.GetStatus();
  242. Driver_I2C1.MasterReceive(I2C_ADR_TEMP_SENSOR, dataReceive, 2, false);
  243. status = Driver_I2C1.GetStatus();
  244. while (status.busy)
  245. status = Driver_I2C1.GetStatus();
  246.  
  247. temperature = (256 * dataReceive[0] + dataReceive[1]) >> 5;
  248. temperature = (temperature * 1270) / 0x3f8;// prepocet na st.C
  249. return temperature;
  250.  
  251. #endif
  252.  
  253. }
  254.  
  255. // funkce volana ovladacem I2C pokud povolime signalizaci udalosti
  256. void i2c0_event(uint32_t event) {
  257. ;
  258. }
  259.  
  260. ////////////////////////////////////////////////////////////////////////////////
  261. // EOF
  262. ////////////////////////////////////////////////////////////////////////////////
Advertisement
Add Comment
Please, Sign In to add comment