続続8ピンPICでUSB -16FUSBを30MHzで動かす-
PIC12F1822版16FUSBを30MHzで駆動し、回路の簡素化を計る試み
30MHz化への変更ポイント
30MHzは24MHzに比べ、送受信1ビットで5サイクル(24MHzの1.25倍)となるため以下の変更が必要となる。
壱)TM0→TM2への変更
割り込みルーチン内ではTM0の時間経過をチェックして、送信の完了を判断している。
TMR0のプリスケーラを4として(255-送信するビット数)をTMR0にセット
プリスケール値x送信するビット数=出力に要するサイクル数
TMR0を使用せず、TMR2のポストスケーラ1:5を用いて同様の処理を行う。
送信完了のチェックにT0IFではなくTMR2IFを使用する。
(isr.asm内の SendTXBuffer)
弐)NOPの挿入
ポートへのビット操作(読み出し/書き込み)のインターバルをチェックし、
ビット操作間隔が4サイクルから5サイクルになるようNOPを挿入する。
(isr.asm内の 0x04からのコード、SendTXBuffer、SendHandshake、GenEop)
参)USB_EOPCHKを廃止
F16USBではUSBからの読み出し時に、データ読み出しとホストの送信完了検出とを4サイクルに収めるためにD+とD-のOR出力をUSB_EOPCHK(PORTA,3)に入力している。
30MHz化に伴い、1サイクルの余裕ができるので、OR出力を使用しなくてもホストの送信完了を検出できる。
回路上ではダイオード2本と15kの抵抗が不要となり、PORTA,3を汎用入力として使用できる。
(isr.asm内の 0x04からのコード、usb.asm内のコード)
<変更後の回路>
30MHzのクロックオシレーターが入手できなかったので、
7.5MHzのクリスタルを使用。内臓PLLで30MHzで動作

以下にisr.asm内とusb.asm内の変更後のコードを示す。(2013.03.09改訂) (2013.03.12改訂)
PIC12F1822は割り込み時にcontextをスタックに保存・復帰するので、
contextの処理を無効にしている。
<0x04からのコード>
ORG 0x04
; -------------- Sync (start) --------------
; save context
; movwf W_TMP
; swapf STATUS,W
; movwf STATUS_TMP
nop
nop
nop
bcf BSR,0
bcf BSR,1
WaitForJ:
btfsc USB_DPLUS
goto WaitForJ
nop
WaitForK:
btfss USB_DPLUS
goto WaitForK
nop
FoundK:
nop
btfss USB_DPLUS
goto WaitForK
; setup RX_BUFFER
movlw RX_BUFFER
movwf FSR
clrf INDF
; -------------- Sync (end) ----------------
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,0
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,1
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,2
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,3
RxLoop:
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,4
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,5
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,6
btfsc USB_DPLUS
bsf INDF,7
nop
incf FSR,F
clrf INDF
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,0
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,1
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,2
btfsc USB_DPLUS
bsf INDF,3
nop
goto RxLoop
<ReturnFromISR>
ReturnFromISR:
; restore Context
; movf FSR_TMP,W
; movwf FSR
; swapf STATUS_TMP,W
; movwf STATUS
; swapf W_TMP,F
; swapf W_TMP,W
bcf INTCON,INTF
retfie
<SendTXBuffer>
SendTXBuffer:
; TX_PAYLOAD_LEN += PID + CRC16 (3 bytes)
addlw 0x03
movwf PAYLOAD_LEN
; prepare latch
; USB_DPLUS will by 0 due to R-M-W (we're in EOP)
bsf USB_DMINUS
; set RA2/RA4 Output
bsf BSR,0
movlw B'11101011'
andwf TRISA,F
bcf BSR,0
movlw 0x07
movwf COUNT
bcf STATUS,C
rlf PAYLOAD_LEN,F
rlf PAYLOAD_LEN,F
rlf PAYLOAD_LEN,W
addlw 0x08 ; 8 bits of Sync Pattern
#if INTERRUPT_IN_ENDPOINT == 1
addwf ADDITIONAL_BITS,W
#else
addwf TX_EXTRA_BITS,W
#endif
; PR2 = 8 + (TX_PAYLOAD_LEN*8) + Additional Bits
movwf PR2
clrf TMR2 ; clear TIMER2
bsf T2CON,TMR2ON ; enable TIMER2
bcf PIR1,TMR2IF ; clear Flag
decf PR2,F ; PR2=PR2-1
movlw B'00010100'
goto $+D'1'
; send Sync
STXB_SyncLoop:
xorwf USB_PORT,F
nop
decfsz COUNT,F
goto STXB_SyncLoop
goto $+D'1'
goto $+D'1'
; send TX_Buffer (doing NRZI encode)
nop
btfss INDF,0
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
nop
btfss INDF,1
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
STXB_SendByte:
nop
btfss INDF,2
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
nop
btfss INDF,3
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
nop
btfss INDF,4
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
nop
btfss INDF,5
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
nop
btfss INDF,6
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
; We can't check for T0IF here because FSR needs to be
; incremented to take next bit in buffer. Due this, sometimes,
; one trash bit may be present before EOP. In fact, it's not a
; problem, because hosts just ignore extra bits in package. ;)
nop
btfss INDF,7
xorwf USB_PORT,F
incf FSR,F
nop
nop
btfss INDF,0
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
; Same about trash bit here, but this time due to 'goto STXB_SendByte'.
nop
btfss INDF,1
xorwf USB_PORT,F
goto STXB_SendByte
<GenEop>
GenEop:
movlw B'11101011'
GenEop_01:
andwf USB_PORT,F
bcf T2CON,TMR2ON ; disable TIMER2
goto GenEop_02
GenEop_02:
movlw B'00010000'
goto $+D'1'
nop
nop
nop
xorwf USB_PORT,F
; set RA2/RA4 Input
bsf BSR,0
movlw B'00010100'
iorwf TRISA,F
bcf BSR,0
return
<SendHandshake>
SendHandshake:
; save handshake PID to send (from W)
movwf PID ; prepare latch
; USB_DPLUS will by 0 due to R-M-W (we're in EOP)
bsf USB_DMINUS ; set RA2/RA4 Output
bsf BSR,0
movlw B'11101011'
andwf TRISA,F
bcf BSR,0 ; back to bank 0
movlw 0x07
movwf COUNT
movlw B'00010100'
SH_SyncLoop: ; send Sync
xorwf USB_PORT,F
nop
decfsz COUNT,F
goto SH_SyncLoop
goto $+D'1'
goto $+D'1'
nop
; send handshake PID
btfss PID,0
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,1
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,2
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,3
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,4
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,5
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,6
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,7
xorwf USB_PORT,F
nop
goto GenEop ; 2 cycles
<ファームウエア PIC12F1822 7.5MHz>(2013.03.09改訂) (2013.03.12改訂)
:020000040000FA
:1000000010308B005529000000000000000008108F
:1000100088100C19092800000C1D0C280000000095
:100020000C1D0C282030840080010C191A280C1A91
:100030001C286428000000140C1921280C1A2328FD
:100040006428000080140C1928280C1A2A28642817
:10005000000000150C192F280C1A31286428000004
:1000600080150C1936280C1A382864280000001650
:100070000C193D280C1A3F286428000080160C1922
:1000800044280C1A46286428000000170C19801711
:100090000000840A80010C1950280C1A5228642888
:1000A000000000140C1957280C1A59286428000065
:1000B00080140C195E280C1A6028642800000015B2
:1000C0000C19801500003128A0189628201C9428AF
:1000D000201A90287311210DA106A11F7315731DFD
:1000E0007A28F31E8328F3123D3084004C08D00098
:1000F0004B088628731F832873132D3084003C0817
:10010000D0003B0886285A3023219428C720731931
:1001100094287608F500F31D9428F40A73149428A3
:100120002008CF002108D0008B1009007F30500537
:100130007506031D9428731CA2284F1D08005A3011
:1001400023219428D230232120300402CE00DA006B
:100150004E08033A031994287314F314F3134F1938
:10016000F3177311500DD006D01F73152030CF0038
:100170005B30D0004F0884000008CD005008840098
:100180004D088000CF0AD00ACE0BBA289428033E2F
:10019000CF000C160814EB308C0508100730CD008A
:1001A0000310CF0DCF0D4F0D083E50079B009A0155
:1001B0001C1591109B031430DD288C060000CD0B1C
:1001C000DD28E228E3280000001C8C069118142981
:1001D0000000801C8C06911814290000001D8C065C
:1001E000911814290000801D8C0691181429000014
:1001F000001E8C06911814290000801E8C06911890
:1002000014290000001F8C06911814290000801F7B
:100210008C06840A00000000001C8C06911814292A
:100220000000801C8C06ED28EB308C051C11182971
:1002300010301A290000000000008C060814143049
:100240008C0408100800CE000C160814EB308C0546
:1002500008100730CD0014308C060000CD0B2C297F
:100260003129322900004E1C8C0600003729CE1C93
:100270008C0600003B294E1D8C0600003F29CE1D38
:100280008C06000043294E1E8C0600004729CE1E16
:100290008C0600004B294E1F8C0600004F29CE1FF4
:1002A0008C060000142900340034CA230814881076
:1002B000C13095001C308C0408108810F3012A30DE
:1002C000F500F600C330BD008B1714300C05031980
:1002D0000A22E02308108810731C6529F31879217D
:1002E000F31FC829F823F3186F29731073196529B0
:1002F000FE29081088105A03EC005C30EA00F70170
:100300005230EB000130E90006305B1B0430EF0097
:1003100068100830EE006A0884000008DB006B08F3
:1003200084000830ED00681C9A2968105B08E90019
:10033000DB0CED035B08E906E909691CA629EF0B54
:10034000A829DB0CED0BA6296814ED0A0630EF0096
:10035000E90C800C5B08E900EE0BB929F70A770875
:100360005A02033A0319BF29EB0A6B0884000830CC
:10037000EE00DB0CED0B9A29EA0AEC0B8B29F3104B
:10038000F31B0800F401C330AD005808D100080089
:1003900060305205DB00D21FEE29D622DB0803199C
:1003A000D3298923E7295308063A031DDC29550878
:1003B000223A03198A23E922D30803197D2353081B
:1003C000083A0319802353080A3A031983230810B3
:1003D00088100301242203014E22072ADB08031997
:1003E000F3298923F7295308053A031985230810AF
:1003F0008810D1080319002A731065290810881085
:100400004B30AD00AE01AF01BB01BC01F311731065
:1004100073176529081088100330EC0014300C05A0
:10042000031D0800EC0B0E2A2A30F500F600080028
:1004300008108810C330BD1D4B30BD000130242290
:1004400001304E22F3160800003A03192B2A3E30E1
:1004500084004B082E2A2E3084003B08EB00FF302E
:10046000E900EA0000083F22840AEB0B322AE9097E
:1004700069088000840AEA096A0880000800E90621
:100480000830ED00EA0CEA13E90C031C4B2AA030FB
:10049000EA060130E906ED0B422A0800EF00003AB7
:1004A0000319572A3D308400CC014B085B2A2D30BC
:1004B0008400BC013B08033EEB000430EE00000862
:1004C000E9000830EC0001306905013C031D6A2A8F
:1004D000EE036C2A0630EE00E90C03016E020319EC
:1004E0007722EC0B632A840AEB0B5F2A08006F0863
:1004F000031D7C2ABC0A7D2ACC0A6B08ED00ED0A9C
:100500000408E8000008EA00800D840AED0B842A44
:10051000680884000930E8006C08E80200106A18D6
:100520000014E80B942ABE2A8010EA188014E80B05
:100530009A2AC02A00116A190015E80BA02AC22ABB
:100540008011EA198015E80BA62AC42A00126A1A3B
:100550000016E80BAC2AC62A8012EA1A8016E80BAD
:10056000B22AC82A00136A1B0017E80BB82ACA2A45
:100570008013EA1B8017E80BBE2ACC2A8010CF2AF2
:100580000011CF2A8011CF2A0012CF2A8012CF2A41
:100590000013CF2A8013CF2A840A00108403063068
:1005A000EE0001306C02031DEC030800083051021C
:1005B000031CE12AD1000830BB000319E32AF3151C
:1005C000E42A5108BB00F311C330AD1D4B30AD0020
:1005D00008005508013A0319F22A5508023A03198E
:1005E0001C2B08007408013A0319092B7408023AFD
:1005F0000319182B1230AE000130AF001030B000DC
:100600000130B100FF30B200B301B4010830B500D1
:100610000800D830AE000430AF002830B0000630FB
:10062000B1000030B2000130B300B401B5010800E0
:10063000AE010130AF0008007408013A03193E2BE7
:100640007408023A03194C2B7408053A03197A2BE3
:100650007408043A0319692B7408033A0319592BD7
:100660000930AE000230AF002930B000B1010130D6
:10067000B200B300B4018030B50008003230AE00E3
:100680000930AF000430B000B101B2010230B30054
:100690000330B400B5010800AE01AF010930B0006D
:1006A0002130B1001030B2000130B300B401B50008
:1006B00008002230AE001930AF00B0010730B100A1
:1006C0000530B2008130B3000330B4000830B5000B
:1006D00008000030AE000830AF000730B000053031
:1006E000B1000130B2000330B3000830B400003074
:1006F000B50008000830AE000800AE01AF010800E8
:100700000130AE000800AE0108005E08F600F613E6
:10071000080008007408013A0319A72B7408023A6C
:100720000319B62B7408033A0319C72B0630AE0021
:10073000A030AF00FF30B0000930B1000130B2008E
:10074000A130B3000130B4000930B5000800033017
:10075000AE001530AF00B0012630B100FF30B2005E
:10076000B3017530B4000830B50008009530AE0014
:100770000130AF008130B0000230B1000930B2006A
:100780000430B3009130B4000230B5000800C0302E
:10079000AE000800081488148C0124309E00083034
:1007A0009F000C309B0003309C0090309D0088100F
:1007B000FE308C0008108C01981120309C0008003D
:1007C000911E0800081488141D19F02B9D18F32B96
:1007D000190808108810BE000130CB00182208004C
:1007E00019089D1CF52B1D121D16081088100800F5
:1007F000731D08005208081488149E1CFD2B9A00D3
:060800000810881008003A
:020000040001F9
:02000E00A7C980
:02001000FFDD12
:00000001FF
30MHz化への変更ポイント
30MHzは24MHzに比べ、送受信1ビットで5サイクル(24MHzの1.25倍)となるため以下の変更が必要となる。
壱)TM0→TM2への変更
割り込みルーチン内ではTM0の時間経過をチェックして、送信の完了を判断している。
TMR0のプリスケーラを4として(255-送信するビット数)をTMR0にセット
プリスケール値x送信するビット数=出力に要するサイクル数
TMR0を使用せず、TMR2のポストスケーラ1:5を用いて同様の処理を行う。
送信完了のチェックにT0IFではなくTMR2IFを使用する。
(isr.asm内の SendTXBuffer)
弐)NOPの挿入
ポートへのビット操作(読み出し/書き込み)のインターバルをチェックし、
ビット操作間隔が4サイクルから5サイクルになるようNOPを挿入する。
(isr.asm内の 0x04からのコード、SendTXBuffer、SendHandshake、GenEop)
参)USB_EOPCHKを廃止
F16USBではUSBからの読み出し時に、データ読み出しとホストの送信完了検出とを4サイクルに収めるためにD+とD-のOR出力をUSB_EOPCHK(PORTA,3)に入力している。
30MHz化に伴い、1サイクルの余裕ができるので、OR出力を使用しなくてもホストの送信完了を検出できる。
回路上ではダイオード2本と15kの抵抗が不要となり、PORTA,3を汎用入力として使用できる。
(isr.asm内の 0x04からのコード、usb.asm内のコード)
<変更後の回路>
30MHzのクロックオシレーターが入手できなかったので、
7.5MHzのクリスタルを使用。内臓PLLで30MHzで動作

以下にisr.asm内とusb.asm内の変更後のコードを示す。(2013.03.09改訂) (2013.03.12改訂)
PIC12F1822は割り込み時にcontextをスタックに保存・復帰するので、
contextの処理を無効にしている。
<0x04からのコード>
ORG 0x04
; -------------- Sync (start) --------------
; save context
; movwf W_TMP
; swapf STATUS,W
; movwf STATUS_TMP
nop
nop
nop
bcf BSR,0
bcf BSR,1
WaitForJ:
btfsc USB_DPLUS
goto WaitForJ
nop
WaitForK:
btfss USB_DPLUS
goto WaitForK
nop
FoundK:
nop
btfss USB_DPLUS
goto WaitForK
; setup RX_BUFFER
movlw RX_BUFFER
movwf FSR
clrf INDF
; -------------- Sync (end) ----------------
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,0
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,1
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,2
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,3
RxLoop:
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,4
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,5
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,6
btfsc USB_DPLUS
bsf INDF,7
nop
incf FSR,F
clrf INDF
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,0
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,1
btfsc USB_DPLUS
goto $+4
btfsc USB_DMINUS
goto $+4
goto Eop
nop
bsf INDF,2
btfsc USB_DPLUS
bsf INDF,3
nop
goto RxLoop
<ReturnFromISR>
ReturnFromISR:
; restore Context
; movf FSR_TMP,W
; movwf FSR
; swapf STATUS_TMP,W
; movwf STATUS
; swapf W_TMP,F
; swapf W_TMP,W
bcf INTCON,INTF
retfie
<SendTXBuffer>
SendTXBuffer:
; TX_PAYLOAD_LEN += PID + CRC16 (3 bytes)
addlw 0x03
movwf PAYLOAD_LEN
; prepare latch
; USB_DPLUS will by 0 due to R-M-W (we're in EOP)
bsf USB_DMINUS
; set RA2/RA4 Output
bsf BSR,0
movlw B'11101011'
andwf TRISA,F
bcf BSR,0
movlw 0x07
movwf COUNT
bcf STATUS,C
rlf PAYLOAD_LEN,F
rlf PAYLOAD_LEN,F
rlf PAYLOAD_LEN,W
addlw 0x08 ; 8 bits of Sync Pattern
#if INTERRUPT_IN_ENDPOINT == 1
addwf ADDITIONAL_BITS,W
#else
addwf TX_EXTRA_BITS,W
#endif
; PR2 = 8 + (TX_PAYLOAD_LEN*8) + Additional Bits
movwf PR2
clrf TMR2 ; clear TIMER2
bsf T2CON,TMR2ON ; enable TIMER2
bcf PIR1,TMR2IF ; clear Flag
decf PR2,F ; PR2=PR2-1
movlw B'00010100'
goto $+D'1'
; send Sync
STXB_SyncLoop:
xorwf USB_PORT,F
nop
decfsz COUNT,F
goto STXB_SyncLoop
goto $+D'1'
goto $+D'1'
; send TX_Buffer (doing NRZI encode)
nop
btfss INDF,0
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
nop
btfss INDF,1
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
STXB_SendByte:
nop
btfss INDF,2
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
nop
btfss INDF,3
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
nop
btfss INDF,4
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
nop
btfss INDF,5
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
nop
btfss INDF,6
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
; We can't check for T0IF here because FSR needs to be
; incremented to take next bit in buffer. Due this, sometimes,
; one trash bit may be present before EOP. In fact, it's not a
; problem, because hosts just ignore extra bits in package. ;)
nop
btfss INDF,7
xorwf USB_PORT,F
incf FSR,F
nop
nop
btfss INDF,0
xorwf USB_PORT,F
btfsc PIR1,TMR2IF
goto GenEop
; Same about trash bit here, but this time due to 'goto STXB_SendByte'.
nop
btfss INDF,1
xorwf USB_PORT,F
goto STXB_SendByte
<GenEop>
GenEop:
movlw B'11101011'
GenEop_01:
andwf USB_PORT,F
bcf T2CON,TMR2ON ; disable TIMER2
goto GenEop_02
GenEop_02:
movlw B'00010000'
goto $+D'1'
nop
nop
nop
xorwf USB_PORT,F
; set RA2/RA4 Input
bsf BSR,0
movlw B'00010100'
iorwf TRISA,F
bcf BSR,0
return
<SendHandshake>
SendHandshake:
; save handshake PID to send (from W)
movwf PID ; prepare latch
; USB_DPLUS will by 0 due to R-M-W (we're in EOP)
bsf USB_DMINUS ; set RA2/RA4 Output
bsf BSR,0
movlw B'11101011'
andwf TRISA,F
bcf BSR,0 ; back to bank 0
movlw 0x07
movwf COUNT
movlw B'00010100'
SH_SyncLoop: ; send Sync
xorwf USB_PORT,F
nop
decfsz COUNT,F
goto SH_SyncLoop
goto $+D'1'
goto $+D'1'
nop
; send handshake PID
btfss PID,0
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,1
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,2
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,3
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,4
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,5
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,6
xorwf USB_PORT,F
nop
goto $+D'1'
btfss PID,7
xorwf USB_PORT,F
nop
goto GenEop ; 2 cycles
<usb.asm>(2013.03.12改訂)
MainLoop:
movlw B'00010100' ; checks for Reset
andwf USB_PORT,W
btfsc STATUS,Z
call CheckReset
call Main
CR_Loop:
movlw B'00010100'
andwf USB_PORT,W
btfss STATUS,Z
return
decfsz COUNT,F
<ファームウエア PIC12F1822 7.5MHz>(2013.03.09改訂) (2013.03.12改訂)
:020000040000FA
:1000000010308B005529000000000000000008108F
:1000100088100C19092800000C1D0C280000000095
:100020000C1D0C282030840080010C191A280C1A91
:100030001C286428000000140C1921280C1A2328FD
:100040006428000080140C1928280C1A2A28642817
:10005000000000150C192F280C1A31286428000004
:1000600080150C1936280C1A382864280000001650
:100070000C193D280C1A3F286428000080160C1922
:1000800044280C1A46286428000000170C19801711
:100090000000840A80010C1950280C1A5228642888
:1000A000000000140C1957280C1A59286428000065
:1000B00080140C195E280C1A6028642800000015B2
:1000C0000C19801500003128A0189628201C9428AF
:1000D000201A90287311210DA106A11F7315731DFD
:1000E0007A28F31E8328F3123D3084004C08D00098
:1000F0004B088628731F832873132D3084003C0817
:10010000D0003B0886285A3023219428C720731931
:1001100094287608F500F31D9428F40A73149428A3
:100120002008CF002108D0008B1009007F30500537
:100130007506031D9428731CA2284F1D08005A3011
:1001400023219428D230232120300402CE00DA006B
:100150004E08033A031994287314F314F3134F1938
:10016000F3177311500DD006D01F73152030CF0038
:100170005B30D0004F0884000008CD005008840098
:100180004D088000CF0AD00ACE0BBA289428033E2F
:10019000CF000C160814EB308C0508100730CD008A
:1001A0000310CF0DCF0D4F0D083E50079B009A0155
:1001B0001C1591109B031430DD288C060000CD0B1C
:1001C000DD28E228E3280000001C8C069118142981
:1001D0000000801C8C06911814290000001D8C065C
:1001E000911814290000801D8C0691181429000014
:1001F000001E8C06911814290000801E8C06911890
:1002000014290000001F8C06911814290000801F7B
:100210008C06840A00000000001C8C06911814292A
:100220000000801C8C06ED28EB308C051C11182971
:1002300010301A290000000000008C060814143049
:100240008C0408100800CE000C160814EB308C0546
:1002500008100730CD0014308C060000CD0B2C297F
:100260003129322900004E1C8C0600003729CE1C93
:100270008C0600003B294E1D8C0600003F29CE1D38
:100280008C06000043294E1E8C0600004729CE1E16
:100290008C0600004B294E1F8C0600004F29CE1FF4
:1002A0008C060000142900340034CA230814881076
:1002B000C13095001C308C0408108810F3012A30DE
:1002C000F500F600C330BD008B1714300C05031980
:1002D0000A22E02308108810731C6529F31879217D
:1002E000F31FC829F823F3186F29731073196529B0
:1002F000FE29081088105A03EC005C30EA00F70170
:100300005230EB000130E90006305B1B0430EF0097
:1003100068100830EE006A0884000008DB006B08F3
:1003200084000830ED00681C9A2968105B08E90019
:10033000DB0CED035B08E906E909691CA629EF0B54
:10034000A829DB0CED0BA6296814ED0A0630EF0096
:10035000E90C800C5B08E900EE0BB929F70A770875
:100360005A02033A0319BF29EB0A6B0884000830CC
:10037000EE00DB0CED0B9A29EA0AEC0B8B29F3104B
:10038000F31B0800F401C330AD005808D100080089
:1003900060305205DB00D21FEE29D622DB0803199C
:1003A000D3298923E7295308063A031DDC29550878
:1003B000223A03198A23E922D30803197D2353081B
:1003C000083A0319802353080A3A031983230810B3
:1003D00088100301242203014E22072ADB08031997
:1003E000F3298923F7295308053A031985230810AF
:1003F0008810D1080319002A731065290810881085
:100400004B30AD00AE01AF01BB01BC01F311731065
:1004100073176529081088100330EC0014300C05A0
:10042000031D0800EC0B0E2A2A30F500F600080028
:1004300008108810C330BD1D4B30BD000130242290
:1004400001304E22F3160800003A03192B2A3E30E1
:1004500084004B082E2A2E3084003B08EB00FF302E
:10046000E900EA0000083F22840AEB0B322AE9097E
:1004700069088000840AEA096A0880000800E90621
:100480000830ED00EA0CEA13E90C031C4B2AA030FB
:10049000EA060130E906ED0B422A0800EF00003AB7
:1004A0000319572A3D308400CC014B085B2A2D30BC
:1004B0008400BC013B08033EEB000430EE00000862
:1004C000E9000830EC0001306905013C031D6A2A8F
:1004D000EE036C2A0630EE00E90C03016E020319EC
:1004E0007722EC0B632A840AEB0B5F2A08006F0863
:1004F000031D7C2ABC0A7D2ACC0A6B08ED00ED0A9C
:100500000408E8000008EA00800D840AED0B842A44
:10051000680884000930E8006C08E80200106A18D6
:100520000014E80B942ABE2A8010EA188014E80B05
:100530009A2AC02A00116A190015E80BA02AC22ABB
:100540008011EA198015E80BA62AC42A00126A1A3B
:100550000016E80BAC2AC62A8012EA1A8016E80BAD
:10056000B22AC82A00136A1B0017E80BB82ACA2A45
:100570008013EA1B8017E80BBE2ACC2A8010CF2AF2
:100580000011CF2A8011CF2A0012CF2A8012CF2A41
:100590000013CF2A8013CF2A840A00108403063068
:1005A000EE0001306C02031DEC030800083051021C
:1005B000031CE12AD1000830BB000319E32AF3151C
:1005C000E42A5108BB00F311C330AD1D4B30AD0020
:1005D00008005508013A0319F22A5508023A03198E
:1005E0001C2B08007408013A0319092B7408023AFD
:1005F0000319182B1230AE000130AF001030B000DC
:100600000130B100FF30B200B301B4010830B500D1
:100610000800D830AE000430AF002830B0000630FB
:10062000B1000030B2000130B300B401B5010800E0
:10063000AE010130AF0008007408013A03193E2BE7
:100640007408023A03194C2B7408053A03197A2BE3
:100650007408043A0319692B7408033A0319592BD7
:100660000930AE000230AF002930B000B1010130D6
:10067000B200B300B4018030B50008003230AE00E3
:100680000930AF000430B000B101B2010230B30054
:100690000330B400B5010800AE01AF010930B0006D
:1006A0002130B1001030B2000130B300B401B50008
:1006B00008002230AE001930AF00B0010730B100A1
:1006C0000530B2008130B3000330B4000830B5000B
:1006D00008000030AE000830AF000730B000053031
:1006E000B1000130B2000330B3000830B400003074
:1006F000B50008000830AE000800AE01AF010800E8
:100700000130AE000800AE0108005E08F600F613E6
:10071000080008007408013A0319A72B7408023A6C
:100720000319B62B7408033A0319C72B0630AE0021
:10073000A030AF00FF30B0000930B1000130B2008E
:10074000A130B3000130B4000930B5000800033017
:10075000AE001530AF00B0012630B100FF30B2005E
:10076000B3017530B4000830B50008009530AE0014
:100770000130AF008130B0000230B1000930B2006A
:100780000430B3009130B4000230B5000800C0302E
:10079000AE000800081488148C0124309E00083034
:1007A0009F000C309B0003309C0090309D0088100F
:1007B000FE308C0008108C01981120309C0008003D
:1007C000911E0800081488141D19F02B9D18F32B96
:1007D000190808108810BE000130CB00182208004C
:1007E00019089D1CF52B1D121D16081088100800F5
:1007F000731D08005208081488149E1CFD2B9A00D3
:060800000810881008003A
:020000040001F9
:02000E00A7C980
:02001000FFDD12
:00000001FF
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT