Advertisement
linevich

Atmega

Mar 1st, 2015
3,021
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. $regfile = "m8def.dat"                                      'Мега8
  2. $crystal = 10000000                                         '10МГц
  3.  
  4.  
  5.  
  6. 'конфігурація підключення дисплею до портів мікроконтроллера
  7. Config Lcd = 16 * 2
  8. Config Lcdpin = Pin , Rs = Portd.6 , E = Portd.5 , Db4 = Portb.1 , Db5 = Portb.0 , Db6 = Portb.2 , Db7 = Portd.7
  9. Cursor Off
  10. Cls
  11.  
  12. 'малюємо нестандартний символ
  13. Deflcdchar 0 , 28 , 20 , 28 , 32 , 32 , 32 , 32 , 32        'знак градуса
  14.  
  15.  
  16. 'Конфігурація датчику вологості
  17.  
  18. 'об*явлення підпрограми
  19. Declare Sub Get_th(t As Byte , H As Byte)
  20.  
  21. Config Serialin = Buffered , Size = 128
  22. Config Serialout = Buffered , Size = 128
  23.  
  24. 'підключення датчика до PortC.2
  25. Dht_put Alias Portc.2
  26. Dht_get Alias Pinc.2
  27. Dht_io_set Alias Ddrc.2
  28.  
  29. Dim T As Byte                                               'поточна температура
  30. Dim H As Byte                                               'поточна вологість
  31. Dim Crc As Byte                                             'зімнна для зберігання байту парності
  32. Dim Mybyte As Byte
  33. Dim Sensor_data As String * 40                              'сюди будуть записуватись дані що відправляються датчиком
  34. Dim Tmp_str8 As String * 8
  35. Dim Count As Byte                                           'зімнна для підрахунку прийнтяих біт
  36.  
  37. Set Dht_io_set
  38. Set Dht_put
  39.  
  40. '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  41. 'кінець налаштування датчика
  42.  
  43. ' настройка інших периферійних приладів
  44. Config Portc.4 = Output                                     'вихід релє вентилятора
  45. Rele1 Alias Portc.4                                         'підключення релє вентилятора
  46.  
  47.  
  48. Config Portc.3 = Output                                     'світлодіод робочого стану
  49. Led Alias Portc.3
  50.  
  51. Config Portd.0 = Output                                     'світлодіод помилки та іншої індикації
  52. Ledred Alias Portd.0
  53.  
  54. Config Portd.1 = Output                                     'підсвітка дисплею
  55. Backlight Alias Portd.1
  56.  
  57.  
  58.  
  59. Config Timer1 = Timer , Prescale = 1024
  60. On Timer1 Overflow:
  61. Stop Timer1
  62.  
  63.  
  64. 'налаштування зовнішніх переивань
  65. Config Int0 = Falling
  66. Config Int1 = Falling
  67.  
  68. Config Portd.4 = Input                                      'підключення другого виходу енкодеру
  69.  
  70. On Int0 Button                                              'переривання від кнопки енкодера
  71. On Int1 Encod                                               'переривання від повроту енкодера
  72.  
  73.  
  74. 'переменная для организации меню
  75. Dim A As Byte
  76.  
  77. 'переменные для зберігання значений волгості і температури
  78. Dim Hum_eeprom As Eram Byte                                 'значення межі волгості в еепром
  79. Dim Temp_eeprom As Eram Byte                                'значення межі температури в еепром
  80.  
  81. Dim Temp As Byte                                            'межа температури в оперативній пам*яті
  82. Dim Hum As Byte                                             'межа волгості в оперативній пам*яті
  83.  
  84. Dim Tdispl As Byte                                          'температура на екрані налаштувань
  85. Dim Hdispl As Byte                                          'вологість на екрані налаштувань
  86. Dim Tsave As Byte                                           'температура для запису в еепром
  87. Dim Hsave As Byte                                           'вологість для записи в еепром
  88.  
  89. Dim Error As Byte                                           'флаг помилки зчитування з датчика
  90.  
  91. Hum = Hum_eeprom                                            'отримання вологості з пам*яті
  92. Temp = Temp_eeprom                                          'отримання температури з пам*яті
  93.  
  94.  
  95. Dim Flag1 As Bit                                            'флаг стану першого релє
  96. Dim Ttemp As Byte                                           'тимчасова змінна для зберігання температури
  97. Dim Htemp As Byte                                           'тимчасова змінна для зберігання волгості
  98.  
  99. Cls
  100. Backlight = 1                                               'вмикаємо підсвітку дисплею
  101.  
  102. ' тест всіх світлодідів
  103. Led = 1
  104. Ledred = 1
  105. Waitms 20
  106. Led = 0
  107. Ledred = 0
  108. Waitms 60
  109. Led = 1
  110. Ledred = 1
  111. Waitms 20
  112. Led = 0
  113. Ledred = 0
  114.                    'тестування та вивід інформації під час запуску
  115. '#####################################################################################
  116. Rem ТЕСТ ВЕНТИЛЯЦИИ
  117. Lcd "TECT BEHTҐ§±бҐҐ"
  118. Rele1 = 1
  119. Wait 2
  120. Rele1 = 0
  121. Waitms 200
  122. Cls
  123.  
  124. Cls
  125.  
  126. Rem Установленная
  127. Rem температура:
  128. Lcd "©cїaЅoі»eЅЅaЗ"
  129. Lowerline
  130. Lcd "їeјѕepaїypa:"
  131. Locate 2 , 14
  132. Lcd Temp ; Chr(0) ; "C"
  133.  
  134. Wait 2
  135. Cls
  136.  
  137. Rem Установленная
  138. Rem вологість:
  139. Lcd "©cїaЅoі»eЅЅaЗ"
  140. Lowerline
  141. Lcd "і»a¶ЅocїД:"
  142. Locate 2 , 12
  143. Lcd Hum ; "%"
  144.  
  145. Wait 2
  146. Cls
  147.  
  148. '#####################################################################################
  149.                         'кінець тестової інформації
  150.  
  151.  
  152. ' моргання світлодіолів
  153. Led = 1
  154. Ledred = 1
  155. Waitms 20
  156. Led = 0
  157. Ledred = 0
  158. Waitms 60
  159. Led = 1
  160. Ledred = 1
  161. Waitms 20
  162. Led = 0
  163. Ledred = 0
  164.  
  165.  
  166. 'дозволяємо переивання
  167. Enable Interrupts
  168. Enable Int0
  169. Enable Int1
  170. Enable Timer1
  171.  
  172.                              'Головний цикл
  173. '================================================================================================
  174. Backlight = 0                                               'вимикаємо підсвітку
  175.  
  176.  
  177. Do
  178.  
  179. Disable Interrupts
  180. Call Get_th(t , H)                                          'отримуємо дані про температуру і вологість
  181. Gosub Compare                                               'порівнюємо з заданими межами та вмикаємо навантаження
  182. Enable Interrupts
  183.  
  184. If A = 0 Then                                               'виводимо на дисплей інформацію
  185.     Cls
  186.  
  187.   If H = 111 Then                                           'перевірка показів датчику, якщо вони не вірні то виводимо помилку
  188.     Ledred = 1
  189.     Lcd "Sensor"
  190.     Lowerline
  191.     Lcd "not respond"
  192.   Elseif H = 222 Then
  193.     Ledred = 1
  194.     Lcd "Sensor"
  195.     Lowerline
  196.     Lcd "is incorrect"
  197.   Elseif H = 123 Then
  198.     Ledred = 1
  199.     Lcd "CRC error"
  200.     Lowerline
  201.     Lcd "sensor is broken"
  202.  
  203.   Else
  204.  
  205.     Ledred = 0
  206.     Lcd "Temp: " ; T ; "C"
  207.     Lowerline
  208.     Lcd "Hmdt: " ; H ; "%"
  209.     Led = 1
  210.     Waitms 10
  211.     Led = 0
  212.     Wait 3
  213.  
  214.    End If
  215.   Wait 1
  216. End If
  217.  
  218.  
  219. If A = 1 Then
  220.     Timer1 = 0
  221.      Do
  222.      Cls
  223.      'межа Т
  224.      Lcd "Ёopoґ T"
  225.      Lowerline
  226.      Lcd Tdispl ; Chr(0) ; "C"
  227.      Waitms 400
  228.  Loop Until A <> 1
  229. End If
  230.  
  231.  
  232.  If A = 2 Then
  233.     Timer1 = 0
  234.     Do
  235.      Cls
  236.      'межа H
  237.      Lcd "Ёopoґ H"
  238.      Lowerline
  239.      Lcd Hdispl ; "%"
  240.      Waitms 400
  241.     Loop Until A <> 2
  242. End If
  243.  
  244.  
  245.  
  246. Loop
  247.  
  248.  
  249.  
  250.                          'робота з датчиком DHT11 / 22
  251. '**************************************************************************************************
  252.  
  253. Sub Get_th(t As Byte , H As Byte)
  254.  
  255.  Count = 0
  256.  Sensor_data = ""
  257.  Set Dht_io_set                                             'встановлюємо PD.6 в якості виходу
  258.  Reset Dht_put                                              'притискаємо шину до землі
  259.  Waitms 25                                                  'очікування не менше 18мс
  260.  
  261.  Set Dht_put                                                'відпускаємо шину
  262.  Waitus 40
  263.  Reset Dht_io_set                                           'встановлюємо PD.6 в якості виходу
  264.  Waitus 40                                                  'чекаємоо 40 мкс
  265.  If Dht_get = 1 Then                                        'якщо на порті досі 1
  266.     Error = 1                                               'означає, зо датчик не відповів
  267.     H = 111
  268.  
  269.     Exit Sub                                                'виходимо з підпрограми
  270.  End If
  271.  
  272. 'якщо датчик відповів і прижав шину до землі продовжуємо роботу
  273.   Waitus 80                                                 'чекаємо еще 80 мкс
  274.   If Dht_get = 0 Then                                       'якщо на линии по прежнему 0
  275.     Error = 2                                               'значит датчик сошел з ума
  276.     H = 222
  277.  
  278.     Exit Sub                                                'выходим из підпрограми
  279.   End If
  280. 'якщо все нормально і датчик відповів правильно, тогда продовжуємо
  281.  
  282.   While Dht_get = 1 : Wend                                  'чекаємо поки на шині з*явиться 1
  283.  
  284.    Do                                                       'починаємо приймати 40 біт даних
  285.     While Dht_get = 0 : Wend                                'чекаємо появи на шині 0
  286.     Waitus 30                                               'після появи 0 чекаємо 30мкс
  287.      If Dht_get = 1 Then                                    'якщо на шині 1
  288.        Sensor_data = Sensor_data + "1"                      'записуємо в змінну цю одиницю
  289.        While Dht_get = 1 : Wend                             'і чекаємо поки датчик відправить наступний біт
  290.        Else                                                 'інакше, якщо там був 0
  291.        Sensor_data = Sensor_data + "0"                      'записуємо цей 0 в змінну
  292.     End If
  293.     Incr Count                                              'збільшуємо лічильник на 1
  294.    Loop Until Count = 40                                    'повторємо поки лічильник не досягне 40
  295.  
  296.    Set Dht_io_set
  297.    Set Dht_put
  298.  
  299. 'починаємо сортувати отримані дані
  300.  
  301.    Tmp_str8 = Left(sensor_data , 8)                         'беремо 8 символів зміної
  302.    H = Binval(tmp_str8)                                     'це ціла частина волгості
  303.  
  304.    Tmp_str8 = Mid(sensor_data , 17 , 8)                     'беремо 8 символів з середини
  305.    T = Binval(tmp_str8)                                     'це ціла частина температури
  306.  
  307.    Tmp_str8 = Right(sensor_data , 8)                        'праві 8 символів
  308.    Crc = Binval(tmp_str8)                                   'перевірочні дані
  309. 'перевірка контрольної суми
  310.  
  311.    Mybyte = T + H                                           'складаємо значення температури і волгості
  312.    If Mybyte <> Crc Then                                    'якщо контрольна сума не зійшлась
  313.       Error = 3                                             'значит отримані дані не вірні
  314.       H = 123
  315.    End If
  316.  
  317. End Sub                                                     'повертаємось в головний цикл програми
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.                            'переривання по переповненню таймера
  328. '**************************************************************************************************
  329.  
  330. Overflow:
  331.  Stop Timer1                                                'зупиняємо і скидаємо таймер
  332.  Timer1 = 0
  333.  A = 0                                                      'обнуляемо змінну
  334.  Backlight = 0                                              'вимикаємо підсвітку
  335. Return
  336.  
  337.  
  338.  
  339.  
  340.  
  341.                        'ввімкнення/вимкнення навантаження
  342. '**************************************************************************************************
  343. Compare:                                                    'порівнюємо значення і вмик./вимикаємо навантаження
  344.  
  345.  If H = 111 Or H = 222 Or H = 123 Then                      'якщо покази некоректні вимикаємо навантаження і виходимо з підпрограми
  346.    Rele1 = 0
  347.    Goto Extcompare
  348.  End If
  349.  
  350.  
  351. If Flag1 = 0 Then                                           'якщо реле не включено
  352.   If T >= Temp Then                                         'якщо температура підвищилась вище встановленої
  353.   Rele1 = 1                                                 'вмикаємо вентиляцію
  354.   Flag1 = 1                                                 'ставимо флаг
  355.   End If
  356. End If
  357.  
  358. If Flag1 = 1 Then                                           'якщо релє включене
  359.   Ttemp = Temp + 1                                          'гістерезис температури 1 градус
  360.   If T < Ttemp Then                                         'знизилась
  361.    Rele1 = 0                                                'вимикаємо навантаження
  362.    Flag1 = 0                                                'і скидаємо флаг
  363.   End If
  364. End If
  365.  
  366. 'то же самое для волгості
  367. If Flag1 = 0 Then
  368.   If H > Hum Then                                           'якщо вологість перевишила встановлене значення
  369.   Rele1 = 1                                                 'вмикаємо вентиляцію
  370.   Flag1 = 1
  371.   End If
  372. End If
  373.  
  374. If Flag1 = 1 Then
  375.   Htemp = Hum - 1
  376.   If H =< Htemp Then
  377.    Rele1 = 0
  378.    Flag1 = 0
  379.   End If
  380. End If
  381.  
  382. Extcompare:
  383.  
  384. Return
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.                        'обробка переривань енкодера
  392. '**************************************************************************************************
  393. Encod:
  394.  
  395.  Backlight = 1                                              'вмикаємо підсвітку дисплея
  396.  Stop Timer1
  397.  Timer1 = 0
  398.  Start Timer1
  399.  
  400.  
  401.  If A > 0 Then
  402.   Waitms 2                                                  'чекаємо поки затихне дрижджання контактів
  403.   If Pind.3 = 0 Then
  404.    If Pind.4 = 0 Then                                       'якщо на ніжці 1 (немає імпульсу)
  405.  
  406.     If A = 1 Then
  407.      Incr Tdispl
  408.        If Tdispl > 100 Then
  409.         Tdispl = 100
  410.        End If
  411.  
  412.     End If
  413.  
  414.     If A = 2 Then
  415.      Incr Hdispl
  416.  
  417.       If Hdispl > 100 Then
  418.         Hdispl = 100
  419.        End If
  420.  
  421.     End If
  422.  
  423.    Else
  424.  
  425.     If A = 1 Then
  426.      Decr Tdispl
  427.      If Tdispl > 200 Then
  428.       Tdispl = 0
  429.      End If
  430.  
  431.     End If
  432.  
  433.     If A = 2 Then
  434.      Decr Hdispl
  435.  
  436.      If Hdispl > 200 Then
  437.       Hdispl = 0
  438.      End If
  439.  
  440.     End If
  441.  
  442.  
  443.    End If
  444.   End If
  445.  Gifr = 128                                                 'скидаємо регістр зберігання переривання INT1
  446.  End If
  447.  
  448.  
  449. Return
  450.  
  451.  
  452.  
  453.  
  454. Button:                                                     'натискання кнопки
  455.  
  456.  Timer1 = 0                                                 'скидання таймеру
  457.  Start Timer1                                               'запуск таймеру
  458.  Backlight = 1                                              'увімкнули підсвітку дисплею
  459. 'magic, no comments
  460.    If A = 2 Then
  461.     A = 0
  462.  
  463.     'тут організована перевірка зміни даних та їх запис в EPROM
  464.     If Tdispl <> Temp Then
  465.         Temp = Tdispl
  466.         Temp_eeprom = Temp
  467.         Cls
  468.         'Темп записана
  469.         Lcd "Teјѕ. ·aѕёcaЅa"
  470.          Ledred = 1
  471.          Waitms 50
  472.          Ledred = 0
  473.         Wait 1
  474.  
  475.     End If
  476.  
  477.     If Hdispl <> Hum Then
  478.        Hum = Hdispl
  479.        Hum_eeprom = Hum
  480.        Cls
  481.        'Влаж записана
  482.        Lcd "B»a¶. ·aѕёcaЅa"
  483.         Ledred = 1
  484.         Waitms 50
  485.         Ledred = 0
  486.  
  487.        Wait 1
  488.  
  489.     End If
  490.       Waitms 30
  491.       Gifr = 64
  492.  
  493.        Sound , Portb.3 , 600 , 500
  494.       Goto Argh                                             'переходимо в кінець підпрограми, щоб пропустити всі інші умови
  495.  
  496.   End If
  497.  
  498.  
  499.    Sound , Portb.3 , 200 , 500
  500.  
  501.    If A = 1 Then
  502.     A = 2
  503.     Hdispl = Hum
  504.    End If
  505.  
  506.    If A = 0 Then
  507.     A = 1
  508.     Tdispl = Temp
  509.    End If
  510.  
  511.  
  512.  
  513. Argh:
  514.  Ledred = 1
  515.  Waitms 30
  516.  Ledred = 0
  517.  
  518.  Waitms 50                                                  'очікування затихання дрижджання
  519.  Gifr = 64                                                  'скидання флага наступного переривання
  520.  
  521. Return
  522.  
  523.  
  524. End
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement