マイクロテクニカ製品サポートFAQ
[一覧] [1つ前に戻る] [マニュアル及び各種ダウンロードページへ]
CDCを使ったUSB-UART変換プログラムの例について
PIC18F2550や4550などのUSB機能内蔵のPICを使って、USBとUARTを相互に変換するプログラムのプロクラム例を紹介しています。
UART側は割込を使用してUART受信が発生すると直ちにUARTから受信してUSBOUT命令でUSB側にデータを送信します。USB側からの受信に対してはループによって待機し、受信後HSEROUT命令でUART側にデータを送ります。

サンプル例ではPIC18F2550を使用しています。動作周波数はOSC1-OSC2に外部から12MHzのクロックを供給し内部で4xPLLで4逓倍して48MHz動作としています。UARTの通信速度は9600bpsです。CDCについても同様に9600bpsです。

※本FAQのCGIの都合上正しくTABやスペースが入らないため、見にくい場合にはお手数ですが下記からソースコードのzipファイルを入手してください。

http://www.microtechnica.tv/support/software/usb-uartpbpexe.zip

--------------------------------------------
#CONFIG
CONFIG WDT = OFF ;WDT disabled (enabled by SWDTEN bit)
CONFIG VREGEN = ON ;USB Voltage Regulator Enable
CONFIG PLLDIV = 3 ;Divide by 3 (12 MHz oscillator input)
CONFIG STVREN = ON ;stack overflow/underflow reset enabled
CONFIG XINST = OFF ;Extended instruction set disabled
CONFIG CPUDIV = OSC1_PLL2 ;No CPU system clock divide
CONFIG USBDIV = 2 ;Clock source from 96MHz PLL/2
CONFIG CP0 = OFF ;Program memory is not code-protected
CONFIG FOSC = HSPLL_HS ;HS+PLL oscillator
CONFIG FCMEN = OFF ;Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ;Two-Speed Start-up disabled
CONFIG WDTPS = 32768 ;1:32768
CONFIG LVP = OFF ;Low Voltage ICSP
CONFIG PBADEN = OFF ;PortB<4:0> pins are configured as digital
#ENDCONFIG

Include "cdc_desc.bas"
DEFINE OSC 48
DEFINE HSER_BAUD 9600
DEFINE HSER_CLROERR 1

ucfg = %00010100 'enable internal USB pull-up, Full speed USB

BufferRX var Byte[16]
cnt Var Byte
B0 VAR BYTE

init:
ADCON1 = 15
CMCON = 7

INTCON2.7 = 1 'Disable PortB Pullups

RCON.7 = 0
INTCON.4 = 0 ' Disable INT0 (PORTB.0)
INTCON3.3 = 0 ' Disable INT1 (PORTB.1)
INTCON3.4 = 0 ' Disable INT2 (PORTB.2)
INTCON.5 = 0 ' Disable TMR0 (Timmer 0)
INTCON.6 = 1 ' Enable Peripheral Interrupts
INTCON.7 = 1 ' Enable Global Interrupt Handler
PIE1.4 = 0 ' Disable USART Transmit Interrupt
PIE1.5 = 1 ' Enable USART Receive Interrupt
PIE2.5 = 0 ' Disable USB Interrupt

usb_init:

USBInit
pause 1000
USBService

ON INTERRUPT GOTO Main_Interrupt_Handler
ENABLE INTERRUPT

mainloop:
USBService
cnt = 16
USBIn 3, BufferRX, Cnt, MainLoop

HSEROUT [STR BufferRX\Cnt]
'gosub usbtx
goto mainLoop

usbtx:
USBService
USBOut 3, BufferRX, Cnt, usbtx
pause 50
return

'-----------------------------------------
DISABLE INTERRUPT
Main_Interrupt_Handler:

IF PIR1.4 = 1 THEN
PIR1.4 = 0
ENDIF

IF PIR1.5 = 1 THEN
HSERIN [B0]
BufferRX[0] = B0
Cnt = 1

OutLoop:
USBService ' Must service USB regularly
USBOut 3, BufferRX, Cnt, OutLoop
PIR1.5 = 0
ENDIF

IntDone:
RESUME

ENABLE INTERRUPT
END
オリジナル - FAQみたいです - 猫でいいです