Cách thứ nhất, dùng phương pháp gián tiếp bằng cách sử dụng phần mềm PICkit 2 hoặc PICkit 3 của Microchip để đặt các bit cấu hình theo yêu cầu.. Các bit cấu hình của PIC 18F4550 có thể
Trang 1CHƯƠNG 10: CÁC ĐẶC TRƯNG ĐẶC BIỆT CỦA PIC 18F4550
Các VĐK PIC 18F2455/2550/4450/4550 có nhiều đặc trưng đặc biệt:
Lựa chọn khối dao động
Các kiểu reset: reset khởi động nguồn (POR), bộ định thời khởi động nguồn (PWRT),
bộ định thời khởi tạo dao động (OST), brown-out reset
Các ngắt
Bộ định thời canh gác (WDT)
Giám sát lỗi xung clock
Khởi động hai tốc độ
Bảo vệ mã
Nhận dạng VĐK
Lập trình VĐK
Nội dung chính của chương này sẽ giải thích đầy đủ ý nghĩa các bit cấu hình, hướng dẫn cách thiết lập các bit cấu hình bằng hai cách Cách thứ nhất, dùng phương pháp gián tiếp bằng
cách sử dụng phần mềm PICkit 2 (hoặc PICkit 3) của Microchip để đặt các bit cấu hình theo
yêu cầu Cách thứ hai, dùng phương pháp trực tiếp bằng cách thiết lập các bit cấu hình khi đang viết mã chương trình, trong chương này sẽ hướng dẫn cách thiết lập các bit cấu hình bằng MPLAB C18
Lưu ý, để hiểu kỹ về chương này, chúng ta phải đọc hiểu nội dung chương 2 trước, vì nội dung trong hai chương này đều liên quan đến tổ chức dao động cho VĐK Ngoài ra, đối với nhiều người mới tìm hiểu về lập trình cho VĐK, thường họ không để ý tới các đặc trưng đặc biệt trên, nên khi nạp mã cho VĐK thì nó không thi hành đúng theo thiết kế
Các bit cấu hình của PIC 18F4550 có thể được lập trình (được đọc bằng 0) hoặc không được lập trình (được đọc bằng 1) để lựa chọn các cấu hình của chip khác nhau Các bit này
được sắp xếp bắt đầu từ vị trí bộ nhớ chương trình có địa chỉ 0x300000
Người dùng lưu ý địa chỉ 0x300000 là vượt ngoài không gian bộ nhớ chương trình người
dùng Thực tế, nó phụ thuộc vào không gian bộ nhớ cấu hình (0x300000 đến 0x3FFFFF), nó
chỉ có thể được truy xuất bằng cách đọc và ghi bảng
Trang 2Bảng 10.1: các bit cấu hình và nhận dạng chip
Thanh ghi CONFIG1L
Hình 10.1: thanh ghi CONFIG1L
Bit 7-6 – không sử dụng, đọc bằng 0
Bit 5 – USBDIV: bit chọn xung clock USB (được sử dụng chỉ với kiểu tốc độ full của USB;
UCFG.FSEN = 1)
1 = Nguồn clock USB lấy từ 96 MHz của PLL được chia 2
0 = Nguồn clock USB lấy trực tiếp từ khối dao động chính không sử dụng bộ chia
sau (postscaler)
Bit 4-3 – CPUDIV<1:0>: các bit chọn tần số xung clock hệ thống từ bộ chia sau
Áp dụng cho các chế độ dao động XT, HS, EC, ECIO
11 = FOSC/4
10 = FOSC/3
01 = FOSC/2
00 = FOSC (không dùng bộ chia sau)
Áp dụng cho các chế độ dao động XTPLL, HSPLL, ECPLL, ECPIO
11 = 96MHz (PLL)/6
10 = 96MHz (PLL)/4
01 = 96MHz (PLL)/3
Trang 300 = 96MHz (PLL)/2
Bit 2-0 – PLLDIV<2:0>: các bit chọn bộ chia PLL prescaler
111 = Chia cho 12 (ngõ vào bộ dao động 48 MHz)
110 = Chia cho 10 (ngõ vào bộ dao động 40 MHz)
101 = Chia cho 6 (ngõ vào bộ dao động 24 MHz)
100 = Chia cho 5 (ngõ vào bộ dao động 20 MHz)
011 = Chia cho 4 (ngõ vào bộ dao động 16 MHz)
010 = Chia cho 3 (ngõ vào bộ dao động 12 MHz)
001 = Chia cho 2 (ngõ vào bộ dao động 8 MHz)
000 = Không dùng prescaler (ngõ vào bộ dao động 4 MHz điều khiển PLL trực tiếp)
Thanh ghi CONFIG1H
Hình 10.2: thanh ghi CONFIG1H
Bit 7 – IESO: bit chuyển dao động ngoại/nội
1 = Cho phép chuyển dao động
0 = Không cho phép
Bit 6 – FCMEN: bit cho phép giám sát xung clock không an toàn (fail-safe)
1 = Cho phép
0 = Vô hiệu
Bit 5-4 – không sử dụng, đọc bằng 0
Bit 3-0 – FOSC<3 :0>: các bit chọn dao động(1)
111x = Dao động HS, PLL được phép (HSPLL)
110x = Dao động HS
1011 = Dao động nội, HS được sử dụng bởi USB (INTHS)
1010 = Dao động nội, XT được sử dụng bởi USB (INTXT)
1001 = Dao động nội, chân RA6 sẽ thành chức năng CLKO, EC được sử dụng bằng
USB (INTCKO)
1000 = Dao động nội, chân RA6 sẽ giữ chức năng port, EC được sử dụng bằng USB
(INTIO)
Trang 40111 = Dao động EC, PLL được phép, chân RA6 thành chức năng CLKO (ECPLL)
0110 = Dao động EC, PLL được phép, chân RA6 sẽ giữ chức năng port (ECPIO)
0101 = Dao động EC, chân RA6 sẽ thành chức năng CLKO (EC)
0100 = Dao động EC, chân RA6 sẽ giữ chức năng port (ECIO)
001x = Dao động XT, PLL được phép (XTPLL)
000x = Dao động XT (XT)
Ghi chú (1): cả VĐK và khối USB sử dụng bộ dao động đã chọn làm nguồn xung clock của chúng ở các chế độ XT, HS, EC Khối USB dùng bộ dao động XT, HS hoặc EC được chỉ định làm nguồn clock cho nó bất kể khi VĐK dùng khối dao động nội
Thanh ghi CONFIG2L
Hình 10.3: thanh ghi CONFIG2L
Bit 7-6 – không sử dụng, đọc bằng 0
Bit 5 – VREGEN: bit cho phép điều chỉnh nguồn nội USB
1 = Cho phép
0 = Vô hiệu
Bit 4-3 – BORV<1:0>: các bit điện thế reset brown-out(1)
11 = Thiết lập nhỏ nhất
0 = Thiết lập lớn nhất
Bit 2-1 – BOREN<1:0>: các bit cho phép reset brown-out(2)
11 = Reset brown-out chỉ được cho phép bằng phần cứng (SBOREN bị vô hiệu)
10 = Reset brown-out chỉ được cho phép bằng phần cứng và bị vô hiệu ở chế độ Sleep
01 = Reset brown-out được cho phép và được điều khiển bằng phần cứng (SBOREN được cho phép)
00 = Reset brown-out bị vô hiệu bằng phần cứng và phần mềm
Bit 0 – 𝐏𝐖𝐑𝐓𝐄𝐍̅̅̅̅̅̅̅̅̅̅̅̅̅: bit cho phép sử dụng bộ định thời khởi nguồn
1 = Vô hiệu PWRT
Trang 50 = Cho phép PWRT
Ghi chú:
(1) Xem chỉ mục 28.0 về "đặc tính điện" từ thông số kỹ thuật PIC 18F4550 từ nguồn
của Microchip
(2) PWRT được tách rời với reser brown-out, cho phép các đặc trưng này để được điều khiển một cách độc lập
Thanh ghi CONFIG2H
Hình 10.4: thanh ghi CONFIG2H
Bit 7-5 – không sử dụng, đọc bằng 0
Bit 4-1 – WDTPS<3:0>: các bit chọn tỷ lệ chia sau cho bộ định thời canh gác
1111 = 1 : 32,768
1110 = 1 : 16,384
1101 = 1 : 8,192
1100 = 1 : 4,096
1011 = 1 : 2,048
1010 = 1 : 1,024
1001 = 1 : 512
1000 = 1 : 256
0111 = 1 : 128
0110 = 1 : 64
0101 = 1 : 32
0100 = 1 : 16
0011 = 1 : 8
0010 = 1 : 4
0001 = 1 : 2
0000 = 1 : 1
Bit 0 – WDTEN: bit cho phép bộ định thời canh gác hoạt động
1 = WDT được phép
Trang 60 = WDT bị vô hiệu
Thanh ghi CONFIG3H
Hình 10.5: thanh ghi CONFIG3H
Bit 7 – MCLRE: bit cho phép tích cực chân MCLR̅̅̅̅̅̅̅̅
1 = MCLR̅̅̅̅̅̅̅̅ được cho phép; chân ngõ vào RE3 bị vô hiệu
0 = chân ngõ vào RE3 được cho phép; MCLR̅̅̅̅̅̅̅̅ bị vô hiệu
Bit 6-3 – không sử dụng, đọc bằng 0
Bit 2 – LPT1OSC: bit cho phép dao động Timer1 hoạt động công suất thấp
1 = Timer1 được cấu hình để hoạt động công suất thấp
0 = Timer1 được cấu hình để hoạt động công suất cao hơn
Bit 1 – PBADEN: bit cho phép sử dụng A/D của PORTB
(Ảnh hưởng trạng thái reset ADCON1 ADCON1 điều khiển cấu hình các chân PORTB<4:0>)
1 = Các chân PORTB<4:0> được cấu hình thành các kênh ngõ vào tương tự sau tác động Reset
0 = PORTB<4:0> được cấu hình thành I/O số sau tác động Reset
Bit 0 – CCP2MX: bit ghép kênh CCP2
1 = Ngõ vào/ngõ ra CCP2 được ghép với RC1
0 = Ngõ vào/ngõ ra CCP2 được ghép với RB3
Thanh ghi CONFIG4L
Hình 10.6: thanh ghi CONFIG4L
Bit 7 – 𝐃𝐄𝐁𝐔𝐆̅̅̅̅̅̅̅̅̅̅: bit cho phép gỡ rối
1 = Vô hiệu gỡ rối, RB6 và RB7 được định làm các chân I/O đa năng
0 = Cho phép gỡ rối, RB6 và RB7 được chỉ định sử dụng trong mạch gỡ rối
Bit 6 – XINST: bit cho phép sử dụng tập lệnh mở rộng
1 = Mở rộng tập lệnh và kiểu định vị chỉ mục được cho phép
Trang 70 = Vô hiệu
Bit 5 – ICPRT (In-Circuit Debug/Programming Port; ICPORT): bit cho phép ICPORT
1 = Cho phép
0 = Vô hiệu
Bit 4-3 – không sử dụng, đọc bằng 0
Bit 2 – LVP: bit cho phép ICSP nguồn đơn
1 = Cho phép
0 = Vô hiệu
Bit 1 – không sử dụng, đọc bằng 0
Bit 0 – STVREN: bit cho phép reset tràn trên hoặc dưới ngăn xếp
1 = Tràn trên hoặc dưới ngăn xếp sẽ thực hiện reset
0 = Tràn trên hoặc dưới ngăn xếp sẽ không thực hiện reset
Thanh ghi CONFIG5L
Hình 10.7: thanh ghi CONFIG5L
Bit 7-4 – không sử dụng, đọc bằng 0
Bit 3 – CP3: bit bảo vệ mã(1)
1 = Mã trong khối 3 (0x006000 – 0x007FFF) không được bảo vệ
0 = Mã trong khối 3 (0x006000 – 0x007FFF) được bảo vệ
Bit 2 – CP2: bit bảo vệ mã
1 = Mã trong khối 2 (0x004000 – 0x005FFF) không được bảo vệ
0 = Mã trong khối 2 (0x004000 – 0x005FFF) được bảo vệ
Bit 1 – CP1: bit bảo vệ mã
1 = Mã trong khối 1 (0x002000 – 0x003FFF) không được bảo vệ
0 = Mã trong khối 1 (0x002000 – 0x003FFF) được bảo vệ
Bit 0 – CP0: bit bảo vệ mã
1 = Mã trong khối 0 (0x000800 – 0x001FFF) không được bảo vệ
0 = Mã trong khối 0 (0x000800 – 0x001FFF) được bảo vệ
Trang 8Thanh ghi CONFIG5H
Hình 10.8: thanh ghi CONFIG5H
Bit 7 – CPD: bit bảo vệ mã EEPROM dữ liệu
1 = EEPROM dữ liệu không được bảo vệ
0 = EEPROM dữ liệu được bảo vệ
Bit 6 – CPB: bit bảo vệ mã khối boot
1 = Khối boot (0x000000 – 0x0007FF) không được bảo vệ
0 = Khối boot (0x000000 – 0x0007FF) được bảo vệ
Bit 5-0 – không sử dụng, đọc bằng 0
Thanh ghi CONFIG6L
Hình 10.9: thanh ghi CONFIG6L
Bit 7-4 – không sử dụng, đọc bằng 0
Bit 3 – WRT3: bit bảo vệ ghi(1)
1 = Khối 3 (0x006000 – 0x007FFF) không được chống ghi
0 = Khối 3 (0x006000 – 0x007FFF) được chống ghi
Bit 2 – WRT2: bit bảo vệ ghi
1 = Khối 2 (0x004000 – 0x005FFF) không được chống ghi
0 = Khối 2 (0x004000 – 0x005FFF) được chống ghi
Bit 1 – WRT1: bit bảo vệ ghi
1 = Khối 1 (0x002000 – 0x003FFF) không được chống ghi
0 = Khối 1 (0x002000 – 0x003FFF) được chống ghi
Bit 0 – WRT0: bit bảo vệ ghi
1 = Khối 0 (0x000800 – 0x001FFF) không được chống ghi
0 = Khối 0 (0x000800 – 0x001FFF) được chống ghi
Trang 9Thanh ghi CONFIG6H
Hình 10.10: thanh ghi CONFIG6H
Bit 7 – WRTD: bit bảo vệ ghi EEPROM dữ liệu
1 = EEPROM dữ liệu không được chống ghi
0 = EEPROM dữ liệu được chống ghi
Bit 6 – WRTB: bit bảo vệ ghi khối boot
1 = Khối boot (0x000000 – 0x0007FF) không được chống ghi
0 = Khối boot (0x000000 – 0x0007FF) được chống ghi
Bit 5 – WRTC: bit bảo vệ ghi thanh ghi cấu hình
1 = Các thanh ghi cấu hình (0x300000 – 0x3000FF) không được chống ghi
0 = Các thanh ghi cấu hình (0x300000 – 0x3000FF) được chống ghi
Bit 4-0 – không sử dụng, đọc bằng 0
Thanh ghi CONFIG7L
Hình 10.11: thanh ghi CONFIG7L
Bit 7-4 – không sử dụng, đọc bằng 0
Bit 3 – EBTR3: bit bảo vệ đọc bảng(1)
1 = Khối 3 (0x006000 – 0x007FFF) không được bảo vệ từ hành động đọc bảng được
thi hành trong các khối khác
0 = Khối 3 (0x006000 – 0x007FFF) được bảo vệ từ hành động đọc bảng được thi
hành trong các khối khác
Bit 2 – EBTR2: bit bảo vệ đọc bảng
1 = Khối 2 (0x004000 – 0x005FFF) không được bảo vệ từ hành động đọc bảng được
thi hành trong các khối khác
0 = Khối 2 (0x004000 – 0x005FFF) được bảo vệ từ hành động đọc bảng được thi
hành trong các khối khác
Bit 1 – EBTR1: bit bảo vệ đọc bảng
Trang 101 = Khối 1 (0x002000 – 0x003FFF) không được bảo vệ từ hành động đọc bảng được
thi hành trong các khối khác
0 = Khối 1 (0x002000 – 0x003FFF) được bảo vệ từ hành động đọc bảng được thi
hành trong các khối khác
Bit 0 – EBTR0: bit bảo vệ đọc bảng
1 = Khối 0 (0x000800 – 0x001FFF) không được bảo vệ từ hành động đọc bảng được
thi hành trong các khối khác
0 = Khối 0 (0x000800 – 0x001FFF) được bảo vệ từ hành động đọc bảng được thi
hành trong các khối khác
Thanh ghi CONFIG7H
Hình 10.12: thanh ghi CONFIG7H
Bit 7 – không sử dụng, đọc bằng 0
Bit 6 – EBTRB: bit bảo vệ đọc bảng khối boot
1 = Khối boot (0x000000 – 0x0007FF) không được bảo vệ từ hành động đọc bảng
được thi hành trong các khối khác
0 = Khối boot (0x000000 – 0x0007FF) được bảo vệ từ hành động đọc bảng được thi
hành trong các khối khác
Bit 5-0 – không sử dụng, đọc bằng 0
Thanh ghi DEVID1 (Device ID)
Hình 10.13: thanh ghi DEVID1
Bit 7-5 – DEVID<2:0>: các bit nhận dạng chip
011 = PIC18F2455
010 = PIC18F2550
001 = PIC18F4455
000 = PIC18F4550
Bit 4-0 – REV<4:0>: các bit nhận dạng lại
Trang 11Thanh ghi DEVID2
Hình 10.14: thanh ghi DEVID2
Bit 7-0 – DEV<10:3>: các bit nhận dạng chip
Các bit này được sử dụng với các bit DEV<2:0> trong thanh ghi để nhận biết phần số
0001 0010 = PIC18F2455/2550/4455/4550
Với PIC 18F2455/2550/4450/4550, bộ định thời canh gác WDT nhận xung điều khiển
từ nguồn INTRC Khi WDT được cho phép, nguồn xung clock này cũng được tích cực Chu
kỳ WDT danh định là 4 ms và độ ổn định tương tự dao động INTRC Chu kỳ 4 ms của WDT được nhân bởi postscaler 16-bit Ngõ ra bất kỳ của bộ chia sau WDT được lựa chọn bằng bộ dồn kênh, được điều khiển bằng các bit trong thanh ghi CONFIG2H Dải chu kỳ định sẵn từ
4 ms đến 131.072 s (2.18 phút) WDT và bộ chia sau WDT được xoá khi có bất kỳ sự kiện sau xảy ra: lệnh SLEEP hoặc CLRWDT được thi hành, các bit IRCF (OSCON<6:4>) bị thay
đổi hay lỗi xung clock đã xảy ra
Hình 10.15: sơ đồ khối WDT
Thanh ghi điều khiển bộ định thời canh gách (WDTCON)
Thanh ghi WDTCON có thể đọc và ghi, nó chứa 1 bit điều khiển mà nó cho phép điều khiển bằng phần mềm không quan tâm đến bit cấu hình cho phép WDT, chỉ áp dụng khi bit cấu hình đã vô hiệu WDT
Hình 10.16: thanh ghi WDTCON
Bit 7-1 – không sử dụng, đọc bằng 0
Trang 12Bit 0 – SWDTEN: bit cho phép WDT được điều khiển bằng phần mềm
1 = Cho phép WDT hoạt động
0 = Tắt WDT
10.3.1 Kiểm tra lập trình và bảo vệ mã
Bảo vệ mã bộ nhớ chương trình
Bộ nhớ lập trình người dùng được phân chia thanh 5 khối Trong đó, khối boot có dung lượng 2 kbyte
Mỗi khối có 3 bit bảo vệ mã: bit bảo vệ mã (CPn), bit bảo vệ ghi (WRTn) và bit đọc bảng khối ngoài (EBTRn)
Hình 10.17: bộ nhớ chương trình có bảo vệ mã (PIC 18F2455/2550/4455/4550)
Bảng 10.2: tóm tắt các thanh ghi bảo vệ mã
Địa chỉ Thanh ghi Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
0x30000A CONFIG6L - - - - WRT3 WRT2 WRT1 WRT0
0x30000B CONFIG6H WRTD WRTB WRTC - - - - -
0x30000C CONFIG7L - - - - EBTR3 EBTR2 EBTR1 EBTR0
Chú thích:
“-”: không sử dụng
Trang 13Bảo vệ mã bộ nhớ chương trình
Bộ nhớ chương trình có thể được đọc hay ghi ở vị trí bất kỳ bằng sử dụng các lệnh đọc
và ghi bảng Nhãn nhận dạng VĐK cũng được thấy bằng đọc bảng Các thanh ghi cấu hình cũng được đọc và ghi bằng các lệnh đọc và ghi bảng
Ở chế độ hoạt động thông thường, các bit CPn không ảnh hưởng trực tiếp Các bit CPn ngăn cấm việc đọc và ghi từ bên ngoài Một khối bộ nhớ người dùng có thể được bảo vệ từ hành động ghi bảng nếu bit WRTn = 0 tương ứng Nếu muốn bảo vệ đọc bảng trong khối bộ nhớ nào thì chỉ cần đặt các bit EBTRn = 0 tương ứng
Lệnh đọc bảng mà nó thi hành từ vị trí ở ngoài khối đó không được cho phép để đọc và làm cho kết quả đọc bằng toàn bộ 0
Hình 10.18: ví dụ về ghi bảng bảng không được phép Bảo vệ mã bộ nhớ EEPROM dữ liệu
Toàn bộ dữ liệu EEPROM được bảo vệ từ sự đọc và ghi bên ngoài bằng 2 bit là CPD
và WRTD Bit CPD ngăn cấm bên ngoài việc đọc và ghi dữ liệu EEPROM, còn bit WRTD
ngăn cấm cả bên trong và bên ngoài ghi dữ liệu vào EEPROM
Bảo vệ thanh ghi cấu hình
Các thanh ghi cấu hình có thể được bảo vệ ghi Bit WRTC giám sát bảo vệ các thanh ghi cấu hình Ở chế độ thi hành bình thường, WRTC chỉ có thể đọc WRTC chỉ có thể được ghi nhờ hoạt động ICSP hoặc bộ lập trình bên ngoài
10.3.2 Mạch lập trình PIC
Sơ đồ mạch nguyên lý hình 10.19 là sơ đồ mạch thực tế đã test thử nghiệm, kết quả lập trình cho các dòng của PIC chạy rất ổn định Kit lập trình này hoàn toàn tương thích với
Trang 14PICkit 2 của hãng Microchip, nên người dùng co thể tải phần mềm và firmware từ website của Microchip về để nạp mã cho kit
Kit lập trình được giới thiệu có những ưu điểm: tương thích với PICkit 2 của Microchip
(người dùng có thể sử dụng các phần mềm và firmware có sẵn của Microchip mà không phải cực công viết lại), không sử dụng nguồn điện ngoài, linh kiện hoàn toàn mua được trên thị trường trong nước (cả linh kiện dán và ghim chân), sơ đồ mạch đơn giản hơn nhiều so với
PICkit 2 chính hãng, mạch nhỏ gọn và giá thành cũng rẻ hơn nhiều so với chính hãng, mạch chạy ổn định
Hướng dẫn cách sử dụng kit này, người dùng tham khảo trực tiếp từ cách sử dụng PICkit
2 của Microchip Trong sơ đồ mạch có đầu kết nối ICSP, người dùng có thể chọn kiểu đầu kết nối khác nhau để thuận tiện trong thiết kế sử dụng
Hình 10.19: sơ đồ nguyên lý kit lập trình cho PIC
Hình 10.20 là giao diện của PICkit 2 từ hãng Microchip có thể tải miễn phí phần mềm
từ hãng về
R4 100K
R11 330
PGC
JP3
USB
1
3
5
R15
4K7
L1 680uH Y1
20MHz
R14 22K
R16
4K7
C4 100nF
5V
AXU
R7 330
Q3 MMBT3906 5V
JP1
ICSP
1
3
5
C3 15pF
Vdd
R2 4K7
5V
D1 ZHCS1000
Vpp
Q1 MMBT3904 R1 1K
PGD
R8 100 R5 10K
5V
C5 100nF
GND
U1
PIC18F2550
1
2
3
4
5
6
7
9
10
11
12
13
15
16
17
18
21
22
23
24
25
26
27
28
MCLR/Vpp/RE3
RA0/AN0
RA1/AN1
RA2/AN2/Vref -/CVref
RA3/AN3/Vref +
RA4/T0CKI/C1OUT/RCV
RA5/AN4/SS/HLVDIN/C2OUT
OSC1/CLKI
OSC2/CLKO/RA6
RC0/T1OSO/T13CKI
RC1/T1OSI/CCP2/UOE
RC2/CCP1
RC4/D-/VM
RC5/D+/VP
RC6/TX/CK
RC7/RX/DT/SDO
DRB0/AN12/INT0/FLT0/SDI/SDA
RB1/AN10/INT1/SCK/SCL
RB2/AN8/INT2/VMO
RB3/AN9/CCP2/VPO
RB4/AN11/KBI0
RB5/KBI1/PGM
RB6/KBI2/PGC
RB7/KBI3/PGD
Q4 MMBT3904
D3
RED
D4 GREEN
R3 2K7
Q2 MMBT3904
C2 15pF
S1
JP2
ICSP
1
3
5
C1 47uF D2
SS14
R17 100
R6 10K