CHƯƠNG IV: GIỚI THIỆU VỀ VI ĐIỀU KHIỂN PIC18F452 4.1 Giới thiệu chung
4.2 Cấu trúc tổng quát PIC18F
Gồm:
- 8 K Flash ROM - 368 bytes RAM
- 256 bytes EEPROM
- 5 Port I/O (A, B, C, D, E), ngõ vào/ra với tín hiệu điều khiển độc lập - 2 bộ định thời 8 bit Timer 0 và Timer 2
- 1 bộ định thời 16 bit Timer 1, có thể hoạt động trong cả chế độ tiết kiệm năng lượng (Sleep Mode) với nguồn xung clock ngoài
- 2 bộ CCP, Capture/Compare/PWM - tạm gọi là: Bắt giữ /So sánh /Điều biến xung.
- 1 bộ biến đổi tương tự – số (ADC) 10 bit, 8 ngõ vào - 2 bộ so sánh tương tự (Comparator)
- 1 bộ định thời giám sát (WDT – Watch Dog Timer)
- 1 cổng song song (Parallel Port) 8 bit với các tín hiệu điều khiển - 1 cổng nối tiếp (Serial Port)
- 14 nguồn ngắt (Interrupt)
- Chế độ tiết kiệm năng lượng (Sleep Mode)
- Nạp chương trình bằng cổng nối tiếp ICSPTM (In-Circuit Serial Programing)
- Nguồn dao động lập trình được tạo bằng công nghệ CMOS - 35 tập lệnh có độ dài 14 bit
- Tần số hoạt động tối đa là 20 MHz.
• Cấu trúc phần cứng PIC18F452:
PIC là một vi điều khiển với kiến trúc RISC, chạy một lệnh một chu kỳ máy (4 chu kỳ của bộ dao động).
PIC18F452 là họ vi điều khiển có 40 chân, mỗi chân có một chức năng khác nhau. Trong đó có một số chân đa công dụng (đa hợp), mỗi chân có thể hoạt động như một đường xuất/nhập (I/O) độc lập hoặc là một chức năng đặc biệt dùng để giao tiếp với các thiết bị ngoại vi.
4.2.1 Mạch dao động cho vi điều khiển PIC.
Hình 4.2: Mạch dao động thạch anh
Mỗi vi điều khiển hoạt động đều cần một xung clock nhất định. Hai chân OSC1 và OSC2 (chân 13 và chân 14) cung cấp dao động cho vi điều khiển PIC hoạt động.
PIC18F452 có thể hoạt động trong 4 chế độ dao động khác nhau: Ở chế độ LP, XT, HS, thì dùng thạch anh nối vào 2 chân OSC1 và OSC2 để thiếp lập dao động. Việc mắc thêm các tụ lọc giúp tăng tính ổn định của bộ dao động, tuy nhiên giá trị của tụ không quá lớn hay quá nhỏ để dao động ổn định và thời gian khởi động ngắn. Với điện thế Vdd > 4.5V thì nên dùng tụ có trị số 33pF.
Đối với một số ứng dụng mà độ chính xác của thời gian không quan trọng, có thể dùng dao động RC như một giải pháp tiết kiệm. Tần số dao động được xác định bởi giá trị của điện trở R và tụ C.
4.2.2 Chân Reset PIC (MCLR – Master Clear)
Ngõ vào Master Clear (RESET PIC) trên chân số 1 của vi điều khiển PIC. Khi đưa MCLR xuống thấp, các thanh ghi bên trong vi điều khiển PIC sẽ được tải những giá trị thích hợp để khởi động lại hệ thống.
Hình 4.3: Sơ đồ mạch Master Clear (RESET PIC) 4.2.3 Nguồn cấp cho PIC18F452
IC18F452 vận hành với nguồn đơn 5V. VDD (chân nguồn dương) được nối váo chân số 11 và 32 của PIC. Vss (chân mass) được nối vào chân số 12 và 31 của PIC. Cả 4 chân này phải được nối nguồn thì PIC mới hoạt động được.
4.2.4 Tổ chức bộ nhớ trong PIC PIC18F452.
Có tất cả 3 khối bộ nhớ riêng biệt trong PIC18F452 bao gồm: Bộ nhớ dữ liệu, Bộ nhớ chương trình, và Bộ nhớ EEPROM.
PIC18F452 có bộ đếm chương trình (Program Counter) dài 13 bit có thể định địa chỉ cho 8K không gian bộ nhớ, 8K không gian bộ nhớ được chia làm 8 trang bộ nhớ. Mọi sự truy cập ngoài vùng không gian này sẽ không có tác dụng. Bộ nhớ chương trình còn có các ngăn xếp (stack) với 8 mức. Vector reset được đặt ở địa chỉ 0000h và vector ngắt ngoại vi được đặt ở địa chỉ 0004h, khi PIC được reset thì chương trình sẽ nhảy về vị trí vector reset và bắt đầu thực hiện tại đó.
Bộ nhớ dữ liệu bao gồm 4 Bank: Bank 0, Bank 1, Bank 2, và Bank 3. Mỗi Bank có dung lượng 128 Bytes, bao gồm vùng RAM đa mục đích và vùng các thanh ghi chức năng đặc biệt SFRs (Special Function Registers).
Các vùng RAM đa mục đích (GPR – General Purpose RAM) có chiều rộng là 8 bit và được truy cập trực tiếp hoặc gián tiếp thông qua thanh ghi chức năng đặc biệt. Các thanh ghi chức năng đặc biệt được sử dụng bởi bộ xử lý trung tâm và các hàm chức năng ngoại vi để điều khiển hoạt động của các thiết bị. Các thanh ghi chức năng đặc biệt được chia làm 2 loại, loại thứ nhất dùng cho các chức năng ngoại vi (ngắt, so sánh, điều biến xung PWM,...) loại thứ hai dùng cho các chức năng bên trong của vi điều khiển (các phép tính số học, truy xuất dữ liệu,... )
Các phần ứng dụng điều khiển dùng PIC18F452 sẽ được trình bày cụ thể trong các phần tiếp theo, ví dụ như việc truy xuất các port I/O, delay, Bộ biến đổi ADC, hay ngắt,... Có thể khái quát một điều là việc truy xuất dữ liệu trong PIC cần được thực hiện theo một trình tự như sau:
- Đầu tiên: Chọn và thiết lập các Bank 0, 1, 2, 3 trong bộ nhớ dữ liệu bằng các thanh ghi chức năng đăc biệt.
- Tiếp theo: Chọn và thiết lập thanh ghi TRISx để định hướng Port, thiết lập các bit điều khiển liên quan.
- Cuối cùng: Chọn và tác động các Port, hoặc các thanh ghi chức năng khác cần cho việc điều khiển.
trong RAM tại các thanh ghi đa mục đích của RAM. Có tổng cộng là 368 byte RAM trong các thanh ghi đa mục đích để sử dụng.
Hình 4.5: Bản đồ cấu trúc bộ nhớ dữ liệu của PIC18F452. 4.2.5 Các Port x và thanh ghi TRISx [ x={A,B,C,D,E} ]
Bảng 4.6: Các thanh ghi liên quan đến Port A
Ghi chú: x – giá trị không rõ, u – giá trị không thay đổi.
Port A gồm 6 chân RA0-RA5 (các chân 2, 3, 4, 5, 6, 7), việc ghi các giá trị nào vào thanh ghi TRISA sẽ quy định các chân của Port A là Input hay Output, 0 = Output, 1 = Input.
Việc đọc thanh ghi Port A sẽ đọc các trạng thái chân của Port A. Việc ghi giá trị vào thanh ghi Port A sẽ thay đổi các trạng thái của các chân của Port A. Riêng chân RA4 được tích hợp thêm chức năng cung cấp xung clock ngoài cho Timer 0 (RA4/ T0CLKI). Chân này như một đầu vào của Schmitt Trigger và nó mở đầu ra. Các chân khác của Port A được đa hợp với các chân Analog của bộ ADC và chân ngõ vào điện thế so sánh của bộ so sánh Comparator. Hoạt động của các chân này được quy định bằng các bit ADCON1 và CMCON1.
Khi các chân của Port A được sử dụng là ngõ vào thì các bit của thanh ghi TRISA phải luôn bằng 1.
Bảng 4.7: Các thanh ghi liên quan đến Port B
Ghi chú: x – giá trị không rõ, u – giá trị không thay đổi. Các ô tô bóng không được
dùng bởi Port B
Port B là cổng hai chiều với độ rộng đường truyền là 8 bít tương ứng với 8 chân RB0-RB7 (các chân từ 33 – 40), việc ghi các giá trị nào vào thanh ghi TRISB sẽ quy định các chân của Port B là Input hay Output, 0 = Output, 1 = Input.
Việc đọc thanh ghi Port B sẽ đọc các trạng thái chân cảu Port B. Việc ghi giá trị vào thanh ghi Port B sẽ thay đổi các trạng thái của các chân của Port B.
Ba chân của Port B được đa hợp với chức năng In-Circuit Debugger và Low Voltage Programing Function là RB3/PGM, RB6/PGC, RB7/PGD. Việc thay đổi chức năng của ba thanh ghi này được đề cập trong phần các thanh ghi chức năng đặc biệt.
Mỗi chân của Port B có một transistor kéo lên nguồn Vdd , chức năng này hoạt động khi bit RBPU OPTION<7> được xóa, chức năng này sẽ tự động tắt khi chân Port B được quy định là Input. Bốn chân RB4-RB7 có chức năng ngắt (interrupt) khi trạng thái chân Port thay đổi (khi chân Port được quy định là output thì chức năng này không hoạt động), giá trị chân Port được so sánh với giá trị được lưu lại trước đó, khi có 2 trạng thái sai lệch giữa 2 giá trị này, ngắt sẽ xảy ra với cờ ngắt RBIF INTCON<0> bật lên, ngắt có thể làm cho vi điều khiển thoát khỏi trạng thái Sleep Mode.
Bất cứ hoạt động truy xuất nào trên Port B sẽ xóa trạng thái sai lệch, kết thúc ngắt và cho phép xóa cờ RBIF.
v Port C và thanh ghi TRIS C
Ghi chú: x – giá trị không rõ, u – giá trị không thay đổi.
Port C gồm 8 chân từ RC0-RC7, việc ghi các giá trị nào vào thanh ghi TRISC sẽ quy định các chân của Port C là Input hay Output, 0 = Output, 1 = Input. Đặt nội dung của chốt ra có thể đặt trên chân chọn.
Việc đọc thanh ghi Port C sẽ đọc các trạng thái chân của Port C. Việc ghi giá trị vào thanh ghi Port C sẽ thay đổi các trạng thái của các chân của Port C.
Khi chế độ I2C hoạt động, thì các chân cổng PORTC <4:3> có thể được sắp xếp với mức I2C thường hoặc mức SMBUS bằng cách sử dụng bit CKE (SSPSTAT<6>) là bit 6 của thanh ghi SSPSTAT.
Các chân của Port C được đa hợp với các chức năng ngoại vi. Chân của cổng C thông qua bộ đệm Schmitt Trigger đầu vào. Khi các hàm chức năng ngoại vi được cho phép, thì cần quan tâm chặt chẽ tới giá trị các bit của thanh ghi TRISC. Một số chức năng ngoại vi sẽ ghi các giá trị 0 đè lên các bit của thanh ghi TRISC và mặc định các chân là ngõ vào. Do đó cần phải xem xét kỹ các tính năng của các hàm ngoại vi để thiết lập giá trị các bit trong thanh ghi TRISC cho chính xác.
v Port D và thanh ghi TRISD
Bảng 4.9: Các thanh ghi liên quan đến Port D
Ghi chú: x – giá trị không rõ, u – giá trị không thay đổi.
Port D gồm 8 chân từ RD0-RD7, có bộ đệm đầu vào Schmitt Trigger. Ngoài việc Port D được cấu trúc là một Port xuất nhập, nó còn có thể hoạt động như một cổng song song phụ tá (Parallel Slave Port) bằng cách đặt bit PSPMODE(TRIS<4>) lên 1, trong chế độ này buffer của ngõ vào là linh kiện TTL.
v Port E và thanh ghi TRISE
Bảng 4.10: Các thanh ghi liên quan đến Port E
Ghi chú: x – giá trị không rõ, u – giá trị không thay đổi. Các ô tô bóng không được
dùng bởi Port E.
Port E có 3 chân RE0/RD/AN5, RE1/WR/AN6, và RE2/CS/AN7 có thể được cấu hình là các chân xuất nhập.
Các chân của Port E có thể trở thành các chân điều khiển cho các cổng của vi xử lý khi bit PSPMODE(TRISE<4>) được đặt lên 1. Trong chế độ này, phải đảm bảo rằng các bit từ 0 đến 2 của thanh ghi TRISE phải được đặt lên 1 để các chân này được cấu hình như là chân ngõ vào.
Ngoài ra, các chân của Port E còn được cấu hình như các ngõ vào Analog, ở chế độ này khi đọc trạng thái các chân của Port E sẽ cho ta giá trị 0.
Thanh ghi TRISE quy định chức năng xuất nhập của các chân Port E ngay cả khi nó được sử dụng là các ngõ vào Analog, khi đó các chân Port E phải là ngõ vào.
4.2.6 Các bộ Timer của chip.
Bộ vi điều khiển PIC18F452 có 4 bộ Timer đó là: Timer0, Timer1, Timer2, Timer3
v Bộ Timer0
Là bộ định thời hoặc bộ đếm có những ưu điểm nổi bật sau: - 8 bit hoặc 16 bit cho timer/ bộ đếm
- Có thể dùng đồng hồ bên trong hoặc bên ngoài - Có thể chọn cạnh xung của xung đồng hồ
- Có hệ số chia cho xung đầu vào có thể lập trình lại bằng phần mềm - Ngắt tràn
Hoạt động của Timer 0:
Timer 0 có thể hoạt động như một bộ định thời hoặc một bộ đếm. Việc chọn bộ định thời hoặc bộ đếm có thể được xác lập bằng việc xóa hoặc đặt bit T0CS của thanh ghi OPTION_REG<5>.
Nếu dùng hệ số chia xung đầu vào thì xóa bit PSA của thanh ghi OPTION_REG<3>.
Trong chế độ bộ định thời được lựa chọn bởi việc xóa bit TOCS (OPTION_REG<5>), nó sẽ được tăng giá trị sau một chu kỳ lệnh nếu không chọn hệ số chia xung đầu vào. Và giá trị của nó được viết tới thanh ghi TMR0.
Chế độ đếm được lựa chọn bởi việc set bit TOCS (OPTION_REG<5>). Trong chế độ bộ đếm, nó sẽ được tăng ở xung đi xuống nếu xóa bit T0SE (OPTION_REG<4>) hoặc ở xung đi lên nếu set bit T0SE. Và giá trị của nó được viết tới thanh ghi TMR0.
Khi dùng xung clock bên ngoài cho bộ định thời Timer0 và không dùng hệ số chia clock đầu vào Timer0 thì phải đáp ứng các điều kiện cần thiết để có thể hoạt động, đó là phải bảo đảm xung clock bên ngoài có thể đồng bộ với pha clock bên trong (TOSC).
v Bộ Timer1
Bộ Timer1 có thể là bộ đếm hoặc bộ định thời với ưu điểm sau:
- 16 bit cho bộ đếm hoặc bộ định thời (gồm 2 thanh ghi TMR1H: TMR1L). - Có khả năng đọc và viết
- Có thể chọn xung đồng hồ bên trong hoặc đồng hồ bên ngoài
Timer1 có thanh ghi điều khiển, đó là thanh ghi T1CON. Bộ Timer1 có hoạt động hay không hoạt động là nhờ việc đặt hoặc xóa bit TMR1ON (T1CON<0>).
Hoạt động của bộ Timer1
Nó có thể hoạt động ở một trong các chế độ sau:
- Là một bộ định thời 16 bit - Là một bộ đếm có đồng bộ
- Là một bộ đếm không đồng bộ.
Phương thức hoạt động của bộ này được xác định bởi việc chọn nguồn xung vào Timer1. Nguồn xung đồng hồ được chọn bởi việc đặt hoặc xóa bit TMR1CS (T1CON<1>). Ở chế độ bộ định thời, đầu vào là clock trong FOSC /4, bit đồng bộ T1SYNC(T1CON<2>), không có tác dụng vì clock trong luôn đồng bộ. Chế độ bộ đếm hoạt động hai chế độ: Có đồng bộ xung vào xóa bit T1SYNC(T1CON<2>), không đồng bộ xung vào set bit T1SYNC(T1CON<2>). Timer1 tăng ở sườn lên xung đầu vào. Khi bộ dao động Timer1 cho phép hoạt động thì các chân RC1/T1OSI/CCP2, RC0/T1OSO/T1CKI trở thành chân vào.
Ở chế độ đếm có đồng bộ, bộ đếm tăng mỗi khi sườn lên ở chân RC0 hoặc ở chân RC1 nếu bit T1OSCEN xóa và xung vào phải đồng bộ với Clock trong, ở chế độ này bộ đếm không tăng trong trạng thái SLEEP.
Ở chế độ đếm không đồng bộ Timer1 tăng mỗi khi sườn lên ở chân RC0 hoặc ở chân RC1 nếu bit T1OSCEN xóa, ở chế độ này bộ đếm tiếp tục tăng trong trạng thái SLEEP và có khả năng tràn gây ra ngắt khi đó bộ xử lý được đánh thức.
Dao động của Timer1
Mạch dao động thạch anh được xây dựng giữa 2 chân T1OSI và T1OS0. Khi dao động được cung cấp ở chế độ công suất thấp thì tần số cực đại của nó sẽ là 200 KHz và trong nó ở chế độ SLEEP nó cung cấp ở tần số 32 KHz
v Bộ Timer2
- 8 bit cho bộ định thời (thanh ghi TMR2).
- 8 bit vòng lặp (thanh ghi PR2)
- Có khả năng đọc và viết ở cả hai thanh ghi nói trên.
- Có khả năng lập trình bằng phần mềm tỷ lệ trước
- Có khả năng lập trình bằng phần mềm tỷ lệ sau
Chế độ SSP dùng đầu ra của TMR2 để tạo xung Clock. Timer2 có một thanh ghi điều khiển đó là thanh ghi T2CON. Timer2 có thể tắt bằng việc xóa bit TMR2CON của thanh ghi T2CON.
Hoạt động của bộ Timer2
Timer2 được dùng chủ yếu ở phần điều chế xung của bộ CCP, thanh ghi TMR2 có khả năng đọc và viết, nó có thể xóa bằng việc Reset lại thiết bị. Đầu vào của xung có thể chọn các tỷ số sau: 1:1, 1:2 hoặc 1:6; Việc chọn các tỷ số này có thể điều khiển các bit sau T2CKPS1 và bit T2CKPS0.
v Bộ Timer3
Bộ Timer3 có thể là bộ đếm hoặc bộ định thời với ưu điểm sau:
- 16 bit cho bộ đếm hoặc bộ định thời (gồm 2 thanh ghi TMR3H: TMR3L).