Как связать pic18f4550 с ПК через usb?
|
|
tesla88 |
Дата: Сб, 06.04.2013, 08:46 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
Всем доброго времени суток!!! Возникла необходимость связать pic18f4550 с ПК через юсб. прочитав чудесную статью http://www.picbasic.ru/publ....-1-0-28 я столкнулся с проблемой: у меня контроллер уже стоит в железе и загружается через usb bootloader, но прошивка из статьи грузиться отказывается, я пологая что она не расчитана на загрузку с бутлоадера , но как быть в такой ситуации я не знаю, может кто занимался такой работой? и возможно ли написать программу в протоне , а не в swordfish? прелагаю фото девайся ( на всякий случай). И главный вопрос - можно ли переписать вот этот код под протон? Device = 18F4550 Clock = 48 '// 20Mhz crystal, 48Mhz internal (FS USB) Config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2, FOSC = HSPLL_HS, VREGEN = ON
'// this is the programs descriptor, generated by EasyHID - you '// can find it in the same folder as this program... #option USB_Descriptor = "USBProject1Desc.bas"
'// import the HID module... Include "usbhid.bas"
// an example TX report structure, which contains a message // string and two word values - the variable TXReport will overlay // the structure over the USB dual port RAM Buffer... Structure TTXReport Message As String ValueA As Word ValueB As Word End Structure Dim TXReport As TTXReport Absolute TXReportRAM
// an example RX report structure, which contains some bit // value and a configuration byte - the variable RXReport will overlay // the structure over the USB dual port RAM Buffer... Structure TRXReport LED0 As Bit LED1 As Bit Configuration As Byte End Structure Dim RXReport As TRXReport Absolute RXReportRAM
// rather than using the above structures, you can read and write data // directly into a Buffer array - choose which method you prefer - examples // are given in the main program block... Dim Buffer(32) As Byte
// connect to USB... Repeat Until Attached
// the main program loop shows two different ways in which you can read and // write HID data. The ReadReport() and WriteReport() techniques are very useful // when sending and receiving highly structured data (for example, string, bits, // words etc). If you just want to send and receive blocks of bytes, then // ReadArray() and WriteArray() are probably more useful - you can of course // use both ways! While true // this is one way you can read some HID data... If DataAvailable Then ReadReport // the data is now in our RX structure - for example, PORTD.0 = RXReport.LED0 etc... // Alternatively, you can access the Buffer directly as an array. For example, // HID.RXReport(0), HID.RXReport(1)... EndIf
// rather than using ReadReport(), as shown above, you can read data directly // into a Buffer array. For example, If DataAvailable Then ReadArray(Buffer,10) EndIf
// this is one way you can write some HID data... TXReport.Message = "Hello World" TXReport.ValueA = $1234 TXReport.ValueB = $0000 WriteReport // rather than using WriteReport(), as shown above, you can write data directly // into a Buffer array. For example, Buffer(0) = 0 Buffer(1) = 1 WriteArray(Buffer,2) Wend
Сообщение отредактировал
tesla88 - Сб, 06.04.2013, 09:12
|
|
|
|
shaman |
Дата: Сб, 06.04.2013, 09:42 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
День добрый ,вот что нашёл http://320volt.com/pic18f4550-uln2803-usb-ile-step-motor-kontrolu-vb6/
|
|
|
|
tesla88 |
Дата: Пн, 08.04.2013, 19:02 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
shaman спасибо за ссылку, по сути мне это и надо , НАШЁЛ ПЛАГИН ДЛЯ ПРОТОНА , вот только он для шестого визуал бейсика, а хотелось бы работать в десятом, может у кого есть мысли по этому поводу? Добавлено (08.04.2013, 19:02) --------------------------------------------- помогите к описанному выше проэкту добавить юсб бутлоадер? очень нужна помощь!!!
Сообщение отредактировал
tesla88 - Сб, 06.04.2013, 12:17
|
|
|
|
Andriy76 |
Дата: Пн, 08.04.2013, 22:40 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
231
Замечания:
±
На сайте с 06.04.2010
Статус:
Offline
|
Не знаю помогу Вам , но в Протоне вроде есть бутлодер . C:\Program Files\ProtonIDE\MCLoader . Пробуйте . Кроме того Админ выкладывал статью про ЮСБ вольтметр .
|
|
|
|
tesla88 |
Дата: Ср, 10.04.2013, 09:34 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
может кто знает как бороться с ключём дескриптора в протоне?
|
|
|
|
anatol |
Дата: Ср, 10.04.2013, 12:58 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
tesla88 когда поймешь ЧТО означает эта строчка - будешь знать как бороться. Подсказываю - настройки и пути....
|
|
|
|
Andriy76 |
Дата: Ср, 10.04.2013, 20:45 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
231
Замечания:
±
На сайте с 06.04.2010
Статус:
Offline
|
Как понял не видит файла который надо подключить . Найти в папках Протона и переместить что то или туда или сюда . В смысле или проэкт в папку с инклудом или инклуд в папку с проэктом .
|
|
|
|
tesla88 |
Дата: Пн, 15.04.2013, 15:43 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
В общем пока пишу на рыбе и не заморачиваюсь, вот только есть одна проблема - далее кусок программмы на vb6 , slider1 со шкалой до 1000 , а ячейка буфера (byte) до 255 и при превышении данного значения выдаёт ошибку переполнения буфера? можно ли как то объеденить несколько ячеек в одну? преложил архив проэкта)
Private Sub Slider1_Click() x = Slider1.Value Label1.Caption = x If x = 0 Then ProgressBar1.Value = x + 0.1 Else: ProgressBar1.Value = x End If BufferOut(21) = x WriteSomeData
Slider1.Value = 0 Slider2.Value = 0 Slider3.Value = 0 x = 0 End Sub
|
|
|
|
DAlexV |
Дата: Ср, 17.04.2013, 10:54 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Xhi=x\256 ' целочисленное деление if Xhi>0 then Xlo=x-Xhi*256 end if
В итоге Xhi- старший разряд, Xlo- младший Обратное преобразование примерно так x=Xhi*256+Xlo
Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал
DAlexV - Ср, 17.04.2013, 10:55
|
|
|
|
tesla88 |
Дата: Ср, 17.04.2013, 12:22 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
спасибо за совет? зделал всё именно так) vb6 HBx = Int(x / 256) HLx = x - 256 * HBx swordfish X = Buffer(1)*256+Buffer(2) этот метод работает на ура, вот только есть одна загвоздка - у меня три мотора ( которые должны работать одновременно) , приходят на контроллер 3 переменные ( по два байта), так как переменная x - это число от 0 до 10000 (в моём случае) то я пользовался циклом for to next , что бы эту переменную представить в виде эного количества импульсов на выходе мк - y = Buffer(3)*256+Buffer(4) z = Buffer(5)*256+Buffer(6) X = Buffer(1)*256+Buffer(2) dirx = buffer(7) diry = buffer(8) dirz = buffer(9) t = buffer(10) For Q = 0 To X M1 = 1 DelayMS (T) M1 = 0 DelayMS (T) Next For Q = 0 To Y M2 = 1 DelayMS (T) M2 = 0 DelayMS (T) Next For Q = 0 To Z M3 = 1 DelayMS (T) M3 = 0 DelayMS (T) Next но этот метод не подходит для одновременного управления моторами, так как все три цикла выполняются последовательно, может есть какая небудь команда типа - (...OUT PORTB, 1000) ?
|
|
|
|
DAlexV |
Дата: Ср, 17.04.2013, 12:59 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Цитата tesla88может есть какая небудь команда типа - (...OUT PORTB, 1000)Если про Рыбу, то такой команды нет. как вариант можно попробовать так:
if x>0 then Xon=1 ' где Xon флаг запуска мотора, то же для других end if if y>0 then Yon=1 end if if z>0 then Zon=1 end if
if Xon=1 then M1 = 1 DelayMS (T) M1 = 0 DelayMS (T) dec(x) if x=0 then Xon=0 end if end if
' то же для управления Y и Z
Оптимально это все загнать через таймер дабы не было ошибок при приеме данных.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
tesla88 |
Дата: Ср, 17.04.2013, 13:07 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
А как это всё увязать с таймером? для чего это всё с ним увязывать? я просто не когда не работал с таймером , поэтому прошу понять и прости
|
|
|
|
DAlexV |
Дата: Ср, 17.04.2013, 13:37 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Что бы не пропустить данные при приеме. Вот пример из Рыбы. Так же можно с помошью таймера можно избавиться от DelayMS (T) отдав данную задержку таймеру. И хотелось бы взглянуть на полный код, если не трудно
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
tesla88 |
Дата: Ср, 17.04.2013, 13:43 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
114
Замечания:
±
На сайте с 20.11.2010
Статус:
Offline
|
// устройство и частота Device = 18F4550 Clock = 48 // настроечные фьюсы Config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2, FOSC = HSPLL_HS, VREGEN = ON // настройки для LCD #option LCD_DATA = PORTD.4 #option LCD_RS = PORTD.1 #option LCD_EN = PORTD.0 '#option LCD_RW = PORTD.2 // подключаем дескриптор сгенерированный EasyHID #option USB_DESCRIPTOR = "USB_VBA_ProjectDesc.bas" // импортируем библиотеки
Include "ADC.bas" // ADC Include "convert.bas" // Конвертирование данных Include "LCD.bas" // LCD алфавитно-цифровой Include "usbhid.bas" // HID
// читаем значение канала АЦП и преобразовываем значение 0 - 5 Вольт... Function ADInAsVolt(Numn_Ch As Byte) As Word result = (ADC.Read(Numn_Ch) + 1) * 500 / 1024 End Function
Dim Buffer(64) As Byte // буффер для приема-отправки через USB Dim LED As PORTD.7 // светодиоды Dim KEY1 As PORTC.0 // Кнопка 1 Dim KEY2 As PORTC.1 // Кнопка 2 Dim M1 As PORTD.6 Dim M2 As PORTD.5 Dim M3 As PORTD.4 Dim DIRx As PORTC.7 Dim DIRy As PORTC.6 Dim DIRz As PORTD.3
Dim X As Byte // ПЕРЕМЕННАЯ ОСИ Х Dim Y As Byte // ПЕРЕМЕННАЯ ОСИ Y Dim Z As Byte // ПЕРЕМЕННАЯ ОСИ Z Dim Q As Byte Dim T As Byte
T = 20 X = 0 Y = 0 Z = 0 // настройка портов ADCON1 = $07 // PORTE цифровой TRISA.0 = 1 // AN0, AN1 вход TRISA.1 = 1 ADCON1.7 = 1 // AN0, AN1 аналоговые входа TRISB=0 // PORTB выход TRISC=0 // PORTC PORTE=0 // очищаем PORTE TRISD.3 = 0
MAIN: DelayMS (500) // задержка перед старотом для правильной настройки портов и LCD LCD.Cls // все ясно, очистка LCD LED = 1 LCD.WriteAt(1,1,"Test") While true DIRx = 0 DIRy = 0 DIRz = 0
// Соединение через USB... Repeat Service Until Attached //********************************************************************************** // Основная программа // Если есть новые данные, то принимаем и обрабатываем If DataAvailable Then // если есть новые данные из компа ReadArray(Buffer,64) // читаем данные из компа // Обновляем светодиоды LED=Buffer(22) // X = Buffer(1)*256+Buffer(2), Y = Buffer(3)*256+Buffer(4) Z = Buffer(5)*256+Buffer(6) X = Buffer(1)*256+Buffer(2) DIRx = Buffer(7) DIRy = Buffer(8) DIRz = Buffer(9) T = Buffer(10) EndIf // Данные в комп
// Подготавливаем данные Buffer(0)=0 // на свякий пожарный чиcтим перед записью значений Buffer(0).0=Not KEY1 // бит 0 значение кнопки 1 (Инверсия) Buffer(0).1=Not KEY2 // бит 1 значение кнопки 2 (Инверсия) // отправляем в комп WriteArray(Buffer,64) // Проверяем соединение с USB Service WendДобавлено (17.04.2013, 13:43) --------------------------------------------- а таймеры могут одновременно запускаться?
|
|
|
|
DAlexV |
Дата: Ср, 17.04.2013, 14:38 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Цитата tesla88а таймеры могут одновременно запускаться?да, могут.
Dim X As Byte // ПЕРЕМЕННАЯ ОСИ Х Dim Y As Byte // ПЕРЕМЕННАЯ ОСИ Y Dim Z As Byte // ПЕРЕМЕННАЯ ОСИ Z Dim Q As Byte Dim T As Byte
в данном случае не byte(255) а word (65535)
тогда отпадает умножение Y = Buffer(3)*256+Buffer(4) и пишется так Y.byte1= Buffer(3) ' старший байт Y.byte0= Buffer(4) ' младший байт
насчет таймера, сейчас еще раз пройдусь по коду, и возможно он и не потребуется(надо все в Рыбу загнать)
И еще хотелось USB_VBA_ProjectDesc.bas получить
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|