Microprocessor and peripheral 2 assignments for AUTH
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

210 lines
4.7 KiB

  1. /*!
  2. * \file hal.c
  3. *
  4. * Copyright (C) 2020 Choutouridis Christos (http://www.houtouridis.net)
  5. *
  6. * This program is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU Lesser General Public License as
  8. * published by the Free Software Foundation, either version 3
  9. * of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. *
  19. */
  20. #include "hal.h"
  21. /*
  22. * Public data types / classes
  23. */
  24. alcd_t alcd;
  25. ow_uart_t ow;
  26. proximity_t prox;
  27. /*!
  28. * Initialize all hardware
  29. * @return
  30. */
  31. int hal_hw_init (void) {
  32. // Init base board
  33. NUCLEO_Init(1000);
  34. SHIELD_Init ();
  35. // Start Jiffy functionality
  36. jf_link_setfreq (JF_setfreq);
  37. jf_link_value ((jiffy_t*)&JF_TIM_VALUE);
  38. jf_init (JF_TIM_CLOCK_FREQ, 1000);
  39. return 0;
  40. }
  41. /*
  42. * ========== LCD ===========
  43. */
  44. /*!
  45. * \brief
  46. * Initialize the lcd data. Not the LCD module
  47. */
  48. void lcd_init (void) {
  49. alcd_link_db4 (&alcd, SHIELD_LCD_DB4);
  50. alcd_link_db5 (&alcd, SHIELD_LCD_DB5);
  51. alcd_link_db6 (&alcd, SHIELD_LCD_DB6);
  52. alcd_link_db7 (&alcd, SHIELD_LCD_DB7);
  53. alcd_link_rs (&alcd, SHIELD_LCD_RS);
  54. alcd_link_en (&alcd, SHIELD_LCD_EN);
  55. alcd_link_bl (&alcd, SHIELD_LCD_BL);
  56. alcd_set_lines (&alcd, 2);
  57. alcd_set_columns (&alcd, 16);
  58. alcd_init (&alcd, (alcd_funset_en)LCD_FUNSET_2L8);
  59. }
  60. __INLINE void lcd_enable (uint8_t en) {
  61. alcd_enable(&alcd, en);
  62. }
  63. __INLINE int lcd_putchar (char c) {
  64. return alcd_putchar(&alcd, c);
  65. }
  66. int lcd_puts (const char *s) {
  67. int i =0;
  68. while (alcd_putchar(&alcd, *s++))
  69. ++i;
  70. return i;
  71. }
  72. /*
  73. * ========== Led interface ==========
  74. */
  75. __INLINE void led_red (uint8_t en) { LED_RED (en); }
  76. __INLINE void led_green (uint8_t en) { LED_GREEN (en); }
  77. /*
  78. * ========= Relay ===========
  79. */
  80. void relay (uint8_t on) {
  81. switch (on) {
  82. case 0:
  83. SHIELD_BR1(1);
  84. HAL_Delay(100);
  85. SHIELD_BR1(0);
  86. break;
  87. default:
  88. SHIELD_BR2(1);
  89. HAL_Delay(100);
  90. SHIELD_BR2(0);
  91. break;
  92. }
  93. }
  94. /*
  95. * ========= Temperature ===========
  96. */
  97. uint8_t ds18b20_rom[8];
  98. uint8_t zero_rom[8] = {0};
  99. int temp_init (uint8_t resolution) {
  100. if (!IS_TEMP_RESOLUTION(resolution))
  101. return 1;
  102. ow_uart_link_rw (&ow, (ow_uart_rw_ft)SHIELD_1W_RW);
  103. ow_uart_link_br (&ow, (ow_uart_br_ft)SHIELD_1W_UART_BR);
  104. ow_uart_set_timing (&ow, OW_UART_T_STANDARD);
  105. ow_uart_init (&ow);
  106. ow_uart_search(&ow, ds18b20_rom);
  107. if (!memcmp ((const void*)ds18b20_rom, (const void*)zero_rom, 8))
  108. return 1;
  109. // set resolution to 9-bit
  110. ow_uart_reset(&ow);
  111. ow_uart_tx (&ow, SKIPROM); // Skip rom
  112. ow_uart_tx (&ow, WRITESCRATCH); // write scratchpad
  113. ow_uart_tx (&ow, (byte_t)127); // Th
  114. ow_uart_tx (&ow, (byte_t)-128); // Tl
  115. ow_uart_tx (&ow, resolution); // Configuration 9 bit
  116. HAL_Delay(100);
  117. return 0;
  118. }
  119. float temp_read (void) {
  120. uint8_t t[2];
  121. ow_uart_reset(&ow);
  122. ow_uart_tx (&ow, SKIPROM); // Skip rom
  123. ow_uart_tx (&ow, STARTCONV); // convert temperature
  124. while (ow_uart_rx(&ow) == 0) // Wait for slave to free the bus
  125. ;
  126. //HAL_Delay (100);
  127. ow_uart_reset(&ow);
  128. ow_uart_tx (&ow, SKIPROM); // Skip rom
  129. ow_uart_tx (&ow, READSCRATCH); // read scratchpad
  130. t[0] = ow_uart_rx(&ow); // LSB
  131. t[1] = ow_uart_rx(&ow); // MSB
  132. ow_uart_reset(&ow);
  133. t[1] <<= 4;
  134. t[1] |= (t[0] >> 4);
  135. t[0] &= 0x0F;
  136. return t[1] + t[0]/16.0;
  137. }
  138. /*
  139. * ========= Proximity ===========
  140. */
  141. void proximity_init (proximity_t* p){
  142. for (int i =0 ; i<PROX_READINGS ; ++i)
  143. proximity(p);
  144. }
  145. float_t proximity (proximity_t* p){
  146. float_t ret;
  147. clock_t t1, t2, mark;
  148. SHIELD_TRIG(1); // send pulse and mark cycles
  149. jf_delay_us(10);
  150. SHIELD_TRIG(0);
  151. // wait for response with timeout
  152. mark = clock();
  153. do {
  154. t1 = CYCLE_Get();
  155. if (clock() - mark >= PROX_TIME_MAX)
  156. return -1;
  157. } while (!SHIELD_ECHO());
  158. mark = clock();
  159. do {
  160. t2 = CYCLE_Get();
  161. if (clock() - mark >= PROX_TIME_MAX)
  162. return -1;
  163. } while (SHIELD_ECHO());
  164. SystemCoreClockUpdate();
  165. uint32_t c_usec = SystemCoreClock / 1000000;
  166. // Load value
  167. p->readings[p->iter++] = (c_usec) ? ((t2 - t1)/c_usec) / 58.2 : PROX_MAX_DISTANSE;
  168. p->iter %= PROX_READINGS;
  169. // Return filtered distance
  170. ret =0;
  171. for (int i=0 ; i<PROX_READINGS ; ++i)
  172. ret += p->readings[i];
  173. return ret/PROX_READINGS;
  174. }