Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Контроллер стиральной машины

Сообщений 31 страница 58 из 58

31

Nord написал(а):

Интересная мысль, надо взять на вооружение...

Кстати, olegkaras, а на бывшей стиралке что-то живое, кроме желания ее оживить, осталось ?

Я эту стиралку специально приобрел для тренировки, у нее все рабочее кроме платы управления можно сказать что  ее нет.

0

32

olegkaras написал(а):

Я эту стиралку специально приобрел для тренировки, у нее все рабочее кроме платы управления можно сказать что  ее нет.

Так в чем тогда проблема-то ?
Наверняка там уже имеются и датчики наличия воды и не только, того же дисбаланса (возможно), весь набор исполнительных устройств...
Все есть, осталось только использовать ! ;)

0

33

Nord написал(а):

Так в чем тогда проблема-то ?
Наверняка там уже имеются и датчики наличия воды и не только, того же дисбаланса (возможно), весь набор исполнительных устройств...
Все есть, осталось только использовать !

Датчик наличия воды есть ,его и буду использовать , разговор про датчик давления я завел для того, что вдруг у кого то кто будет тоже делать плату этот датчик не рабочий.
Дисбаланс там измерялса по ТАХО  , думаю так и я сделаю , буду мерить время 1/3 части оборота потом другой 1/3  и по разнице судить о дисбалансе.

0

34

olegkaras написал(а):

буду мерить время 1/3 части оборота потом другой 1/3

Давай-ка хоть часть кода напиши, посмотрим на что ты способен.

0

35

СсылкаНе понял , а в первом посту это чего?

0

36

Мне не нужны ссылки твои, я не живу чужим умом и гуглем  :D
Напиши что-то СВОЁ, покажи НАМ хоть часть, всё не нужно - и мы (я лично) буду тебе помогать написать то, что ты хочешь!
А если ты будешь пытаться вЪехать в рай на чужом ....   помощи не жди!

0

37

-NMi- написал(а):

Мне не нужны ссылки твои, я не живу чужим умом и гуглем  
Напиши что-то СВОЁ, покажи НАМ хоть часть, всё не нужно - и мы (я лично) буду тебе помогать написать то, что ты хочешь!
А если ты будешь пытаться вЪехать в рай на чужом ....   помощи не жди!

Вы смотрели ппрограмму которую я вылошел в первом посту?
Там  один из кусков кода как раз и меряет частоту вращения, я ее подправлю и будет мерять время 1/3 оборота .
Да там есть куски кода чужие не мои , если они мне подходят то зачем мне писать что то свое, или тоже самое но левой рукой? :writing:

0

38

Дык сыда запость и под спойлер спрячь.  Лично у меня твоя ссылка не работает....

0

39

-NMi- написал(а):

Дык сыда запость и под спойлер спрячь.  Лично у меня твоя ссылка не работает....

Это что за жаргон? :glasses: чего спрятать?
Ну если ссылка не работает попробую выложить через яндекс диск, в принцепе я так и хотел, но почему то файл из телефона не смог закинуть на яндекс диск , может кто подскажет в чом может быть причина ?

Отредактировано olegkaras (2018-01-28 21:19:28)

0

40

Не получается скинуть на яндекс. У кого моя ссылка открывается в первом посте перезалейте через яндекс.

Отредактировано olegkaras (2018-01-28 21:45:28)

0

41

Свернутый текст
Код:
'===============================================================================
  $regfile = "m32def.dat"       ' мега32
$crystal = 16000000
'$baud = 4800
$hwstack = 120      ' default use 32 for the hardware stack
$swstack = 120      ' default use 10 for the SW stack
$framesize = 120    ' default use 40 for the frame space
  'Ucsr0a.1 = 1

Config Timer0 = Timer , Prescale = 64       'настройка прерывания Для Подсчета 1 Секунды Pulse по таймеру ' Делитель 32768 / 64 / 256
On Timer0 Pulse:
Enable Interrupts
Enable Timer0
'********************* ADC ***********************
Config Adc = Single , Prescaler = Auto , Reference = Avcc

'********************* ШИМ ***********************
'Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 256
Config Timer1 = Pwm , Pwm = 8 , Compare B Pwm = Clear Up , Prescale = 256
Config Portd.4 = Output
'Config Portd.5 = Output

'********************************************

Config Int0 = Falling
' переход по получению импульса
On Int0 Обработка_прерывания_int0
Enable Int0

'----------------  Используемые библиотеки  ----------------------------------------

 '$lib "mcsbyte.lbx"
 ' $lib "glcd-Nokia1100.lib"
 $lib "glcd-Nokia1100_China.lib"


'----------------  Настраиваем LCD Nokia1100  -------------------
  Config Graphlcd = 128x64sed , Cs1 = Porta.7 , Si = Portc.7 , Sclk = Porta.5 , Rst = Porta.6
  Const Negative_lcd = 0       ' Для негативного вывода информации, установить "Negative_lcd = 1"
  Const Mirror_y = 1
  Const Mirror_x = 0
  Initlcd           ' Инициализируем LCD
  Cls               ' Очищаем LCD



  '********************* Установки Дисплея и Инициализация ***********************


'Nokia_spi_data Alias Portc.7 : Config Portc.7 = Output      'SDA       - можно задать любую ножку
'Nokia_spi_clock Alias Porta.5 : Config Porta.5 = Output     'SCLK        - можно задать любую ножку
'Nokia_cs Alias Porta.7 : Config Porta.7 = Output            'CS         - можно задать любую ножку
'Display_reset Alias Porta.6 : Config Porta.6 = Output       'LCD_RESET  - можно задать любую ножку
'Display_reset = 1
'Nokia_cs = 1

'Declare Sub Nokia_init()
'Declare Sub Nokia_clear()
'Declare Sub Nokia_text(byval Nokia_x As Byte , Byval Nokia_y As Byte , Byval Nokia_text As String , Byval Nokia_inversion As Byte)
'Declare Sub Nokia_picture(bylabel Nokia_label As Word)

'Dim W As Iram Word At 8 Overlay
'Dim Nokia_data_9 As Integer

'Call Nokia_init()                                           ' Инициализируем дисплей


'*******************************************************************************
Config Portb.6 = Input , Portb.2 = Input , Portb.4 = Input , Portb.3 = Input , Portb.5 = Input , Portd.7 = Input , Portc.2 = Input , Portc.3 = Input , Portd.5 = Input , Portd.6 = Input , Portc.4 = Input , Portc.5 = Input , Portd.0 = Input , Portd.1 = Input , Porta.3 = Input , Porta.4 = Input
Set Portb.6 : Set Portb.2 : Set Portb.4 : Set Portb.3 : Set Portb.5 : Set Portd.7 : Set Portc.2 : Set Portc.3 : Set Portd.5 : Set Portd.6 : Set Portc.4 : Set Portc.5 : Set Portd.0 : Set Portd.1 : Set Porta.3 : Set Porta.4
Стоп_key Alias Pinb.6 : Пуск_пауза_key Alias Pinb.2 : Плюс_вода_temp Alias Pinb.4 : Минус_вода_temp Alias Pinb.3 : Плюс_обороты_key Alias Pinb.5 : Минус_обороты_key Alias Pind.7 : Курсор_вверх_key Alias Pinc.2 : Курсор_вниз_key Alias Pinc.3 : Количество_полосканий_плюс_key Alias Pind.5 : Количество_полосканий_минус_key Alias Pind.6
Время_стирки_плюс_key Alias Pinc.4 : Время_стирки_минус_key Alias Pinc.5 : Время_замачевания_плюс_key Alias Pind.0 : Время_замачевания_минус_key Alias Pind.1 : Отстрочка_плюс_key Alias Pina.3 : Отстрочка_минус_key Alias Pina.4

'*******************************************************************************



Const Realization_i2c = 2       ' 1 - аппаратный i2c, 2 - программный i2c
  #if Realization_i2c = 2
      Config Sda = Portb.0
      Config Scl = Portb.1
      Config I2cdelay = 1
  #endif

  I2cinit           ' Инициализация шины I2c
  Waitms 50         ' Ждём пока запустится i2c


'===============================================================================
'                    Конфигурация акселерометра ADXL345
'===============================================================================
'http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345.pdf

  Const Запись_adxl345 = &HA6       ' ADXL345 адрес записи
  Const Чтение_adxl345 = &HA7       ' ADXL345 адрес чтения

  I2cstart
  I2cwbyte Запись_adxl345
  I2cwbyte &H2D     ' Power-saving features control
  I2cwbyte &B0000_1000
  I2cstop

  I2cstart
  I2cwbyte Запись_adxl345
  I2cwbyte &H31
  I2cwbyte &B00000000       ' Data format control
  I2cstop           ' Освобождаем шину I2c

  I2csend Запись_adxl345 , &B00001000       ' Пробуждение датчика

'===============================================================================
'                        Используемые переменные
'===============================================================================
  Dim Флаг_есть_данные As Byte
  Dim Флаг_обновить_lcd As Byte
  Dim Количество_измерений As Byte
  Dim Угол_наклона_integer As Integer

  Dim X_byte(2) As Byte
  Dim Y_byte(2) As Byte
  Dim Z_byte(2) As Byte
  Dim X_integer As Integer At X_byte(1) Overlay
  Dim Y_integer As Integer At Y_byte(1) Overlay
  Dim Z_integer As Integer At Z_byte(1) Overlay

  Dim X_integer_нов As Integer , X_integer_разница As Integer
  Dim Y_integer_нов As Integer , Y_integer_разница As Integer
  Dim Z_integer_нов As Integer , Z_integer_разница As Integer

  Dim Сумма_x_integer As Integer
  Dim Сумма_y_integer As Integer
  Dim Сумма_z_integer As Integer

  Dim Сумма_x_y_z As Integer
  Dim Сумма_x_y_z_новое As Integer
  Dim К As Byte
 Dim Сумма As Integer


  Dim X_single As Integer
  Dim Y_single As Integer
  Dim Z_single As Integer

  Dim X_str As String * 8
  Dim Y_str As String * 8
  Dim Z_str As String * 8

  Dim P_gain As Byte
  Dim I_gain As Byte
  Dim D_gain As Byte
  Dim Gain_scaling As Integer
  Dim Kof As Byte
  Dim F_rpm As Byte
  Dim Count_t As Integer
  Dim Count_1 As Integer
  Dim Count_2 As Integer
  Dim Spid_1 As Integer
  Dim Feedback As Integer
  Dim Setpoint As Integer
  Dim Заданная_скорость As Byte
  Dim Pid_p As Integer
  Dim Pid_d As Integer
  Dim Pid_px As Integer
  Dim Pid_y As Integer
  Dim Pid_i As Integer
  Dim Pid_y_1 As Integer
  Dim Pid_y_2 As Integer
  Dim A As Byte
   '===========================переменные калибровка терморезистора========================================
 Dim Adc_rtc As Integer
 Dim T_0_gr As Integer , T_10_gr As Integer , T_20_gr As Integer , T_30_gr As Integer , T_40_gr As Integer , T_50_gr As Integer , T_60_gr As Integer , T_70_gr As Integer , T_80_gr As Integer , T_90_gr As Integer , T_100_gr As Integer
 Dim T_0_gr_eram As Integer , T_10_gr_eram As Integer , T_20_gr_eram As Integer , T_30_gr_eram As Integer , T_40_gr_eram As Integer , T_50_gr_eram As Integer , T_60_gr_eram As Integer , T_70_gr_eram As Integer , T_80_gr_eram As Integer , T_90_gr_eram As Integer , T_100_gr_eram As Integer
 Dim T_univ_gr_temp As Integer
 Dim Y As Integer
 Dim Adc2 As Integer
 Dim Adc3 As Integer
 Dim Adc3_temp As Integer
 Dim Температура_adc4 As Integer
 Dim Temper_kal As Byte



 Dim Стоп As Bit
 Dim Инженерное_меню As Integer
 Dim Курсор_вверх As Bit
 Dim Курсор_вниз As Bit
 Dim Пуск_пауза As Bit
 Dim Pod_1 As Bit , Pod_2 As Bit , Pod_3 As Bit , Pod_4 As Bit , Pod_5 As Bit , Pod_6 As Bit , Pod_7 As Bit , Pod_8 As Bit , Pod_9 As Bit , Pod_10 As Bit , Pod_11 As Bit , Pod_12 As Bit , Pod_13 As Bit
 Dim Pod_14 As Bit , Pod_15 As Bit , Pod_16 As Bit , Pod_17 As Bit , Pod_18 As Bit , Pod_19 As Bit , Pod_20 As Bit , Pod_21 As Bit , Pod_22 As Bit , Pod_23 As Bit , Pod_24 As Bit , Pod_25 As Bit
 Dim Pod_26 As Bit , Pod_27 As Bit , Pod_28 As Bit , Pod_29 As Bit
 Dim Kursor_1 As Byte , Kursor_2 As Byte , Kursor_3 As Byte , Kursor_4 As Byte , Kursor_5 As Byte , Kursor_6 As Byte
 Dim Число_импульсов_обор_taxo As Byte , Число_импульсов_обор_taxo_eram As Byte , Число_импульсов_обор_ustavka As Byte
 Dim Плюс_вода_темп As Byte , Минус_вода_темп As Byte , Заданная_температура_воды_lcd As Byte
 Dim Плюс_обороты As Byte , Минус_обороты As Byte , Заданные_обороты_отжима_taxo As Integer
 Dim Импульсы_таймера As Integer
 Dim Pusk_1 As Byte
 Dim Количество_полосканий_плюс As Byte , Количество_полосканий_минус As Byte , Зад_количество_полосканий_lcd As Byte
 Dim Время_стирки_плюс As Byte , Время_стирки_минус As Byte , Заданное_время_отирки_lcd As Integer , Часы_стирки As Integer , Минуты_стирки As Integer
 Dim Время_замачевания_плюс As Byte , Время_замачевания_минус As Byte , Заданное_время_замачевания_lcd As Integer , Часы_замоч_конец As Integer , Минуты_замоч_конец As Integer
 Dim Отстрочка_плюс As Byte , Отстрочка_минус As Byte , Заданное_время_отстрочки_lcd As Integer , Часы_отстр_конец As Integer , Минуты_отстр_конец As Integer
 Dim Номер_программы As Byte , Номер_программы_новое As Byte , Номер_программы_новое_2 As Byte , Номер_программы_eram As Byte

'1 , 3 , 6 , 9 , 12 , 15 , 18 , 21 , 24 , 27 , 30 , 33,36 используемые ячеки памяти
'===============================================================================
'     чтение уставок - точки калипровки термодатчика
'===============================================================================
Readeeprom T_0_gr , 1       ' чтение уставки из память - точка калибровки 0 градусов

Readeeprom T_10_gr , 3       ' чтение уставки из память - точка калибровки 10 градусов

Readeeprom T_20_gr , 6       ' чтение уставки из память - точка калибровки 20 градусов

Readeeprom T_30_gr , 9       ' чтение уставки из память - точка калибровки 30 градусов

Readeeprom T_40_gr , 12       ' чтение уставки из память - точка калибровки 40 градусов

Readeeprom T_50_gr , 15       ' чтение уставки из память - точка калибровки 50 градусов

Readeeprom T_60_gr , 18       ' чтение уставки из память - точка калибровки 60 градусов

Readeeprom T_70_gr , 21       ' чтение уставки из память - точка калибровки 70 градусов

Readeeprom T_80_gr , 24       ' чтение уставки из память - точка калибровки 80 градусов

Readeeprom T_90_gr , 27       ' чтение уставки из память - точка калибровки 90 градусов

Readeeprom T_100_gr , 30       ' чтение уставки из память - точка калибровки 100 градусов

'===============================================================================
'     чтение уставки - число импульсов за один оборот барабана
'===============================================================================
Readeeprom Число_импульсов_обор_ustavka , 33       ' чтение уставки - число импульсов за один оборот барабана
 '===============================================================================
'===============================================================================
'     чтение уставки - Номера программы
'===============================================================================
Readeeprom Номер_программы , 36       ' чтение уставки - Номера программы
 '===============================================================================

 '     Настройка прерывания INT0 Прерывание для подсчета входных импульсов
'===============================================================================
 'Настраиваем вывод на вход и подтягиваем к "-", но этой подтяжки мало, смотреть схему
 ' Config Pind.2 = Input : Reset Portd.2

 'Прерывание срабатывает по нарастанию уровня   Rising (по переднему фронту) ; Falling (по заднему фронту) ; Low Level (по низкому уровню)
  'Config Int0 = Falling

 'Ссылка на подпрограмму обработчика прерывания INT0, переход фазы через "0"
  'On Int0 Обработка_прерывания_int0 Nosave                  ' После прерывания идем в подпрограмму обработки прерывания

 'Eifr.intf0 = 1                                             ' Сбрасываем флаг прерывания INT0
  'Enable Int0                                               ' Разрешаем прерывания INT0

'=============================== Коеффициенты  ПИДР ===========================================

P_gain = 10
I_gain = 3
D_gain = 0
Gain_scaling = 2
'Kof = 30
'F_rpm = 0
'==========================================================================



'Контроль Alias Portb.7
'Config Portb.7 = Output


Стоп = Стоп_key
If Стоп = 0 Then    'Если нажать кнопку СТОП и включить в СЕТЬ стиральню машину то попадаем в инженерное меню
Инженерное_меню = 10
Pod_4 = 1
End If


'===============================================================================
  Главный_цикл:
'===============================================================================
'Incr Pwm1a                                                  'плавно увеличиваем значение регистра сравнения OCR1A
'Incr Pwm1b                                 'плавно увеличиваем значение регистра сравнения OCR1B
'Ocr1b = 10

 'Gosub Калибровка_rtc       'Макрос записи точек при калибровке терморезистора доступна при замкнутой перемычки на плате
 Gosub Линейность_rtc       'Макрос линейности терморезистора



 If Инженерное_меню <> 0 Then       'Если зашли в инженерное меню
 Gosub Инженерное_меню_glav       'Макрос инженерного меню
 Else
 If Pusk_1 = 0 Then
 Gosub Наименование_программы_lcd       'Макрос отображения наименования программы стирки на ЛСД

 End If
  End If

'=========== Кнопка "КУРСОР В ВЕРХ" =========
  Курсор_вверх = Курсор_вверх_key
 If Курсор_вверх = 0 And Pod_1 = 0 Then       '1
 Pod_1 = 1
 If Инженерное_меню <> 0 Then       '2

 If Инженерное_меню > 9 And Инженерное_меню < 41 Then       '5 если инженерное меню в диапазоне от 10  - 40
 If Инженерное_меню < 20 Then       '4
 Инженерное_меню = 40
 Else               '4
 Инженерное_меню = Инженерное_меню - 10
 End If             '4
 End If             '5
 Else               '2
 Номер_программы = Номер_программы + 1       'если  Инженерное_меню не равно 0 то выбираем номер программы курсором в верх
 Pusk_1 = 0         'останавливаем таймер времени отображения задаваеммых параметров (температура,обороты,программа ,...)
Импульсы_таймера = 0       'зброс импульсов
Pod_10 = 0 : Pod_11 = 0 : Pod_12 = 0 : Pod_13 = 0 : Pod_20 = 0 : Pod_16 = 0 : Pod_21 = 0 : Pod_17 = 0 : Pod_24 = 0 : Pod_25 = 0 : Pod_28 = 0 : Pod_29 = 0       'зброс противоположных запретов
 End If             '2


 If Инженерное_меню = 100 Then       '7 если инженерное меню =100 то курсором меняем значение при котором меряется температура
 If Temper_kal > 91 Then       '6
 Temper_kal = 0
 Else               '6
 Temper_kal = Temper_kal + 10
 Kursor_5 = 0
 End If             '6
 End If             '7


 Else               '1
 If Курсор_вверх = 1 And Pod_1 = 1 Then       '3
 Pod_1 = 0
 End If             '3
 End If             '1

'=========== Кнопка "КУРСОР ВНИЗ" =========
  Курсор_вниз = Курсор_вниз_key
 If Курсор_вниз = 0 And Pod_2 = 0 Then
 Pod_2 = 1


 If Инженерное_меню <> 0 Then       '2

  If Инженерное_меню > 9 And Инженерное_меню < 41 Then       '5 если инженерное меню в диапазоне от 10  - 40
 If Инженерное_меню > 30 Then       '4
 Инженерное_меню = 10
 Else               '4
 Инженерное_меню = Инженерное_меню + 10
 End If             '4
 End If             '5
 Else               '2
 Номер_программы = Номер_программы - 1       'если  Инженерное_меню не равно 0 то выбираем номер программы курсором вниз
Pusk_1 = 0          'останавливаем таймер времени отображения задаваеммых параметров (температура,обороты,программа ,...)
Импульсы_таймера = 0       'зброс импульсов
Pod_10 = 0 : Pod_11 = 0 : Pod_12 = 0 : Pod_13 = 0 : Pod_20 = 0 : Pod_16 = 0 : Pod_21 = 0 : Pod_17 = 0 : Pod_24 = 0 : Pod_25 = 0 : Pod_28 = 0 : Pod_29 = 0       'зброс противоположных запретов
 End If             '2

 If Инженерное_меню = 100 Then       '7 если инженерное меню =100 то курсором меняем значение при котором меряется температура
 If Temper_kal < 1 Then       '6
 Temper_kal = 100
 Else               '6
 Temper_kal = Temper_kal - 10
 Kursor_5 = 0
 End If             '6
 End If             '7

 Else
 If Курсор_вниз = 1 And Pod_2 = 1 Then
 Pod_2 = 0
 End If
 End If

 '=========== Кнопка "ПУСК/ПАУЗА" =========
  Пуск_пауза = Пуск_пауза_key
 If Пуск_пауза = 0 And Pod_3 = 0 Then
 Pod_3 = 1

 If Номер_программы_новое_2 <> Номер_программы Then       'заностм в память Номера программы
Номер_программы_eram = Номер_программы
Номер_программы_новое_2 = Номер_программы
Writeeeprom Номер_программы_eram , 36
End If


 If Инженерное_меню = 200 Then       '3 если инженерное меню =200
 Число_импульсов_обор_taxo_eram = Число_импульсов_обор_taxo
 Writeeeprom Число_импульсов_обор_taxo_eram , 33       'запись в память числа импульсов на оборот доступна при замкнутой перемычки на плате
 Kursor_6 = 1
 End If             '3

 If Инженерное_меню = 100 Then       '2 если инженерное меню =100
 Gosub Калибровка_rtc       'Макрос записи точек при калибровке терморезистора доступна при замкнутой перемычки на плате
 Kursor_5 = 1
 End If             '2

 If Инженерное_меню > 9 And Инженерное_меню < 41 Then       '1 если инженерное меню в диапазоне от 10  - 40 то умножаем на 10
 Инженерное_меню = Инженерное_меню * 10
 Cls                ' Очищаем LCD
 End If             '1

 Else
 If Пуск_пауза = 1 And Pod_3 = 1 Then
 Pod_3 = 0
 End If
 End If

 '=========== Кнопка "СТОП/ВЫХОД" =========
  Стоп = Стоп_key
 If Стоп = 0 And Pod_4 = 0 Then
 Pod_4 = 1


 If Инженерное_меню > 9 And Инженерное_меню < 41 Then       '2 если инженерное меню в диапазоне от 9  - 41 то выход ыход из инженерного меню
 Инженерное_меню = 0
 Cls                ' Очищаем LCD
 End If             '2

 If Инженерное_меню > 99 And Инженерное_меню < 401 Then       '1 если инженерное меню в диапазоне от 99  - 401 то делим на 10
 Инженерное_меню = Инженерное_меню / 10
 Число_импульсов_обор_taxo = 0       'обнуляем счетчик перед повторным счетом импульсов при калибровке
 Kursor_6 = 0
 End If             '1

 Else
 If Стоп = 1 And Pod_4 = 1 Then
 Pod_4 = 0
 End If
 End If


 '=========== Кнопка "Плюс уставка заданная температура" =========
  Плюс_вода_темп = Плюс_вода_temp
 If Плюс_вода_темп = 0 And Pod_5 = 0 And Pod_13 = 1 Then       'Pod_13 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
 Pod_5 = 1
 If Заданная_температура_воды_lcd > 89 Then
Заданная_температура_воды_lcd = 0
 Else
 Заданная_температура_воды_lcd = Заданная_температура_воды_lcd + 5
 End If

 Else
 If Плюс_вода_темп = 1 And Pod_5 = 1 Then
 Pod_5 = 0
 End If
 End If

 '=========== Кнопка "Минус уставка заданная температура" =========
  Минус_вода_темп = Минус_вода_temp
 If Минус_вода_темп = 0 And Pod_6 = 0 And Pod_13 = 1 Then       'Pod_13 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
 Pod_6 = 1
 If Заданная_температура_воды_lcd < 1 Then
Заданная_температура_воды_lcd = 90
 Else
 Заданная_температура_воды_lcd = Заданная_температура_воды_lcd - 5
 End If

 Else
 If Минус_вода_темп = 1 And Pod_6 = 1 Then
 Pod_6 = 0
 End If
 End If

 '=========== Кнопка "Плюс уставка заданные обороты при отжиме" =========
   Плюс_обороты = Плюс_обороты_key
 If Плюс_обороты = 0 And Pod_7 = 0 And Pod_11 = 1 Then       'Pod_11 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
 Pod_7 = 1
 If Заданные_обороты_отжима_taxo > 1999 Then
Заданные_обороты_отжима_taxo = 200
 Else
 Заданные_обороты_отжима_taxo = Заданные_обороты_отжима_taxo + 100
 End If

 Else
 If Плюс_обороты = 1 And Pod_7 = 1 Then
 Pod_7 = 0
 End If
 End If

'=========== Кнопка "Минус уставка заданные обороты при отжиме" =========
   Минус_обороты = Минус_обороты_key
 If Минус_обороты = 0 And Pod_8 = 0 And Pod_11 = 1 Then       'Pod_11 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
 Pod_8 = 1
 If Заданные_обороты_отжима_taxo < 201 Then
Заданные_обороты_отжима_taxo = 2000
 Else
 Заданные_обороты_отжима_taxo = Заданные_обороты_отжима_taxo - 100
 End If

 Else
 If Минус_обороты = 1 And Pod_8 = 1 Then
 Pod_8 = 0
 End If
 End If

 '=========== Кнопка "Плюс уставка заданное время стирки" =========
   Время_стирки_плюс = Время_стирки_плюс_key
 If Время_стирки_плюс = 0 And Pod_14 = 0 And Pod_16 = 1 Then       'Pod_16 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
 Pod_14 = 1
 If Заданное_время_отирки_lcd > 299 Then
Заданное_время_отирки_lcd = 10
 Else
 Заданное_время_отирки_lcd = Заданное_время_отирки_lcd + 10
 End If

 Else
 If Время_стирки_плюс = 1 And Pod_14 = 1 Then
 Pod_14 = 0
 End If
 End If

'=========== Кнопка "Минус уставка заданное время стирки" =========
  Время_стирки_минус = Время_стирки_минус_key
 If Время_стирки_минус = 0 And Pod_15 = 0 And Pod_16 = 1 Then       'Pod_16 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
 Pod_15 = 1
 If Заданное_время_отирки_lcd < 11 Then
Заданное_время_отирки_lcd = 300
 Else
 Заданное_время_отирки_lcd = Заданное_время_отирки_lcd - 10
 End If

 Else
 If Время_стирки_минус = 1 And Pod_15 = 1 Then
 Pod_15 = 0
 End If
 End If


 '=========== Кнопка "Плюс уставка заданное количество полосканий" =========
   Количество_полосканий_плюс = Количество_полосканий_плюс_key
 If Количество_полосканий_плюс = 0 And Pod_18 = 0 And Pod_17 = 1 Then       'Pod_17 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
 Pod_18 = 1
 If Зад_количество_полосканий_lcd > 9 Then
Зад_количество_полосканий_lcd = 0
 Else
 Зад_количество_полосканий_lcd = Зад_количество_полосканий_lcd + 1
 End If

 Else
 If Количество_полосканий_плюс = 1 And Pod_18 = 1 Then
 Pod_18 = 0
 End If
 End If

'=========== Кнопка "Минус уставка заданное количество полосканий" =========
Количество_полосканий_минус = Количество_полосканий_минус_key
 If Количество_полосканий_минус = 0 And Pod_19 = 0 And Pod_17 = 1 Then       'Pod_17 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
 Pod_19 = 1
 If Зад_количество_полосканий_lcd < 1 Then
Зад_количество_полосканий_lcd = 10
 Else
 Зад_количество_полосканий_lcd = Зад_количество_полосканий_lcd - 1
 End If

 Else
 If Количество_полосканий_минус = 1 And Pod_19 = 1 Then
 Pod_19 = 0
 End If
 End If

 '=========== Кнопка "Плюс уставка заданное время замачивания" =========
   Время_замачевания_плюс = Время_замачевания_плюс_key
 If Время_замачевания_плюс = 0 And Pod_22 = 0 And Pod_24 = 1 Then       'Pod_24 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
 Pod_22 = 1
 If Заданное_время_замачевания_lcd > 1439 Then
Заданное_время_замачевания_lcd = 0
 Else
 Заданное_время_замачевания_lcd = Заданное_время_замачевания_lcd + 10
 End If

 Else
 If Время_замачевания_плюс = 1 And Pod_22 = 1 Then
 Pod_22 = 0
 End If
 End If

'=========== Кнопка "Минус уставка заданное время замачивания" =========
Время_замачевания_минус = Время_замачевания_минус_key
 If Время_замачевания_минус = 0 And Pod_23 = 0 And Pod_24 = 1 Then       'Pod_24 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
 Pod_23 = 1
 If Заданное_время_замачевания_lcd < 10 Then
Заданное_время_замачевания_lcd = 1440
 Else
 Заданное_время_замачевания_lcd = Заданное_время_замачевания_lcd - 10
 End If

 Else
 If Время_замачевания_минус = 1 And Pod_23 = 1 Then
 Pod_23 = 0
 End If
 End If

 '=========== Кнопка "Плюс уставка заданное время отстрочки" =========
   Отстрочка_плюс = Отстрочка_плюс_key
 If Отстрочка_плюс = 0 And Pod_26 = 0 And Pod_28 = 1 Then       'Pod_28 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
 Pod_26 = 1
 If Заданное_время_отстрочки_lcd > 1439 Then
Заданное_время_отстрочки_lcd = 0
 Else
 Заданное_время_отстрочки_lcd = Заданное_время_отстрочки_lcd + 10
 End If

 Else
 If Отстрочка_плюс = 1 And Pod_26 = 1 Then
 Pod_26 = 0
 End If
 End If

'=========== Кнопка "Минус уставка заданное время отстрочки" =========
Отстрочка_минус = Отстрочка_минус_key
 If Отстрочка_минус = 0 And Pod_27 = 0 And Pod_28 = 1 Then       'Pod_28 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
 Pod_27 = 1
 If Заданное_время_отстрочки_lcd < 10 Then
Заданное_время_отстрочки_lcd = 1440
 Else
 Заданное_время_отстрочки_lcd = Заданное_время_отстрочки_lcd - 10
 End If

 Else
 If Отстрочка_минус = 1 And Pod_27 = 1 Then
 Pod_27 = 0
 End If
 End If

 '=========== Контроль нажатия кнопок =========
 'Если Нажать Одну Кнопку Из Выбора Оборотов , Температуры И.т.д. То Запускаем Счетчик Времени Отображение На Лсд Етих Уставок
  If Плюс_вода_темп = 0 Or Минус_вода_темп = 0 Or Плюс_обороты = 0 Or Минус_обороты = 0 Or Время_стирки_плюс = 0 Or Время_стирки_минус = 0 Or Количество_полосканий_плюс = 0 Or Количество_полосканий_минус = 0 Or Время_замачевания_плюс = 0 Or Время_замачевания_минус = 0 Or Отстрочка_плюс = 0 Or Отстрочка_минус = 0 Then

  If Pusk_1 = 0 Then
  Pod_10 = 0 : Pod_11 = 0 : Pod_12 = 0 : Pod_13 = 0 : Pod_20 = 0 : Pod_16 = 0 : Pod_21 = 0 : Pod_17 = 0 : Pod_24 = 0 : Pod_25 = 0 : Pod_28 = 0 : Pod_29 = 0       'зброс противоположных запретов
  End If


  Pusk_1 = 1        'Пуск таймера времени отображения уставок
  Импульсы_таймера = 0       'Пока кнопка нажата таймер =0

  If Pod_9 = 0 Then
  Pod_9 = 1

  End If
  Else
  Pod_9 = 0

  End If

  If Pusk_1 = 1 Then
   Gosub Лсд_уставки_lcd       'Макрос Отображения на ЛСД задаваеммых параметров (температура,обороты,программа ,...)
   End If

'=========== ОПРОС АЦП №5 ТЕМПЕРАТУРА =========
'Disable Interrupts                                          'на всякий отключаем прерывания, это то, что может затормозить программу если не отключить и опросить АЦП
Start Adc           'запуск опроса АЦП
Adc_rtc = Getadc(1) ' чтение в переменну значение АЦП 5
'Waitms 20            'будет глючить, ставьте задержку
Stop Adc
'Disable Interrupts








      Gosub Измерение_adxl345

      Сумма_x_integer = Сумма_x_integer + X_integer
      Сумма_y_integer = Сумма_y_integer + Y_integer
      Сумма_z_integer = Сумма_z_integer + Z_integer

     'Набираем сумму из 64 измерений
      Incr Количество_измерений

     'Усредняем полученные данные
      If Количество_измерений > 64 Then
         X_single = Сумма_x_integer
          Shift X_single , Right , 6 , Signed       ' Аналог X_single = Сумма_x_single / 64

          Y_single = Сумма_y_integer
          Shift Y_single , Right , 6 , Signed       ' Аналог Y_single = Сумма_y_single / 64

          Z_single = Сумма_z_integer
          Shift Z_single , Right , 6 , Signed       ' Аналог Z_single = Сумма_z_single / 64

          Количество_измерений = 0
          Флаг_есть_данные = 1
      End If





     'Переводим в угловые градусы, минуты, секунды
      If Флаг_есть_данные <> 0 Then

           If X_integer <> X_integer_нов Then
           X_integer_разница = X_integer - X_integer_нов
           X_integer_нов = X_integer
           If X_integer_разница < 0 Then
           X_integer_разница = X_integer_разница * -1
           End If
           End If

           If Y_integer <> Y_integer_нов Then
           Y_integer_разница = Y_integer - Y_integer_нов
           Y_integer_нов = Y_integer
           If Y_integer_разница < 0 Then
           Y_integer_разница = Y_integer_разница * -1
           End If
           End If

           If Z_integer <> Z_integer_нов Then
           Z_integer_разница = Z_integer - Z_integer_нов
           Z_integer_нов = Z_integer
           If Z_integer_разница < 0 Then
           Z_integer_разница = Z_integer_разница * -1
           End If
           End If

            Сумма_x_y_z = X_integer_разница + Y_integer_разница
            Сумма_x_y_z = Сумма_x_y_z + Z_integer_разница

            Сумма = Сумма + Сумма_x_y_z

            К = К + 1
            If К > 2 Then
            Сумма_x_y_z = Сумма / 3
            Сумма_x_y_z_новое = Сумма_x_y_z
            Сумма = 0
            К = 0
            Флаг_обновить_lcd = 1
            End If


          'Флаг_обновить_lcd = 1
          Флаг_есть_данные = 0
      End If


     'Выводим на LCD
      If Флаг_обновить_lcd <> 0 Then

        If Инженерное_меню = 0 And Pusk_1 = 0 Then       'Если зашли в инженерное меню

         'Форматируем, чтобы не прыгали показания
         'X_str = Str(сумма_x_y_z)       'выводим на ЛСД данные от акселерометра:
'         X_str = Format(x_str , "0000")
'         Setfont Font_6x8
'          Lcdat 1 , 1 , X_str , 0


      End If
       Флаг_обновить_lcd = 0

      End If

      'If Инженерное_меню = 0 And Pusk_1 = 0 Then       'Если зашли в инженерное меню
'      Z_str = Str(spid_1)       'выводим на ЛСД скорость вращения:
'      Z_str = Format(z_str , "0000")
'      Setfont Font_12x16
'      Lcdat 5 , 1 , Z_str , 0



      'Z_str = Str(температура_adc4)       'выводим на ЛСД температуру воды:
'      Z_str = Format(z_str , "0000")
'      Lcdat 7 , 1 , Z_str , 0
'      End If

'===============================================================================
  Goto Главный_цикл
 End
'===============================================================================



'===============================================================================
  Измерение_adxl345:
'-------------------------------------------------------------------------------
    I2cstart        ' Подготовка к работе шины I2c
    I2cwbyte Запись_adxl345       ' Адресное обращение к используемому чипу i2c, для записи
    I2cwbyte &H32   ' Регистр с которого будем считывать данные
    I2crepstart     ' Повторная подготовка к работе шины I2c
    I2cwbyte Чтение_adxl345       ' Адресное обращение к используемому чипу i2c, для чтения
    I2crbyte X_byte(1) , Ack       ' Читаем значение из регистра чипа i2c
    I2crbyte X_byte(2) , Ack       ' Читаем значение из регистра чипа i2c
    I2crbyte Y_byte(1) , Ack       ' Читаем значение из регистра чипа i2c
    I2crbyte Y_byte(2) , Ack       ' Читаем значение из регистра чипа i2c
    I2crbyte Z_byte(1) , Ack       ' Читаем значение из регистра чипа i2c
    I2crbyte Z_byte(2) , Nack       ' Читаем значение из регистра чипа i2c
    I2cstop         ' Освобождаем шину I2c
'-------------------------------------------------------------------------------
  Return
'===============================================================================
 Pulse:             ' Прерывание Для Подсчета 1 Секунды   Частота прерывания 500 гц   100 - это 200 мс

If Count_t >= 100 Then       ' 1 Частота прерывания 500 гц 100= это (500/100=5 гц),период прерывания 1/5гц = 0.2 сек,
                              'если мы определили что на один оборот 20 импулсов , то 300/20импульсов = 30 ,
                              ' 300 Это Число Зависит От Коефицыента(100) На Который Делится Частота Прерывания
                             '30 - это коефициент на который множим измеренные импульсы за 0.2 сек - пример (Spid_1 = Spid_1 * 30),
                              'и на  етот же  коефициент (30) умножаем заданную скорость для отображения на ЛСД заданные обороты/мин
Spid_1 = Count_1
Spid_1 = Spid_1 * 30
'Spid_1 = Spid_1 * 3
Feedback = Count_1  ' измерянное
Setpoint = 30       'заданная_скорость (если число импульсов на оборот 20 то 1 - это 1*30 оборотов/мин) , если заданные обороты 100 то 100/на коеф-нт 30

Pid_p = Setpoint - Feedback       ' ошибка
Pid_d = Pid_p - Pid_px
Pid_px = Pid_p

Pid_y = Pid_p * P_gain
Pid_y_1 = Pid_i * I_gain
Pid_y = Pid_y + Pid_y_1
Pid_y_2 = Pid_d * D_gain
Pid_y = Pid_y + Pid_y_2
Pid_y = Pid_y / Gain_scaling

If Pid_y < 255 Then ' 2
If Pid_y > 0 Then
Pid_i = Pid_i + Pid_p
Else
Pid_y = 0
End If
Else
Pid_y = 255
End If              ' 2
Ocr1b = Pid_y       ' PWM
Count_t = 0
Число_импульсов_обор_taxo = Число_импульсов_обор_taxo + Count_1       'Count_2- счет импульсов при калибровке ТАХО и повороте барабана на один оборот

Count_1 = 0
End If              ' 1
Count_t = Count_t + 1

If Pusk_1 = 1 Then  'Пуск таймера времени отображения уставок
Импульсы_таймера = Импульсы_таймера + 1
If Импульсы_таймера > 200 Then       '500- ето одна секунда
Pusk_1 = 0
Импульсы_таймера = 0
End If
End If
  'Count_2 = Count_2 + 1

 'If A = 1 Then
' A = 0
' Portb.7 = 0
' Else
' A = 1
' Portb.7 = 1
 'End If
 Return

Калибровка_rtc:     'Макрос записи точек при калибровке терморезистора, доступна при замкнутой перемычки на плате

If Temper_kal = 0 Then       'заностм в память данные с ADC при 0 градусах
T_0_gr_eram = Adc_rtc
Writeeeprom T_0_gr_eram , 1
End If

If Temper_kal = 10 Then       'заностм в память данные с ADC при 10 градусах
T_10_gr_eram = Adc_rtc
Writeeeprom T_10_gr_eram , 3
End If

If Temper_kal = 20 Then       'заностм в память данные с ADC при 20 градусах
T_20_gr_eram = Adc_rtc
Writeeeprom T_20_gr_eram , 6
End If

If Temper_kal = 30 Then       'заностм в память данные с ADC при 30 градусах
T_30_gr_eram = Adc_rtc
Writeeeprom T_30_gr_eram , 9
End If

If Temper_kal = 40 Then       'заностм в память данные с ADC при 40 градусах
T_40_gr_eram = Adc_rtc
Writeeeprom T_40_gr_eram , 12
End If

If Temper_kal = 50 Then       'заностм в память данные с ADC при 50 градусах
T_50_gr_eram = Adc_rtc
Writeeeprom T_50_gr_eram , 15
End If

If Temper_kal = 60 Then       'заностм в память данные с ADC при 60 градусах
T_60_gr_eram = Adc_rtc
Writeeeprom T_60_gr_eram , 18
End If

If Temper_kal = 70 Then       'заностм в память данные с ADC при 70 градусах
T_70_gr_eram = Adc_rtc
Writeeeprom T_70_gr_eram , 21
End If

If Temper_kal = 80 Then       'заностм в память данные с ADC при 80 градусах
T_80_gr_eram = Adc_rtc
Writeeeprom T_80_gr_eram , 24
End If

If Temper_kal = 90 Then       'заностм в память данные с ADC при 90 градусах
T_90_gr_eram = Adc_rtc
Writeeeprom T_90_gr_eram , 27
End If

If Temper_kal = 100 Then       'заностм в память данные с ADC при 100 градусах
T_100_gr_eram = Adc_rtc
Writeeeprom T_100_gr_eram , 30
End If

Return




Линейность_rtc:     'Макрос линейности терморезистора
Adc2 = Adc_rtc
Adc2 = Adc2 * 10

If Adc_rtc > T_10_gr Then       '1 Если температура больше 10 гр.

If Adc_rtc > T_20_gr Then       '2 Если температура больше 20 гр.

If Adc_rtc > T_30_gr Then       '3 Если температура больше 30 гр.

If Adc_rtc > T_40_gr Then       '4 Если температура больше 40 гр.

If Adc_rtc > T_50_gr Then       '5 Если температура больше 50 гр.

If Adc_rtc > T_60_gr Then       '6 Если температура больше 60 гр.

If Adc_rtc > T_70_gr Then       '7 Если температура больше 70 гр.

If Adc_rtc > T_80_gr Then       '8 Если температура больше 80 гр.

If Adc_rtc > T_90_gr Then       '9 Если температура больше 90 гр.

If Adc_rtc > T_100_gr Then       '10 Если температура больше 100 гр.


Else                '10 Температура = от 90-100 гр.
Y = T_100_gr - T_90_gr
T_univ_gr_temp = T_90_gr * 10
Adc3_temp = Adc2 - T_univ_gr_temp
Adc3 = Adc3_temp / Y
Adc3 = Adc3 + 90    'Додаем 90 гр
End If              '10

Else                '9 Температура = от 80-90 гр.
Y = T_90_gr - T_80_gr
T_univ_gr_temp = T_80_gr * 10
Adc3_temp = Adc2 - T_univ_gr_temp
Adc3 = Adc3_temp / Y
Adc3 = Adc3 + 80    'Додаем 80 гр
End If              '9

Else                '8 Температура = от 70-80 гр.
Y = T_80_gr - T_70_gr
T_univ_gr_temp = T_70_gr * 10
Adc3_temp = Adc2 - T_univ_gr_temp
Adc3 = Adc3_temp / Y
Adc3 = Adc3 + 70    'Додаем 70 гр
End If              '8

Else                '8 Температура = от 60-70 гр.
Y = T_70_gr - T_60_gr
T_univ_gr_temp = T_60_gr * 10
Adc3_temp = Adc2 - T_univ_gr_temp
Adc3 = Adc3_temp / Y
Adc3 = Adc3 + 60    'Додаем 60 гр
End If              '7

Else                '6 Температура = от 50-60 гр.
Y = T_60_gr - T_50_gr
T_univ_gr_temp = T_50_gr * 10
Adc3_temp = Adc2 - T_univ_gr_temp
Adc3 = Adc3_temp / Y
Adc3 = Adc3 + 50    'Додаем 50 гр
End If              '6

Else                '5 Температура = от 40-50 гр.
Y = T_50_gr - T_40_gr
T_univ_gr_temp = T_40_gr * 10
Adc3_temp = Adc2 - T_univ_gr_temp
Adc3 = Adc3_temp / Y
Adc3 = Adc3 + 40    'Додаем 40 гр
End If              '5

Else                '4 Температура = от 30-40 гр.
Y = T_40_gr - T_30_gr
T_univ_gr_temp = T_30_gr * 10
Adc3_temp = Adc2 - T_univ_gr_temp
Adc3 = Adc3_temp / Y
Adc3 = Adc3 + 30    'Додаем 30 гр
End If              '4

Else                '3 Температура = от 20-30 гр.
Y = T_30_gr - T_20_gr
T_univ_gr_temp = T_20_gr * 10
Adc3_temp = Adc2 - T_univ_gr_temp
Adc3 = Adc3_temp / Y
Adc3 = Adc3 + 20    'Додаем 20 гр
End If              '3

Else                '2 Температура = от 10-20 гр.
Y = T_20_gr - T_10_gr
T_univ_gr_temp = T_10_gr * 10
Adc3_temp = Adc2 - T_univ_gr_temp
Adc3 = Adc3_temp / Y
Adc3 = Adc3 + 10    'Додаем 10 гр
End If              '2

Else                '1 Температура = от 0-10 гр.
Y = T_10_gr - T_0_gr
T_univ_gr_temp = T_0_gr * 10
Adc3_temp = Adc2 - T_univ_gr_temp
Adc3 = Adc3_temp / Y
End If              '1

'- обрезаем показания если температура ниже 0 то 0 и если больше 100 то 100  -----

If Adc_rtc <= T_0_gr Then       ' Если температура меньше 0 гр.
Температура_adc4 = 0
Else
Температура_adc4 = Adc3
If Adc_rtc >= T_100_gr Then       ' Если температура больше 100 гр.
Температура_adc4 = 100
End If
End If

Return

Инженерное_меню_glav:       'Макрос инженерного меню

Setfont Font_6x8

If Инженерное_меню > 9 And Инженерное_меню < 41 Then       '1 если инженерное меню в диапазоне от 9  - 41
Lcdat 1 , 1 , "Инженерное меню:" , 0
Lcdat 3 , 1 , "1.Калибровка RTC" , Kursor_1
Lcdat 4 , 1 , "2.Число имп/об " , Kursor_2
Lcdat 5 , 1 , "3.Акселерометр" , Kursor_3
Lcdat 6 , 1 , "4.Ко-ль сигналов" , Kursor_4
End If              '1

If Инженерное_меню = 100 Then       '2 если инженерное меню в диапазоне 100 калибровка терморезистора
Lcdat 1 , 1 , "Калибровка RTC:" , 0
Lcdat 3 , 1 , "температура на " , 0
Lcdat 4 , 1 , "датчике=   гр" , 0
Z_str = Str(temper_kal)       'выводим на ЛСД температуру среды вкоторой находится датчик при калибровке:
Z_str = Format(z_str , "000")
Lcdat 4 , 49 , Z_str , 0
Lcdat 6 , 1 , "Данные ADC=" , 0
Z_str = Str(adc_rtc)       'выводим на ЛСД значение ADC при калибровке:
Z_str = Format(z_str , "0000")
Lcdat 6 , 67 , Z_str , 0
Lcdat 8 , 1 , "ADC в EEPROM" , Kursor_5
End If              '2


If Инженерное_меню = 200 Then       '2 если инженерное меню в диапазоне 200 калибровка таходатчика
Lcdat 1 , 1 , "Калибровка ТАХО:" , 0
Lcdat 3 , 1 , "импульсы/об от" , 0
Lcdat 4 , 1 , "датчика=   имп" , 0
Z_str = Str(число_импульсов_обор_taxo)       'выводим на ЛСД число импульсов при калибровке ТАХО:
Z_str = Format(z_str , "000")
Lcdat 4 , 49 , Z_str , 0
Lcdat 8 , 1 , "ТАХО в EEPROM" , Kursor_6
End If              '2


If Инженерное_меню = 10 Then : Kursor_1 = 1
Else
Kursor_1 = 0
End If

If Инженерное_меню = 20 Then : Kursor_2 = 1
Else
Kursor_2 = 0
End If

If Инженерное_меню = 30 Then : Kursor_3 = 1
Else
Kursor_3 = 0
End If

If Инженерное_меню = 40 Then : Kursor_4 = 1
Else
Kursor_4 = 0
End If

Return

'**********************************************************************************************************
'=========== Макрос Отображения на ЛСД задаваеммых параметров (температура,обороты,программа ,...) =========
Лсд_уставки_lcd:    'Макрос Отображения на ЛСД задаваеммых параметров (температура,обороты,программа ,...)


  If Плюс_обороты = 0 Or Минус_обороты = 0 Then
  Pod_12 = 0 : Pod_13 = 0 : Pod_20 = 0 : Pod_16 = 0 : Pod_21 = 0 : Pod_17 = 0 : Pod_24 = 0 : Pod_25 = 0 : Pod_28 = 0 : Pod_29 = 0       'зброс противоположных запретов
  If Pod_10 = 0 Then
  Pod_10 = 1
  Setfont Font_12x16
  Cls               ' Очищаем LCD один раз
  End If
  End If
  If Плюс_обороты = 1 And Минус_обороты = 1 And Pod_10 = 1 Then
   Pod_11 = 1       'Pod_14 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
  End If
     '********************************************
  If Плюс_вода_темп = 0 Or Минус_вода_темп = 0 Then
  Pod_10 = 0 : Pod_11 = 0 : Pod_20 = 0 : Pod_16 = 0 : Pod_21 = 0 : Pod_17 = 0 : Pod_24 = 0 : Pod_25 = 0 : Pod_28 = 0 : Pod_29 = 0       'зброс противоположных запретов
  If Pod_12 = 0 Then
  Pod_12 = 1
  Setfont Font_12x16
  Cls               ' Очищаем LCD один раз
  End If
  End If
  If Плюс_вода_темп = 1 And Минус_вода_темп = 1 And Pod_12 = 1 Then
  Pod_13 = 1        'Pod_13 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
  End If
        '********************************************
  If Время_стирки_плюс = 0 Or Время_стирки_минус = 0 Then
   Pod_10 = 0 : Pod_11 = 0 : Pod_12 = 0 : Pod_13 = 0 : Pod_21 = 0 : Pod_17 = 0 : Pod_24 = 0 : Pod_25 = 0 : Pod_28 = 0 : Pod_29 = 0       'зброс противоположных запретов
  If Pod_20 = 0 Then
  Pod_20 = 1
  Setfont Font_12x16
  Cls               ' Очищаем LCD один раз
  End If
  End If
  If Время_стирки_плюс = 1 And Время_стирки_минус = 1 And Pod_20 = 1 Then
  Pod_16 = 1        'Pod_16 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
  End If
        '********************************************
  If Количество_полосканий_плюс = 0 Or Количество_полосканий_минус = 0 Then
   Pod_10 = 0 : Pod_11 = 0 : Pod_12 = 0 : Pod_13 = 0 : Pod_20 = 0 : Pod_16 = 0 : Pod_24 = 0 : Pod_25 = 0 : Pod_28 = 0 : Pod_29 = 0       'зброс противоположных запретов
  If Pod_21 = 0 Then
  Pod_21 = 1
  Setfont Font_12x16
  Cls               ' Очищаем LCD один раз
  End If
  End If
  If Количество_полосканий_плюс = 1 And Количество_полосканий_минус = 1 And Pod_21 = 1 Then
  Pod_17 = 1        'Pod_17 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
  End If

  '********************************************
  If Время_замачевания_плюс = 0 Or Время_замачевания_минус = 0 Then
   Pod_10 = 0 : Pod_11 = 0 : Pod_12 = 0 : Pod_13 = 0 : Pod_20 = 0 : Pod_16 = 0 : Pod_21 = 0 : Pod_17 = 0 : Pod_28 = 0 : Pod_29 = 0       'зброс противоположных запретов
  If Pod_25 = 0 Then
  Pod_25 = 1
  Setfont Font_12x16
  Cls               ' Очищаем LCD один раз
  End If
  End If
  If Время_замачевания_плюс = 1 And Время_замачевания_минус = 1 And Pod_25 = 1 Then
  Pod_24 = 1        'Pod_24 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
  End If

 '********************************************
  If Отстрочка_плюс = 0 Or Отстрочка_минус = 0 Then
   Pod_10 = 0 : Pod_11 = 0 : Pod_12 = 0 : Pod_13 = 0 : Pod_20 = 0 : Pod_16 = 0 : Pod_21 = 0 : Pod_17 = 0 : Pod_24 = 0 : Pod_25 = 0       'зброс противоположных запретов
  If Pod_29 = 0 Then
  Pod_29 = 1
 Setfont Font_12x16
  Cls               ' Очищаем LCD один раз
  End If
  End If
  If Отстрочка_плюс = 1 And Отстрочка_минус = 1 And Pod_29 = 1 Then
  Pod_28 = 1        'Pod_28 = 1-запрещаем менять уставку при первом нажатии кнопки выбора
  End If


   '***выводим на ЛСД уставку оборотов / мин**
 If Плюс_обороты = 0 Or Минус_обороты = 0 Then
'Setfont Font_12x16
Lcdat 1 , 1 , "ОБОРОТЫ" , 0
Lcdat 3 , 1 , "ОТЖИМА" , 0
Z_str = Str(заданные_обороты_отжима_taxo)       'выводим на ЛСД уставку оборотов / мин :
Z_str = Format(z_str , "0000")
Lcdat 5 , 20 , Z_str , 0
Lcdat 7 , 1 , "ОБ/МИН" , 0
 End If

 '***выводим на ЛСД уставку температура воды**
  If Плюс_вода_темп = 0 Or Минус_вода_темп = 0 Then
'Setfont Font_12x16
Lcdat 1 , 1 , "ТЕМПЕРА-" , 0
Lcdat 3 , 1 , "ТУР.ВОДЫ" , 0
Z_str = Str(заданная_температура_воды_lcd)       'выводим на ЛСД уставку температура воды :
Z_str = Format(z_str , "00")
Lcdat 5 , 20 , Z_str , 0
Lcdat 7 , 1 , "ГРАДУСОВ" , 0
 End If

'***выводим на ЛСД уставку заданное время стирки**
  If Время_стирки_плюс = 0 Or Время_стирки_минус = 0 Then
'Setfont Font_12x16
Lcdat 1 , 25 , "ВРЕМЯ" , 0
Lcdat 3 , 13 , "СТИРКИ" , 0
Минуты_стирки = Заданное_время_отирки_lcd Mod 60       ' ЧАСЫ
Часы_стирки = Заданное_время_отирки_lcd / 60       ' МИНУТЫ
Z_str = Str(часы_стирки)       'выводим на ЛСД уставку заданное время стирки (ЧАСЫ) :
Z_str = Format(z_str , "00")
Lcdat 7 , 20 , Z_str , 0
Lcdat 7 , 45 , ":" , 0       'выводим на ЛСД уставку заданное время стирки (МИНУТЫ) :
Z_str = Str(минуты_стирки)
Z_str = Format(z_str , "00")
Lcdat 7 , 55 , Z_str , 0


 End If

'***выводим на ЛСД уставку заданное количество полосканий**
  If Количество_полосканий_плюс = 0 Or Количество_полосканий_минус = 0 Then
'Setfont Font_12x16
Lcdat 1 , 1 , "КОЛИЧЕС-" , 0
Lcdat 3 , 1 , "ТВО  ПО-" , 0
Lcdat 5 , 1 , "ЛОСКАНИЙ" , 0
Z_str = Str(зад_количество_полосканий_lcd)       'выводим на ЛСД уставку заданное количество полосканий :
Z_str = Format(z_str , "00")
Lcdat 7 , 20 , Z_str , 0
 End If

'***выводим на ЛСД уставку заданное время замачевания**
  If Время_замачевания_плюс = 0 Or Время_замачевания_минус = 0 Then
'Setfont Font_12x16
Lcdat 1 , 1 , "ЗАМО-НИЕ" , 0

              '**********
Минуты_замоч_конец = Заданное_время_замачевания_lcd Mod 60       ' ЧАСЫ
Часы_замоч_конец = Заданное_время_замачевания_lcd / 60       ' МИНУТЫ
Z_str = Str(часы_замоч_конец)       'выводим на ЛСД уставку заданное время замачевания (часы) :
Z_str = Format(z_str , "00")
Lcdat 5 , 1 , Z_str , 0
Lcdat 5 , 25 , ":  КОН" , 0
Z_str = Str(минуты_замоч_конец)       'выводим на ЛСД уставку заданное время замачевания (минуты):
Z_str = Format(z_str , "00")
Lcdat 5 , 31 , Z_str , 0

 End If

'***выводим на ЛСД уставку заданное время отстрочки стирки **
  If Отстрочка_плюс = 0 Or Отстрочка_минус = 0 Then
'Setfont Font_12x16
Lcdat 1 , 1 , "ОТСТ-ЧКА" , 0
     '**********
Минуты_отстр_конец = Заданное_время_отстрочки_lcd Mod 60       ' ЧАСЫ
Часы_отстр_конец = Заданное_время_отстрочки_lcd / 60       ' МИНУТЫ
Z_str = Str(часы_отстр_конец)       'выводим на ЛСД уставку заданное время отстрочки стирки (часы) :
Z_str = Format(z_str , "00")
Lcdat 5 , 1 , Z_str , 0
Lcdat 5 , 25 , ":  КОН" , 0
Z_str = Str(минуты_отстр_конец)       'выводим на ЛСД уставку заданное время отстрочки стирки (минуты) :
Z_str = Format(z_str , "00")
Lcdat 5 , 31 , Z_str , 0

 End If

Return

 '************************************************************
 '***выводим на ЛСД наименования программы стирки **


Наименование_программы_lcd:       'Макрос отображения наименования программы стирки на ЛСД

If Номер_программы_новое <> Номер_программы Then
 Номер_программы_новое = Номер_программы
 Cls                ' Очищаем LCD один раз
 End If


Setfont Font_12x16
If Номер_программы = 1 Then
Lcdat 1 , 1 , "*ХЛОПОК*" , 0
End If

If Номер_программы = 2 Then
Lcdat 1 , 1 , "БЕРЕЖНАЯ" , 0
Lcdat 3 , 1 , "СТИРКА" , 0
End If

If Номер_программы = 3 Then
Lcdat 1 , 1 , "ТОНКИЕ" , 0
Lcdat 3 , 1 , "ТКАНИ" , 0
End If

If Номер_программы = 4 Then
Lcdat 1 , 1 , "СИНТЕ-" , 0
Lcdat 3 , 1 , "ТИКА" , 0
End If

If Номер_программы = 5 Then
Lcdat 1 , 1 , "ШЕРСТЬ" , 0
End If

If Номер_программы = 6 Then
Lcdat 1 , 1 , "ШЕЛК" , 0
End If

If Номер_программы = 7 Then
Lcdat 1 , 1 , "СМЕШАНЫЕ" , 0
Lcdat 3 , 1 , "ТКАНИ" , 0
End If

If Номер_программы = 8 Then
Lcdat 1 , 1 , "БЫСТРАЯ" , 0
Lcdat 3 , 1 , "СТИРКА" , 0
End If

If Номер_программы = 9 Then
Lcdat 1 , 1 , "ТОЛЬКО" , 0
Lcdat 3 , 1 , "СТИРКА" , 0
End If

If Номер_программы = 10 Then
Lcdat 1 , 1 , "ТОЛЬКО" , 0
Lcdat 3 , 1 , "ОТЖИМ" , 0
End If

If Номер_программы = 11 Then
Lcdat 1 , 1 , "ТОЛЬКО" , 0
Lcdat 3 , 1 , "СЛИВ" , 0
End If

If Номер_программы = 12 Then
Lcdat 1 , 1 , "ТОЛЬКО" , 0
Lcdat 3 , 1 , "ЗАМО-НИЕ" , 0
End If

If Номер_программы = 13 Then
Lcdat 1 , 1 , "СВОЯ ПРО" , 0
End If

Setfont Font_6x8
'Lcdat 5 , 1 , "t=•»°*" , 0
'Lcdat 5 , 1 , "t=  »  C°" , 0
Lcdat 5 , 1 , "t=" , 0
Z_str = Str(заданная_температура_воды_lcd)       'выводим на ЛСД уставку температура воды :
Z_str = Format(z_str , "00")
Lcdat 8 , 13 , Z_str , 0
Lcdat 8 , 25 , "»" , 0

Lcdat 5 , 1 , "t=" , 0
Z_str = Str(заданная_температура_воды_lcd)       'выводим на ЛСД уставку время /отстрочки /  :
Z_str = Format(z_str , "00")
Lcdat 8 , 13 , Z_str , 0
Lcdat 8 , 25 , "»" , 0



Z_str = Str(заданные_обороты_отжима_taxo)       'выводим на ЛСД уставку оборотов / мин :
Z_str = Format(z_str , "0000")
Lcdat 6 , 1 , Z_str , 0
Lcdat 6 , 25 , "»" , 0
Lcdat 7 , 1 , "1234567891234567" , 0
Return
'===============================================================================
  Обработка_прерывания_int0:
'-------------------------------------------------------------------------------
   Count_1 = Count_1 + 1
                                      ' Счетчик входных импульсов
'-------------------------------------------------------------------------------
  Return
'===============================================================================


'===============================================================================
'--------------------  Используемые шрифты  ------------------------------------
'===============================================================================
  '--------------------  Используемые шрифты  ----------------------------------------
'=================================================
 $include "Font_6x8.font"
  $include "Font_12x16.font"
  '$include "Font24x32.font"
'=================================================
'-------------------------------------------------------------------------------
   '$include "Nokia-1100 Library.inc"                        'сама библиотека
'===============================================================================

Отредактировано olegkaras (2018-01-28 22:06:17)

0

42

Да, букав там много...   И что не устраивает в Этом коде?

0

43

-NMi- написал(а):

Да, букав там много...   И что не устраивает в Этом коде?

То что до финала трудно самому дойти. :offtop:

0

44

Тебе нужно как-то это всё в "железе" испытывать. Так просто ковыряться в коде бессмысленно.  Разбивай задачу на кусочки и испытывай.

0

45

Ну а я опять заикнуть про замер вибрации аналоговым акселерометром  :flirt:
Была как-то статься на одном из профильных форумов о замере вибрации вращающихся механизмов, оказалось аналоговым гироскопом.... точней акселерометром можно и без контроллера с выводом на стрелочный индикатор сделать хороший замер, но там люди пошли дальше и даже стробоскоп впихнули.
Опа... да это патент )))) Стробоскоп в стиралке ))))
По идее можно будет просто накапливать максимальное значение АЦП за период времени, это и будет служить порогом вибрации, можно сбавлять обороты и т.п.
Вот, ссылочка по теме - https://www.chipmaker.ru/topic/129522/

Отредактировано Ev3658 (2018-01-29 12:55:24)

0

46

Это усложнит и сделает дороже всю конструкцию.  Не усложняйте себе жизнь, подавляющее большинство стиралок работают на датчике холла на барабане и каким-то чудом умеют определять вибрацию.

0

47

Подскажите будет ли работать устройство если  INT0 - мерят будет частоту вращения, INT1 - переход фазы через ноль для управления углом открывания симистора управлением эл. двигателем,
INT2 - принимать сигнал от пульта RC5 ?,

0

48

Int2 - RC5 это как?
Ты собрался на "интах" ИК протокол раскодировать?
Нука, пакаж пример, только свой!!!!! а не чужой!!!

Остальные "инты" - не лАмай себе голову а сделай так, как делают все! Контроллер моторчика там отдельный и он сам "переваривает" то, что ты хочешь переварить мегой. "инты" - шо пАнты, то-же времени процессорного требуют...  :D

0

49

Может обороты счетчиком делать?
https://avrhelp.mcselec.com/index.html? … timer0.htm

Отредактировано RDW (2018-02-01 18:46:50)

0

50

RDW написал(а):

Может обороты счетчиком делать?
https://avrhelp.mcselec.com/index.html? … timer0.htm

Отредактировано RDW (Сегодня 18:46:50)

Не по нашему, надо по ЭДС  :writing:  Шучу )))
Так-то Xmega сама тут напрашивается быть, хотя у Atmega328PB есть хороший и нужный потенциал! - https://www.rlocman.ru/review/article.html?di=162667

картинка потрахов

https://www.rlocman.ru/i/Image/2016/09/15/Fig_1_Rus.gif

Разница выводов Atmega328p и Atmega329PB, точней вот в PB версии:
Функциональные отличия портов

ввода/вывода ATmega328PB
Выводы корпуса
TQFP/MLF

ATmega328

ATmega328PB

3

GND

PE0/ACO

6

VCC

PE1

19

ADC6

ADC6/PE2

22

ADC7

ADC7/PE3

ATmega328PB стал первым 8-разрядным МК семейства AVR с интегрированным контроллером сенсорного интерфейса QTouch (Peripheral Touch Controller, PTC)  :glasses:

Свернутый текст

https://www.rlocman.ru/i/Image/2016/09/15/Fig_2_Rus.gif

Уникальный серийный номер для защиты подделок стиралок!!!!
Узнать уникальный серийный номер ATmega328PB в стиралке можно посредством чтения определенных регистров ввода/вывода. Он формируется конкатенацией 9 байт, содержащихся в этих регистрах. Регистры доступны только для чтения.

И да, Bascom AVR 2.0.8 поддерживает этот контроллер!
http://s4.uploads.ru/t/1A5mE.png

0

51

olegkaras написал(а):

INT2 - принимать сигнал от пульта RC5 ?

После недавних экспериментов с RC5 я навсегда отказался от самоделок с этим способом управления...
А уж тем более для стиралки... ;)

0

52

Что так кисло то?   Всё там переваривается хоть на "интах" хоть в линейном коде. 38кГц всё-таки...

ТС - код то хоть когда-нибудь свой собственный будет или только куски плагиата???  :D

0

53

По поводу дисбаланса шмоток в барабане. Мне кажется, что все намного проще чем кажется. Барабан на малой скорости переворачивает по несколько раз шмотки в обе стороны и считается, что этого достаточно, что-бы разложить тряпье ривненько. Все довольно просто. С другой стороны можно себе представить как, чем увидеть дисбаланс, с каким допустимым уровнем можно считать нормой, оформить это в код. И еще. Тогда логично, в этом случае этот дисбаланс должен контролироваться на всех этапах стирки. А если дисбаланс появится во время стирки? Делать сброс стирки и выходить в режим укладывания? Тоже не камильфо. Но этого не происходит. Поэтому просто тупо туда-сюда обратно несколько раз, типа все само должно уложиться. Я ТАК ДУМАЮ. (смешной смайл).

0

54

AleksanderG написал(а):

Барабан на малой скорости переворачивает по несколько раз шмотки в обе стороны и считается, что этого достаточно, что-бы разложить тряпье ривненько.

Логично... ;)

AleksanderG написал(а):

Все довольно просто. С другой стороны можно себе представить как, чем увидеть дисбаланс, с каким допустимым уровнем можно считать нормой, оформить это в код.

Вот как раз не все так просто... ;)
Ключевые слова "как", "чем", "норма", "оформить"...
Причем наиболее значимые - первые два, остальное вытекает из них... ;)

AleksanderG написал(а):

Тогда логично, в этом случае этот дисбаланс должен контролироваться на всех этапах стирки. А если дисбаланс появится во время стирки? Делать сброс стирки и выходить в режим укладывания?

Тут скорости небольшие, один оборот за 2-3 секунды...
В режиме стирки/полоскания, когда белье бултыхается в растворе/воде, дисбаланс вполне компенсируется системой подвеса барабана.

0

55

Ну... дык...чо...  , есть чо по делу???    :flag:

0

56

-NMi- написал(а):

Ну... дык...чо...  , есть чо по делу???

Если это ко мне , то я сейчас делаю железо.

0

57

Ну.......подождём.

0

58

olegkaras написал(а):

Если это ко мне , то я сейчас делаю железо.

Как собрались решать проблему поиска дисбаланса ?
Лучше в личку, есть хорошая идея !

0