Главная » Статьи » Полезные материалы

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

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




Категория: Полезные материалы | Добавил: PB (14.07.2010)
Просмотров: 14502 | Теги: программатор, HID, USB, PureBasic, Программирование, PICkit 2, отладчик | Рейтинг: 5.0/2
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]