adray Опубликовано 20 мая, 2015 Поделиться Опубликовано 20 мая, 2015 Проблема состоит в том что не удается получить hex файл для програмирования микроконтроллеров pic18f452 и pic16f84. C файлы прелагаются. Программа блока контроля оси.txt Программа контроллера управления.txt 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
andryvlad Опубликовано 20 мая, 2015 Поделиться Опубликовано 20 мая, 2015 Подробнее можно, почему не удается? Компилятор выдает ошибки? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
adray Опубликовано 20 мая, 2015 Автор Поделиться Опубликовано 20 мая, 2015 (изменено) Подробнее можно, почему не удается? Компилятор выдает ошибки? Да компилятор выдает ошибки 0 1 mikroCPIC1618.exe -MSF -DBG -pP18F452 -LHF -DL -O11111114 -fo8 -N"C:\Users\Public\Documents\Mikroelektronika\mikroC PRO for PIC\Examples\MyProject.mcppi" -SP"C:\Users\Public\Documents\Mikroelektronika\mikroC PRO for PIC\defs\" -SP"C:\Users\Public\Documents\Mikroelektronika\mikroC PRO for PIC\uses\P18\" -SP"C:\Users\Public\Documents\Mikroelektronika\mikroC PRO for PIC\Examples\" "MyProject.c" "__Lib_Math.mcl" "__Lib_MathDouble.mcl" "__Lib_System.mcl" "__Lib_Delays.mcl" 0 1139 Available RAM: 1515 [bytes], Available ROM: 32768 [bytes] 0 122 Compilation Started __Lib_Delays.c 172 123 Compiled Successfully __Lib_Delays.c 0 122 Compilation Started MyProject.c 8 396 Invalid declarator expected'(' or identifier MyProject.c 12 393 'n' Identifier redefined MyProject.c 69 324 Undeclared identifier 'Soft_Uart_Write' in expression MyProject.c 78 324 Undeclared identifier 'Soft_Uart_Init' in expression MyProject.c 85 396 Invalid declarator expected'(' or identifier MyProject.c 85 324 Undeclared identifier 'Soft_Uart_Read' in expression MyProject.c 86 315 Invalid expression MyProject.c 86 406 ')' expected, but 'data' found MyProject.c 86 315 Invalid expression MyProject.c 86 402 ; expected, but ')' found MyProject.c 87 424 '}' expected ';' found MyProject.c 0 1163 Variable '' has been declared, but not used MyProject.c 91 424 '}' expected '}' found MyProject.c 95 424 '}' expected '}' found MyProject.c 96 424 '}' expected '}' found MyProject.c 101 424 '}' expected '}' found MyProject.c 105 312 Internal error '' MyProject.c 0 102 Finished (with errors): 20 май 2015, 17:03:02 MyProject.mcppi И для программы контроллера управления: 0 1 mikroCPIC1618.exe -MSF -DBG -pP18F452 -LHF -DL -O11111114 -fo8 -N"C:\Users\Ivan\Desktop\Ïðàêòèêà\ïóëüò\sdfsd.mcppi" -SP"C:\Users\Public\Documents\Mikroelektronika\mikroC PRO for PIC\defs\" -SP"C:\Users\Public\Documents\Mikroelektronika\mikroC PRO for PIC\uses\P18\" -SP"C:\Users\Ivan\Desktop\Ïðàêòèêà\ïóëüò\" "sdfsd.c" "__Lib_Math.mcl" "__Lib_MathDouble.mcl" "__Lib_System.mcl" "__Lib_Delays.mcl" "__Lib_CType.mcl" "__Lib_CString.mcl" "__Lib_CStdlib.mcl" "__Lib_CMath.mcl" "__Lib_MemManager.mcl" "__Lib_Conversions.mcl" "__Lib_Sprintf.mcl" "__Lib_PrintOut.mcl" "__Lib_Sprinti.mcl" "__Lib_Sprintl.mcl" "__Lib_Time.mcl" "__Lib_Trigonometry.mcl" "__Lib_Button.mcl" "__Lib_Keypad4x4.mcl" "__Lib_Manchester.mcl" "__Lib_OneWire.mcl" "__Lib_PS2.mcl" "__Lib_Sound.mcl" "__Lib_SoftI2C.mcl" "__Lib_SoftSPI.mcl" "__Lib_SoftUART.mcl" "__Lib_ADC_A_C.mcl" "__Lib_EEPROM_256.mcl" "__Lib_FLASH_w8_e64.mcl" "__Lib_I2C_c34.mcl" "__Lib_PWM_c21.mcl" "__Lib_SPI_c345.mcl" "__Lib_UART_c67.mcl" "__Lib_PortExpander.mcl" "__Lib_CANSPI.mcl" "__Lib_CF.mcl" "__Lib_CFFat16.mcl" "__Lib_GlcdFonts.mcl" "__Lib_Glcd.mcl" "__Lib_LcdConsts.mcl" "__Lib_Lcd.mcl" "__Lib_Mmc.mcl" "__Lib_MmcFat16.mcl" "__Lib_MmcFat16Constants.mcl" "__Lib_RS485.mcl" "__Lib_S1D13700.mcl" "__Lib_T6963C.mcl" "__Lib_SPIGlcd.mcl" "__Lib_SPILcd.mcl" "__Lib_SPILcd8.mcl" "__Lib_SPIT6963C.mcl" "__Lib_EthEnc28j60.mcl" "__Lib_TFT.mcl" "__Lib_TFT_Defs.mcl" "__Lib_TFT_16bit.mcl" "__Lib_TFT_16bit_Defs.mcl" "__Lib_TouchPanel_TFT.mcl" "__Lib_EthEnc24j600.mcl" "__Lib_TouchPanel.mcl" 0 1139 Available RAM: 1515 [bytes], Available ROM: 32768 [bytes] 0 122 Compilation Started sdfsd.c 4 396 Invalid declarator expected'(' or identifier sdfsd.c 261 324 Undeclared identifier 'Usart_Write' in expression sdfsd.c 267 324 Undeclared identifier 'Usart_Data_Ready' in expression sdfsd.c 267 309 Invalid statement sdfsd.c 268 324 Undeclared identifier 'Usart_Read' in expression sdfsd.c 297 324 Undeclared identifier 'Usart_Write' in expression sdfsd.c 303 324 Undeclared identifier 'Usart_Data_Ready' in expression sdfsd.c 303 309 Invalid statement sdfsd.c 304 324 Undeclared identifier 'Usart_Read' in expression sdfsd.c 347 324 Undeclared identifier 'Usart_Write' in expression sdfsd.c 353 324 Undeclared identifier 'Usart_Data_Ready' in expression sdfsd.c 353 309 Invalid statement sdfsd.c 354 324 Undeclared identifier 'Usart_Read' in expression sdfsd.c 383 324 Undeclared identifier 'Usart_Write' in expression sdfsd.c 389 324 Undeclared identifier 'Usart_Data_Ready' in expression sdfsd.c 389 309 Invalid statement sdfsd.c 390 324 Undeclared identifier 'Usart_Read' in expression sdfsd.c 440 312 Internal error '' sdfsd.c 0 102 Finished (with errors): 20 ìàé 2015, 17:05:45 sdfsd.mcppi Изменено 20 мая, 2015 пользователем adray 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Особенности хранения литиевых аккумуляторов и батареекПотеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
shindbad Опубликовано 21 мая, 2015 Поделиться Опубликовано 21 мая, 2015 (изменено) Первое, что очевидно, нет ни одного include, как компилятор узнает, что такое "PORTB", например? Ни одного прототипа функций тоже не видно, о чём компилятор Вам чёрным-по белому говорит. Сначала Вам следует посмотреть примеры от самой MikroC и переписать код под этот компилятор. Порты, SFR в разных компиляторах описываются и применяются по-другому, помнится. Да и Кернигана с Ричи стОит почитать. Изменено 21 мая, 2015 пользователем shindbad 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
100482 Опубликовано 21 мая, 2015 Поделиться Опубликовано 21 мая, 2015 Что бы что-то сказать по вашей проблеме, нужно выложить весь проект на микроси. А файлы тем более текстовые сами по себе не компилируются. Сам я только учусь, но кое что из готовых проектов получается переделать на микроси под свой микроконтроллер. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
adray Опубликовано 21 мая, 2015 Автор Поделиться Опубликовано 21 мая, 2015 Что бы что-то сказать по вашей проблеме, нужно выложить весь проект на микроси. А файлы тем более текстовые сами по себе не компилируются. Сам я только учусь, но кое что из готовых проектов получается переделать на микроси под свой микроконтроллер. Просто я не могу найти толкового описания как это сделать я понимаю что не хватает библиотек и все такое но не понимаю как это все привязать к своему микроконтроллеру да еще и с библиотеками. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
shindbad Опубликовано 21 мая, 2015 Поделиться Опубликовано 21 мая, 2015 (изменено) ...Просто я не могу найти толкового описания как это сделать... Не не можете найти, а не хотите, информации по MikroC - море. Что мануала с компилятором нет? я понимаю что не хватает библиотек и все такое но не понимаю как это все привязать к своему микроконтроллеру да еще и с библиотеками. Я выше уже сказал, что Вам в первую очередь надо почитать и на базовые ошибки внимание обратил. Си - это не Бейсик, придётся поработать, тогда и понимание придёт. P.S. А вообще, IMHO, MikroC для PIC - самый неудачный выбор для начинающего, а-ля ардуино. Или это курсовик? Изменено 21 мая, 2015 пользователем shindbad 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
100482 Опубликовано 22 мая, 2015 Поделиться Опубликовано 22 мая, 2015 (изменено) А вообще, IMHO, MikroC для PIC - самый неудачный выбор для начинающего Почему? Сам я с нуля начал имено с микроси. Взял пример отсюда http://embedded-lab.com/blog/?p=396 , создал проект в микроси, откомпилировал, получил hex файл, в PROTEUS создал проект по схеме, проверил работоспособность, спаял макет. И-и-и-и схемка заработала . Позже доработал програмку и сделал вольт-амперметр с выводом на LCD. Вот А вообще создать проект достаточно просто. Нажимай на верхнем ряду надпись Proyect и дальше New proyect и далее по порядку. В принципе сложного ничего нет. Если плохо с Ангельским языком гугл переводчик и гугл поиск в помощь. Да еще есть хелп на русском. Файл не удается загрузить. Изменено 22 мая, 2015 пользователем 100482 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
shindbad Опубликовано 23 мая, 2015 Поделиться Опубликовано 23 мая, 2015 (изменено) А вообще, IMHO, MikroC для PIC - самый неудачный выбор для начинающего Почему?... Потому, что никому не известно, как написана функция, ADC_Read, например, или Lcd_Init. MikroC - это вообще не компилятор с Си, это - что-то вроде Arduino. Куча библиотек, неизвестно какими индусо-китайцами писаными, но однозначно развращающими начинающих. Много Вы узнали о работе с Lcd "откомпилировав" код от MikroC? Хрена-ли там не откомпилировать? 20 строк? Изменено 23 мая, 2015 пользователем shindbad 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
100482 Опубликовано 26 мая, 2015 Поделиться Опубликовано 26 мая, 2015 (изменено) Начинающему в принципе до лампочки кем и как написана функция. Ему важно чтобы конкретная програмка пусть и в 20 строк реально заработала и что бы начать разбираться в этих строках и менять их по необходимости. И решить надо ему это программирование или забросить куда нибудь ее вместе со всей электроникой. Сам я, повторюсь, начал изучать с нуля (рядом нет советчиков, когда учился был язык АП а когда заканчивал бейсик), я не работаю и уже не буду работать програмистом. Попробовал разные компиляторы и нашел микроси с примерами простых, рабочих програмок. Спорить больше не буду, каждый решает сам. ps. Ну как знаток помоги человеку. Изменено 26 мая, 2015 пользователем 100482 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
shindbad Опубликовано 26 мая, 2015 Поделиться Опубликовано 26 мая, 2015 (изменено) Начинающему в принципе до лампочки кем и как написана функция... С MikroC этот начинающий так и останется начинающим. Научиться программированию можно лишь изучая качественные исходные тексты и документацию. ...ps. Ну как знаток помоги человеку. А чем помочь-то? Я ТС ответил, откуда берутся ошибки. Достаточно просто перевести сообщение с английского на русский и почитать, как уже говорил, Кернигана и Ричи. Изменено 26 мая, 2015 пользователем shindbad -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Ratamahatta Опубликовано 27 августа, 2016 Поделиться Опубликовано 27 августа, 2016 Здравствуйте! Помогите, пожалуйста с MikroC (работаю в версии 6.6.3 не зарегистрирована). Изучаю СИ через pic16f628a (был опыт общения с асмом на авр). Не могу понять, почему компилятор ругается на функции (вылазят сообщения типа Undeclared identifier '' in expression). ButtonForMultiCooker.rar 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
VladimirVU Опубликовано 27 августа, 2016 Поделиться Опубликовано 27 августа, 2016 adray это вы от куда взяли? /* Программа ведущего контроллера поворотного устройства */ unsigned short data, *rec; char Highbyteangle; //старший байт для приёма пакета энкодера char Lowbyteangle; //Младший байт для приёма пакета энкодера char Highbyteangle2; //старший байт для приёма пакета энкодера char Lowbyteangle2; //Младший байт для приёма пакета энкодера char Last_Highbyteangle; char Last_Lowbyteangle; char Last_Highbyteangle2; char Last_Lowbyteangle2; int angle; //буфер формирования угла long angle1; // рассчитанное значение угла для вывода int angle_up; long angle_up1; long realangle; // рассчитанное значение реального угла long realangle_up; long zeropoint; // угол принятый за 000 long zeropoint_up; long incpoint; // значение угла для нулевой точки энкодера азимута long incpoint2; // значение угла для нулевой очки энкодера элевации long lastangle; // угол последней стоянки int lowpacket; //промежуточные значения int hipacket; // пактов чтения энкодеров int lowpacket2; // элевации int hipacket2; // и азимута long tlong; long tlong1; char ch; char ch1; char mark_CW; //маркеры перекрута поворотки char mark_CCW; int i; //счётчик int sr; //счётчик char ds; //счётчик char dw; //счётчик char marker1 = 0x11;//маркер-запрос старшего байта азимута char marker2 = 0x17;//маркер-запрос младшего байта азимута char marker3 = 0x41; //маркер-запрос старшего байта элевации char marker4 = 0x47; //маркер-запрос старшего байта элевации char *text; char movestat; //переменная статуса движения поворотки по азимуту char elevastat; //переменная статуса движения поворотки по элевации char moderotate; //переменная - указатель режима управления вращением unsigned char firstbyte; //флаг приёма первого байта пакета из компьютера char buffer1 [8]; // массив приёма пакета из ПК в режиме ведения int hundr_AZ; //Сотни угла азимута из ПК int tens_AZ; //Десятки угла азимута из ПК int onces_AZ; //Еденицы угла азимута из ПК long angle_AZ_PC;//Угол азимута принятый из ПК int hundr_AZ_rot;//Сотни угла азимута из ротатора int tens_AZ_rot;//Десятки угла азимута из ротатора int onces_AZ_rot;//Еденицы угла азимута из ротатора long angle_AZ_ROT;//Угол азимута принятый из ротатора long last_angle_AZ_PC;//Запомненный угол азимута из ПК long diff_angle_AZ;//Разница углов азимута ПК и ПУ int hundr_EL; //Сотни угла элевации из ПК int tens_EL; //Десятки угла элевации из ПК int onces_EL; //Еденицы угла элевации из ПК long angle_EL_PC;//Угол элевации принятый из ПК int hundr_EL_rot;//Сотни угла элевации из ротатора int tens_EL_rot;//Десятки угла элевации из ротатора int onces_EL_rot;//Еденицы угла элевации из ротатора long angle_EL_ROT;//Угол элевации принятый из ротатора long last_angle_EL_PC;//Запомненный угол элевации из ПК long diff_angle_EL;//Разница углов элевации ПК и ПУ int move_AZ;//Флаг разрешения подстройки азимута ПУ от ПК int move_EL;//Флаг разрешения подстройки элевации ПУ от ПК int menu_view;//Определитель вывода меню int current_menu;//Определитель текущего меню настроек char grad = 0xDF;//значёк градуса char stat_azim;//статус связи с датчиком азимута char stat_elevat;//статус связи с датчиком энкодера long byte_save; //Байт сохранения во FLASH long byte_save1; long byte_save2; long byte_save3; long angOwerwindLeft;//Значение угла перекрута влево long angOwerwindRight;//Значение угла перекрута вправо long angMaxElevate;//Угол максимального подъёма элевации long angPulseZone;//угол Азимута при меньшем значении которого ПУ начинает подстройку угла толчками long angPulseZone_up;//угол Азимута при меньшем значении которого ПУ начинает подстройку угла толчками char setOverwind;//Флаг записи углов перекрута в EEPROM char setMaxElevate;//Флаг записи максимального ушла подъёма в EEPROM char setPulseZone;//Флаг записи угла азимута зоны толчкового режима char setPulseZone_up;//Флаг записи угла элевации зоны толчкового режима char set_inputOutside;//флаг записи порта связи с ПК char set_step_AZ; char set_step_EL; int steps_AZ; int steps_EL; int steps; char flagSetposition; char stat; char flagERR_AZ;//флаг ошибки связи char flagERR_EL;//флаг ошибки связи char counter_alarm; char flagSTOP; char setStartBit;//Бит обнуления угла принятого из ПК char work; //Флаг разрешения работы после включения char inputOutside;//Маркер входа для связи с ПК char markOutmodesAZ;//Маркеры осуществления вывода надписей в ручном режиме char markOutmodesEL; //------------------------------------------------------------------------------------------------------------------------------- void Words_status_AZ() { //Процедура формирования значения угла азимута и слова состояния hipacket = Highbyteangle; angle = hipacket << 2; //сдвигаем на 2 бита влево lowpacket = Lowbyteangle >> 6; //Сдвигаем на 6 бит вправо realangle = angle + lowpacket; //формируем 10-битное значение угла if (realangle >= zeropoint) { angle1 = realangle - zeropoint; } if (realangle < zeropoint) { incpoint = 1024 - zeropoint; angle1 = incpoint + realangle; } } //------------------------------------------------------------------------------------------------------------------------------- void Words_status_EL() { //Процедура формирования значения угла элевации и слова состояния hipacket2 = Highbyteangle2; angle_up = hipacket2 << 2; //сдвигаем на 2 бита влево lowpacket2 = Lowbyteangle2 >> 6; //Сдвигаем на 6 бит вправо realangle_up = angle_up + lowpacket2; //формируем 10-битное значение угла if (realangle_up >= zeropoint_up) { angle_up1 = realangle_up - zeropoint_up; } if (realangle_up < zeropoint_up) { incpoint2 = 1024 - zeropoint_up; angle_up1 = incpoint2 + realangle_up; } if(angle_up1 > 0x380) { angle_up1 = 0; } } //------------------------------------------------------------------------------------------------------------------------------- void Angle_LCD_AZ() { tlong = (long)angle1 * 3597; // covert adc reading to milivolts tlong = tlong / 1023; // 0..1023 -> 0-5000mV ch = tlong / 1000; // extract volts digit LCD_Chr(1,3,48+ch); // write ASCII digit at 2nd row, 9th column ch = (tlong / 100) % 10; // extract 0.1 volts digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point ch = (tlong / 10) % 10; // extract 0.01 volts digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point LCD_Chr_CP('.'); ch = tlong % 10; // extract 0.001 volts digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point if(moderotate == 0x00) {//Если ручной режим if (movestat == 0x26) { LCD_Chr(2,3,' '); LCD_Chr_CP('L'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if (movestat == 0x31) { LCD_Chr(2,3,' '); LCD_Chr_CP('R'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if (movestat == 0x28) { LCD_Chr(2,2,' '); LCD_Chr_CP('S'); LCD_Chr_CP('T'); LCD_Chr_CP('O'); LCD_Chr_CP('P'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } } if(moderotate == 0x01) {//Если автоматический режим if(movestat == 0x26) { LCD_Chr(2,7,'L'); } if (movestat == 0x31) { LCD_Chr(2,7,'R'); } if (movestat == 0x28) { LCD_Chr(2,7,'S'); } } if (moderotate == 0x00) { LCD_Chr(2,16,'H'); //Индикация режима } if (moderotate == 0x01) { LCD_Chr(2,16,'A'); } } //------------------------------------------------------------------------------------------------------------------------------- void Angle_LCD_EL() { tlong1 = (long)angle_up1 * 3597; // covert adc reading to milivolts tlong1 = tlong1 / 1023; // 0..1023 -> 0-5000mV ch1 = (tlong1 / 100) % 10; // extract 0.1 volts digit LCD_Chr(1,11,48+ch1); // write ASCII digit at cursor point ch1 = (tlong1 / 10) % 10; // extract 0.01 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point LCD_Chr_CP('.'); ch1 = tlong1 % 10; // extract 0.001 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point */ if(moderotate == 0x00) {//Если ручной режим if (elevastat == 0x65) { LCD_Chr(2,11,' '); LCD_Chr_CP('U'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if (elevastat == 0x61) { LCD_Chr(2,11,' '); LCD_Chr_CP('D'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if (elevastat == 0x63) { LCD_Chr(2,10,' '); LCD_Chr_CP('S'); LCD_Chr_CP('T'); LCD_Chr_CP('O'); LCD_Chr_CP('P'); LCD_Chr_CP(' '); } } if(moderotate == 0x01) { if (elevastat == 0x65) { LCD_Chr(2,14,'U'); } if (elevastat == 0x61) { LCD_Chr(2,14,'D'); } if (elevastat == 0x63) { LCD_Chr(2,14,'S'); } } } //------------------------------------------------------------------------------------------------------------------------------ void Read_Angle_AZ() { //Запрос данных угла поворота и данных состояния датчика lowpacket = 0; hipacket = 0; ds = 0; PORTD.F4 = 1; //Включаем передачу Usart_Write(marker1); //Передача маркера delay_us(545); PORTD.F4 = 0; //Выключаем передачу for (i = 0; i < 1000; i++) { if (Usart_Data_Ready()) { // Если данные приняты Highbyteangle = Usart_Read(); // Прочитать, что принято //Анализируем байт на маркер запрещённого байта if(Highbyteangle == 0x80) {//Если принят маркер запрещённого байта if(Last_Highbyteangle >= 0x3F && Last_Highbyteangle <= 0x43) { Highbyteangle = 0x41; } if(Last_Highbyteangle >= 0x45 && Last_Highbyteangle <= 0x49) { Highbyteangle = 0x47; } if(Last_Highbyteangle >= 0x4B && Last_Highbyteangle <= 0x4F) { Highbyteangle = 0x4D; } if(Last_Highbyteangle >= 0x51 && Last_Highbyteangle <= 0x55) { Highbyteangle = 0x53; } if(Last_Highbyteangle >= 0x57 && Last_Highbyteangle <= 0x60) { Highbyteangle = 0x59; } } i = 1100; ds = 1; //Если 1 то байт прочитан Last_Highbyteangle = Highbyteangle;//Присваиваем переменной прошлого байта принятый байт } } if (ds == 1) { //Если байт прочитан можно читать второй delay_ms(20); //Задержка между запросами обязательна(подбирать)!!!!!!! PORTD.F4 = 1; //Включаем передачу Usart_Write(marker2); //Передача маркера delay_us(545); PORTD.F4 = 0; //Выключаем передачу for (sr = 0; sr < 1000; sr++) { if (Usart_Data_Ready()) { // Если данные приняты Lowbyteangle = Usart_Read(); // Прочитать, что принято //Анализируем байт на маркер запрещённого байта if(Lowbyteangle == 0x80) {//Если принят маркер запрещённого байта if(Last_Lowbyteangle >= 0x3F && Last_Lowbyteangle <= 0x43) { Lowbyteangle = 0x41; } if(Last_Lowbyteangle >= 0x45 && Last_Lowbyteangle <= 0x49) { Lowbyteangle = 0x47; } if(Last_Lowbyteangle >= 0x4B && Last_Lowbyteangle <= 0x4F) { Lowbyteangle = 0x4D; } if(Last_Lowbyteangle >= 0x51 && Last_Lowbyteangle <= 0x55) { Lowbyteangle = 0x53; } if(Last_Lowbyteangle >= 0x57 && Last_Lowbyteangle <= 0x60) { Lowbyteangle = 0x59; } } sr = 1200; ds = 0; //Для опознавания чтения первого байта Last_Lowbyteangle = Lowbyteangle;//Присваиваем переменной прошлого байта принятый байт LCD_Chr(2,1,'*'); flagERR_AZ = 0; counter_alarm = 0; } else {LCD_Chr(2,1,'!'); flagERR_AZ = 1; } } } else {LCD_Chr(2,1,'!'); flagERR_AZ = 1; } } //------------------------------------------------------------------------------------------------------------------------------ void Read_Angle_EL() { //Запрос данных угла подъёма и данных состояния датчика lowpacket2 = 0; hipacket2 = 0; dw = 0; PORTD.F4 = 1; //Включаем передачу Usart_Write(marker3); //Передача маркера delay_us(545); PORTD.F4 = 0; //Выключаем передачу for (i = 0; i < 1000; i++) { if (Usart_Data_Ready()) { // Если данные приняты Highbyteangle2 = Usart_Read(); // Прочитать, что принято //Анализируем байт на маркер запрещённого байта if(Highbyteangle2 == 0x80) {//Если принят маркер запрещённого байта if(Last_Highbyteangle2 >= 0x0F && Last_Highbyteangle2 <= 0x13) { Highbyteangle2 = 0x11; } if(Last_Highbyteangle2 >= 0x15 && Last_Highbyteangle2 <= 0x19) { Highbyteangle2 = 0x17; } if(Last_Highbyteangle2 >= 0x1B && Last_Highbyteangle2 <= 0x1E) { Highbyteangle2 = 0x1D; } if(Last_Highbyteangle2 >= 0x21 && Last_Highbyteangle2 <= 0x25) { Highbyteangle2 = 0x23; } if(Last_Highbyteangle2 >= 0x27 && Last_Highbyteangle2 <= 0x2B) { Highbyteangle2 = 0x29; } } i = 1100; dw = 1; //Если 1 то байт прочитан Last_Highbyteangle2 = Highbyteangle2; } } if (dw == 1) { //Если байт прочитан можно читать второй delay_ms(20); //Задержка между запросами обязательна(подбирать)!!!!!!! PORTD.F4 = 1; //Включаем передачу Usart_Write(marker4); //Передача маркера delay_us(545); PORTD.F4 = 0; //Выключаем передачу for (sr = 0; sr < 1000; sr++) { if (Usart_Data_Ready()) { // Если данные приняты Lowbyteangle2 = Usart_Read(); // Прочитать, что принято //Анализируем байт на маркер запрещённого байта if(Lowbyteangle2 == 0x80) {//Если принят маркер запрещённого байта if(Last_Lowbyteangle2 >= 0x0F && Last_Lowbyteangle2 <= 0x13) { Lowbyteangle2 = 0x11; } if(Last_Lowbyteangle2 >= 0x15 && Last_Lowbyteangle2 <= 0x19) { Lowbyteangle2 = 0x17; } if(Last_Lowbyteangle2 >= 0x1B && Last_Lowbyteangle2 <= 0x1E) { Lowbyteangle2 = 0x1D; } if(Last_Lowbyteangle2 >= 0x21 && Last_Lowbyteangle2 <= 0x25) { Lowbyteangle2 = 0x23; } if(Last_Lowbyteangle2 >= 0x27 && Last_Lowbyteangle2 <= 0x2B) { Lowbyteangle2 = 0x29; } } sr = 1200; dw = 0; //Для опознавания чтения первого байта Last_Lowbyteangle2 = Lowbyteangle2; stat_elevat = 1; } else stat_elevat = 0; } } else { stat_elevat = 0; } if (current_menu == 1 && stat_elevat == 0) { LCD_Chr(2,1,'!'); flagERR_EL = 1; } if (current_menu != 1 && stat_elevat == 0) { LCD_Chr(2,9,'!'); flagERR_EL = 1; } if (current_menu == 1 && stat_elevat == 1) { LCD_Chr(2,1,'*'); flagERR_EL = 0; counter_alarm = 0; } if (current_menu != 1 && stat_elevat == 1) { LCD_Chr(2,9,'*'); flagERR_EL = 0; counter_alarm = 0; } } //----------------------------------------------------------------------------------------------------------------------------- void Zerocalibr_EL () { //Программа калибровки 000 if (PORTD.F0 == 1) { hipacket2 = Highbyteangle2; angle_up = hipacket2 << 2; //сдвигаем на 2 бита влево lowpacket2 = Lowbyteangle2 >> 6; //Сдвигаем на 6 бит вправо realangle_up = angle_up + lowpacket2; //формируем 10-битное значение угла zeropoint_up = realangle_up; //Сохраняем калибровочное значение во FLASH byte_save = zeropoint_up >> 24; //Старший байт значения EEprom_Write(0x04, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = zeropoint_up >> 16; //байт после старшего EEprom_Write(0x05, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = zeropoint_up >> 8; //байт перед младшим EEprom_Write(0x06, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = zeropoint_up; //байт младший EEprom_Write(0x07, byte_save); //Записываем в ячейку памяти delay_ms(30); } } //------------------------------------------------------------------------------------------------------------------------------ void Zerocalibr_AZ () { //Программа калибровки 000 if (PORTD.F0 == 1) { hipacket = Highbyteangle; angle = hipacket << 2; //сдвигаем на 2 бита влево lowpacket = Lowbyteangle >> 6; //Сдвигаем на 6 бит вправо realangle = angle + lowpacket; //формируем 10-битное значение угла zeropoint = realangle; //Сохраняем калибровочное значение во FLASH byte_save = zeropoint >> 24; //Старший байт значения EEprom_Write(0x00, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = zeropoint >> 16; //байт после старшего EEprom_Write(0x01, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = zeropoint >> 8; //байт перед младшим EEprom_Write(0x02, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = zeropoint; //байт младший EEprom_Write(0x03, byte_save); //Записываем в ячейку памяти delay_ms(30); EEprom_Write(0x1D, mark_CW);//Снимаем флаги перекрутов delay_ms(30); EEprom_Write(0x1C, mark_CCW); mark_CW = 0; mark_CCW = 0; } } //------------------------------------------------------------------------------------------------------------------------------ void Rotate_CCW() { //Модуль вращения против часовой стрелки PORTD.F4 = 1; //Включаем передачу Usart_Write(0x1D); //Команда влево CCW delay_us(545); PORTD.F4 = 0; //Выключаем передачу for (i = 0; i < 1000; i++) { if (Usart_Data_Ready()) { // Если данные приняты movestat = Usart_Read(); // Прочитать, что принято i = 1100; } } } //------------------------------------------------------------------------------------------------------------------------------- void Rotate_CW() { //Модуль вращения по часовой стрелке PORTD.F4 = 1; //Включаем передачу Usart_Write(0x23); //Команда вправо CW delay_us(545); PORTD.F4 = 0; //Выключаем передачу for (i = 0; i < 1000; i++) { if (Usart_Data_Ready()) { // Если данные приняты movestat = Usart_Read(); // Прочитать, что принято i = 1100; } } } //------------------------------------------------------------------------------------------------------------------------------- void RotateStop_AZ() { //Остановка двигателя if(mark_CW == 0 && mark_CCW == 0) { lastangle = angle1; //Запоминаем угол стоянки } PORTD.F4 = 1; //Включаем передачу Usart_Write(0x29); //Команда стоп delay_us(545); PORTD.F4 = 0; //Выключаем передачу for (i = 0; i < 1000; i++) { if (Usart_Data_Ready()) { // Если данные приняты movestat = Usart_Read(); // Прочитать, что принято i = 1100; } } } //------------------------------------------------------------------------------------------------------------------------------- void RotateUp() { //Вращение вверх PORTD.F4 = 1; //Включаем передачу Usart_Write(0x4D); //Команда поднять вверх delay_us(545); PORTD.F4 = 0; //Выключаем передачу for (i = 0; i < 1000; i++) { if (Usart_Data_Ready()) { // Если данные приняты elevastat = Usart_Read(); // Прочитать, что принято i = 1100; } } } //------------------------------------------------------------------------------------------------------------------------------- void RotateDown() { PORTD.F4 = 1; //Включаем передачу Usart_Write(0x53); //Команда опустить вниз delay_us(545); PORTD.F4 = 0; //Выключаем передачу for (i = 0; i < 1000; i++) { if (Usart_Data_Ready()) { // Если данные приняты elevastat = Usart_Read(); // Прочитать, что принято i = 1100; } } } //------------------------------------------------------------------------------------------------------------------------------- void RotateStop_EL() { //Остановка двигателя элевации PORTD.F4 = 1; //Включаем передачу Usart_Write(0x59); //Команда стоп delay_us(545); PORTD.F4 = 0; //Выключаем передачу for (i = 0; i < 1000; i++) { if (Usart_Data_Ready()) { // Если данные приняты elevastat = Usart_Read(); // Прочитать, что принято i = 1100; } } } //------------------------------------------------------------------------------------------------------------------------------- //Контроль перекрутов и вращение влево void CCW_rotate_con() { if (mark_CCW == 0) {//Условия отключения вращения при перекруте Rotate_CCW(); //Вращаем против часовой стрелки } if (mark_CCW == 1 && angle1 >= angOwerwindLeft && flagSTOP == 0) {//если перекрут Rotate_CCW(); //Вращаем против часовой стрелки } if (mark_CCW == 1 && angle1 < angOwerwindLeft) { RotateStop_AZ(); //Стоп } if (angle1 > lastangle + 5 && mark_CW == 0) {LCD_Chr(1,16,'R'); mark_CCW = 1;//Выставляем маркер перекрута EEprom_Write(0x1C, mark_CCW); //Записываем в ячейку памяти PORTC.F1 = 1; } if (angle1 > lastangle && mark_CW == 1) {LCD_Chr(1,16,' ');//Снятие перекрута вправо lastangle = 0x2000; mark_CW = 0; EEprom_Write(0x1D, mark_CW); //Записываем в ячейку памяти PORTC.F1 = 0; } } //------------------------------------------------------------------------------------------------------------------------------- //Контроль перекрутов и вращение вправо void CW_rotate_con() { if (mark_CW == 0) { //Условия отключения вращения при перекруте Rotate_CW(); //Вращаем по часовой стрелке } if (mark_CW == 1 && angle1 <= angOwerwindRight && flagSTOP == 0) { Rotate_CW(); //Вращаем по часовой стрелке } if (mark_CW == 1 && angle1 > angOwerwindRight) { RotateStop_AZ(); //Стоп } if (angle1 < lastangle - 5 && mark_CCW == 0) {LCD_Chr(1,16,'R'); mark_CW = 1;//Выставляем маркер перекрута EEprom_Write(0x1D, mark_CW); //Записываем в ячейку памяти PORTC.F1 = 1; } if (angle1 < lastangle && mark_CCW == 1) {LCD_Chr(1,16,' '); lastangle = 0x00; mark_CCW = 0; //Снимаем маркер перекрута EEprom_Write(0x1C, mark_CCW); //Записываем в ячейку памяти PORTC.F1 = 0; } } //------------------------------------------------------------------------------------------------------------------------------ void RotateCom() { //Ручное управление повороткой if (PORTD.F3 == 1 && PORTD.F2 == 0 && flagSTOP == 0) { //Вращение влево CCW_rotate_con(); } if (PORTD.F3 == 0 && PORTD.F2 == 1 && flagSTOP == 0) { //Вращение вправо CW_rotate_con(); } if (PORTD.F3 == 0 && PORTD.F2 == 0) { RotateStop_AZ(); //Стоп } if (PORTD.F3 == 1 && PORTD.F2 == 1) { RotateStop_AZ(); //Стоп } if (PORTD.F5 == 1 && PORTD.F6 == 0 && flagSTOP == 0) {//Вращение вверх if(angle_up1 <= angMaxElevate || angle_up1 >= 0x300) { RotateUp();//Крутим вверх PORTC.F4 = 0; } if(angle_up1 > angMaxElevate && angle_up1 < angMaxElevate + 10) { RotateStop_EL(); //Стоп элевация PORTC.F4 = 1; } } if (PORTD.F5 == 0 && PORTD.F6 == 0) { RotateStop_EL(); //Стоп элевация } if (PORTD.F5 == 1 && PORTD.F6 == 1) { RotateStop_EL(); //Стоп элевация } if (PORTD.F5 == 0 && PORTD.F6 == 1 && flagSTOP == 0) {//Вращение вниз if(angle_up1 <= 0x02 || angle_up1 > 0x300) { RotateStop_EL(); //Стоп if(angle_up1 > 0x300) { RotateUp();//Крутим вверх for(steps = 1; steps < steps_EL; steps++) {//шаг delay_ms(1); } } } if(angle_up1 > 0x02 && angle_up1 <= 0x300) { RotateDown();//Крутим вниз PORTC.F4 = 0; } } } //------------------------------------------------------------------------------------------------------------------------------ void RotateUpAuto() { //Вращение вверх в автоматическом режие if(angle_up1 <= angMaxElevate || angle_up1 >= 0x250 && flagSTOP == 0) { RotateUp();//Крутим вверх PORTC.F4 = 0; } if(angle_up1 > angMaxElevate && angle_up1 < angMaxElevate + 10) { RotateStop_EL(); //Стоп элевация PORTC.F4 = 1; } } void RotateDownAuto() {//Вращение вниз в автоматическом режиме if(angle_up1 > 0x02 && angle_up1 <= 0x250 && flagSTOP == 0) { RotateDown();//Крутим вниз PORTC.F4 = 0; } else { RotateStop_EL(); //Стоп } if(angle_up1 == 0) RotateStop_EL(); //Стоп } //------------------------------------------------------------------------------------------------------------------------------ void Mode_rotate() {//Переключение режима управления поворотным устройством if (PORTD.F7 == 1) {//Переключение в режим авто moderotate = 1; } if (PORTD.F7 == 0) {//Переключение в режим ручной moderotate = 0; } } //------------------------------------------------------------------------------------------------------------------------------- void Read_Packet_Orbitron() { //Чтение пакета из Орбитрона if(inputOutside == 0) {//RS232 канал 1 PORTC.F0 = 1; //Включаем чтение с компьютера PORTC.F2 = 0; } if(inputOutside == 1) {//RS232 канал 2 PORTC.F0 = 0; //Включаем чтение с компьютера PORTC.F2 = 1; } if(inputOutside == 2) {//RS232 канал 3 PORTC.F0 = 1; //Включаем чтение с компьютера PORTC.F2 = 1; } for (i = 0; i < 30000; i++) { //Принимаем начало пакета if(Usart_Data_Ready()) { //если байт принят buffer1[0] = Usart_Read(); if (buffer1 [0] == 'W') { //если байт = началу пакета firstbyte = 1; //устанавливаем флаг приёма остальных байтов i = 30100; //выходим из цикла приёма 1 байта } if (buffer1 [0] != 'W') { firstbyte = 0; //если байт != началу пакета не принимаем остальные } } } if (firstbyte == 1) { for(i = 0; i < 100; i++) { if(Usart_Data_Ready()) { buffer1[1] = Usart_Read(); i = 110; } } for(i = 0; i < 100; i++) { if(Usart_Data_Ready()) { buffer1[2] = Usart_Read(); i = 110; } } for(i = 0; i < 100; i++) { if(Usart_Data_Ready()) { buffer1[3] = Usart_Read(); i = 110; } } for(i = 0; i < 100; i++) { if(Usart_Data_Ready()) { buffer1[4] = Usart_Read(); i = 110; } } for(i = 0; i < 100; i++) { if(Usart_Data_Ready()) { buffer1[5] = Usart_Read(); i = 110; } } for(i = 0; i < 100; i++) { if(Usart_Data_Ready()) { buffer1[6] = Usart_Read(); i = 110; } } for(i = 0; i < 100; i++) { if(Usart_Data_Ready()) { buffer1[7] = Usart_Read(); i = 110; } } for(i = 0; i < 100; i++) { if(Usart_Data_Ready()) { buffer1[8] = Usart_Read(); i = 110; } } }//Конец чтения пакета из Орбитрона } //------------------------------------------------------------------------------------------------------------------------------- void Screen_handle_mode() { //Основной экран ручное управление LCD_Chr(1,1,'A'); LCD_Chr_CP(':'); Angle_LCD_AZ();//Вывод на LCD LCD_Chr(1,8,grad);//Градус LCD_Chr_CP('E'); LCD_Chr_CP(':'); Angle_LCD_EL();//Вывод на LCD LCD_Chr(1,15,grad);//Градус } //------------------------------------------------------------------------------------------------------------------------------- void Screen_automatic_mode() {//Основной экран автоматическое управление LCD_Chr(1,1,'A'); LCD_Chr_CP(':'); Angle_LCD_AZ();//Вывод на LCD LCD_Chr(1,8,grad);//Градус LCD_Chr_CP('E'); LCD_Chr_CP(':'); Angle_LCD_EL();//Вывод на LCD LCD_Chr(1,15,grad);//Градус LCD_Chr(2,2,'('); LCD_Chr_CP(buffer1[1]); LCD_Chr_CP(buffer1[2]); LCD_Chr_CP(buffer1[3]); LCD_Chr_CP(')'); LCD_Chr(2,8,' '); LCD_Chr(2,10,'('); LCD_Chr_CP(buffer1[6]); LCD_Chr_CP(buffer1[7]); LCD_Chr_CP(')'); LCD_Chr(2,15,' '); } void Tuning_menu_selector() { //Переключение менюшек настройки if (PORTD.F5 == 0 && PORTD.F6 == 1) { current_menu ++; if (current_menu > 8) { current_menu = 8; } if (current_menu < 0) { current_menu = 0; } delay_ms(200); } if (PORTD.F5 == 1 && PORTD.F6 == 0) { current_menu --; if (current_menu > 8) { current_menu = 8; } if (current_menu < 0) { current_menu = 0; } delay_ms(200); } } //---------------------------------------------------------------------------------------------------------------------------- void Read_save_parameters_FLASH() {//Чтение сохранённых парметров в EEPROM //Читаем нулевой параметр азимута byte_save = EEprom_Read(0x00); //Читаем старший байт byte_save = byte_save << 24; delay_ms(30); byte_save1 = EEprom_Read(0x01); byte_save1 = byte_save1 << 16; delay_ms(30); byte_save2 = EEprom_Read(0x02); byte_save2 = byte_save2 << 8; delay_ms(30); byte_save3 = EEprom_Read(0x03); zeropoint = byte_save + byte_save1 + byte_save2 + byte_save3; delay_ms(30); //Читаем нулевой параметр элевации byte_save = EEprom_Read(0x04); //Читаем старший байт byte_save = byte_save << 24; delay_ms(30); byte_save1 = EEprom_Read(0x05); byte_save1 = byte_save1 << 16; delay_ms(30); byte_save2 = EEprom_Read(0x06); byte_save2 = byte_save2 << 8; delay_ms(30); byte_save3 = EEprom_Read(0x07); zeropoint_up = byte_save + byte_save1 + byte_save2 + byte_save3; //Читаем углы перекрута перекрут вправо byte_save = EEprom_Read(0x08); //Читаем старший байт byte_save = byte_save << 24; delay_ms(30); byte_save1 = EEprom_Read(0x09); byte_save1 = byte_save1 << 16; delay_ms(30); byte_save2 = EEprom_Read(0x0A); byte_save2 = byte_save2 << 8; delay_ms(30); byte_save3 = EEprom_Read(0x0B); angOwerwindRight = byte_save + byte_save1 + byte_save2 + byte_save3; angOwerwindLeft = 0x3FF - angOwerwindRight; //Читаем угол максимального родъёма byte_save = EEprom_Read(0x0C); //Читаем старший байт byte_save = byte_save << 24; delay_ms(30); byte_save1 = EEprom_Read(0x0D); byte_save1 = byte_save1 << 16; delay_ms(30); byte_save2 = EEprom_Read(0x0E); byte_save2 = byte_save2 << 8; delay_ms(30); byte_save3 = EEprom_Read(0x0F); angMaxElevate = byte_save + byte_save1 + byte_save2 + byte_save3; //Читаем угол зоны импульсного режима Азимута byte_save = EEprom_Read(0x10); //Читаем старший байт byte_save = byte_save << 24; delay_ms(30); byte_save1 = EEprom_Read(0x11); byte_save1 = byte_save1 << 16; delay_ms(30); byte_save2 = EEprom_Read(0x12); byte_save2 = byte_save2 << 8; delay_ms(30); byte_save3 = EEprom_Read(0x13); angPulseZone = byte_save + byte_save1 + byte_save2 + byte_save3; //Читаем угол зоны импульсного режима Элевации byte_save = EEprom_Read(0x18); //Читаем старший байт byte_save = byte_save << 24; delay_ms(30); byte_save1 = EEprom_Read(0x19); byte_save1 = byte_save1 << 16; delay_ms(30); byte_save2 = EEprom_Read(0x1A); byte_save2 = byte_save2 << 8; delay_ms(30); byte_save3 = EEprom_Read(0x1B); angPulseZone_up = byte_save + byte_save1 + byte_save2 + byte_save3; //Читаем значение длины импульса азимута byte_save2 = EEprom_Read(0x14); byte_save2 = byte_save2 << 8; delay_ms(30); byte_save3 = EEprom_Read(0x15); steps_AZ = byte_save + byte_save1 + byte_save2 + byte_save3 + 1; //Читаем значение длины импульса элевации byte_save2 = EEprom_Read(0x16); byte_save2 = byte_save2 << 8; delay_ms(30); byte_save3 = EEprom_Read(0x17); steps_EL = byte_save + byte_save1 + byte_save2 + byte_save3 + 1; //Читаем флаги перекрута mark_CCW = EEprom_Read(0x1C); if(mark_CCW == 0x01) LCD_Chr(1,16,'R'); PORTC.F1 = 1; if(mark_CCW == 0xFF) mark_CCW = 0; PORTC.F1 = 0; mark_CW = EEprom_Read(0x1D); if(mark_CW == 0x01) LCD_Chr(1,16,'R'); PORTC.F1 = 1; if(mark_CW == 0xFF) mark_CW = 0; PORTC.F1 = 0; //Читаем порт связи с пк inputOutside = EEprom_Read(0x1E); } //------------------------------------------------------------------------------------------------------------------------------- void Off_alarm() {//Отключение ПУ при ошибке связи if(flagERR_AZ == 1 || flagERR_EL == 1) { counter_alarm++; } if(counter_alarm > 10 && flagSTOP == 0) { PORTD.F1 = 0; delay_ms(1000); PORTD.F1 = 1; counter_alarm = 0; flagSTOP = 1; } if(flagERR_AZ == 0 && flagERR_EL == 0) { flagSTOP = 0; } } void Test_connect_rotator() { //Проверка соединения с поворотным устройством при включении контроллера LCD_Chr(1,1,' '); LCD_Chr_CP('-'); LCD_Chr_CP('S'); LCD_Chr_CP('Y'); LCD_Chr_CP('S'); LCD_Chr_CP('T'); LCD_Chr_CP('E'); LCD_Chr_CP('M'); LCD_Chr_CP(' '); LCD_Chr_CP('T'); LCD_Chr_CP('E'); LCD_Chr_CP('S'); LCD_Chr_CP('T'); LCD_Chr_CP('-'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); while(work == 0) { delay_ms(1000); Read_Angle_AZ();//Читаем угол из контроллера азимута delay_ms(50); Read_Angle_EL();//Читаем угол из контроллера элевации if(flagERR_AZ == 1 && flagERR_EL == 0) { LCD_Chr(2,1,' '); LCD_Chr_CP('N'); LCD_Chr_CP('o'); LCD_Chr_CP(' '); LCD_Chr_CP('A'); LCD_Chr_CP('Z'); LCD_Chr_CP(' '); LCD_Chr_CP('c'); LCD_Chr_CP('o'); LCD_Chr_CP('n'); LCD_Chr_CP('n'); LCD_Chr_CP('e'); LCD_Chr_CP('c'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); work = 0;//Запрещаем работу работу ПУ } if(flagERR_AZ == 0 && flagERR_EL == 1) { LCD_Chr(2,1,' '); LCD_Chr_CP('N'); LCD_Chr_CP('o'); LCD_Chr_CP(' '); LCD_Chr_CP('E'); LCD_Chr_CP('L'); LCD_Chr_CP(' '); LCD_Chr_CP('c'); LCD_Chr_CP('o'); LCD_Chr_CP('n'); LCD_Chr_CP('n'); LCD_Chr_CP('e'); LCD_Chr_CP('c'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); work = 0;//Запрещаем работу работу ПУ } if(flagERR_AZ == 1 && flagERR_EL == 1) { LCD_Chr(2,1,' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); LCD_Chr_CP('N'); LCD_Chr_CP('o'); LCD_Chr_CP(' '); LCD_Chr_CP('c'); LCD_Chr_CP('o'); LCD_Chr_CP('n'); LCD_Chr_CP('n'); LCD_Chr_CP('e'); LCD_Chr_CP('c'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); work = 0;//Запрещаем работу работу ПУ } if(flagERR_AZ == 0 && flagERR_EL == 0) { LCD_Chr(2,1,'T'); LCD_Chr_CP('e'); LCD_Chr_CP('s'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr_CP('b'); LCD_Chr_CP('e'); LCD_Chr_CP(' '); LCD_Chr_CP('c'); LCD_Chr_CP('o'); LCD_Chr_CP('m'); LCD_Chr_CP('p'); LCD_Chr_CP('l'); LCD_Chr_CP('e'); LCD_Chr_CP('t'); LCD_Chr_CP('e'); delay_ms(2000); work = 1;//Разрешаем работу ПУ } } } //------------------------------------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------------------------------- void main() { //Основная прога TRISD = 0xED; // Set pins PORTD 3-in TRISA = 0x00; TRISB = 0x00; TRISC = 0x08; //Set C1 and C3 as input TRISE = 0x00; Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // Lcd_Init_EP5, see Autocomplete LCD_Cmd(LCD_CLEAR); // Clear display LCD_Cmd(LCD_CURSOR_OFF); // Turn cursor off USART_init(19200); // initialize USART module zeropoint = 0x00; zeropoint_up = 0x00; mark_CW = 0x00; mark_CCW = 0x00; moderotate = 0x00; firstbyte = 0; move_AZ = 0x00;//Запрещаем подстройку азимута и элевации от ПК move_EL = 0x00; last_angle_AZ_PC = angle_AZ_PC; last_angle_EL_PC = angle_EL_PC; menu_view = 0x00; current_menu = 0; flagERR_AZ = 0; flagERR_EL = 0; flagSTOP = 0; counter_alarm = 0; PORTD.F1 = 1;//Включаем ПУ buffer1[1] = '-'; buffer1[2] = '-'; buffer1[3] = '-'; buffer1[5] = '-'; buffer1[6] = '-'; buffer1[7] = '-'; work = 0;//Перед тестом связи с контроллерами запрещаем работу с ПУ Test_connect_rotator();//Проверка состояния и связи с ПУ Read_save_parameters_FLASH();//Читаем параметры из EEPROM Mode_rotate(); //Переключение режимов ручной/автоматический while(work == 1)//Если тестирование прошло успешно { if(menu_view == 0x00) {//Выводим основные экраны if (PORTD.F0 == 1) {//Если кнопку МЕНЮ нажали выводим меню настроек menu_view = 0x01; //устанавливаем флаг вывода меню настроек } if (moderotate == 0) {//Режим ручного управления PORTC.F0 = 0; //Включаем чтение с интерфейсной платы PORTC.F2 = 0; Read_Angle_AZ(); //Читаем угол поворота Words_status_AZ(); //Формирование 10-битного числа угла Read_Angle_EL(); //Читаем угол подьёма Words_status_EL(); //Формирование 10-битного числа угла Screen_handle_mode();//Основной экран контроллера RotateCom(); //Команды вращения от кнопок AZ and EL delay_ms(20); //Задержка между запросами подбирать !!!! Mode_rotate(); //Переключение режимов ручной/автоматический flagSetposition = 0;//Перекрут не устранён (для автоматического режима) stat = 0; Off_alarm();//Отключение ПУ при потере связи if(setStartBit == 1) { buffer1[1] = 0x2D; buffer1[2] = '-'; buffer1[3] = '-'; buffer1[5] = '-'; buffer1[6] = '-'; buffer1[7] = '-'; setStartBit = 0; } } //------------------------------------------------------------------------------------------------------------------------------- if (moderotate == 1) {//Режим автоматического управления Mode_rotate(); //Переключение режимов ручной/автоматический Off_alarm();//Отключение ПУ при потере связи Read_Packet_Orbitron();//Читаем пакет из Орбитрона setStartBit = 1; //Преобразуем значения пакета из CHAR в значения углов для сравнения hundr_AZ = (buffer1[1]-48) * 100; //Сотни угла азимута из ПК tens_AZ = (buffer1[2]-48) * 10; //Десятки угла азимута из ПК onces_AZ = buffer1[3]-48; //Еденицы угла азимута из ПК angle_AZ_PC = hundr_AZ + tens_AZ + onces_AZ;//Угол азимута принятый из ПК (шеснадцатеричный) hundr_EL = (buffer1[5]-48) * 100;//Сотни угла элевации из ПК tens_EL = (buffer1[6]-48) * 10;//Десятки угла элевации из ПК onces_EL = buffer1[7]-48;//Единицы угла элевации из ПК angle_EL_PC = hundr_EL + tens_EL + onces_EL;//Угол элевации принятный из ПК (шестнадцатеричный) if(buffer1[1] == 0x2D) {//Если в буфер из ПК ничего не прочитано запрещаем вращение ПУ angle_AZ_PC = 0; last_angle_AZ_PC = 0; move_AZ = 0x00; angle_EL_PC = last_angle_EL_PC; move_EL = 0x00; } //Проверяем изменились ли данные углов из ПК if(move_AZ == 0x00) {//Если угол азимута установлен if(angle_AZ_PC == last_angle_AZ_PC) {//Если угол не изменился запрещаем подстройку угла move_AZ = 0x00; } if(angle_AZ_PC != last_angle_AZ_PC) {//Если угол изменился разрешаем подстройку угла move_AZ = 0x01; last_angle_AZ_PC = angle_AZ_PC; } } if(move_EL == 0x00) { if(angle_EL_PC == last_angle_EL_PC) {//Если угол изменился запрещаем подстройку угла move_EL = 0x00; } if(angle_EL_PC != last_angle_EL_PC) {//Если угол изменился разрешаем подстройку угла move_EL = 0x01; last_angle_EL_PC = angle_EL_PC; } } //Принимаем углы из поворотного устройства PORTC.F0 = 0; //Включаем чтение с интерфейсной платы PORTC.F2 = 0; Read_Angle_AZ(); //Читаем угол поворота Words_status_AZ(); //Формирование 10-битного числа угла Screen_automatic_mode();//Вывод на экран меню автоматический режим Read_Angle_EL(); //Читаем угол подьёма Words_status_EL(); //Формирование 10-битного числа угла Screen_automatic_mode();//Вывод на экран меню автоматический режим Off_alarm();//Отключение ПУ при потере связи //Преобразуем значения углов из поворотного устройства для сравнения tlong = (long)angle1 * 3597; // covert adc reading to milivolts tlong = tlong / 1023; // 0..1023 -> 0-5000mV ch = tlong / 1000; // extract volts digit hundr_AZ_rot = ch * 100; ch = (tlong / 100) % 10; // extract 0.1 volts digit tens_AZ_rot = ch * 10; // write ASCII digit at cursor point ch = (tlong / 10) % 10; // extract 0.01 volts digit onces_AZ_rot = ch; angle_AZ_ROT = hundr_AZ_rot + tens_AZ_rot + onces_AZ_rot; tlong = (long)angle_up1 * 3597; // covert adc reading to milivolts tlong = tlong / 1023; // 0..1023 -> 0-5000mV ch = tlong / 1000; // extract volts digit hundr_EL_rot = ch * 100; ch = (tlong / 100) % 10; // extract 0.1 volts digit tens_EL_rot = ch * 10; // write ASCII digit at cursor point ch = (tlong / 10) % 10; // extract 0.01 volts digit onces_EL_rot = ch; angle_EL_ROT = hundr_EL_rot + tens_EL_rot + onces_EL_rot; //------------------------------------------------------------------------------------------------------------------------------- if(move_AZ == 0x01) {//Если угол принятый из ПК изменился //Производим вращение ПУ к углу принятому из ПК if(angle_AZ_ROT < angle_AZ_PC && buffer1 [0] == 'W' && mark_CW == 0 && flagSTOP == 0) {//Если угол ПУ < угла из ПК крутим вправо Rotate_CW(); diff_angle_AZ = angle_AZ_PC - angle_AZ_ROT; if(diff_angle_AZ < angPulseZone) { //Если разница между углами < докроучиваем шагами for(steps = 1; steps < steps_AZ; steps++) {//шаг delay_ms(1); } RotateStop_AZ(); } } if(angle_AZ_ROT > angle_AZ_PC && buffer1 [0] == 'W' && mark_CCW == 0 && flagSTOP == 0) {//Если угол ПУ > угла из ПК крутим влево Rotate_CCW(); diff_angle_AZ = angle_AZ_ROT - angle_AZ_PC; if(diff_angle_AZ < angPulseZone) { //Если разница между углами < докроучиваем шагами for(steps = 1; steps < steps_AZ; steps++) {//шаг delay_ms(1); } RotateStop_AZ(); } } if(mark_CCW == 1) { CW_rotate_con(); } if(mark_CW == 1) { CCW_rotate_con(); } if(angle_AZ_ROT == angle_AZ_PC || buffer1 [0] != 'W') { RotateStop_AZ(); if(buffer1 [0] != 'W'){ move_AZ = 0x01;//Разрешаем подстройку угла } else move_AZ = 0x00; } } //------------------------------------------------------------------------------------------------------------------------------- if(move_EL == 0x01) {//Если угол элевации приятый из ПК изменился if(angle_EL_ROT < angle_EL_PC && buffer1 [0] == 'W' && flagSTOP == 0) {//Если элевация ПУ меньше чем из ПК поднимаем RotateUpAuto(); diff_angle_EL = angle_EL_PC - angle_EL_ROT; if(diff_angle_EL < angPulseZone_up) { for(steps = 1; steps < steps_EL; steps++) {//шаг delay_ms(1); } RotateStop_EL(); } } if(angle_EL_ROT > angle_EL_PC + 1 && buffer1 [0] == 'W' && flagSTOP == 0) {//Если элевация ПУ больше чем из ПК опускаем RotateDownAuto();//Крутим вниз diff_angle_EL = angle_EL_ROT - angle_EL_PC; if(diff_angle_EL < angPulseZone_up) { //Если разница между углами < установленных градусов, докроучиваем шагами for(steps = 1; steps < steps_EL; steps++) {//шаг delay_ms(1); } RotateStop_EL(); } } if(angle_EL_ROT == angle_EL_PC && buffer1 [0] == 'W') { RotateStop_EL(); move_EL = 0x00;//Запрещаем подстройку угла } if(buffer1 [0] != 'W') { RotateStop_EL(); } } } }//Конец ввода рабочего экрана //------------------------------------------------------------------------------------------------------------------------------- if(menu_view == 0x01) {//Выводим меню настройки if (PORTC.F3 == 1) {//Если кнопку ESC нажали выводим рабочие экраны menu_view = 0x00; //сбрасываем флаг вывода меню настроек current_menu = 0; //начальня менюшка настроек setOverwind = 0; //Обнулим флаг записи углов перекрута setMaxElevate = 0; //Обнулим флаг записи максимального угла подъёма setPulseZone = 0; //Обнулим флаг записи зоны толчкового режима азимута setPulseZone_up = 0;//Обнулим флаг записи зоны толчкового режима элевации } if (current_menu == 0) {//Меню калибровки 000 Азимута setOverwind = 0; //Обнулим флаг записи углов перекрута setMaxElevate = 0; //Обнулим флаг записи максимального угла подъёма LCD_Chr(1,1,'C');//Заголовок меню калибровки 000 LCD_Chr_CP('a'); LCD_Chr_CP('l'); LCD_Chr_CP('i'); LCD_Chr_CP('b'); LCD_Chr_CP('.'); LCD_Chr_CP('Z'); LCD_Chr_CP('e'); LCD_Chr_CP('r'); LCD_Chr_CP('o'); LCD_Chr_CP('p'); LCD_Chr_CP('o'); LCD_Chr_CP('i'); LCD_Chr_CP('n'); LCD_Chr_CP('t'); LCD_Chr(2,2,'A'); LCD_Chr_CP('z'); LCD_Chr_CP('i'); LCD_Chr_CP('m'); LCD_Chr_CP('u'); LCD_Chr_CP('t'); LCD_Chr_CP('h'); LCD_Chr_CP(':'); //Выводим значения углов для калибровки 000 PORTC.F0 = 0; //Включаем чтение с интерфейсной платы Read_Angle_AZ(); //Читаем угол поворота Words_status_AZ(); //Формирование 10-битного числа угла //Выводим азимут tlong = (long)angle1 * 3597; // covert adc reading to milivolts tlong = tlong / 1023; // 0..1023 -> 0-5000mV ch = tlong / 1000; // extract volts digit LCD_Chr(2,10,48+ch); // write ASCII digit at 2nd row, 9th column ch = (tlong / 100) % 10; // extract 0.1 volts digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point ch = (tlong / 10) % 10; // extract 0.01 volts digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point LCD_Chr_CP('.'); ch = tlong % 10; // extract 0.001 volts digit LCD_Chr_CP(48+ch); LCD_Chr_CP(grad);//знак градус delay_ms(50); if (PORTD.F3 == 1 && PORTD.F2 == 0) { //Вращение влево Rotate_CCW(); LCD_Chr(2,16,'L'); } if (PORTD.F3 == 0 && PORTD.F2 == 1) { //Вращение вправо Rotate_CW(); LCD_Chr(2,16,'R'); } if (PORTD.F3 == 0 && PORTD.F2 == 0) { RotateStop_AZ(); //Стоп LCD_Chr(2,16,'S'); } if (PORTD.F3 == 1 && PORTD.F2 == 1) { RotateStop_AZ(); //Стоп LCD_Chr(2,16,'S'); } Zerocalibr_AZ(); //Модуль калибровки 000 AZ and EL Tuning_menu_selector();//Переключатель менюшек настройки }//Конец меню калибровки 000 Азимута //-------------------------------------------------------------------------------------------------------------------------------- if (current_menu == 1) {//Меню калибровки 000 Элевации setOverwind = 0; //Обнулим флаг записи углов перекрута setMaxElevate = 0; //Обнулим флаг записи максимального угла подъёма LCD_Chr(1,1,'C');//Заголовок меню калибровки 000 LCD_Chr_CP('a'); LCD_Chr_CP('l'); LCD_Chr_CP('i'); LCD_Chr_CP('b'); LCD_Chr_CP('.'); LCD_Chr_CP('Z'); LCD_Chr_CP('e'); LCD_Chr_CP('r'); LCD_Chr_CP('o'); LCD_Chr_CP('p'); LCD_Chr_CP('o'); LCD_Chr_CP('i'); LCD_Chr_CP('n'); LCD_Chr_CP('t'); LCD_Chr(2,2,'E'); LCD_Chr_CP('l'); LCD_Chr_CP('e'); LCD_Chr_CP('v'); LCD_Chr_CP('a'); LCD_Chr_CP('t'); LCD_Chr_CP('e'); LCD_Chr_CP(':'); //Выводим значения угла для калибровки PORTC.F0 = 0; //Включаем чтение с интерфейсной платы Read_Angle_EL(); //Читаем угол подьёма Words_status_EL(); //Формирование 10-битного числа угла //Выодим элевацию tlong1 = (long)angle_up1 * 3597; // covert adc reading to milivolts tlong1 = tlong1 / 1023; // 0..1023 -> 0-5000mV ch1 = (tlong1 / 1000) % 10; // extract 0.1 volts digit LCD_Chr(2,10,48+ch1); // write ASCII digit at cursor point ch1 = (tlong1 / 100) % 10; LCD_Chr_CP(48+ch1); ch1 = (tlong1 / 10) % 10; // extract 0.01 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point LCD_Chr_CP('.'); ch1 = tlong1 % 10; // extract 0.001 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point */ LCD_Chr_CP(grad);//знак градус delay_ms(50); if (PORTD.F3 == 1 && PORTD.F2 == 0) { //Вращение вверх RotateUp(); LCD_Chr(2,16,'U'); } if (PORTD.F3 == 0 && PORTD.F2 == 1) { //Вращение вниз RotateDown(); LCD_Chr(2,16,'D'); } if (PORTD.F3 == 0 && PORTD.F2 == 0) { RotateStop_EL(); //Стоп элевация LCD_Chr(2,16,'S'); } if (PORTD.F3 == 1 && PORTD.F2 == 1) { RotateStop_EL(); //Стоп элевация LCD_Chr(2,16,'S'); } Zerocalibr_EL(); //Модуль калибровки 000 AZ and EL Tuning_menu_selector();//Переключатель менюшек настройки } //------------------------------------------------------------------------------------------------------------------------------ if (current_menu == 2) {//Меню калибровки углов перекрута азимута setMaxElevate = 0; //Обнулим флаг записи максимального угла подъёма LCD_Chr(1,1,' ');//Заголовок меню LCD_Chr_CP('S'); LCD_Chr_CP('e'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr_CP('o'); LCD_Chr_CP('v'); LCD_Chr_CP('e'); LCD_Chr_CP('r'); LCD_Chr_CP('r'); LCD_Chr_CP('o'); LCD_Chr_CP('t'); LCD_Chr_CP('a'); LCD_Chr_CP('t'); LCD_Chr_CP('e'); LCD_Chr_CP(' '); LCD_Chr(2,1,' '); LCD_Chr_CP('A'); LCD_Chr_CP('n'); LCD_Chr_CP('g'); LCD_Chr_CP('l'); LCD_Chr_CP('e'); LCD_Chr_CP(':'); //Выводим значения угла перекрута tlong1 = (long)angOwerwindRight * 3600; // covert adc reading to milivolts tlong1 = tlong1 / 1023; // 0..1023 -> 0-5000mV ch1 = (tlong1 / 1000) % 10; // extract 0.1 volts digit LCD_Chr(2,8,48+ch1); // write ASCII digit at cursor point ch1 = (tlong1 / 100) % 10; LCD_Chr_CP(48+ch1); ch1 = (tlong1 / 10) % 10; // extract 0.01 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point LCD_Chr_CP('.'); ch1 = tlong1 % 10; // extract 0.001 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point */ LCD_Chr_CP(grad);//знак градус if(setOverwind == 0) { LCD_Chr(2,14,' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if(setOverwind == 1) { LCD_Chr(2,14,'M'); LCD_Chr_CP('E'); LCD_Chr_CP('M'); } //Изменяем значение углов перекрута кнопками if (PORTD.F3 == 0 && PORTD.F2 == 1) { //Увеличиваем угол угол angOwerwindRight++; if(angOwerwindRight > 0x180) { angOwerwindRight = 0x180; } angOwerwindLeft = 0x3FF - angOwerwindRight; setOverwind = 0; //Обнулим флаг записи углов перекрута delay_ms(100); } if (PORTD.F3 == 1 && PORTD.F2 == 0) { //Уменьшаем угол angOwerwindRight--; if(angOwerwindRight < 0x00) { angOwerwindRight = 0x00; } angOwerwindLeft = 0x3FF - angOwerwindRight; setOverwind = 0; //Обнулим флаг записи углов перекрута delay_ms(100); } if (PORTD.F0 == 1) {//Сохраняем значения перекрута в EEPROM byte_save = angOwerwindRight >> 24; //Старший байт значения EEprom_Write(0x08, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = angOwerwindRight >> 16; //байт после старшего EEprom_Write(0x09, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = angOwerwindRight >> 8; //байт перед младшим EEprom_Write(0x0A, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = angOwerwindRight; //байт младший EEprom_Write(0x0B, byte_save); //Записываем в ячейку памяти delay_ms(30); setOverwind = 1; } Tuning_menu_selector();//Переключатель менюшек настройки } //------------------------------------------------------------------------------------------------------------------------------- if (current_menu == 3) {//Меню калибровки Максимального угла подъёма setOverwind = 0; //Обнулим флаг записи углов перекрута setPulseZone = 0; //Обнулим флаг записи зоны толчкового режима LCD_Chr(1,1,' ');//Заголовок меню калибровки 000 LCD_Chr_CP('S'); LCD_Chr_CP('e'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr_CP('u'); LCD_Chr_CP('p'); LCD_Chr_CP('l'); LCD_Chr_CP('i'); LCD_Chr_CP('m'); LCD_Chr_CP('i'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); LCD_Chr(2,1,' '); LCD_Chr_CP('A'); LCD_Chr_CP('n'); LCD_Chr_CP('g'); LCD_Chr_CP('l'); LCD_Chr_CP('e'); LCD_Chr_CP(':'); if(setMaxElevate == 0) { LCD_Chr(2,14,' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if(setMaxElevate == 1) { LCD_Chr(2,14,'M'); LCD_Chr_CP('E'); LCD_Chr_CP('M'); } //Выводим значение максимального угла подъёма //Выводим значения угла перекрута tlong1 = (long)angMaxElevate * 3600; // covert adc reading to milivolts tlong1 = tlong1 / 1023; // 0..1023 -> 0-5000mV ch1 = (tlong1 / 100) % 10; // extract 0.1 volts digit LCD_Chr(2,8,48+ch1); // write ASCII digit at cursor point ch1 = (tlong1 / 10) % 10; // extract 0.01 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point LCD_Chr_CP('.'); ch1 = tlong1 % 10; // extract 0.001 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point */ LCD_Chr_CP(grad);//знак градус LCD_Chr_CP(' '); //Изменяем значение углов перекрута кнопками if (PORTD.F3 == 0 && PORTD.F2 == 1) { //Увеличиваем угол угол angMaxElevate++; if(angMaxElevate > 0x100) { angMaxElevate = 0x100; } setMaxElevate = 0; //Обнулим флаг записи максимального угла подъёма delay_ms(100); } if (PORTD.F3 == 1 && PORTD.F2 == 0) { //Уменьшаем угол angMaxElevate--; if(angMaxElevate < 0x00) { angMaxElevate = 0x00; } setMaxElevate = 0; //Обнулим флаг записи максимального угла подъёма delay_ms(100); } if (PORTD.F0 == 1) {//Сохраняем значения максимального подъёма в EEPROM byte_save = angMaxElevate >> 24; //Старший байт значения EEprom_Write(0x0C, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = angMaxElevate >> 16; //байт после старшего EEprom_Write(0x0D, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = angMaxElevate >> 8; //байт перед младшим EEprom_Write(0x0E, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = angMaxElevate; //байт младший EEprom_Write(0x0F, byte_save); //Записываем в ячейку памяти delay_ms(30); setMaxElevate = 1; } Tuning_menu_selector();//Переключатель менюшек настройки } //------------------------------------------------------------------------------------------------------------------------------- if (current_menu == 4) {//Меню калибровки Зоны азимута перехода к толчковому режиму setOverwind = 0; //Обнулим флаг записи углов перекрута setMaxElevate = 0; //Обнулим флаг записи максимального угла подъёма setPulseZone_up = 0; LCD_Chr(1,1,' ');//Заголовок меню LCD_Chr_CP('S'); LCD_Chr_CP('e'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr_CP('p'); LCD_Chr_CP('u'); LCD_Chr_CP('l'); LCD_Chr_CP('s'); LCD_Chr_CP('e'); LCD_Chr_CP(' '); LCD_Chr_CP('z'); LCD_Chr_CP('o'); LCD_Chr_CP('n'); LCD_Chr_CP('e'); LCD_Chr(2,1,' '); LCD_Chr_CP(' '); LCD_Chr_CP('A'); LCD_Chr_CP('z'); LCD_Chr_CP('i'); LCD_Chr_CP('m'); LCD_Chr_CP(':'); if(setPulseZone == 0) { LCD_Chr(2,14,' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if(setPulseZone == 1) { LCD_Chr(2,14,'M'); LCD_Chr_CP('E'); LCD_Chr_CP('M'); } //Выводим значение угла зоны толчкового режима //Выводим значения угла перекрута tlong1 = (long)angPulseZone * 3600; // covert adc reading to milivolts tlong1 = tlong1 / 1023; // 0..1023 -> 0-5000mV ch1 = (tlong1 / 100) % 10; // extract 0.1 volts digit LCD_Chr(2,8,48+ch1); // write ASCII digit at cursor point ch1 = (tlong1 / 10) % 10; // extract 0.01 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point LCD_Chr_CP('.'); ch1 = tlong1 % 10; // extract 0.001 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point */ LCD_Chr_CP(grad);//знак градус LCD_Chr_CP(' '); //Изменяем значение углов перекрута кнопками if (PORTD.F3 == 0 && PORTD.F2 == 1) { //Увеличиваем угол угол angPulseZone++; if(angPulseZone > 0x22) { angPulseZone = 0x22; } setPulseZone = 0; //Обнулим флаг записи зоны толчкового режима delay_ms(100); } if (PORTD.F3 == 1 && PORTD.F2 == 0) { //Уменьшаем угол angPulseZone--; if(angPulseZone < 0x03) { angPulseZone = 0x03; } setPulseZone = 0; //Обнулим флаг записи зоны толчкового режима delay_ms(100); } if (PORTD.F0 == 1) {//Сохраняем значение угла начала толчкового режима в EEPROM byte_save = angPulseZone >> 24; //Старший байт значения EEprom_Write(0x10, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = angPulseZone >> 16; //байт после старшего EEprom_Write(0x11, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = angPulseZone >> 8; //байт перед младшим EEprom_Write(0x12, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = angPulseZone; //байт младший EEprom_Write(0x13, byte_save); //Записываем в ячейку памяти delay_ms(30); setPulseZone = 1; } Tuning_menu_selector();//Переключатель менюшек настройки } //------------------------------------------------------------------------------------------------------------------------------- if (current_menu == 5) {//Меню калибровки Зоны элевации перехода к толчковому режиму setOverwind = 0; //Обнулим флаг записи углов перекрута setMaxElevate = 0; //Обнулим флаг записи максимального угла подъёма setPulseZone = 0; set_step_AZ = 0; setPulseZone = 0; LCD_Chr(1,1,' ');//Заголовок меню LCD_Chr_CP('S'); LCD_Chr_CP('e'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr_CP('p'); LCD_Chr_CP('u'); LCD_Chr_CP('l'); LCD_Chr_CP('s'); LCD_Chr_CP('e'); LCD_Chr_CP(' '); LCD_Chr_CP('z'); LCD_Chr_CP('o'); LCD_Chr_CP('n'); LCD_Chr_CP('e'); LCD_Chr(2,1,' '); LCD_Chr_CP(' '); LCD_Chr_CP('E'); LCD_Chr_CP('l'); LCD_Chr_CP('e'); LCD_Chr_CP('v'); LCD_Chr_CP(':'); if(setPulseZone_up == 0) { LCD_Chr(2,14,' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if(setPulseZone_up == 1) { LCD_Chr(2,14,'M'); LCD_Chr_CP('E'); LCD_Chr_CP('M'); } //Выводим значение угла зоны толчкового режима //Выводим значения угла перекрута tlong1 = (long)angPulseZone_up * 3600; // covert adc reading to milivolts tlong1 = tlong1 / 1023; // 0..1023 -> 0-5000mV ch1 = (tlong1 / 100) % 10; // extract 0.1 volts digit LCD_Chr(2,8,48+ch1); // write ASCII digit at cursor point ch1 = (tlong1 / 10) % 10; // extract 0.01 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point LCD_Chr_CP('.'); ch1 = tlong1 % 10; // extract 0.001 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point */ LCD_Chr_CP(grad);//знак градус LCD_Chr_CP(' '); //Изменяем значение углов перекрута кнопками if (PORTD.F3 == 0 && PORTD.F2 == 1) { //Увеличиваем угол угол angPulseZone_up++; if(angPulseZone_up > 0x22) { angPulseZone_up = 0x22; } setPulseZone_up = 0; //Обнулим флаг записи зоны толчкового режима delay_ms(100); } if (PORTD.F3 == 1 && PORTD.F2 == 0) { //Уменьшаем угол angPulseZone_up--; if(angPulseZone_up < 0x03) { angPulseZone_up = 0x03; } setPulseZone_up = 0; //Обнулим флаг записи зоны толчкового режима delay_ms(100); } if (PORTD.F0 == 1) {//Сохраняем значение угла начала толчкового режима в EEPROM byte_save = angPulseZone_up >> 24; //Старший байт значения EEprom_Write(0x18, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = angPulseZone_up >> 16; //байт после старшего EEprom_Write(0x19, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = angPulseZone_up >> 8; //байт перед младшим EEprom_Write(0x1A, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = angPulseZone_up; //байт младший EEprom_Write(0x1B, byte_save); //Записываем в ячейку памяти delay_ms(30); setPulseZone_up = 1; } Tuning_menu_selector();//Переключатель менюшек настройки } //------------------------------------------------------------------------------------------------------------------------------ if (current_menu == 6) {//Меню калибровки Длительности шага подстройки азимута в толчковом режиме setPulseZone = 0; set_step_EL = 0; LCD_Chr(1,1,'P');//Заголовок меню LCD_Chr_CP('u'); LCD_Chr_CP('l'); LCD_Chr_CP('s'); LCD_Chr_CP('e'); LCD_Chr_CP(' '); LCD_Chr_CP('l'); LCD_Chr_CP('e'); LCD_Chr_CP('n'); LCD_Chr_CP('g'); LCD_Chr_CP('h'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); LCD_Chr(2,1,' '); LCD_Chr_CP('A'); LCD_Chr_CP('z'); LCD_Chr_CP('i'); LCD_Chr_CP('m'); LCD_Chr_CP(':'); LCD_Chr(2,10,'m'); LCD_Chr_CP('s'); LCD_Chr_CP(' '); if(set_step_AZ == 0) { LCD_Chr(2,14,' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if(set_step_AZ == 1) { LCD_Chr(2,14,'M'); LCD_Chr_CP('E'); LCD_Chr_CP('M'); } //Выводим значение длительности шага в милисекундах tlong1 = (long)steps_AZ * 10000; // covert adc reading to milivolts tlong1 = tlong1 / 1023; // 0..1023 -> 0-5000mV ch1 = (tlong1 / 1000) % 10; // extract 0.1 volts digit LCD_Chr(2,7,48+ch1); // write ASCII digit at cursor point ch1 = (tlong1 / 100) % 10; LCD_Chr_CP(48+ch1); ch1 = (tlong1 / 10) % 10; // extract 0.01 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point //Изменяем значение длительности шага в милисекундах if (PORTD.F3 == 0 && PORTD.F2 == 1) { //Увеличиваем угол угол steps_AZ++; if(steps_AZ > 0x7FFF) { steps_AZ = 0x7FFF; } set_step_AZ = 0; //Обнулим флаг записи длительности шага азимута delay_ms(100); } if (PORTD.F3 == 1 && PORTD.F2 == 0) { //Уменьшаем угол steps_AZ--; if(steps_AZ < 0x00) { steps_AZ = 0x00; } set_step_AZ = 0; //Обнулим флаг записи длительности шага азимута delay_ms(100); } if (PORTD.F0 == 1) {//Сохраняем значение длительности шага азимута byte_save = steps_AZ >> 8; //байт перед младшим EEprom_Write(0x14, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = steps_AZ; //байт младший EEprom_Write(0x15, byte_save); //Записываем в ячейку памяти delay_ms(30); set_step_AZ = 1; } Tuning_menu_selector();//Переключатель менюшек настройки } //------------------------------------------------------------------------------------------------------------------------------ if (current_menu == 7) {//Меню калибровки Длительности шага подстройки элевации в толчковом режиме setPulseZone = 0; set_step_AZ = 0; set_inputOutside = 0; LCD_Chr(1,1,'P');//Заголовок меню LCD_Chr_CP('u'); LCD_Chr_CP('l'); LCD_Chr_CP('s'); LCD_Chr_CP('e'); LCD_Chr_CP(' '); LCD_Chr_CP('l'); LCD_Chr_CP('e'); LCD_Chr_CP('n'); LCD_Chr_CP('g'); LCD_Chr_CP('h'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); LCD_Chr(2,1,' '); LCD_Chr_CP('E'); LCD_Chr_CP('l'); LCD_Chr_CP('e'); LCD_Chr_CP('v'); LCD_Chr_CP(':'); LCD_Chr(2,10,'m'); LCD_Chr_CP('s'); LCD_Chr_CP(' '); if(set_step_EL == 0) { LCD_Chr(2,13,' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if(set_step_EL == 1) { LCD_Chr(2,14,'M'); LCD_Chr_CP('E'); LCD_Chr_CP('M'); } //Выводим значение длительности шага в милисекундах tlong1 = (long)steps_EL * 10000; // covert adc reading to milivolts tlong1 = tlong1 / 1023; // 0..1023 -> 0-5000mV ch1 = (tlong1 / 1000) % 10; // extract 0.1 volts digit LCD_Chr(2,7,48+ch1); // write ASCII digit at cursor point ch1 = (tlong1 / 100) % 10; LCD_Chr_CP(48+ch1); ch1 = (tlong1 / 10) % 10; // extract 0.01 volts digit LCD_Chr_CP(48+ch1); // write ASCII digit at cursor point //Изменяем значение длительности шага в милисекундах if (PORTD.F3 == 0 && PORTD.F2 == 1) { //Увеличиваем угол угол steps_EL++; if(steps_AZ > 0x7FFF) { steps_EL = 0x7FFF; } set_step_AZ = 0; //Обнулим флаг записи длительности шага азимута delay_ms(100); } if (PORTD.F3 == 1 && PORTD.F2 == 0) { //Уменьшаем угол steps_EL--; if(steps_AZ < 0x00) { steps_EL = 0x00; } set_step_EL = 0; //Обнулим флаг записи длительности шага азимута delay_ms(100); } if (PORTD.F0 == 1) {//Сохраняем значение длительности шага азимута byte_save = steps_EL >> 8; //байт перед младшим EEprom_Write(0x16, byte_save); //Записываем в ячейку памяти delay_ms(30); byte_save = steps_EL; //байт младший EEprom_Write(0x17, byte_save); //Записываем в ячейку памяти delay_ms(30); set_step_EL = 1; } Tuning_menu_selector();//Переключатель менюшек настройки } //------------------------------------------------------------------------------------------------------------------------------- if (current_menu == 8) {//Меню выбора порта соединения с ПК set_step_AZ = 0; LCD_Chr(1,1,' ');//Заголовок меню LCD_Chr_CP(' '); LCD_Chr_CP('S'); LCD_Chr_CP('e'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr_CP('C'); LCD_Chr_CP('O'); LCD_Chr_CP('M'); LCD_Chr_CP('-'); LCD_Chr_CP('p'); LCD_Chr_CP('o'); LCD_Chr_CP('r'); LCD_Chr_CP('t'); LCD_Chr_CP(' '); LCD_Chr(2,1,' '); LCD_Chr_CP('P'); LCD_Chr_CP('o'); LCD_Chr_CP('r'); LCD_Chr_CP('t'); LCD_Chr_CP('-'); if(inputOutside == 0) { LCD_Chr(2,7,'1'); LCD_Chr_CP('-'); LCD_Chr_CP('R'); LCD_Chr_CP('S'); LCD_Chr_CP('2'); LCD_Chr_CP('3'); LCD_Chr_CP('2'); } if(inputOutside == 1) { LCD_Chr(2,7,'2'); LCD_Chr_CP('-'); LCD_Chr_CP('U'); LCD_Chr_CP('S'); LCD_Chr_CP('B'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if(inputOutside == 2) { LCD_Chr(2,7,'3'); LCD_Chr_CP('-'); LCD_Chr_CP('B'); LCD_Chr_CP('t'); LCD_Chr_CP('h'); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if(set_inputOutside == 0) { LCD_Chr(2,14,' '); LCD_Chr_CP(' '); LCD_Chr_CP(' '); } if(set_inputOutside == 1) { LCD_Chr(2,14,'M'); LCD_Chr_CP('E'); LCD_Chr_CP('M'); } if (PORTD.F3 == 0 && PORTD.F2 == 1) { //Изменяем порт связи с ПК inputOutside++; if(inputOutside > 2) { steps_EL = 2; } set_inputOutside = 0; //Обнулим флаг записи длительности шага азимута delay_ms(300); } if (PORTD.F3 == 1 && PORTD.F2 == 0) { //Уменьшаем угол inputOutside--; if(inputOutside < 0) { inputOutside = 0; } set_inputOutside = 0; //Обнулим флаг записи длительности шага азимута delay_ms(300); } if (PORTD.F0 == 1) {//Сохраняем значение порта связи с ПК byte_save = inputOutside; //байт EEprom_Write(0x1E, byte_save); //Записываем в ячейку памяти delay_ms(30); set_inputOutside = 1; } Tuning_menu_selector();//Переключатель менюшек настройки } } } //------------------------------------------------------------------------------------------------------------------------------- } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 27 августа, 2016 Поделиться Опубликовано 27 августа, 2016 VladimirVU 1. будите выкладывать такие простыни без спойлера - накажу 2. прежде чем постить смотрите на даты сообщений 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
VladimirVU Опубликовано 27 августа, 2016 Поделиться Опубликовано 27 августа, 2016 IMXO фак точно. Дико извеняюсь 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Ratamahatta Опубликовано 31 августа, 2016 Поделиться Опубликовано 31 августа, 2016 а мне никто не подскажет, в чём косяк? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 31 августа, 2016 Поделиться Опубликовано 31 августа, 2016 здесь редко пользуют микрос, поэтому и нет ответов... в чём косяк? рекурсия?????+ нет предопределения функций 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
КЭС Опубликовано 6 сентября, 2016 Поделиться Опубликовано 6 сентября, 2016 Ratamahatta, запустить проект не на чем, смотрел блокнотом. Пока вижу, что расположение процедур "не по порядку", т.е. вызываемая процедура должна быть расположена выше места, откуда она вызывается. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.