Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Как связать pic18f4550 с ПК через usb?
Как связать pic18f4550 с ПК через usb?
tesla88 Дата: Сб, 06.04.2013, 08:46  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 114
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Прикрепления: 9496276.jpg (221.5 Kb)

Сообщение отредактировал tesla88 - Сб, 06.04.2013, 09:12
ЯНДЕКС Дата: 06.04.2013
shaman Дата: Сб, 06.04.2013, 09:42  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 178
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

День добрый ,вот что нашёл
http://320volt.com/pic18f4550-uln2803-usb-ile-step-motor-kontrolu-vb6/
tesla88 Дата: Пн, 08.04.2013, 19:02  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 114
Репутация: 0   ±
Замечания:   ±
На сайте с 20.11.2010

Статус: Offline

shaman спасибо за ссылку, по сути мне это и надо , НАШЁЛ ПЛАГИН ДЛЯ ПРОТОНА , вот только он для шестого визуал бейсика, а хотелось бы работать в десятом, может у кого есть мысли по этому поводу?

Добавлено (08.04.2013, 19:02)
---------------------------------------------
помогите к описанному выше проэкту добавить юсб бутлоадер? очень нужна помощь!!!

Сообщение отредактировал tesla88 - Сб, 06.04.2013, 12:17
Andriy76 Дата: Пн, 08.04.2013, 22:40  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 231
Репутация: 10   ±
Замечания:   ±
На сайте с 06.04.2010

Статус: Offline

Не знаю помогу Вам , но в Протоне вроде есть бутлодер . C:\Program Files\ProtonIDE\MCLoader . Пробуйте . Кроме того Админ выкладывал статью про ЮСБ вольтметр .
tesla88 Дата: Ср, 10.04.2013, 09:34  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 114
Репутация: 0   ±
Замечания:   ±
На сайте с 20.11.2010

Статус: Offline

может кто знает как бороться с ключём дескриптора в протоне?
Прикрепления: 0478752.jpg (130.1 Kb)
anatol Дата: Ср, 10.04.2013, 12:58  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

tesla88 когда поймешь ЧТО означает эта строчка - будешь знать как бороться. Подсказываю - настройки и пути....
Andriy76 Дата: Ср, 10.04.2013, 20:45  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 231
Репутация: 10   ±
Замечания:   ±
На сайте с 06.04.2010

Статус: Offline

Как понял не видит файла который надо подключить . Найти в папках Протона и переместить что то или туда или сюда . В смысле или проэкт в папку с инклудом или инклуд в папку с проэктом .
tesla88 Дата: Пн, 15.04.2013, 15:43  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 114
Репутация: 0   ±
Замечания:   ±
На сайте с 20.11.2010

Статус: Offline

В общем пока пишу на рыбе и не заморачиваюсь, вот только есть одна проблема - далее кусок программмы на vb6 , slider1 со шкалой до 1000 , а ячейка буфера (byte) до 255 и при превышении данного значения выдаёт ошибку переполнения буфера? можно ли как то объеденить несколько ячеек в одну? преложил архив проэкта) book

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
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Xhi=x\256    ' целочисленное деление
if Xhi>0 then
Xlo=x-Xhi*256
end if

В итоге Xhi- старший разряд, Xlo- младший
Обратное преобразование примерно так
x=Xhi*256+Xlo

Успехов  wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал DAlexV - Ср, 17.04.2013, 10:55
tesla88 Дата: Ср, 17.04.2013, 12:22  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 114
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 27   ±
Замечания:   ±
На сайте с 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).Старею :)
ЯНДЕКС Дата: 17.04.2013
tesla88 Дата: Ср, 17.04.2013, 13:07  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 114
Репутация: 0   ±
Замечания:   ±
На сайте с 20.11.2010

Статус: Offline

А как это всё увязать с таймером? для чего это всё с ним увязывать? я просто не когда не работал с таймером , поэтому прошу понять и прости wacko
DAlexV Дата: Ср, 17.04.2013, 13:37  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Что бы не пропустить данные при приеме.  Вот пример из Рыбы. Так же можно с помошью таймера можно избавиться от DelayMS (T) отдав данную задержку таймеру. И хотелось бы взглянуть на полный код, если не трудно
Прикрепления: Interrupt_Timer.bas (1.6 Kb)


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
tesla88 Дата: Ср, 17.04.2013, 13:43  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 114
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 27   ±
Замечания:   ±
На сайте с 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).Старею :)
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Как связать pic18f4550 с ПК через usb?
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: