Главная » Статьи » Полезные материалы |
Наверняка у многих радиолюбителей, работающих с PIC контроллерами, есть программатор PICkit 2 фирмы Microchip, который подключается к компьютеру через USB порт. С точки зрения программиста, PICkit 2 является обычным USB HID устройством, с которым можно "общаться" с помощью своих программ. О нескольких таких программах далее пойдет речь. Первая программа, просто перезагружает программатор PICkit 2 и после её запуска, услышите характерные звуки отключения и подключения USB устройства. Code #USB_PID = $33 ; Идентификаторы программатора PicKit2 #USB_VID = $4D8 #END_OF_BUFFER = $AD ; Этим заполняеся пустое просторанство в буфере #PACKET_SIZE = 65 ; Размер HID репорта для программатора Procedure ResetPICkit2(Handle) ; Сброс (перезагрузка) PICkit2 Dim OutBuffer.a(#PACKET_SIZE+2) FillMemory(@OutBuffer()+1, #PACKET_SIZE, #END_OF_BUFFER, #PB_Byte) ; Заполнение массива, данными из константы #END_OF_BUFFER OutBuffer(0)=0 OutBuffer(1)=$AE ; RESET ProcedureReturn HID_Lib_WriteDevice(Handle, @OutBuffer(), #PACKET_SIZE) ; Передача данных в программатор PICkit2 EndProcedure Handle=HID_Lib_OpenDevice(#USB_PID, #USB_VID) ; Установка связи с PicKit2 If Handle ResetPICkit2(Handle) ; Сброс (перезагрузка) PICkit2 HID_Lib_CloseDevice(Handle) ; Разрыв связи с PicKit2 Else MessageRequester("", "Нет связи с PicKit2!", 48) EndIf Вторая программа, подает питание на программируемый микроконтроллер и через две секунды, отключает его, о чем свидетельствует мигание светодиода Target в PicKit2. Code #USB_PID = $33 ; Идентификаторы программатора PicKit2 #USB_VID = $4D8 #END_OF_BUFFER = $AD ; Этим заполняеся пустое просторанство в буфере #PACKET_SIZE = 65 ; Размер HID репорта программатора Procedure VddOn(Handle) ; Включить питание Dim OutBuffer.a(#PACKET_SIZE+2) FillMemory(@OutBuffer()+1, #PACKET_SIZE, #END_OF_BUFFER, #PB_Byte) ; Заполнение массива, данными из константы #END_OF_BUFFER OutBuffer(0)=0 OutBuffer(1)=$A6 ; EXECUTE_SCRIPT OutBuffer(2)=2 OutBuffer(3)=$FC ; _VDD_GND_OFF OutBuffer(4)=$FF ; _VDD_ON ProcedureReturn HID_Lib_WriteDevice(Handle, @OutBuffer(), #PACKET_SIZE) ; Передача данных в программатор PICkit2 EndProcedure Procedure VddOff(Handle) ; Выключить питание Dim OutBuffer.a(#PACKET_SIZE+2) FillMemory(@OutBuffer()+1, #PACKET_SIZE, #END_OF_BUFFER, #PB_Byte) ; Заполнение массива, данными из константы #END_OF_BUFFER OutBuffer(0)=0 OutBuffer(1)=$A6 ; EXECUTE_SCRIPT OutBuffer(2)=2 OutBuffer(3)=$FE ; _VDD_OFF OutBuffer(4)=$FD ; _VDD_GND_ON ProcedureReturn HID_Lib_WriteDevice(Handle, @OutBuffer(), #PACKET_SIZE) ; Передача данных в программатор PICkit2 EndProcedure Handle=HID_Lib_OpenDevice(#USB_PID, #USB_VID) ; Установка связи с PicKit2 If Handle VddOn(Handle) ; Включить питание Delay(2000) ; Пауза 2 секунды VddOff(Handle) ; Выключить питание HID_Lib_CloseDevice(Handle) ; Разрыв связи с PicKit2 Else MessageRequester("", "Нет связи с PicKit2!", 48) EndIf Следующая программа, позволяет узнать нажата ли кнопка в программаторе PICkit 2. После ее запуска, появится окно
В этом окне отображается текущее состояние кнопки, находящейся в программаторе. Code #USB_PID = $33 ; Идентификаторы программатора PicKit2. #USB_VID = $4D8 #END_OF_BUFFER = $AD ; Этим заполняеся пустое просторанство в буфере. #PACKET_SIZE = 65 ; Размер HID репорта программатора. #NO_Device = "Нет связи с PicKit2" Procedure.u Read_Status(Handle) ; Чтение состояния программатора PicKit2. ; Data[1] = Status Low ; <7> unused ; <6> 1 = PICkit 2 button pressed ; <5> 1 = VppError (Vpp < Vfault) ; <4> 1 = VddError (Vdd < Vfault) ; <3> 1 = Vpp On ; <2> 1 = Vpp GND On ; <1> 1 = Vdd On ; <0> 1 = Vdd GND On ; Data[2] = Status High ; <7> 1 = Download Buffer Overflow ; <6> 1 = Script Buffer Overflow, invalid ; Script length Or index ; <5> 1 = Run Script on Empty Script ; <4> 1 = Script abort- download empty ; <3> 1 = Script abort- upload full ; <2> 1 = ICD transfer timeout/Bus Error ; <1> 1 = UART Mode enabled ; <0> 1 = PICkit 2 reset since last ; Status Read. ; NOTE: Turns BUSY_LED off. St.u=0 ; Переменная типа Unicode (беззнаковая, 2 байта) Dim InBuffer.a(#PACKET_SIZE+2) ; Массив, использующися как буфер приёма от PICkit2. Dim OutBuffer.a(#PACKET_SIZE+2) ; Массив, использующися как буфер передачи в PICkit2. FillMemory(@OutBuffer()+1, #PACKET_SIZE, #END_OF_BUFFER, #PB_Byte) ; Заполнение массива, данными из константы #END_OF_BUFFER. OutBuffer(0)=0 OutBuffer(1)=$A2 ; READ_STATUS If HID_Lib_WriteDevice(Handle, @OutBuffer(), #PACKET_SIZE) = #PACKET_SIZE ; Передача данных в программатор PICkit2. If HID_Lib_ReadDevice(Handle, @InBuffer(), #PACKET_SIZE) = #PACKET_SIZE ; Чтение данных из программатора PICkit2. CopyMemory(@InBuffer()+1, @St, 2) ; Копирование данных из массива в переменную. EndIf EndIf ProcedureReturn St EndProcedure Procedure Timer1() ; Эта процедура вызывается по таймеру, каждые 100 мс. Shared Handle Static Old_Test Test=HID_Lib_DeviceTest(#USB_PID, #USB_VID) ; Есть ли требуемое USB HID устройство? If Test<>Old_Test Old_Test=Test If Test HID_Lib_CloseDevice(Handle) Handle=HID_Lib_OpenDevice(#USB_PID, #USB_VID) ; Подключение к USB HID устройству. SetGadgetText(0,"PicKit2 подключён") Else HID_Lib_CloseDevice(Handle) ; Разрыв связи с USB HID устройством. Handle=0 SetGadgetText(0,#NO_Device) SetGadgetText(2,"НЕТ") EndIf EndIf If Test=1 ; Программатор подключён PICkit2 и нормально работает. Status.u=Read_Status(Handle) ; Получаем данные о статусе программатора If Status & %01000000 >0 ; и выделяем данные о состоянии кнопки. SetGadgetText(2,"ДА") Else SetGadgetText(2,"НЕТ") EndIf EndIf EndProcedure ; Открываем окно OpenWindow(0,0,0,140,80,"PICkit2",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) TextGadget(0,2,2,140,16, #NO_Device, #PB_Text_Center) ; Здесь отображается полключён ли PicKit2. TextGadget(1,10,40,80,16,"Нажата кнопка") TextGadget(2,100,40,40,16,"НЕТ") ; Здесь отображается состояние кнопки. SetGadgetColor(2, #PB_Gadget_FrontColor, $FD0402) AddWindowTimer(0,1,100) ; Запуск таймера с периодом 100 мс. Repeat ; Начало главного цикла Event=WaitWindowEvent() If Event=#PB_Event_Timer And EventTimer()=1 ; Сработал таймер. Timer1() EndIf Until Event=#PB_Event_CloseWindow ; Событие закрытия окна - прерываем цикл. Для компиляции программ, нужно установить библиотеку HID_Lib. Скачать скомпилированные программы с их исходными текстами | |||
Просмотров: 14767 | | |
Всего комментариев: 0 | |