Вопрос по PIC18F4550 - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Вопрос по PIC18F4550
Вопрос по PIC18F4550
tolyan249 Дата: Ср, 18.01.2012, 10:27  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 166
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Добрый день. Подскажите есть ли у кого наработки по этому контроллеру,как сделать HID-устроуство, хочу попробовать осцилограф сделать. Может у кого есть исходники или ссылку может кто даст. Желательно на протоне.

Спасибо.

Добавлено (18.01.2012, 10.27.43)
---------------------------------------------
Кто подскажет почему не могу скомпилировать проект, находиться в исходниках PROTON IDE в SAMLES-USBADC.bas
выдает ошибку -"error in device info Section of the PPI file"

вот исходник от туда

может кто что подскажет.

'
' Transmit the value read from the ADC on AN0 (PORTA.0) using a USB CDC interface
'
' View the results from the serial terminal set to the com port that the USB connects too.
'
Device = 18F4550 ' Use a device with full speed USB capabilities
Xtal = 48 ' Set the oscillator speed to 48MHz (using a 20MHz crystal)
Reminders OFF

Adin_Res 10 ' Set the resolution to 10
Adin_Tad FRC ' Choose the RC osc for ADC samples
Adin_Stime 100 ' Allow 100us for charge time

USB_Descriptor = "CDCDESC.INC" ' Point to the CDC DESCRIPTOR file (located in the INC\USB_18 folder)

Dim PP0 As Byte System ' USBPOLL status return
Dim USB_BUFFER As String * 20 ' USB buffer
Dim AD_RESULT As ADRESL.Word ' \
Dim VALUE As Word ' \
Dim VOLTS As Byte ' / ADC conversion variables
Dim MILLIVOLTS As Byte ' /

Symbol CARRY_FLAG = STATUS.0 ' High if microcontroller does not have control over the buffer
Symbol TRNIF = UIR.3 ' Low if USB Busy

'-------------------------------------------------------------------------------

DelayMS 200 ' Wait for things to stabilise
Clear ' Clear all RAM before we start

Repeat ' \
USBPoll ' Wait for the USB interface to become attached
Until PP0 = %00000110 ' /

TRISA.0 = 1 ' Setup PORTA.0 as an input
ADCON1 = %10001110 ' Make PORTA.0 analogue
ADCON2 = %10000000 ' Right justify the ADC result

While 1 = 1
USBPoll ' Keep the USB interface alive
AD_RESULT = ADIn 0 ' Read the ADC
VALUE = 489 * (AD_RESULT / 10) ' Quantasize the result
VOLTS = VALUE / 10000 ' Split off the Volts
MILLIVOLTS = (VALUE // 10000) / 100 ' Split off the MilliVolts
'
' Convert the value into a string
'
USB_BUFFER = Str$(Dec1,VOLTS) + "." + Str$(Dec2,MILLIVOLTS) + " Volts\r"
Repeat
USBOut 3, USB_BUFFER, Auto ' Poll the USB and transmit the string from endpoint 3
Until CARRY_FLAG = 0 ' Keep trying if the microcontroller does not have control over the buffer
Repeat : Until TRNIF = 1 ' Wait for completion before continuing
Wend ' Go wait for the next buffer input


если знаешь,помоги.
ЯНДЕКС Дата: 18.01.2012
Klim Дата: Ср, 18.01.2012, 10:46  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 80
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Скопировал текст прямо отсюда и он прекрасно скомпилился. Смотри на свой компилятор, глюк там.
tolyan249 Дата: Ср, 18.01.2012, 18:17  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 166
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Да совершенно верно, поставил другую версию протона 3.5.2.7-заработало.

теперь другой вопрос
выводит не правильно напряжение
подаю 3-вольта показывает 8
это все в протеусе
где косяк?

VALUE = 489 * (AD_RESULT / 10) ' Quantasize the result
VOLTS = VALUE / 10000 ' Split off the Volts
MILLIVOLTS = (VALUE // 10000) / 100 ' Split off the MilliVolts
'
' Convert the value into a string
'
USB_BUFFER = Str$(Dec1,VOLTS) + "." + Str$(Dec2,MILLIVOLTS) + " Volts\r"


если знаешь,помоги.
Klim Дата: Ср, 18.01.2012, 19:09  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 80
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Было бы неплохо скинуть исходник и проэкт протеуса.
tolyan249 Дата: Сб, 21.01.2012, 19:39  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 166
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

naprezenie:
AD_result = ADIn 0
value =((AD_result */ 500)>>2)
volts = value / 100
millivolts = (value // 100)
Return

так работает уже нормально если напряжение подаю 0,50в то он мне показывает 0,49

3.25-3.24
3.70-3.69

ну и так далее

т.е не хватает 10 милливольт

добовлять не хочу как можно исправить.

максимальное значение АЦП-1023 ? 10-разрядное

Добавлено (19.01.2012, 09.59.32)
---------------------------------------------
И еще вопрос:

как принимать данные?

main:
gosub DoUSBIn
goto main

DoUSBIn:
USBIn 1, usb_bufferin, USBBufferSizeRX, DoUSBIn
PORTB=usb_bufferin[0]
Return

если делать в цикле ,то пик контроллер ждет приема данных и ничего больше не делает
когда примет данные опять стоит ждет данные. Как от этого можно избавиться или в таймере делать или как можн ввести время ожидания данных?

Добавлено (21.01.2012, 19.39.58)
---------------------------------------------
И еще вопрос как расчитать напряжение с АЦП если котроллер будет переведен в 8-битный режим АЦП-счас он считывает 10-бит, а мне нужно уложиться в 1-байт так проще отправлять данные.

это для 10-бит а мне надо примерно также но для 8-бит, может кто что подскажет . СПАСИБО.
naprezenie:
AD_result = ADIn 0
value =((AD_result */ 500)>>2)
volts = value / 100
millivolts = (value // 100)
Return


если знаешь,помоги.
Сообщение отредактировал tolyan249 - Ср, 18.01.2012, 20:37
DNM Дата: Сб, 07.03.2015, 23:08  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 0   ±
Замечания:   ±
На сайте с 29.09.2011

Статус: Offline

Проблема! Устройство опознается, но с ошибкой! (желтый треугольничек с восклю знаком) - пишет, что подключенное устройство работает неправильно!
код - ниже
вместо кварца на 48  МГц ставлю - 20 МГц

Declare Reminders = off
' select MCU and clock speed
Device = 18F4550
Declare Xtal = 48

' descriptor file, located in \inc\usb_18 - a copy
' is located in the same folder as this file
USB_Descriptor = "USBProjectDESC.inc"

' USB Buffer...
Symbol USBBufferSizeMax = 8
Symbol USBBufferSizeTX  = 8
Symbol USBBufferSizeRX  = 8
Dim    USBBuffer [USBBufferSizeMax]As Byte
' зададим переменные для преобразования...
Dim USB_BUFFER As string*20
Dim AD_RESULT As ADRESL.Word
Dim VALUE As Word
Dim VOLTS As Byte
Dim MILLIVOLTS As Byte

' some useful flags...
Dim PP0 As Byte System        ' USBPOLL status return
Symbol CARRY_FLAG = STATUS.0  ' high if microcontroller does not have control over the buffer
Symbol ATTACHED_STATE = 6     ' is USB attached

' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBPoll, USBIn or USBOut *
' * every couple of milliseconds or so                       *
' ************************************************************
GoSub AttachToUSB
'настроим АЦП
TRISA.0=1    'порт A0 - аналоговый вход
TRISB=0
ADCON1=%10001110   'как аналоговый вход
ADCON2=%10000000

ProgramLoop:
'GoSub DoUSBIn
GoSub DoUSBOut
GoTo ProgramLoop

' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
'DoUSBIn:
'   USBIn 1, USBBuffer, USBBufferSizeRX, DoUSBIn
'   Return

' ************************************************************
' * transmit data                                            *
' ************************************************************
DoUSBOut:
AD_RESULT=ADIn 0   'получим значение
VALUE=((AD_RESULT */500)>>2)
VOLTS=VALUE/100
MILLIVOLTS=VALUE //100
USB_BUFFER = Str$(Dec1,VOLTS)+"."+Str$(Dec2,MILLIVOLTS) 'два знака после запятой

USBOut 1, USB_BUFFER, USBBufferSizeTX, DoUSBOut    'строка передачи данных через USB
Return

' ************************************************************
' * wait for USB interface to attach                         *
' ************************************************************
AttachToUSB:
Repeat
USBPoll
Until PP0 = ATTACHED_STATE
Return

пробовал вместо 
declare Xtal = 48
просто
Xtal = 48

при Xtal = 20, вообще не работает, т.е. не опознается...Почему?
что вообще не так делаю?

Сообщение отредактировал DNM - Сб, 07.03.2015, 23:11
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Вопрос по PIC18F4550
Страница 1 из 11
Поиск: