Работа с программатором PICkit 2

        Наверняка у многих радиолюбителей, работающих с PIC контроллерами, есть программатор PICkit 2 фирмы Microchip, который подключается к компьютеру через USB порт.
Выглядит он вот так:

PICkit 2


С точки зрения программиста, PICkit 2 является обычным USB HID устройством, с которым можно "общаться" с помощью своих программ.
О нескольких таких программах далее пойдет речь.


Первая программа, просто перезагружает программатор PICkit 2 и после её запуска, услышите характерные звуки отключения и подключения USB устройства.  
Код:
#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.
После этого, программа завершает свою работу не создавая никаких окон.
Код:
#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. После ее запуска, появится окно

рисунок

В этом окне отображается текущее состояние кнопки, находящейся в программаторе.
Код:
#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.
Нужен компилятор PureBasic 4.40 или выше.

Скачать скомпилированные программы с их исходными текстами.

Статьи                Главная
Сайт создан в системе uCoz