; ******************* ; Базовые процедуры ; ******************* Global ComProg_Delay.l ; Задержка, заданная в микросекундах Global ComProg_DataOut_Inv.c ; Инверсия отправляемых данных по DTR (1-инверсия, 0-нет) Global ComProg_DataIn_Inv.c ; Инверсия входящих данных по CTS (1-инверсия, 0-нет) Global ComProg_Clock_Inv.c ; Инверсия строба по RTS (1-инверсия, 0-нет) Global ComProg_Pitanie.c ; Инверсия напряжения программирования (1-инверсия, 0-нет) Global ComPortName.s ; Имя порта, через который происходит программирование Global ComProg_ComId.l=0 ; Идентификатор открытого COM порта. Procedure ComProg_Init() ; Чтение настроек из файла Preferences.ini If OpenPreferences("Preferences.ini")=0 MessageRequester("Ошибка", "Файл Preferences.ini не найден", 16) EndIf ; Чтение данных ComProg_Delay = ReadPreferenceLong("ComProg_Delay",200) ComProg_DataOut_Inv = ReadPreferenceLong("ComProg_DataOut_Inv",0) ComProg_DataIn_Inv = ReadPreferenceLong("ComProg_DataIn_Inv",0) ComProg_Clock_Inv = ReadPreferenceLong("ComProg_Clock_Inv",0) ComProg_Pitanie = ReadPreferenceLong("ComProg_Pitanie",0) ComPortName = ReadPreferenceString("ComPortName","COM1") ClosePreferences() EndProcedure Procedure ComProg_Test() ; Проверяется есть ли программатор (перемычка между DSR и RTS) Delay(10) ; Пауза на 10 мс. ComSetRTS(ComProg_ComId,1) ; Установка лог. 1 на выводе RTS Delay(10) ; Пауза на 10 мс. If ComGetDSR(ComProg_ComId)<>1 ProcedureReturn 0 ; Ошибка, обратной связи нет! EndIf ComSetRTS(ComProg_ComId,0) ; Установка лог. 0 на выводе RTS Delay(10) ; Пауза на 10 мс. If ComGetDSR(ComProg_ComId)<>0 ProcedureReturn 0 ; Ошибка, обратной связи нет! EndIf Delay(10) ; Пауза на 10 мс. ProcedureReturn 1 ; Программатор обнаружен. EndProcedure Procedure.c ComProg_DataIn() ; Чтение одного бита из микроконтроллера If ComProg_Clock_Inv=1 ; Нужна инверсия такта Start.c=0 : Stop.c=1 Else ; Инверсия такта не требуется Start.c=1 : Stop.c=0 EndIf ComSetRTS(ComProg_ComId,Start) ; Фронт такта (или спад при инверсии) MicroDelayTimer(ComProg_Delay) ; Пауза ComSetRTS(ComProg_ComId,Stop) ; Спад такта (или фронт при инверсии) MicroDelayTimer(ComProg_Delay) ; Пауза MicroDelayTimer(ComProg_Delay) ; Пауза Bit.c=ComGetCTS(ComProg_ComId) ; Читаем бит If ComProg_DataIn_Inv=1 ; Нужна инверсия полученных данных Bit=Bit!1 ; Инвертируем данные EndIf ProcedureReturn Bit EndProcedure Procedure ComProg_DataOut(Bit.c) ; Отправка одного бита микроконтроллеру If Bit>0 Bit_x.c=1 ; Число в Bit больше нуля Else Bit_x.c=0 ; Число в Bit равно или меньше нуля EndIf If ComProg_DataOut_Inv=1 ; Нужна инверсия отправляемых данных Bit_x=Bit_x!1 ; Инвертируем данные EndIf If ComProg_Clock_Inv=1 ; Нужна инверсия такта Start.c=0 : Stop.c=1 Else ; Инверсия такта не требуется Start.c=1 : Stop.c=0 EndIf ComSetDTR(ComProg_ComId,Bit_x) ; Отправляем бит MicroDelayTimer(ComProg_Delay) ; Пауза MicroDelayTimer(ComProg_Delay) ; Пауза ComSetRTS(ComProg_ComId,Start) ; Фронт такта (или спад при инверсии) MicroDelayTimer(ComProg_Delay) ; Пауза ComSetRTS(ComProg_ComId,Stop) ; Спад такта (или фронт при инверсии) MicroDelayTimer(ComProg_Delay) ; Пауза EndProcedure Procedure ComProg_StartStop(State.c) ; Включает (State=1) или выключает (State=0) напряжение программирования. ; Установка лог. нуля на лини CLOCK If ComProg_Clock_Inv = 1 ; Требуется инверсия ComSetRTS(ComProg_ComId,1) Else ComSetRTS(ComProg_ComId,0) EndIf ; Установка лог. нуля на лини DATA If ComProg_DataOut_Inv = 1 ; Требуется инверсия ComSetDTR(ComProg_ComId,1) Else ComSetDTR(ComProg_ComId,0) EndIf Delay(40) If State>0 StatePit=1 Else StatePit=0 EndIf If ComProg_Pitanie=1 ; Требуется инверсия StatePit=StatePit!1 EndIf ComSetTXD(ComProg_ComId, StatePit) EndProcedure Procedure ComProg_OutByteCommand(DataOut.c) ; Передача команды программируемому микроконтроллеру For i=1 To 6 ; Цикл передачи команды (6 бит) Out.c=DataOut Out=Out & 1 ; Обнуление всех бит кроме нулевого ComProg_DataOut(Out) ; Отправляем бит микроконтроллеру DataOut=DataOut>>1 ; Сдвиг информации на одну позицию вправо. Next i EndProcedure Procedure ComProg_OutByteData(DataOut.l) ; Передача данных программируемому микроконтроллеру DataOut=DataOut<<1 ; Сдвиг информации на одну позицию влево DataOut=DataOut & %0111111111111110 ; Обнуление нулевого и пятнадцатого бита For i=1 To 16 ; Цикл передачи данных (16 бит) Out.l=DataOut Out=Out & 1 ; Обнуление всех бит кроме нулевого ComProg_DataOut(Out) ; Отправляем бит микроконтроллеру DataOut=DataOut>>1 ; Сдвиг информации на одну позицию вправо. Next i EndProcedure Procedure.l ComProg_InByteData() ; Чтение данных из программируемого микроконтроллера ; Установка высокого логического уровня на линии данных If ComProg_DataOut_Inv=1 ; Нужна инверсия логического уровня ComSetDTR(ComProg_ComId,0) Else ComSetDTR(ComProg_ComId,1) EndIf For i=1 To 16 ; Цикл приёма данных (16 бит) Bit.c=ComProg_DataIn() ; Чтение бита из микроконтроллера If Bit=0 ; Прочитанный бит равен нулю In=In & %0111111111111111 ; Обнуление 15 бита с помощью "логического И" Else ; Бит не равен нулю In=In | %1000000000000000 ; Установка 15 бита с помощью "логического ИЛИ" EndIf In=In>>1 ; Сдвиг информации на одну позицию вправо. Next i In=In & $3FFF ; Обнуление 14 и 15 бита ProcedureReturn In EndProcedure Procedure OpenCom_Port(Port.s) ; Открытие COM порта ResultPotr.s=Port+":9600,N,8,1" ComProg_ComId=ComOpen(ResultPotr,#HandShakeModeNone,1,1) ProcedureReturn ComProg_ComId EndProcedure Procedure CloseCom_Port() ; Закрытие COM порта ComClose(ComProg_ComId) ComProg_ComId=0 EndProcedure ; IDE Options = PureBasic 4.51 (Windows - x86) ; CursorPosition = 152 ; FirstLine = 140 ; Folding = --