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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Схемы » Контроллер на Xmega128A1


Контроллер на Xmega128A1

Сообщений 1 страница 11 из 11

1

Господа!
Решил я переходить на Xmega, все таки мощь там несравненная по сравнению с atmega, и АЦП получше и интерфейсов поболе.
Спаялась первая плата в ней (как фото прикрепить не знаю):
- 10 АЦП
- 2 ЦАП
- 2 mLan
- LCD 2*16
- RS232 (2 штуки)
- RS485 (2 штуки)
- 8 контактных входов
- 8 реле
плюс обвес и так по мелочи.
работает на 32 мГц
начал разбираться и писать прогу.
начал с USART-ов. Их там аж 8. Программируются и конфигурятся немного по другому.
попробовал АЦП в дифф. режиме (просидел все воскресенье разбирался).
меряет намного точнее чем мой контроллер на atmega128. удалось добиться точности в сотых долях вольта на диапазоне 0-20В
Выкладываю первый кусок кода под Xmega.

Если тема эта кому интересна, то готов дальше выкладывать наработки по Xmega.

Со своей стороны мне интерсно Ваше мнение на код мной написанный, что там я не так делаю (одна голова хорошо, а две головы хорошо, хорошо).

Код:
$regfile = "xm128a1def.dat"
$crystal = 32000000                                         '32MHz
$hwstack = 64
$swstack = 40
$framesize = 64

'include the following lib and code, the routines will be replaced since they are a workaround
$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014

Config Osc = Disabled , 32mhzosc = Enabled                  '32MHz

'configure the systemclock
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1

Dim B As Byte
Dim I As Integer
Dim S As Single


'------ËÑÄ
Config Lcdpin = Pin , Db4 = Porte.4 , Db5 = Porte.5 , Db6 = Porte.6 , Db7 = Porte.7 , E = Porte.0 , Rs = Porte.1

'-------COM ïîðòû
'---RS-232 DB9
Config Com5 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM5:" For Binary As #1

'---àöï êàíàë À
Config Adca = Single , Convmode = Signed , Resolution = 12bit , Dma = Off , Reference = Arefa , Event_mode = None , Prescaler = 512 , Ch0_gain = 1 , Ch0_inp = Diff , Mux0 = &B00000001
'---àöï êàíàë Â
Config Adcb = Single , Convmode = Signed , Resolution = 12bit , Dma = Off , Reference = Arefa , Event_mode = None , Prescaler = 512


Cls
Lcd "test"

Print #1 , "Test"
Usarte0_data = 48

Start Adca
Start Adcb

Do

'---1-ÀÖÏ
 I = Getadc(adca , 0 , &B00010001 )
 I = I - 2
 S = I * 0.0100401606426
 Print #1 , "1=" ; S
'---2-ÀÖÏ
 I = Getadc(adca , 0 , &B00011001 )
 I = I - 2
 S = I * 0.0100401606426
 Print #1 , "2=" ; S
'---3-ÀÖÏ
 I = Getadc(adca , 0 , &B00100001 )
 I = I - 2
 S = I * 0.0100401606426
 Print #1 , "3=" ; S
'---4-ÀÖÏ
 I = Getadc(adca , 0 , &B00101001 )
 I = I - 2
 S = I * 0.0100401606426
 Print #1 , "4=" ; S
'---5-ÀÖÏ
 I = Getadc(adca , 0 , &B00110001 )
 I = I - 2
 S = I * 0.0100401606426
 Print #1 , "5=" ; S
'---6-ÀÖÏ
 I = Getadc(adca , 0 , &B00111001 )
 I = I - 2
 S = I * 0.0100401606426
 Print #1 , "6=" ; S
 '---7-ÀÖÏ
 I = Getadc(adcb , 0 , &B00000001 )
 I = I - 2
 S = I * 0.0100401606426
 Print #1 , "7=" ; S
 '---8-ÀÖÏ
 I = Getadc(adcb , 0 , &B00100001 )
 I = I - 2
 S = I * 0.0100401606426
 Print #1 , "8=" ; S
 '---9-ÀÖÏ
 I = Getadc(adcb , 0 , &B00101001 )
 I = I - 2
 S = I * 0.0100401606426
 Print #1 , "9=" ; S
 '---10-ÀÖÏ
 I = Getadc(adcb , 0 , &B00110001 )
 I = I - 2
 S = I * 0.0100401606426
 Print #1 , "10=" ; S

 Print #1 ,
 Wait 3

Loop

Stop Adca
Stop Adcb

End

Распиновка Микроконтроллера (DD1)

Аналоговые сигналы:
PA2 –PA7 – положительный вход ADCA;
PA0 – вход внешнего опорного напряжения 2,5B;
PA1 – отрицательный вход ADCA (для дифференциального измерения);
PB0  – положительный вход ADCB;
PB4 – положительный вход ADCB (подключается джампером  на контакты XT7 и XT8);
PB5 – положительный вход ADCB (подключается джампером  на контакты XT4 и XT5);
PB6 – положительный вход ADCB (подключается джампером  на контакты XT1 и XT2);
PB1 – отрицательный вход ADCB (для дифференциального измерения);
PB2 – выход DACB канал 0;
PB3 – выход DACB канал 1;

PA0 он же и есть AREF.

Земля опорного напряжения соединена с землей АЦП и можно измерения проводить относительно нее и тогда разрешение измерений будет 12-разрядным, но при такой конфигурации нельзя будет учесть смещение нуля АЦП
Можно проводить измерения как в обычном (несимметричном) режиме, так и в дифференциальном - это все конфигурируется программно.  Поэтому можно попробовать и сравнить разные режимы измерения АЦП.
опорным уровнем является напряжение на порте PA0, величина 2,5В +/-0,1%.

Интерфейсы:
PE2 – RxD0 (USARTE0 для RS232, выходит на разъем  X7(DB-9)) ;
PE3 – TxD0 (USARTE0 для RS232, выходит на разъем X7(DB-9)) ;
PD5 – вход управляющего сигнала (разъем X7(DB-9),pin 9) ;
PD6 – выход управляющего сигнала (разъем X7(DB-9),pin 4) ;
PD2 – RxD0 (USARTD0 для RS485-1 и RS232) ;
PD3 – TxD0 (USARTD0 для RS485-1 и RS232) ;
PK6 – режим работы RS485-1 (управляется микропереключателем SW1);
PD7 – /RE-DE (переключение RS485-1 на прием или передачу) ;
PF2 – RxD0 (USARTF0 для RS485-2) ;
PF3 – TxD0 (USARTF0 для RS485-2) ;
PF1 – /RE-DE (переключение RS485-2 на прием или передачу) ;
PK7 – режим работы RS485-2 (управляется микропереключателем SW7);
PF6 – RxD1 (USARTF1 для USB) ;
PF7 – TxD1 (USARTF1 для USB) ;
PF4 – RTS (для USB) ;
PF5 – CTS (для USB) ;
PD0 – SDA (I2C для EEPROM и RTC) ;
PD1 – SCL (I2C для EEPROM и RTC) ;
PK1 – 1-Wire (на Х10);
PK3 – 1-Wire (TM_DATA контакт 1 на Х9);

LCD-дисплей:
PE4 – DB4 (шина данных);
PE5 – DB5 (шина данных);
PE6 – DB6 (шина данных);
PE7 – DB7 (шина данных);
PE0 – E (разрешение работы);
PE1 – A0 (данные или команда);

Дискретные сигналы:
PH0…PH7 – управление реле К1…К8 (клеммник Х2 и Х5);
PJ0…PJ7 – дискретные входы (клеммник Х3);
PK0 – управление питанием модема (Х8);
PK2 – управление IK (контакт 3 на Х9);
PK4 – управление информационным светодиодом;
PK5 – контроль питания +12В;
PC0 – управление информационным светодиодом (будет в откорректированной плате);
PC1 – управление информационным светодиодом (будет в откорректированной плате);
PC2 – управление зуммером (будет в откорректированной плате);
PC3…PC7 – резерв;

Программирование и отладка:
PB4 – JTAG TMS (подключается джампером  на контакты XT8 и XT9);
PB5 – JTAG TDI (подключается джампером  на контакты XT5 и XT6);
PB6 – JTAG TCK (подключается джампером  на контакты XT2 и XT3);
PB7 – JTAG TDO;
PDI_DATA (PIN 89) (для программирования);
PDI_CLK/RESET (PIN 90) (для программирования);

Питание:
PINS 14, 24, 34, 44, 54, 64, 74, 83 – VCC;
PINS 13, 23, 33, 43, 53, 63, 73, 84 – DGND;
PINS 4, 94 – AVCC;
PINS 3, 93 – AGND;

XTAL1, XTAL2 – вход тактовой частоты 8 МГц;
PQ0/TOSC1, PQ1/TOSC2 – вход тактовой частоты 32,768 КГц.

Отредактировано Александр Д. (2013-04-24 15:45:32)

0

2

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

как фото прикрепить не знаю

В быстром ответе рядом с книжкой три картинки.

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

Если тема эта кому интересна, то готов дальше выкладывать наработки по Xmega.

У меня лежит Xmega, ждет своего часа. Будет познавательно.

P.S. Чтобы в коде не было кракозябров копировать текст нужно при русской раскладке клавы.

0

3

Вот и фото

0

4

http://s2.uploads.ru/t/X3Uyb.jpg

0

5

Лежит одна в запасе 256A3, освобожусь тоже займусь. Но дисплей 16x2 это как к реактивному истребителю
прилепить пропеллер. Буду TFT подключать.

0

6

Диспелей этот только для технологических целей.
Я к нему для вывода информации прилепил вот такой диспелейчикhttp://s2.uploads.ru/t/CHGmu.jpg

0

7

Привет!
Есть у кого-нибудь картинка FUSE-bits для такой настройки частоты?:

Код:
$regfile = "xm128a1def.dat"
$hwstack = 200
$swstack = 200
$framesize = 500
$crystal = 32000000

Config Osc = Enabled , 32mhzosc = Enabled
Config Sysclock = 32mhz                                     '--> 32MHz

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

  Config Osc = Disabled , 32mhzosc = Enabled
  Osc_pllctrl = &B10_0_00100
  Do
  Loop Until Osc_status.1 = 1                               'Check if RC2MRDY is ready                            '
  'enable PLL
  Set Osc_ctrl.4                                            'PLL enable
  'configure the systemclock
  Config Sysclock = Pll , Prescalea = 1 , Prescalebc = 1_1  'use PLL

  Stop Watchdog

0

8

у хмеги нет фъюз-битов, частота задается (меняется ) в любое время  програмно, с завода установлено 2 Мгц

Отредактировано absolut (2014-03-08 23:38:23)

0

9

Да, у ХМеги частота настраивается программно (и можно калибровать). Код обычно выглядит так на запуск 32МHz, на внутреннем кварце:

Код:
Config Osc = Enabled , 32mhzosc = Enabled , Extosc = Enabled , Startup = Extclk
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1

Ещё можно использовать внешний кварц (часовой), для отсчета независимо времени (секунд) - это очень удобно. Код выглядит так для кварца 32768:

Код:
Config Clock = Soft , Rtc = 1khz_32khz_crystosc , Gosub = Sectic

На метке подпрограммы "Sectic" будет выполнятся код раз в секунду.

Биты есть на системные вещи, то как: вачдог, загрузка, размер загрузки, защита разных памятей...в общем стандартно.

0

10

можно посмотреть здесь http://avrhelp.mcselec.com/index.html?atxmega.htm
может есть и русская версия хелпа, но и так вполне читабельно

0

11

ПОЛНОСТЮ РАБОТАЮЩАЯ ВЕРСИЯ ПРОГРАММЫ НА XMEGA

Код:
$regfile = "xm128a1def.dat"
$crystal = 32000000
$hwstack = 64
$swstack = 40
$framesize = 64
'include the following lib and code, the routines will be replaced since they are a workaround
$lib "xmega.lib"
$external _xmegafix_clear
$external _xmegafix_rol_r1014
$lib "i2c_twi.lbx"                                          '
'-------------------------------------------------------------------------------
'Enable the external oscillator 8MHz  and PLL 32MHz
'-------------------------------------------------------------------------------
'For  8MHz crystal
Config Osc = Disabled , Extosc = Enabled , Range = 2mhz_9mhz , Startup = Xtal_1kclk , 32khzosc = Enabled
' Set PLL OSC conditions:
Osc_pllctrl = &B1100_0100                                   ' reference external oscillator, set the PLL' multiplication factor to 4 (bits 0 - 4)
Set Osc_ctrl.4                                              ' Enable PLL Oscillator
Bitwait Osc_status.4 , Set                                  ' wait until the pll clock reference source is stable
Clk_ctrl = &B0000_0100                                      ' switch system clock to pll
Config Sysclock = Pll , Prescalea = 1 , Prescalebc = 1_1

'Config Osc = Disabled , Extosc = Enabled , Range = 2mhz_9mhz , Startup = Xtal_256clk
'Config Sysclock = External , Prescalea = 1 , Prescalebc = 1_1       'EXTERNAL 32MHz
'osc_xoscctrl = &B01001011                                  'задаем диапазон внешнего генератора 2...9МГц и время запуска равное 16000
'Set Osc_ctrl.3                                              'разрешаем работу внешнего генератора
'Osc_pllctrl = &B11000100                                    'задаем внешний генератор как источник синхронизации для блока PLL и умножаем на 4
'Do
'Loop Until Osc_status.3 = 1                                 'ожидаем готовность внешнего генератора
'Set Osc_ctrl.4                                              'разрешаем работу блока PLL
'Do
'Loop Until Osc_status.4 = 1                                 'ожидаем готовность PLL
'Cpu_ccp = &B11011000                                        'разрешение на изменение защитных регистров
'Clk_ctrl = &B00000100                                       'задаем системную синхронизацию от PLL
'Cpu_ccp = &B11011000                                        'разрешение на изменение защитных регистров
'Clk_psctrl = &B00000000                                     'записываем в регистр предделителя системной частоты 0
'Clk_lock = &B00000000                                       'нет запрета на изменение 2-х предыдущих регистров
'Reset Osc_ctrl.0                                            'отключаем внутренний источник на 2МГц, тем самым запускаем системную синхронизацию от PLL
'-------------------------------------------------------------------------------
'Config Interrupts
Config Priority = Static , Vector = Application , Lo = Enabled , Hi = Enabled , Med = Enabled
'-------------------------------------------------------------------------------
'Config ADCA ADCB
'-------------------------------------------------------------------------------
Config Adca = Single , Convmode = Signed , Resolution = 12bit , Dma = Off , Reference = Arefa , Event_mode = None , Prescaler = 512 , Ch0_gain = 1 , Ch0_inp = Diff , Mux0 = &B00000001
Config Adcb = Single , Convmode = Signed , Resolution = 12bit , Dma = Off , Reference = Arefa , Event_mode = None , Prescaler = 512 , Ch0_gain = 1 , Ch0_inp = Diff , Mux0 = &B00000001
'-------------------------------------------------------------------------------
'Config DACB
'-------------------------------------------------------------------------------
'Config Dacb = Enabled , Io0 = Enabled , Io1 = Enabled , Channel = Dual , Reference = AREFA , Interval = 64 , Refresh = 64
'Dacb0 = 4095
'DACB1 = 2047
'Start Dacb
'Stop Dacb
'-------COM порты
'---Основной RS-232 DB9(1)
Config Com5 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM5:" For Binary As #1
'Управление соединением CSD
Reset Portd.6
Config Pind.6 = Output
'---прерывание входящего звонка RI/PIND.5
'On Portd_int0 Prer_zvonok
Enable Portd_int0 , Lo
Config Portd.5 = Input
Portd_int0mask = &B00100000
Config Xpin = Porte.5 , Outpull = Pullup , Sense = Falling

'---Дополнительный RS-232(2)
Config Com3 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM3:" For Binary As #2

'---Основной RS-485/1(3)
Config Com2 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM2:" For Binary As #3
'управление прием/передача RS-485/1
Reset Portd.7
Config Pind.7 = Output

'---Дополнительный RS-485/2(4)
Config Com7 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM7:" For Binary As #4
'управление прием/передача RS-485/2
Reset Portf.1
Config Pinf.1 = Output

'---USB
Config Com8 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM8:" For Binary As #5

'---I2C
Open "twid" For Binary As #6
I2cinit #6                                                  'set i2c pins to right state , open collector , pull up activated
Config Twid = 100000                                        'Set TWI Baud Rate and Enable TWI Master

'configure the date format
'time$ = "23:58:00"                     ' для наблюдения смены дня
'Date$ = "08-10-03"                      ' 08 октябрь 2003

Config Clock = User
Config Date = Dmy , Separator = -                           ' ANSI-Format

Config Watchdog = 8000
Stop Watchdog

'---первый микролан
Config 1wire = Portk.1
'---EEPROM
Config Eeprom = Mapped
'Реле
Config Porth = Output
'Реле модема
Reset Portk.0
Config Pink.0 = Output
'светодиод ТМ
Set Portk.2
Config Pink.2 = Output
'контроль наличия питающего напряжения
Reset Portk.5
Config Pink.5 = Input
'Управление соединением CSD
Reset Portd.6
Config Pind.6 = Output
'контактные входы
Config Portj = Input
'Зуммер
Reset Portc.2
Config Pinc.2 = Output
'информационный светодиод1
Reset Portk.4
Config Pink.4 = Output
'информационный светодиод2
Reset Portc.0
Config Pinc.0 = Output
'информационный светодиод3
Reset Portc.1
Config Pinc.1 = Output
'------ЛСД
Config Lcdpin = Pin , Db4 = Porte.4 , Db5 = Porte.5 , Db6 = Porte.6 , Db7 = Porte.7 , E = Porte.0 , Rs = Porte.1
'############################ЗАМЕНА ПЕРЕМЕННЫХ##################################
'-светодиод 1 modem
Diod_1 Alias Portk.4
'-светодиод 2 net
Diod_2 Alias Portc.0
'-светодиод 1 err
Diod_3 Alias Portc.1
'-Зуммер
Zummer Alias Portc.2
'-управление прием/передача RS-485/1
Re_de_rs485_1 Alias Portd.7
'-управление прием/передача RS-485/2
Re_de_rs485_2 Alias Portf.1
'-Светодиод ТМ
Diod_tm Alias Portk.2
'-Реле модема
Rele_modema Alias Portk.0
'-реле
Rele Alias Porth
'-входы
Vhodi Alias Pinj
'############################КОНСТАНТЫ##########################################
Const Razmeepr = 4799
Const Adca_koef = 1.009191552                               ' коэффициенты для 2-й платы (которая у меня)
Const Adcb_koef = 1.009212989
'address of ds1307
Const Ds1307w = &HD0                                        'Addresses of Ds1307 clock
Const Ds1307r = &HD1
Const Slave_w = &B1010_0000                                 'slave write address  EEPROM
Const Slave_r = &B1010_0001                                 'slave read address  EEPROM
'############################ПЕРЕМЕННЫЕ EEPROMA#################################
'---настройки дополнительного RS-232
Dim Baud_rate_rs232_eram As Eram Byte
Dim Data_bits_rs232_eram As Eram Byte
Dim Parity_rs232_eram As Eram Byte
Dim Stop_bits_rs232_eram As Eram Byte
'---настройки RS-485(1)
Dim Baud_rate_rs485_1_eram As Eram Byte
Dim Data_bits_rs485_1_eram As Eram Byte
Dim Parity_rs485_1_eram As Eram Byte
Dim Stop_bits_rs485_1_eram As Eram Byte
'---настройки дополнительного RS-485(2)
Dim Baud_rate_rs485_2_eram As Eram Byte
Dim Data_bits_rs485_2_eram As Eram Byte
Dim Parity_rs485_2_eram As Eram Byte
Dim Stop_bits_rs485_2_eram As Eram Byte
'---ключи Touch Memory at 27 обязательно
Dim Epr_toch_mem(64) As Eram Byte At 27
'---мастер ключ
Dim Epr_master_kl(8) As Eram Byte
'--режим охраны
Dim Epr_ohrana As Eram Byte
'--маски входов на охране
Dim Epr_maska_vhod As Eram Byte
Dim Epr_maska_vhod_adc As Eram Byte
'--состояние питания перед выключением
Dim Epr_pred_pitanie As Eram Byte
'--кол-во попыток отправки СМС
Dim Epr_nepr_sms As Eram Byte
'--АЦП
Dim Min_adc_eram(10) As Eram Byte
Dim Diap_dat_eram(10) As Eram Integer
Dim Koef_adc_eram(10) As Eram Single
Dim Diap_adc_eram(10) As Eram Byte
Dim Vrem_zad_adc(8) As Eram Word
Dim Vrem_zad_adc_posle(8) As Eram Word
'--контактные
Dim Vrem_nakopl(8) As Eram Word
Dim Vrem_zad(8) As Eram Word
Dim Vrem_zad_posle(8) As Eram Word
Dim Crc_eram As Eram Word
'--mLan
Dim Str_min_por_eram(8) As Eram String * 4
Dim Str_max_por_eram(8) As Eram String * 4
'--пароль
Dim Epr_parol As Eram String * 8
'--номер ДЦ
Dim Disp_epr As Eram String * 16
'--номер СМС Центра
Dim Epr_smsc As Eram String * 16
'Dim Min_dat_eram(8) As Eram Integer
'###############################################################################
'-----Переменные соединения по каналу GPRS
Dim User As String * 16
Dim Password As String * 16
Dim Apn As String * 32
Dim Ip_adr1 As String * 15
Dim Ip_adr2 As String * 15
Dim Ip_port1 As String * 5
Dim Ip_port2 As String * 5
Dim Min_signal As Integer
Dim Ping_ip_adr1 As String * 15
Dim Ping_ip_adr2 As String * 15
Dim Timeout As Byte
Dim Session_gprs As Word
Dim Konf_gprs As Byte
'-----Переменные соединения по каналу CSD
Dim Tempbyte1_r As Byte
Dim Tempbyte_r As Byte
Dim Razr_csd As Byte
Dim I_r As Word
Dim Buf_in_r(254) As Byte
Dim Buf_in_485_r(254) As Byte
Dim Otkr_kanal_r As Bit
Dim Kol_err_r As Byte
Dim Err_r As Byte
Dim Temp_r As Byte
Dim Get_dln_r As Byte
Dim Get_byte_r As Byte
Dim Get_byte_r1 As Byte
Dim Crc_r As Byte
Dim Id_paketa_r As Byte
Dim Id_ystr_r As Byte
Dim Golova_r As Byte
Dim Xvost_r As Byte
Dim Dlina_r As Byte
Dim I_w_r As Word
Dim Get_w_r As Long
Dim Msg_r As String * 16
Dim Otvet_r As String * 50
'-------переменные для буфера событий
Dim Golova As Byte                                          'голова буфера
Dim Hvost As Byte                                           'хвост буфера
Dim Kol_sob As Byte                                         'кол-во событий
Dim Bufer_str(50) As String * 16                            'знач-е времени
Dim Bufer_sost(50) As Byte                                  'знач-е входов
'--------------часы
Dim Hi As Byte , Lo As Byte
Dim Dat As String * 9
Dim Chas As String * 9
'------------переменные функции управления реле
Dim Izm_i As Byte
Dim Izm_j As Byte
Dim Izm_j1 As Byte
Dim Izm_byte As Byte
Dim Izm_value As Byte
Dim Izm_epr_adr As Word
Dim Izm_str2 As String * 2
'------------------некоторые локальные переменные
Dim Loc_epradres As Word
Dim Loc_i As Word
Dim Loc_i1 As Word
Dim Loc_byte As Byte
Dim Get_w As Long
Dim Get_byte As Byte
Dim Get_dln As Word
'---переменные создания архивов состояния
Dim Flag_arhiv As Bit
Dim Arhiv(90) As Byte
Dim Kol_arhiv As Byte
Dim Golova_arhiv As Byte
Dim Period_stat As Word
Dim Ch_period_stat As Word
'------------ПЕРЕМЕННЫЕ ОСНОВНОГО ЦИКЛА
Dim Temp_single As Single
Dim Temp_integer As Integer

Dim J As Word
Dim J2 As Word
Dim I As Word
Dim I1 As Word
Dim I2 As Word
Dim Epradres As Word
Dim Adr_telef As Word
Dim Adr_sms As Word
Dim Tempstr1 As String * 1
Dim Str2 As String * 2

Dim Twi_start As Byte
Dim Min_adc(10) As Byte
Dim Diap_adc(10) As Byte
Dim Min_dat(10) As Integer
Dim Diap_dat(10) As Integer
Dim Koef_adc(10) As Single
Dim Ed_izm_dat(10) As String * 10
Dim Zn_adc_single(10) As Single
Dim Zn_adc_long(10) As Single
Dim Adc_str(10) As String * 5
Dim Zn_dat_adc_single(10) As Single
Dim Zn_dat_adc_string(10) As String * 10

Dim Max_por_dat(8) As Single
Dim Min_por_dat(8) As Single

Dim Mlan_str(8) As String * 10
Dim Vrem_stat As String * 4                                 'ответ телефона или ПС
Dim Id_obekta As String * 10
Dim Csq As String * 11
Dim Csq_dbm As Integer
Dim Parol As String * 7
Dim Smsc As String * 16
Dim Sost_vihod As String * 8
Dim Sost_datch As String * 8
Dim Sost_adc As String * 8
Dim Otvet As String * 40

Dim Ohrana As Byte
Dim Perezagr As Byte
Dim Izmen_mlan(8) As Byte
Dim Izmen_adc(8) As Byte
Dim My_err As Byte
Dim Kol_nepr_sms As Byte
Dim Fl_otsil_stat As Byte
Dim Maska_vhod As Byte
Dim Maska_vhod_adc As Byte
Dim Kol_stat As Byte
Dim Kol_ciklov As Byte
Dim Est_ohrana As Byte
Dim Kontr_tel As Byte
Dim Tempbyte As Byte
Dim Tempbyte1 As Byte
Dim Kol_kluchei As Byte
Dim Dlina_parola As Byte
Dim Tek_vhod As Byte                                        'текущее значение входов
Dim Pred_vhod As Byte                                       'предыдущее значение входов
Dim Tip_datch As Byte
Dim Id_toch_mem(8) As Byte
Dim Vrem_rele(8)as Word
Dim Sost_vhod As Byte

Dim Flag_reset As Bit
Dim Flag_lcd As Bit
Dim Konfig_kluch As Bit
Dim Pervii_raz As Bit                                       'флаг первого цикла измерений
Dim Bez_modema As Bit
Dim Pred_pitanie As Bit
Dim Pitanie As Bit
'---------для датчиков mLAn
Dim Id_datch(8) As Byte
Dim Toch_mem(8) As Byte
Dim Obr_datch As Byte                                       'текущий номер датчика MLan
Dim Pred_sost_datch As String * 1

Dim Str_max_por As String * 4
Dim Str_min_por As String * 4

Dim Zn_datch_str As String * 10
Dim Zn_datch1_str As String * 6
Dim Zn_datch As Single
Dim Zn_datch_arr(32) As Byte
Dim Singl_temper As Single                                  'полученное значение датчика MLan
Dim Min_porog As Single
Dim Max_porog As Single
Dim Vdd As Word , Vad As Word , Vcc As Word , Temp As Single
Dim Kol_imp As Long
'----------переменные для прерывания таймера3
Dim Kol_prer_tim3 As Byte
Dim Zn_dat_mlan(8) As String * 16
Dim Msg_tim3 As String * 16
'----------переменные для прерывания таймера 1
Dim Tim_epradres As Word
Dim Flag(8) As Byte
Dim Flag_adc(8) As Byte
Dim Tek(8) As Byte
Dim Tek_adc(8) As String * 1
Dim Tek_vrem_nakopl(8) As Word
Dim Tek_vrem_zad(8) As Word
Dim Tek_vrem_zad_adc(8) As Word
Dim Tek_vrem_zad_posle(8) As Word
Dim Tek_vrem_zad_adc_posle(8) As Word

Dim Prisl_tm As Byte
Dim Vrem_zad_tm As Word
Dim Flag_tm As Byte
Dim Tek_vrem_tm As Byte

Dim Tim_i As Byte
Dim Tim_i1 As Byte
Dim Tim_j As Byte
Dim Tim_j1 As Byte
Dim Tim_byte As Byte
Dim Tim_toch_mem(8) As Byte
Dim Tim_id_datch(8) As Byte
'@@@@@@@@@@@@@@@@@@@@@переменные работы с СМС@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Dim S1 As String * 2 , S0 As String * 2 , S4 As String * 4
Dim Pdu_type As String * 2
Dim Pdu_err As Byte , Tmp1 As Byte , Tmp2 As Byte , Dsc As Byte
Dim F As Bit
Dim Bytes7(9) As Byte
Dim Char As Word , X As Word , Y As Word , E_i As Word
Dim Loc_dln_pdu As Word
'--------для SMS
Dim Buf As String * 322 , Msg As String * 140
Dim Sender As String * 16
Dim Sender1 As String * 16
'---русификация ЛСД
Dim Rus As String * 1 , Cntr As Byte , I_lcd As Byte
'-----------------СЛУЖЕБНЫЕ
Dim Vrem_otw As Long
Dim Vrem_pered As Long
Dim Vrem_otv_tel As Integer
Dim Sms_komand As String * 15
'------------замена стандартных часов
Dim T_sec As Byte
Dim T_min As Byte
Dim T_hour As Byte
Dim T_weekday As Byte
Dim T_day As Byte
Dim T_month As Byte
Dim T_year As Byte
'###############################################################################
Declare Sub Write_eeprom(byval Adres As Word , Byval Value As Byte)
Declare Sub Read_eeprom(byval Adres As Word , Value As Byte)
Declare Sub Getline_usb(s As String)
Declare Sub Getline_rs232(s As String)
Declare Sub R_lcd(msg As String)
Declare Sub Getdatetime()
Declare Sub Setdate()
Declare Sub Settime()
Declare Sub Temper()
Declare Sub Vlaga()
Declare Sub Schit()
'###############################################################################
'---начальные установки
Rele = 0

Cls
Cursor Off
Msg = "СОЮЗТЕХНОПРОЕКТ"
Call R_lcd(msg)
Locate 2 , 1
Msg = "RECON-SX v.19.1"
Call R_lcd(msg)
Set Zummer
Wait 1
Reset Zummer
Set Diod_1
Wait 1
Reset Diod_1
Set Diod_2
Wait 1
Reset Diod_2
Set Diod_3
Wait 1
Reset Diod_3

'---Установка параметров дополнительного порта RS-232(2)
Arhiv(1) = Baud_rate_rs232_eram
Arhiv(2) = Data_bits_rs232_eram
Arhiv(3) = Parity_rs232_eram
Arhiv(4) = Stop_bits_rs232_eram
J = Crc16uni(arhiv(1) , 4 , &HFFFF , &H8005 , 1 , 1)
J2 = Crc_eram

If J <> J2 Then
 Baud_rate_rs232_eram = 3
 Data_bits_rs232_eram = 3
 Parity_rs232_eram = 0
 Stop_bits_rs232_eram = 0
Else
 Tempbyte = Baud_rate_rs232_eram
 Select Case Tempbyte
  Case 0 : Config Com3 = 1200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  Case 1 : Config Com3 = 2400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  Case 2 : Config Com3 = 4800 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  Case 3 : Config Com3 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  Case 4 : Config Com3 = 14400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  Case 5 : Config Com3 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  Case 6 : Config Com3 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  Case 7 : Config Com3 = 56000 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  Case 8 : Config Com3 = 57600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  Case 9 : Config Com3 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
 End Select

 '---количество бит данных
 Tempbyte = Data_bits_rs232_eram
 Select Case Tempbyte
  Case 0 : Reset Usartd0_ctrlc.0
            Reset Usartd0_ctrlc.1
  Case 1 : Set Usartd0_ctrlc.0
            Reset Usartd0_ctrlc.1
  Case 2 : Reset Usartd0_ctrlc.0
            Set Usartd0_ctrlc.1
  Case 3 : Set Usartd0_ctrlc.0
            Set Usartd0_ctrlc.1
 End Select

 '---бит паритета
 Tempbyte = Parity_rs232_eram
 Select Case Tempbyte
  'none
  Case 0 : Reset Usartd0_ctrlc.4
            Reset Usartd0_ctrlc.5
  'odd
  Case 1 : Set Usartd0_ctrlc.4
            Set Usartd0_ctrlc.5
  'even
  Case 2 : Reset Usartd0_ctrlc.4
            Set Usartd0_ctrlc.5
 End Select

 '---кол-во стоп битов
 Tempbyte = Stop_bits_rs232_eram
 Select Case Tempbyte
  Case 0 : Reset Usartd0_ctrlc.3
  Case 1 : Set Usartd0_ctrlc.3
 End Select
End If

Call Getdatetime()

Poisk:
'-----получение времени
Call Getdatetime()
'---------
'###############################################################################
Cls
Cursor On
Msg = "    RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = "  ..Поиск ПК.."
Call R_lcd(msg)
Wait 1
'*******************************************************************************
J = 0
Do

 Print #5 , "ATI"
 Vrem_otw = 300000                                          'определяет время опроса
 Vrem_otv_tel = 25
 Otvet = ""
 Call Getline_usb(otvet)

 If Otvet = "PC" Then                                       'проверяем ответил ПК или телефон
  Waitms 500
  Vrem_otv_tel = 7
  Print #5 , "Ver.30.05.13*019.1"
  '----принимаем ответ
  Call Getline_usb(otvet)
  If Otvet = "PC_OK" Then
    Exit Do
  End If
 End If

 '---будем искать телефон если не нашли ПК
 If J > 10 Then
   Cls
   Cursor Off
   Msg = "Подключения к ПК"
   Call R_lcd(msg)
   Locate 2 , 1
   Msg = " не обнаружено"
   Call R_lcd(msg)
   Goto Poisk_tel
 End If

 I = J Mod 2
 If I = 0 Then
  Shiftcursor Right
 Else
  Shiftcursor Left
 End If

 Incr J
Loop
'###########################КОНФИГУРАЦИЯ КОНТРОЛЛЕРА############################
'--- LCD
Cls
Cursor Off
Msg = "    RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = "Конфигурирование"
Call R_lcd(msg)
'---
Pc:
Vrem_otw = 2000000
Vrem_otv_tel = 15
Otvet = ""
'ждем команду

Call Getline_usb(otvet)

If Otvet = "" Then
 Goto Pc
End If
'------------запрос ID датчиков из контроллера----------------------------------
If Otvet = "ID" Then
 Cls
 Msg = "    RECON-SX"
 Call R_lcd(msg)
 Locate 2 , 1
 Msg = " Запрос ID mLan"
 Call R_lcd(msg)

 Id_toch_mem(1) = 1wsearchfirst()

 If Err = 0 Then
  For I1 = 1 To 8
    Str2 = Hex(id_toch_mem(i1))
    Print #5 , Str2;
    If I1 = 8 Then
     Print #5 ,
    End If
  Next I1
  '---если совмещенный датчик температуры и влажности
    If Id_toch_mem(1) = &H26 Then
     Id_toch_mem(1) = &H27
       For I1 = 1 To 8
        Str2 = Hex(id_toch_mem(i1))
        Print #5 , Str2;
        If I1 = 8 Then
         Print #5 ,
        End If
       Next I1
      End If
  '---если счетчик импульсов
    If Id_toch_mem(1) = &H1D Then
     Id_toch_mem(1) = &H1E
       For I1 = 1 To 8
        Str2 = Hex(id_toch_mem(i1))
        Print #5 , Str2;
        If I1 = 8 Then
         Print #5 ,
        End If
       Next I1
    End If
 Else
   For I1 = 1 To 16
    Print #5 , "0";
   Next I1
   Print #5 ,
 End If

 For I = 1 To 7
  Id_toch_mem(1) = 1wsearchnext()
  If Err = 0 Then
   For I1 = 1 To 8
     Str2 = Hex(id_toch_mem(i1))
     Print #5 , Str2;
     If I1 = 8 Then
      Print #5 ,
     End If
   Next I1
  '---если совмещенный датчик температуры и влажности
    If Id_toch_mem(1) = &H26 Then
     Id_toch_mem(1) = &H27
       For I2 = 1 To 8
        Str2 = Hex(id_toch_mem(i2))
        Print #5 , Str2;
        If I1 = 8 Then
         Print #5 ,
        End If
       Next I2
    End If
  '---если совмещенный датчик температуры и влажности
    If Id_toch_mem(1) = &H1D Then
     Id_toch_mem(1) = &H1E
       For I2 = 1 To 8
        Str2 = Hex(id_toch_mem(i2))
        Print #5 , Str2;
        If I1 = 8 Then
         Print #5 ,
        End If
       Next I2
    End If
  Else
   For I1 = 1 To 16
    Print #5 , "0";
   Next I1
   Print #5 ,
  End If
 Next I

Goto Pc
End If
'------------запрос TM----------------------------------
 '---запрс Т.М.
If Otvet = "TM" Then
 Cls
 Msg = "    RECON-SX"
 Call R_lcd(msg)
 Locate 2 , 1
 Msg = " Запрос ID Т.М."
 Call R_lcd(msg)
                                      'чтение ID
 Toggle Diod_tm                                             'СВЕТОДИОД ДЛЯ touchmemory
 Tim_id_datch(1) = 1wsearchfirst(pink , 3)

 If Err <> 1 And Tim_id_datch(1) = 1 Then
  Msg = ""
  For Tim_i = 1 To 8
   Msg = Msg + Hex(tim_id_datch(tim_i))
  Next Tim_i
  Print #5 , Msg
 Else
  Print #5 , "N/A"
 End If
 Wait 2
 Toggle Diod_tm                                             'СВЕТОДИОД ДЛЯ touchmemory
 Goto Pc
End If

'------------запрос значения датчиков, входов, выходов
If Otvet = "STATUS" Then
 Cls
 Msg = "    RECON-SX"
 Call R_lcd(msg)
 Locate 2 , 1
 Msg = "Запрос состояния"
 Call R_lcd(msg)

 '---опрос входов
 Tek_vhod = Not Vhodi
 Print #5 , Bin(tek_vhod)

'ОБРАБОТКА АЦП
'-----------------цифрим 30 раз
 For I = 1 To 10
  Zn_adc_single(i) = 0
  Zn_adc_long(i) = 0
 Next I

 '---цифрим все каналы по 30 раз
 For I2 = 1 To 30
  '-------ADCA-------
  'ADC_1(pina.2)
   Temp_integer = Getadc(adca , 0 , &B00010001)
'  Print #1 , "Temp_integer=" ; Temp_integer
   Zn_adc_long(1) = Zn_adc_long(1) + Temp_integer
   Waitus 300
  'ADC_2(pina.3)
   Temp_integer = Getadc(adca , 0 , &B00011001)
'  Print #1 , "Temp_integer=" ; Temp_integer
   Zn_adc_long(2) = Zn_adc_long(2) + Temp_integer
   Waitus 300
  'ADC_3(pina.4)
   Temp_integer = Getadc(adca , 0 , &B00100001)
'  Print #1 , "Temp_integer=" ; Temp_integer
   Zn_adc_long(3) = Zn_adc_long(3) + Temp_integer
   Waitus 300
  'ADC_4(pina.5)
   Temp_integer = Getadc(adca , 0 , &B00101001)
'  Print #1 , "Temp_integer=" ; Temp_integer
   Zn_adc_long(4) = Zn_adc_long(4) + Temp_integer
   Waitus 300
  'ADC_5(pina.6)
   Temp_integer = Getadc(adca , 0 , &B00110001)
'  Print #1 , "Temp_integer=" ; Temp_integer
   Zn_adc_long(5) = Zn_adc_long(5) + Temp_integer
   Waitus 300
  'ADC_6(pina.7)
   Temp_integer = Getadc(adca , 0 , &B00111001)
'  Print #1 , "Temp_integer=" ; Temp_integer
   Zn_adc_long(6) = Zn_adc_long(6) + Temp_integer
   Waitus 300
   '-------ADCB-------
  'ADC_7(pinb.0)
   Temp_integer = Getadc(adcb , 0 , &B00000001)
'  Print #1 , "Temp_integer=" ; Temp_integer
   Zn_adc_long(7) = Zn_adc_long(7) + Temp_integer
   Waitus 300
  'ADC_8(pinb.4)
   Temp_integer = Getadc(adcb , 0 , &B00100001)
'  Print #1 , "Temp_integer=" ; Temp_integer
   Zn_adc_long(8) = Zn_adc_long(8) + Temp_integer
   Waitus 300
  'ADC_9(pinb.5)
   Temp_integer = Getadc(adcb , 0 , &B00101001)
'  Print #1 , "Temp_integer=" ; Temp_integer
   Zn_adc_long(9) = Zn_adc_long(9) + Temp_integer
   Waitus 300
  'ADC_10(pinb.6)
   Temp_integer = Getadc(adcb , 0 , &B00110001)
'  Print #1 , "Temp_integer=" ; Temp_integer
   Zn_adc_long(10) = Zn_adc_long(10) + Temp_integer
   Waitus 300
   Waitms 30
 Next I2
'---перерасчет в мА/В
 For I = 1 To 10
  '---приведение к мА/В
  If Zn_adc_long(i) < 0 Then Zn_adc_long(i) = 0
  Zn_adc_single(i) = Zn_adc_long(i) / 30
  'канал а
  If I < 7 Then
      Zn_datch = Zn_adc_single(i) * Adca_koef
  End If
  'канал в
  If I > 6 Then
      Zn_datch = Zn_adc_single(i) * Adcb_koef
  End If
  Vdd = Round(zn_datch)
  Zn_datch = Vdd / 100
  Zn_adc_single(i) = Zn_datch
  Adc_str(i) = Fusing(zn_adc_single(i) , "#.##")
  Print #5 , Adc_str(i)
 Next I

 '---ОПРОС MLAN
 For Obr_datch = 0 To 7
  Epradres = Obr_datch * 16
  Epradres = Epradres + 3498                                'вычисление адреса ID датчика
  For I = 1 To 8                                            'считывание ID обрабатываемого датчика
   Call Read_eeprom(epradres , Tempbyte)
   Str2 = Chr(tempbyte)
   Incr Epradres

   If Tempbyte = 0 Then
    Print #5 , "N/A"
    Goto Kon_opros
   End If

   If Tempbyte > 90 Or Tempbyte < 47 Then
    Print #5 , "N/A"
    Goto Kon_opros
   End If
   Call Read_eeprom(epradres , Tempbyte)
   Str2 = Str2 + Chr(tempbyte)
   Incr Epradres

   If Tempbyte > 90 Or Tempbyte < 47 Then
    Print #5 , "N/A"
    Goto Kon_opros
   End If

   If Str2 = "" Then
    Id_datch(i) = 0
   Else
    Id_datch(i) = Hexval(str2)
   End If
  Next I

  Select Case Id_datch(1)                                   'проверка принадлежности датчика к используемым
   Case &H10 : Tip_datch = 0                                'температура
   Case &H28 : Tip_datch = 0                                'температура
   Case &H26 : Tip_datch = 11                               'температура
   Case &H27 : Tip_datch = 12                               'влага
               Id_datch(1) = &H26
   Case &H1D : Tip_datch = 21                               'первый канал
   Case &H1E : Tip_datch = 22                               'второй канал
               Id_datch(1) = &H1D
   Case Else : Print #5 , "N/A"
                Goto Kon_opros
  End Select

  If Id_datch(8) <> Crc8(id_datch(1) , 7) Then              'проверка контрольной суммы
   Print #5 , "N/A"
   Goto Kon_opros
  End If
   '---если датчик необнаружен
  1wreset
  1wverify Id_datch(1)                                      'проверка наличия датчика и его ID
   If Err = 1 Then
    Waitms 200
    1wreset
    1wverify Id_datch(1)
    If Err = 1 Then
     Print #5 , "N/A"
     Goto Kon_opros
    End If
   End If

  '----------------------ЕСЛИ ЕСТЬ ДАТЧИК
  Select Case Id_datch(1)
   Case &H10 : Call Temper()
    '---если получили неправильный результат
    If Zn_datch = 255 Then
     Waitms 100
     Call Temper()
    End If
    '---если получили неправильный результат
    If Zn_datch = 255 Then
     Waitms 100
     Call Temper()
    End If
   Case &H28 : Call Temper()
    '---если получили неправильный результат
    If Zn_datch = 255 Then
     Waitms 100
     Call Temper()
    End If
    '---если получили неправильный результат
    If Zn_datch = 255 Then
     Waitms 100
     Call Temper()
    End If
   Case &H26 : Call Vlaga()
   Case &H1D : Call Schit()
  End Select

  If Zn_datch = 255 Then
   If Id_datch(1) <> &H1D Then
    Print #5 , "N/A"
    Goto Kon_opros
   End If
  End If

  Print #5 , Zn_datch_str
  Kon_opros:
 Next Obr_datch
 'Системное время контроллера
 Call Getdatetime()
 Print #5 , Dat
 Print #5 , Chas
 Goto Pc
End If

'-----------------------------установка времени---------------------------------
If Otvet = "TIME" Then
 Cls
 Msg = "   Установка"
 Call R_lcd(msg)
 Locate 2 , 1
 Msg = " Даты и времени"
 Call R_lcd(msg)
 Print #5 , "TIME_OK"
 Vrem_otw = 1400000
 Vrem_otv_tel = 9
 'время
 Call Getline_usb(chas)

 If Len(chas) <> 8 Then
  Print #5 , "ERR"
  Goto Pc
 End If

 Vrem_otv_tel = 9
 'дата
 Call Getline_usb(dat)

 If Len(dat) <> 8 Then
  Print #5 , "ERR"
  Goto Pc
 End If

 '---время
 Str2 = Mid(chas , 7 , 2)
 T_sec = Val(str2)
 Str2 = Mid(chas , 4 , 2)
 T_min = Val(str2)
 Str2 = Mid(chas , 1 , 2)
 T_hour = Val(str2)
 Str2 = Mid(chas , 7 , 2)
 T_sec = Val(str2)
 '----дата
 Str2 = Mid(dat , 1 , 2)
 T_day = Val(str2)
 Str2 = Mid(dat , 4 , 2)
 T_month = Val(str2)
 Str2 = Mid(dat , 7 , 2)
 T_year = Val(str2)
 Call Setdate()
 Waitms 20
 Call Settime()
 Waitms 20
 Call Getdatetime()
 Print #5 , "DATE" ; Dat ; "*" ; Chas
 Wait 2
 Cls
 Msg = "  Дата " + Dat
 Call R_lcd(msg)
 Locate 2 , 1
 Msg = " Время " + Chas
 Call R_lcd(msg)
 Goto Pc
End If

'------------чтение конфигурации из контроллера---------------------------------
If Otvet = "LOAD" Then
 Cls
 Msg = "    RECON-SX"
 Call R_lcd(msg)
 Locate 2 , 1
 Msg = " Чтение EEPROM"
 Call R_lcd(msg)
 Vrem_otw = 600000
 Print #5 , "LOAD"
 Waitms 20
 For I = 0 To Razmeepr
  Call Read_eeprom(i , Tempbyte)
  Printbin #5 , Tempbyte;
 Next I
 Waitms 20
 Print #5 , "LOAD_OK"

 Cls
 Msg = "    RECON-SX"
 Call R_lcd(msg)
 Locate 2 , 1
 Msg = "   Выполнено    "
 Call R_lcd(msg)

 Goto Pc
End If

'------------запись конфигурации в контроллер-----------------------------------
If Otvet = "SAVE" Then
 Cls
 Msg = "    RECON-SX"
 Call R_lcd(msg)
 Locate 2 , 1
 Msg = "Запись в EEPROM"
 Call R_lcd(msg)
 Print #5 , "SAVE"
 Tempbyte1 = 0
 Vrem_otw = 1400000

 For I = 0 To Razmeepr
  Get_w = 0
  Get_dln = 1
  Do
   Incr Get_w
   If Get_w > Vrem_otw Then
     Goto Kon_save
   End If
   Get_byte = Ischarwaiting(#5)
   If Get_byte <> 0 Then
    Get_byte = Inkey(#5)
    Tempbyte = Get_byte
    Print #5 , "o";
    Call Write_eeprom(i , Tempbyte)
   Exit Do
   End If
  Loop
  If I <> Razmeepr Then
   Tempbyte1 = Tempbyte1 + Tempbyte
  End If
 Next I

 If Tempbyte1 = Tempbyte Then
  Print #5 , "SAVE_OK"
  Cls
  Msg = "    RECON-SX"
  Call R_lcd(msg)
  Locate 2 , 1
  Msg = "   Выполнено    "
  Call R_lcd(msg)
 Else
  Kon_save:
  Print #5 , "ERR2"
  Cls
  Msg = "    RECON-SX"
  Call R_lcd(msg)
  Locate 2 , 1
  Msg = " Ошибка записи  "
  Call R_lcd(msg)
 End If

 Goto Pc
End If
'------------управление реле
If Otvet = "RELE" Then
  Otvet = ""
  Vrem_otv_tel = 9
  Vrem_otw = 2000000
  Call Getline_usb(otvet)
  Cls
  Msg = "    RECON-SX"
  Call R_lcd(msg)
  Locate 2 , 1
  Msg = "Управление реле"
  Call R_lcd(msg)

  If Len(otvet) = 9 Then
   For I = 0 To 7
    I1 = I + 1
    If Mid(otvet , I1 , 1) = "0" Then
        Tempbyte.i = 0
    End If
    If Mid(otvet , I1 , 1) = "1" Then
        Tempbyte.i = 1
    End If
   Next I
   Rele = Tempbyte
   'реле питания модема
   If Mid(otvet , 9 , 1) = "1" Then
    Set Rele_modema
   Else
    Reset Rele_modema
   End If
  End If
  Goto Pc
End If

'------------Чтение параметров порта RS-485-----------------------------
If Otvet = "READ RS-485" Then
 Cls
 Msg = "Чтение настроек"
 Call R_lcd(msg)
 Locate 2 , 1
 Msg = " порта RS-232"
 Call R_lcd(msg)

 Tempbyte = Baud_rate_rs232_eram
 Str_max_por = Str(tempbyte)
 Tempbyte = Data_bits_rs232_eram
 Str_max_por = Str_max_por + Str(tempbyte)
 Tempbyte = Parity_rs232_eram
 Str_max_por = Str_max_por + Str(tempbyte)
 Tempbyte = Stop_bits_rs232_eram
 Str_max_por = Str_max_por + Str(tempbyte)
 Print #5 , Str_max_por
 Goto Pc
End If

'------------Установка параметров порта RS-485-----------------------------
If Otvet = "SETUP RS-485" Then
 Vrem_otw = 400000
 Vrem_otv_tel = 4
 Call Getline_usb(otvet)
' otvet = "3000" 'для проверки кода, не забыть убрать в рабочей программе
 Cls
 Msg = "   Настройка "
 Call R_lcd(msg)
 Locate 2 , 1
 Msg = " порта RS-232"
 Call R_lcd(msg)
 '---проверка наличия всех данных
 I2 = Len(otvet)
 If I2 < 4 Then
  Print #5 , "ERROR"
  Wait 2
  Cls
  Msg = "  Ошибка "
  Call R_lcd(msg)
  Locate 2 , 1
  Msg = "установки данных"
  Call R_lcd(msg)
  Wait 2
  Goto Pc
 End If
 '---символы - скорость обмена, бит данных, проверка, стоп бит
 '---скорость обмена
 Tempstr1 = Mid(otvet , 1 , 1)
 Select Case Tempstr1

  Case "0" : Config Com2 = 1200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
              Baud_rate_rs232_eram = 0
  Case "1" : Config Com2 = 2400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
              Baud_rate_rs232_eram = 1
  Case "2" : Config Com2 = 4800 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
              Baud_rate_rs232_eram = 2
  Case "3" : Config Com2 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
              Baud_rate_rs232_eram = 3
  Case "4" : Config Com2 = 14400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
              Baud_rate_rs232_eram = 4
  Case "5" : Config Com2 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
              Baud_rate_rs232_eram = 5
  Case "6" : Config Com2 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
              Baud_rate_rs232_eram = 6
  Case "7" : Config Com2 = 56000 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
              Baud_rate_rs232_eram = 7
  Case "8" : Config Com2 = 57600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
              Baud_rate_rs232_eram = 8
  Case "9" : Config Com2 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
              Baud_rate_rs232_eram = 9
 End Select
 '---количество бит данных
 Tempstr1 = Mid(otvet , 2 , 1)
 Select Case Tempstr1
  Case "0" : Data_bits_rs232_eram = 0
             Reset Usartc1_ctrlc.0
             Reset Usartc1_ctrlc.1
  Case "1" : Data_bits_rs232_eram = 1
             Set Usartc1_ctrlc.0
             Reset Usartc1_ctrlc.1
  Case "2" : Data_bits_rs232_eram = 2
             Reset Usartc1_ctrlc.0
             Set Usartc1_ctrlc.1
  Case "3" : Data_bits_rs232_eram = 3
             Set Usartc1_ctrlc.0
             Set Usartc1_ctrlc.1
 End Select
 '---бит паритета
 Tempstr1 = Mid(otvet , 3 , 1)
 Select Case Tempstr1
  Case "0" : Parity_rs232_eram = 0                          'none
             Reset Usartc1_ctrlc.4
             Reset Usartc1_ctrlc.5
  Case "1" : Parity_rs232_eram = 1                          'odd
             Set Usartc1_ctrlc.4
             Set Usartc1_ctrlc.5
  Case "2" : Data_bits_rs232_eram = 2                       'even
             Reset Usartc1_ctrlc.4
             Set Usartc1_ctrlc.5
 End Select
 '---кол-во стоп битов
 Tempstr1 = Mid(otvet , 4 , 1)
 Select Case Tempstr1
  Case "0" : Stop_bits_rs232_eram = 0
             Reset Usartc1_ctrlc.3
  Case "1" : Stop_bits_rs232_eram = 1
             Set Usartc1_ctrlc.3
 End Select
 Arhiv(1) = Baud_rate_rs232_eram
 Arhiv(2) = Data_bits_rs232_eram
 Arhiv(3) = Parity_rs232_eram
 Arhiv(4) = Stop_bits_rs232_eram
 J = Crc16uni(arhiv(1) , 4 , &HFFFF , &H8005 , 1 , 1)
 Crc_eram = J
 Print #5 , "OK"
 Goto Pc
End If

'------------Вывод данных в RS-485-----------------------------
If Otvet = "SEND RS-485" Then
 '----принимаем данные для посылки в RS-232
 Vrem_otw = 400000
 Vrem_otv_tel = 60
 Call Getline_usb(otvet)

 Cls
 Msg = "Обмен по RS-232 "
 Call R_lcd(msg)

 I2 = Len(otvet)
 Tempstr1 = Mid(otvet , I2 , 1)
 Decr I2
 Otvet = Mid(otvet , 1 , I2)
 I2 = I2 / 2
 '---подготовка массива к передаче
 For I = 1 To I2
  Tempbyte = I * 2
  Tempbyte = Tempbyte - 1
  Str2 = Mid(otvet , Tempbyte , 2)
  Arhiv(i) = Hexval(str2)
 Next I
 '---если нужно добавить CRC16
 If Tempstr1 = "1" Then
  J = Crc16uni(arhiv(1) , I2 , &HFFFF , &H8005 , 1 , 1)
  Incr I2
  Arhiv(i2) = Low(j)
  Otvet = Otvet + Hex(arhiv(i2))
  Incr I2
  Arhiv(i2) = High(j)
  Otvet = Otvet + Hex(arhiv(i2))
 End If
'---передаем обратно строку из байтов в HEX через пробел
 Buf = ""
 For I = 1 To I2
  Str2 = Hex(arhiv(i))
  Buf = Buf + Str2
  Buf = Buf + " "
 Next I
 Print #5 , Buf
 '---передача в RS-232
 For I = 1 To I2
  Tempbyte = Arhiv(i)
  Printbin #2 , Tempbyte;
 Next I
 '---прием из канала RS-232
 Get_w_r = 0
 Get_dln_r = 0
 Do
  Incr Get_w_r
  If Get_w_r > 600000 Then
   Exit Do
  End If
  If Usartd0_status.7 = 1 Then
   Get_byte_r = Usartd0_data
   Incr Get_dln_r
   Buf_in_485_r(get_dln_r) = Get_byte_r
   If Get_dln_r > 253 Then
     Exit Do
   End If
  End If
 Loop
 '---преобразование в HEX строку
 Buf = ""
 Locate 2 , 1
 Msg = "отпр." + Str(i2)
 Msg = Msg + " прин."
 Msg = Msg + Str(get_dln_r)
 Call R_lcd(msg)
 '---если ничего не пришло
 If Get_dln_r = 0 Then
  Buf = "N/A"
  Print #5 , Buf
  Goto No_485
 End If

 For I = 1 To Get_dln_r
  Buf = Buf + Hex(buf_in_485_r(i))
  Buf = Buf + " "
 Next I
 Print #5 , Buf
 No_485:
 Goto Pc
End If

'------------Конец обмена----------------------------------
If Otvet = "BYE" Then
 Goto Poisk
End If
'------------Ошибка обмена----------------------------------

Print "ERR"
Goto Pc
'##########################Поиск телефона#############################
Poisk_tel:

Reset Bez_modema

Print #1 , "AT+IPR=9600 "
Otvet = ""
Golova = 0
Kol_sob = 0
Pred_vhod = 0
Tek_vhod = 0
Pred_pitanie = 0
Obr_datch = 0
Pervii_raz = 1
Sost_datch = "НННННННН"
Sost_adc = "НННННННН"
Sost_vihod = "РРРРРРРР"
Dlina_parola = 0
Wait 1
Print #1 , "ATE0"
Wait 2

Cls
Cursor Off
Msg = "    RECON-SX"
Call R_lcd(msg)
Locate 2 , 1
Msg = "  Поиск модема"
Call R_lcd(msg)
Wait 2

J = 0
Nachprog:                                                   'начало программы
Print #1 , "ATI"
Vrem_otw = 100000                                           'определяет время опроса
Tempbyte = 0

Do

 Vrem_otv_tel = 40
 Otvet = ""
 Call Getline_rs232(otvet)

 '---нашелся модем
 If Mid(otvet , 1 , 2) = "OK" Then
  Kontr_tel = 1
  Otvet = ""
  Reset Bez_modema
  Cls
  Cursor Off
  Msg = "    Обнаружен   "
  Call R_lcd(msg)
  Locate 2 , 1
  Msg = "      Модем     "
  Call R_lcd(msg)
  Wait 1
  Goto Telefon
 End If

 Incr Tempbyte

 If Tempbyte > 7 Then
   Incr J
   '-включаем автономный режим
   If J > 3 Then
    Incr J2
    If J2 > 2 Then
     Kontr_tel = 0
     Set Bez_modema
     Cls
     Cursor Off
     Msg = "     Модем  "
     Call R_lcd(msg)
     Locate 2 , 1
     Msg = "  Не обнаружен  "
     Call R_lcd(msg)
     Wait 2
     Cls
     Cursor Off
     Msg = "   Автономный "
     Call R_lcd(msg)
     Locate 2 , 1
     Msg = "     Режим   "
     Call R_lcd(msg)
     Wait 2
     Goto Telefon
    End If

    J = 0
 '---перезагружаем модем вдруг он завис
    Cls
    Cursor Off
    Msg = "  Перезагрузка "
    Call R_lcd(msg)
    Locate 2 , 1
    Msg = "     Модема   "
    Call R_lcd(msg)
    Set Rele_modema                                         'выключаем реле питания модема
    Wait 2
    Reset Rele_modema                                       'включаем реле питания модема
    Wait 10
    Goto Poisk_tel
   End If
   Goto Nachprog
 End If
Loop

'##########################РЕЖИМ РАБОТЫ С МОДЕМОМ###############################
Telefon:
Cls
Cursor Off
Msg = "    Проверка   "
Call R_lcd(msg)
Locate 2 , 1
Msg = "Алгоритма работы"
Call R_lcd(msg)
'---проверка епром
Tempbyte1 = 0
For I = 0 To Razmeepr
 Call Read_eeprom(i , Tempbyte)
 If I <> Razmeepr Then
  Tempbyte1 = Tempbyte1 + Tempbyte
 End If
Next I

Vrem_otw = 300000
If Tempbyte1 <> Tempbyte Then
 Tempbyte1 = 0
 For I = 0 To Razmeepr
  Call Read_eeprom(i , Tempbyte)
  If I <> Razmeepr Then
   Tempbyte1 = Tempbyte1 + Tempbyte
  End If
 Next I

 Obr_datch = 0
 If Tempbyte1 <> Tempbyte Then
  Do
   Cls
   Set Zummer
   Set Diod_3
   Waitms 100
   Reset Diod_3
   Waitms 100
   Set Diod_3
   Waitms 100
   Reset Diod_3
   Waitms 100
   Set Diod_3
   Waitms 100
   Reset Diod_3
   Waitms 100
   Reset Zummer
   Msg = " Алгоритм работы"
   Call R_lcd(msg)
   Locate 2 , 1
   Msg = "  Отсутствует  "
   Call R_lcd(msg)
   Wait 4
   Cls
   Waitms 200
   Msg = "    Задайте     "
   Call R_lcd(msg)
   Locate 2 , 1
   Msg = " Алгоритм работы"
   Call R_lcd(msg)
   Wait 1

   '---перезагрузка
   Incr Obr_datch
   If Obr_datch > 20 Then
    Obr_datch = 0
    Start Watchdog
    Enable Interrupts                                       'все прерывания
   End If
  Loop
 End If
End If
Cls
Waitms 200
Msg = " Алгоритм работы"
Call R_lcd(msg)
Locate 2 , 1
Msg = "       ОК"
Call R_lcd(msg)
Reset Diod_tm

'--------------------------Считывание настроек алгоритма
'----сколько раз отсылать смс
Call Read_eeprom(3660 , Kol_nepr_sms)
If Kol_nepr_sms = 0 Then
 Epr_nepr_sms = 5
Else
 Epr_nepr_sms = Kol_nepr_sms
End If

'---первый телефон - диспетчерский центр
For I = 1 To 9
 Sender = ""
 Adr_telef = 3833
 For I2 = 0 To 15
  Call Read_eeprom(adr_telef , Tempbyte)
  If Tempbyte = 0 Then                                      'если нет телефона
    Exit For
  End If
  Sender = Sender + Chr(tempbyte)
  Incr Adr_telef
 Next I2
Next
If Len(sender) = 0 Then
 Disp_epr = ""
Else
 Disp_epr = Sender
End If

'---мастер ключ
Tim_epradres = 3642
For Tim_i = 1 To 8                                          'считывание ID мастер ключа
 Str2 = ""
 For Tim_i1 = 1 To 2
  Call Read_eeprom(tim_epradres , Tim_byte)
  Str2 = Str2 + Chr(tim_byte)
  Incr Tim_epradres
 Next Tim_i1
 Tempbyte = Hexval(str2)
 Epr_master_kl(tim_i) = Tempbyte
Next Tim_i

'---сколько статусов отправлять
Call Read_eeprom(3663 , Kol_stat)

'---начальные значения датчиков и ацп
For Obr_datch = 1 To 8
 Mlan_str(obr_datch) = "0"
 Zn_dat_mlan(i) = "0"
 Adc_str(obr_datch) = "0.0"
 Zn_dat_adc_string(obr_datch) = "0.0"
Next Obr_datch

'---пороги для датчиков микролана
For Obr_datch = 0 To 7
 Tempbyte1 = Obr_datch + 1
 Str_min_por_eram(tempbyte1) = ""
 Str_max_por_eram(tempbyte1) = ""
 Str_max_por = ""
 Str_min_por = ""
 Epradres = Obr_datch * 8
 Epradres = Epradres + 3332
 For I = 0 To 3                                             'считывание максимального порога
   Call Read_eeprom(epradres , Tempbyte)
   Str_max_por = Str_max_por + Chr(tempbyte)
   Incr Epradres
 Next I
 For I = 0 To 3                                             'считывание минимального порога
   Call Read_eeprom(epradres , Tempbyte)
   Str_min_por = Str_min_por + Chr(tempbyte)
   Incr Epradres
 Next I
 Tempbyte1 = Obr_datch + 1
 Str_max_por_eram(tempbyte1) = Str_max_por
 Str_min_por_eram(tempbyte1) = Str_min_por
Next Obr_datch

'---для АЦП
For Obr_datch = 0 To 7
 Tempbyte1 = Obr_datch + 1
 Epradres = Obr_datch * 8
 Epradres = Epradres + 3396
'считывание максимального порога
 For I = 0 To 3
  Call Read_eeprom(epradres , Tempbyte)
  For Tim_i = 0 To 7
   Tim_i1 = I * 8
   Tim_i1 = Tim_i1 + Tim_i
   Max_por_dat(tempbyte1).tim_i1 = Tempbyte.tim_i
  Next Tim_i
  Incr Epradres
 Next I
'считывание минимального порога
 For I = 0 To 3
   Call Read_eeprom(epradres , Tempbyte)
   For Tim_i = 0 To 7
    Tim_i1 = I * 8
    Tim_i1 = Tim_i1 + Tim_i
    Min_por_dat(tempbyte1).tim_i1 = Tempbyte.tim_i
   Next Tim_i
   Incr Epradres
 Next I
Next Obr_datch

For I = 1 To 8
 Flag(i) = 0
Next I

'----настройки АЦП
J2 = 3866
For I = 1 To 10
 'диапазон сигнала и его мин. значение
 Call Read_eeprom(j2 , Min_adc(i))
 Incr J2
 Call Read_eeprom(j2 , Tempbyte)
 Incr J2
 Diap_adc(i) = Tempbyte - Min_adc(i)
 'диапазон датчика и его мин. значение
 Call Read_eeprom(j2 , Tempbyte)
 Incr J2
 Call Read_eeprom(j2 , Tempbyte1)
 Incr J2
 Min_dat(i) = Makeint(tempbyte1 , Tempbyte)
 Call Read_eeprom(j2 , Tempbyte)
 Incr J2
 Call Read_eeprom(j2 , Tempbyte1)
 Vrem_otv_tel = Makeint(tempbyte1 , Tempbyte)
 Diap_dat(i) = Vrem_otv_tel - Min_dat(i)
 'коэффициент (чему равен 1мА/В)
 Koef_adc(i) = Diap_dat(i) / Diap_adc(i)
 '---сохраняем во внутренний епром
 Min_adc_eram(i) = Min_adc(i)
 Diap_adc_eram(i) = Diap_adc(i)
 Diap_dat_eram(i) = Diap_dat(i)
 Koef_adc_eram(i) = Koef_adc(i)
 J2 = J2 + 11
Next I

'----Еденицы измерения датчика АЦП
J2 = 3871
For I = 1 To 10
 Ed_izm_dat(i) = ""
 For J = 1 To 10
  Incr J2
  Call Read_eeprom(j2 , Tempbyte)
  If Tempbyte > 0 Then
   Ed_izm_dat(i) = Ed_izm_dat(i) + Chr(tempbyte)
  End If
 Next J
 J2 = J2 + 6
Next I

'----время накопления сигнала для сработки контактного входа
For I = 1 To 8
  Tim_epradres = I + 4025
  Call Read_eeprom(tim_epradres , Tempbyte )
  J = Tempbyte * 2
  Vrem_nakopl(i) = J
  Tek_vrem_nakopl(i) = 0
Next I

'----задержки реакции на контактных входах
For I = 1 To 8
  Tim_epradres = I + 3663
  Call Read_eeprom(tim_epradres , Tempbyte )
  J = Tempbyte * 2
  Vrem_zad(i) = J
Next I

'----задержки после реакции на контактных входах
For I = 1 To 8
  Tim_epradres = I + 3680
  Call Read_eeprom(tim_epradres , Tempbyte)
  J = Tempbyte * 2
  Vrem_zad_posle(i) = J
Next I

'----задержки реакции на аналоговых входах
For I = 1 To 8
  Tim_epradres = I + 3671
  Call Read_eeprom(tim_epradres , Tempbyte)
  J = Tempbyte * 2
  Vrem_zad_adc(i) = J
Next I

'----задержки после реакции на аналоговых входах
For I = 1 To 8
  Tim_epradres = I + 3688
  Call Read_eeprom(tim_epradres , Tempbyte)
  J = Tempbyte * 2
  Vrem_zad_adc_posle(i) = J
Next I

'--считываем время задержки на постановку на охрану
Call Read_eeprom(3680 , Tempbyte)
Vrem_zad_tm = Tempbyte * 2

'---ID объекта
Id_obekta = ""
For Epradres = 3697 To 3704
 Call Read_eeprom(epradres , Tempbyte)
 If Tempbyte <> 0 Then
  Id_obekta = Id_obekta + Chr(tempbyte)
 Else
  Exit For
 End If
Next Epradres

'--------------------------------
'считывание пароля доступа к контроллеру
Parol = ""
Epradres = 3490
For I = 0 To 7
 Call Read_eeprom(epradres , Tempbyte)
 If Tempbyte = 0 Then
   Exit For
 End If
 Parol = Parol + Chr(tempbyte)
 Incr Dlina_parola
 Incr Epradres
Next I
Epr_parol = Parol
'--------------------------------
'записываем смс центр
Smsc = ""
For I = 0 To 15
 Epradres = 3849 + I
 Call Read_eeprom(epradres , Tempbyte)
 If Tempbyte = 0 Then
    Exit For
 End If
 Smsc = Smsc + Chr(tempbyte)
Next I
Epr_smsc = Smsc
'--------------------------------
'охрана
Call Read_eeprom(3661 , Est_ohrana)
'--------------------------------
'---маска снятия с охраны контактных входов
Call Read_eeprom(3658 , Maska_vhod)
Epr_maska_vhod = Maska_vhod
'--------------------------------
'---маска снятия с охраны аналоговых входов
Call Read_eeprom(3659 , Maska_vhod_adc)
Epr_maska_vhod_adc = Maska_vhod_adc
'--------------------------------
'---разрешение соединения по каналу CSD
Call Read_eeprom(3865 , Razr_csd)
'--------------------------------
'---период создания архивов и (ДА/НЕТ)
Call Read_eeprom(3641 , Tempbyte)
If Tempbyte > 0 Then
 Period_stat = Tempbyte * 120
 '---учитываем задержку на пол секунды
 Period_stat = Period_stat - 1
End If
'--------------------------------
'---голова архива и количество имеющихся в памяти архивов
Call Read_eeprom(9997 , Arhiv(1))
Call Read_eeprom(9998 , Arhiv(2))
Call Read_eeprom(9999 , Arhiv(3))
Call Read_eeprom(10000 , Arhiv(4))
J = Crc16uni(arhiv(1) , 2 , &HFFFF , &H8005 , 1 , 1)
J2 = Makeint(arhiv(4) , Arhiv(3))
If J <> J2 Then
 Golova_arhiv = 1
 Kol_arhiv = 0
Else
 Golova_arhiv = Arhiv(1)
 Kol_arhiv = Arhiv(2)
End If
If Golova_arhiv > 60 Or Golova_arhiv = 0 Then
 Golova_arhiv = 1
 Kol_arhiv = 0
End If
If Kol_arhiv > 60 Then
 Golova_arhiv = 1
 Kol_arhiv = 0
End If

'##############################настройки GPRS
'------------------------------
'пользователь
User = ""
For I = 0 To 15
 Epradres = 4300 + I
 Call Read_eeprom(epradres , Tempbyte)
 If Tempbyte = 0 Then
    Exit For
 End If
 User = User + Chr(tempbyte)
Next I
'------------------------------
'пароль
Password = ""
For I = 0 To 15
 Epradres = 4316 + I
 Call Read_eeprom(epradres , Tempbyte)
 If Tempbyte = 0 Then
    Exit For
 End If
 Password = Password + Chr(tempbyte)
Next I
'------------------------------
'точка доступа
Apn = ""
For I = 0 To 31
 Epradres = 4332 + I
 Call Read_eeprom(epradres , Tempbyte)
 If Tempbyte = 0 Then
    Exit For
 End If
 Apn = Apn + Chr(tempbyte)
Next I
'------------------------------
'Ip адрес 1
Ip_adr1 = ""
For I = 0 To 14
 Epradres = 4414 + I
 Call Read_eeprom(epradres , Tempbyte)
 If Tempbyte = 0 Then
    Exit For
 End If
 If Tempbyte <> 32 Then
   Ip_adr1 = Ip_adr1 + Chr(tempbyte)
 End If
Next I
'------------------------------
'Ip адрес 2
Ip_adr2 = ""
For I = 0 To 14
 Epradres = 4429 + I
 Call Read_eeprom(epradres , Tempbyte)
 If Tempbyte = 0 Then
    Exit For
 End If
 If Tempbyte <> 32 Then
   Ip_adr2 = Ip_adr2 + Chr(tempbyte)
 End If
Next I
'------------------------------
'Порт1
Ip_port1 = ""
For I = 0 To 4
 Epradres = 4494 + I
 Call Read_eeprom(epradres , Tempbyte)
 If Tempbyte = 0 Then
    Exit For
 End If
 Ip_port1 = Ip_port1 + Chr(tempbyte)
Next I
'------------------------------
'Порт2
Ip_port2 = ""
For I = 0 To 4
 Epradres = 4499 + I
 Call Read_eeprom(epradres , Tempbyte)
 If Tempbyte = 0 Then
    Exit For
 End If
 Ip_port2 = Ip_port2 + Chr(tempbyte)
Next I
'------------------------------
'минимальный уровень сигнала
Call Read_eeprom(4556 , Tempbyte)
Call Read_eeprom(4557 , Tempbyte1)
Min_signal = Makeint(tempbyte1 , Tempbyte)
'------------------------------
'Ping_ip адрес 1
Ping_ip_adr1 = ""
For I = 0 To 14
 Epradres = 4558 + I
 Call Read_eeprom(epradres , Tempbyte)
 If Tempbyte = 0 Then
    Exit For
 End If
 If Tempbyte <> 32 Then
   Ping_ip_adr1 = Ping_ip_adr1 + Chr(tempbyte)
 End If
Next I
'------------------------------
'Ping_ip адрес 2
Ping_ip_adr2 = ""
For I = 0 To 14
 Epradres = 4573 + I
 Call Read_eeprom(epradres , Tempbyte)
 If Tempbyte = 0 Then
    Exit For
 End If
 If Tempbyte <> 32 Then
   Ping_ip_adr2 = Ping_ip_adr2 + Chr(tempbyte)
 End If
Next I
'------------------------------
'Таймаут
Call Read_eeprom(4588 , Timeout)
'------------------------------
'Длительность GPRS сессии
Call Read_eeprom(4589 , Tempbyte)
Call Read_eeprom(4590 , Tempbyte1)
Session_gprs = Makeint(tempbyte1 , Tempbyte)
'------------------------------
'Конфигурация алгоритма GPRS
Call Read_eeprom(4591 , Konf_gprs)
'--------------------------------
Cls
Msg = "    RECON-SX"
Call R_lcd(msg)
Wait 1
Locate 2 , 1
Msg = " Штатный режим "
Call R_lcd(msg)
'--------------------------------


Kol_prer_tim3 = 1
Kol_nepr_sms = 0
Print "AT&D2"
Wait 1
Print "AT+CLIP=0"
Wait 1
Print "ATE0"
Wait 1
Print "AT+CPMS=" ; Chr(34) ; "ME" ; Chr(34)
Wait 1




End
'#################ОПРЕДЕЛЕНИЕ СОСТОЯНИЯ НА t ДАТЧИКАХ MLan######################
Sub Temper()
nop
End Sub
'#################ОПРЕДЕЛЕНИЕ СОСТОЯНИЯ НА ДАТЧИКАХ ВЛАГИ#######################
Sub Vlaga()
nop
End Sub
'#################ДАТЧИКИ ИМПУЛЬСОВ#############################################
Sub Schit()
nop
End Sub
'##########################ПРОЦЕДУРА ЗАПИСИ ЕЕПРОМА#############################
'writing a byte to EEPROM 24c256
Sub Write_eeprom(byval Adres As Word , Byval Value As Byte)

Hi = High(adres)
Lo = Low(adres)
    I2cstart #6                                             'start condition
    I2cwbyte Slave_w , #6                                   'slave address
    I2cwbyte Hi , #6                                        'high address of EEPROM
    I2cwbyte Lo , #6                                        'low address of EEPROM
    I2cwbyte Value , #6                                     'value to write
    I2cstop #6                                              'stop condition
    Waitms 5                                                'wait for 10 milliseconds
End Sub
'##########################ПРОЦЕДУРА ЧТЕНИЯ ЕЕПРОМА#############################
'reading a byte from EEPROM 24c256
Sub Read_eeprom(byval Adres As Word , Value As Byte)
Hi = High(adres)
Lo = Low(adres)
    I2cstart #6                                             'generate start
    I2cwbyte Slave_w , #6                                   'slave address
    I2cwbyte Hi , #6                                        'high address of EEPROM
    I2cwbyte Lo , #6                                        'low address of EEPROM
    I2cstop #6                                              ' Generate start code

    I2cstart #6 , #6                                        'repeated start
    I2cwbyte Slave_r , #6                                   'slave address (read)
    I2crbyte Value , Nack , #6                              'read byte
    I2cstop #6                                              'generate stop
End Sub

'#####################################ввод строки в порт RS-232#################
Sub Getline_rs232(s As String)
  Get_byte = Inkey(#1)
  Get_byte = Inkey(#1)
  S = ""
  Get_w = 0
  Get_dln = 1
  Do
    Incr Get_w

    If Get_w > Vrem_otw Then
      Exit Do
    End If

    Get_byte = Ischarwaiting(#1)
    If Get_byte <> 0 Then
     Get_byte = Inkey(#1)
     Select Case Get_byte
       Case 13 :                                            '<0D>
       Case 10 : Exit Do                                    '<0A>
       Case Else:
       Incr Get_dln
       S = S + Chr(get_byte)                                ' build string
       If Get_dln > Vrem_otv_tel Then
         Exit Do
       End If
     End Select
    End If
  Loop
End Sub
'#####################################ввод строки в USB порт####################
Sub Getline_usb(s As String)
  Get_byte = Inkey(#5)
  Get_byte = Inkey(#5)
  S = ""
  Get_w = 0
  Get_dln = 1
  Do
    Incr Get_w

    If Get_w > Vrem_otw Then
      Exit Do
    End If

    Get_byte = Ischarwaiting(#5)
    If Get_byte <> 0 Then
     Get_byte = Inkey(#5)
     Select Case Get_byte
       Case 13 :                                            '<0D>
       Case 10 : Exit Do                                    '<0A>
       Case Else:
       Incr Get_dln
       S = S + Chr(get_byte)                                ' build string
       If Get_dln > Vrem_otv_tel Then
         Exit Do
       End If
     End Select
    End If
  Loop
End Sub
'##############################замена стандартных часов№########################
Sub Getdatetime()
  I2cstart #6                                               ' Generate start code
  I2cwbyte Ds1307w , #6                                     ' send address
  I2cwbyte 0 , #6                                           ' start address in 1307
  I2cstop #6                                                ' Generate start code

  I2cstart #6                                               ' Generate start code
  I2cwbyte Ds1307r , #6                                     ' send address
  I2crbyte T_sec , Ack , #6
  I2crbyte T_min , Ack , #6                                 ' MINUTES
  I2crbyte T_hour , Ack , #6                                ' Hours
  I2crbyte T_weekday , Ack , #6                             ' Day of Week
  I2crbyte T_day , Ack , #6                                 ' Day of Month
  I2crbyte T_month , Ack , #6                               ' Month of Year
  I2crbyte T_year , Nack , #6
  I2cstop #6
  T_sec = Makedec(t_sec) : T_min = Makedec(t_min) : T_hour = Makedec(t_hour)
  T_day = Makedec(t_day) : T_month = Makedec(t_month) : T_year = Makedec(t_year)
 '---дата
  Dat = ""
  If T_day < 10 Then
   Dat = "0"
  End If
  Dat = Dat + Str(t_day)
  Dat = Dat + "-"
  If T_month < 10 Then
   Dat = Dat + "0"
  End If
  Dat = Dat + Str(t_month)
  Dat = Dat + "-"
  If T_year < 10 Then
   Dat = Dat + "0"
  End If
  Dat = Dat + Str(t_year)
 '---время
  Chas = ""
  If T_hour < 10 Then
   Chas = "0"
  End If
  Chas = Chas + Str(t_hour)
  Chas = Chas + ":"
  If T_min < 10 Then
   Chas = Chas + "0"
  End If
  Chas = Chas + Str(t_min)
  Chas = Chas + ":"
  If T_sec < 10 Then
   Chas = Chas + "0"
  End If
  Chas = Chas + Str(t_sec)

End Sub

Sub Setdate()
  T_day = Makebcd(t_day) : T_month = Makebcd(t_month) : T_year = Makebcd(t_year)
  I2cstart #6                                               ' Generate start code
  I2cwbyte Ds1307w , #6                                     ' send address
  I2cwbyte 4 , #6                                           ' starting address in 1307
  I2cwbyte T_day , #6                                       ' Send Data to SECONDS
  I2cwbyte T_month , #6                                     ' MINUTES
  I2cwbyte T_year , #6                                      ' Hours
  I2cwbyte &H10 , #6                                        ' Байт конфигурации
  I2cstop #6
End Sub

Sub Settime()
  T_sec = Makebcd(t_sec) : T_min = Makebcd(t_min) : T_hour = Makebcd(t_hour)
  I2cstart #6                                               ' Generate start code
  I2cwbyte Ds1307w , #6                                     ' send address
  I2cwbyte 0 , #6                                           ' starting address in 1307
  I2cwbyte T_sec , #6                                       ' Send Data to SECONDS
  I2cwbyte T_min , #6                                       ' MINUTES
  I2cwbyte T_hour , #6                                      ' Hours
  I2cstop #6
End Sub
'========= Русский текст на LCD ==============================================
Sub R_lcd(msg As String)
  For Cntr = 1 To Len(msg)
    Rus = Mid(msg , Cntr , 1)
    I_lcd = Asc(rus)
    If I_lcd > 191 Then
      I_lcd = I_lcd - 192
      I_lcd = Lookup(i_lcd , Tbl_lcd)
      Rus = Chr(i_lcd)
    End If
    Lcd Rus
  Next Cntr
End Sub
'*******************************************************************************
Koef:
Data 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 255
Koef2:
Data 255 , 128 , 64 , 32 , 16 , 8 , 4 , 2 , 1

Tbl_lcd:
Data &H41 , &HA0 , &H42 , &HA1 , &HE0 , &H45 , &HA3 , &HA4
Data &HA5 , &HA6 , &H4B , &HA7 , &H4D , &H48 , &H4F , &HA8
Data &H50 , &H43 , &H54 , &HA9 , &HAA , &H58 , &HE1 , &HAB
Data &HAC , &HE2 , &HAD , &HAE , &H62 , &HAF , &HB0 , &HB1
Data &H61 , &HB2 , &HB3 , &HB4 , &HE3 , &H65 , &HB6 , &HB7
Data &HB8 , &HB9 , &HBA , &HBB , &HBC , &HBD , &H6F , &HBE
Data &H70 , &H63 , &HBF , &H79 , &HE4 , &H78 , &HE5 , &HC0
Data &HC1 , &HE6 , &HC2 , &HC3 , &HC4 , &HC5 , &HC6 , &HC7

+1


Вы здесь » Программирование ATMEL в BASCOM. » Схемы » Контроллер на Xmega128A1