Hướng dẫn sử dụng vi điều khiển 8-Bit sg8v1

. Lập trình thanh ghi SPICON.  Chế độ master – SPIMS (SPICON [2] ) = 0.  Chế độ SCK – SPICKP: SPICKE (SPICON [4:3]).  Tốc độ truyền – SPIMODE [1:0] (SPICON [1:0]).

pdf98 trang | Chia sẻ: chaien | Lượt xem: 1536 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Hướng dẫn sử dụng vi điều khiển 8-Bit sg8v1, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
D Q /WE Portout Portin Data bus Write to port Write to DIR Input buffer Portout Portin Input buffer Data bus Write to port Write to DIR Cổng truy xuất dữ liệu © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 62 Q D PORTB /spclk PORTBspdatai EEPROM input Q D PORTB /spdatao DIR latch 0 1 EEPROM output spsc D Q /WE D Q /WE D Q /WE D Q /WE Data bus Write to port Write to DIR Input buffer Portin Portout Data bus Write to port Write to DIR DIR latch Portout Portin Input buffer spcsspcs Hình9-6: IO PortB[5:7] - dùng chung với bộ lập trình FLASH Bảng 9-6: Chức năng của PortB Tên chân Bit DIR I/O Mô tả PORTB[1:0] 0 I Dữ liệu vào 1 O Dữ liệu ra PORTB[2]/RX2 0 I Dữ liệu vào /ngõ vào nối tiếp của UART2 1 O Dữ liệu ra PORTB[3]/TX2 0 I Dữ liệu vào 1 O Dữ liệu ra /ngõ ra nối tiếp của UART2 PORTB[4]/T0CLK 0 I Dữ liệu vào /clock ngoài của Timer0 1 O Dữ liệu ra PORTB[5]/SPCLK 0 I Dữ liệu vào /clock nối tiếp của bộ nạp FLASH 1 O Data output PORTB[6]/SPDATAI 0 I Dữ liệu vào / dữ liệu vào nối tiếp của bộ nạp FLASH 1 O Dữ liệu ra PORTB[7]/SPDATAO 0 I Dữ liệu vào 1 O Dữ liệu ra / dữ liệu ra nối tiếp của bộ nạp FLASH Bảng 9-7: Thanh ghi DIRB Tên Bit R/W Mô tả DIRB [7:0] R/W Thanh ghi xác định chiều dữ liệu của PortB. Mỗi bit trong thanh ghi DIRB tương ứng với một chân trong PortB. 0: DATAINB = PortB 1: PortB = DATAOUTB. Cổng truy xuất dữ liệu © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 63 Bảng9-8: Mô tả thanh ghi PORTB Tên Bit R/W Mô tả PORTB [7:0] R Khi CPU đọc tại địa chỉ PORTB, dữ liệu gửi về là từ thanh ghi DATAINB. Mỗi bit trong thanh ghi DATAINB tương ứng với một chân trong PortB. W Khi CPU ghi vào tại địa chỉ PORTB, dữ liệu được ghi vào thanh ghi DATAOUTB. Mỗi bit trong hanh ghi DATAOUTB tương ứng với một chân trong PortB khi DIRB = 1. Ngõ ra Port[3] còn phụ thuộc vào bit U2ON trong thanh ghi U2STA (xem phần 17.2.1 Thanh ghi trạng thái của ngoại vi UART thứ x (UxSTA)). 9.3. GPIO PortC PortC là một port 8-bit hai chiều. người sử dụng có thể lập trình để chọn chiều vào/ra của dữ liệu. Tất cả các chân PortC được pull-up. Khi bit DIRC = 0 thì PortC là ngõ vào. Khi bit DIRC = 1 thì PortC là ngõ ra. PortC có 2 thanh ghi lưu dữ liệu: một thanh lưu dữ liệu đưa ra PortC do CPU ghi vào (DATAOUTC), một thanh ghi nhận dữ liệu từ PortC vào (DATAINC). Bên cạnh chức năng GPIO, PortC còn được sử dụng cho các chức năng khác như UART1, PWM, SPI. Nếu UART1 được sử dụng thì PortC[0] được cấu hình là ngõ vào và PortC[1] được cấu hình là ngõ ra. Nếu PWM được sử dụng thì PortC[2] và PortC[3] được cấu hình là ngõ ra. Nếu SPI được sử dụng:  Chế độ master: PortC[5] được cấu hình là ngõ vào và PortC[4] và PortC[6] được cấu hình là ngõ ra.  Chế độ slave: PortC[4], PortC[5] và PortC[7] được cấu hình là ngõ vào và PortC[6] được cấu hình là ngõ ra. Cổng truy xuất dữ liệu © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 64 PORTC /RX1 Q D PORTC /TX1 DIR latch 0 1TX1 U1ON D Q Q D DIR latch /WE D Q /WE RX1 D Q /WE D Q /WE Data bus Write to port Write to DIR Portout Portin Input buffer Data bus Write to port Write to DIR Portout Portin Input buffer Hình9-7: IO PortC[0:1] - dùng chung với UART1 Q D PORTC /PWM1 PORTC /PWM2 DIR latch 0 1 PWM output PWMxON D Q /WE D Q /WE Data bus Write to port Write to DIR Portout Portin Input buffer Hình9-8: IO PortC[2:3] - dùng chung với PWM Q D PORTC /SCK DIR latch 0 1 SCK output SPION Q D PORTC /SDI DIR latch SDI SCK input D Q /WE D Q /WE D Q /WE D Q /WE Data bus Write to port Write to DIR Input buffer Portout Portin Data bus Write to port Write to DIR Portout Portin Input buffer Hình9-9: IO PortC[4:5] - dùng chung với SPI Cổng truy xuất dữ liệu © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 65 Q D DIR latch 0 1 SDO SPION PORTC /SDO Q D PORTC /SSx Data latch DIR latch SSx D Q /WE D Q /WE D Q /WE D Q /WE Data bus Write to port Write to DIR Input buffer Data bus Write to port Write to DIR Portout Portin Input buffer Hình9-10: IO PortC[6:7] - dùng chung với SPI Bảng 9-9: Chức năng của PortC Tên chân Bit DIR I/O Mô tả PORTC[0]/RX1 0 I Dữ liệu vào /ngõ vào nối tiếp của UART1 1 O Dữ liệu ra PORTC[1]/TX1 0 I Dữ liệu vào 1 O Dữ liệu ra /ngõ ra nối tiếp của UART1 PORTC[2]/PWM1 0 I Dữ liệu vào 1 O Data output/PWM1 output PORTC[3]/PWM2 0 I Dữ liệu vào 1 O Data output/PWM2 output PORTC[4]/SCK 0 I Dữ liệu vào /clock vào nối tiếp của SPI trong chế độ slave 1 O Dữ liệu ra / clock ra nối tiếp của SPI trong chế độ master PORTC[5]/SDI 0 I Dữ liệu ra /dữ liệu vào nối tiếp của SPI 1 O Dữ liệu ra PORTC[6]/SDO 0 I Dữ liệu vào 1 O Dữ liệu ra /dữ liệu ra nối tiếp của SPI PORTC[7]/SSx 0 I Dữ liệu vào/chân SSx trong chế độ slave của SPI 1 O Dữ liệu ra Bảng 9-10: Thanh ghi DIRC Tên Bit R/W Mô tả DIRC [7:0] R/W Thanh ghi xác định chiều dữ liệu của PortC. Mỗi bit trong thanh ghi DIRC tương ứng với một chân trong PortC. 0: DATAINC = PortC 1: PortC = DATAOUTC. Cổng truy xuất dữ liệu © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 66 Bảng9-11: Chức năng PORTC Tên Bit R/W Mô tả PORTC [7:0] R Khi CPU đọc tại địa chỉ PORTC, dữ liệu gửi về là từ thanh ghi DATAINC. Mỗi bit trong hanh ghi DATAINC tương ứng với một chân trong PortC. W Khi CPU ghi vào tại địa chỉ PORTC, dữ liệu được ghi vào thanh ghi DATAOUTC. Mỗi bit trong hanh ghi DATAOUTC tương ứng với một chân trong PortC khi DIRC = 1. Ngõ ra PortC[1] còn phụ thuộc vào bit U1ON trong thanh ghi U2STA (xem phần 17.2.1 Thanh ghi trạng thái của ngoại vi UART thứ x (UxSTA). Ngõ ra PortC[2] còn phụ thuộc vào bit PWM1ON trong thanh ghi PWM1CON (xem phần 14.5.1 PWMxCON) Ngõ ra PortC[3] còn phụ thuộc vào bit PWM2ON trong thanh ghi PWM2CON (xem phần 14.5.1 PWMxCON) Ngõ ra PortC[4], PortC[5] và PortC[7] ] còn phụ thuộc vào bit SPION trong thanh ghi SPICON (xem phần 15.2.1 Thanh ghi điều khiển SPI - SPICON) 9.4. GPIO PortD PortD là một port 8-bit hai chiều. người sử dụng có thể lập trình để chọn chiều vào/ ra của dữ liệu. Hầu hết các chân PortD được pull-up. Khi bit DIRD = 0 thì PortD là ngõ vào. Khi bit DIRD = 1 thì PortD là ngõ ra. PortD có 2 thanh ghi lưu dữ liệu: một thanh ghi lưu dữ liệu đưa ra PortD do CPU ghi vào (DATAOUTD), một thanh ghi nhận dữ liệu từ PortD vào (DATAIND). Bên cạnh chức năng GPIO, PortD còn được sử dụng cho các chức năng khác như ngắt ngoài, I2C, Capture/Compare, Timer1. Nếu sử dụng ngắt ngoài thì PortD[3:0] được cấu hình là ngõ vào. Nếu I2C được sử dụng thì PortD[5:4] được điều khiển bằng tín hiệu đặc biệt từ khối I2C. PortD[5:4] không được pull-up. Nếu Capture được sử dụng thì PortD[6] được cấu hình là ngõ vào. Nếu Compare được sử dụng thì PortD[6] được cấu hình là ngõ ra. Cổng truy xuất dữ liệu © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 67 Nếu Timer1 sử dụng clock ngoài cho bộ đếm thì PortD[7] được cấu hình là ngõ vào. PORTD /INT0 PORTD /INT1 PORTD /INT2 PORTD /INT3 Edge detect Set interrupt Flag INTEDGx x: number of interrupt source D Q Q D DIR latch /WE D Q /WE Data bus Write to port Write to DIR Input buffer Portout Portin Hình 9-11: IO PortD[0:3] - dùng chung với ngắt ngoài Q D PORTD /SCL DIR latch 0 10 I2CON 0 1Clock output PORTD /SDA SDA input D /WE D /WE Q Q Write to port Write to DIR Input buffer Portout Portin SCL input Q D DIR latch 0 10 I2CON 0 1Clock output D /WE D /WE Q Q Write to port Write to DIR Input buffer Portout Portin Data bus Data bus Hình 9-12: IO PortD[4:5] - dùng chung với I2C Cổng truy xuất dữ liệu © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 68 Q D PORTD/CC DIR latch 0 1 Output compare T1ON Input capture CCEN D Q D Q /WE Data bus Write to port Write to DIR Portin Portout Input buffer Hình 9-13: IO PortD[6] - dùng chung với Capture/Compare Q D PORTD /T1CLK DIR latch Timer1 external clock D Q /WE D Q /WE Data bus Write to port Write to DIR Input buffer Portin Portout Hình 9-14: IO PortD[7] - dùng chung với Timer1 Bảng9-12: Chức năng của PortD Tên chân Bit DIR I/O Mô tả PORTD[3:0]/EXINT[3:0] 0 I Dữ liệu vào/ngắt ngoài 1 O Dữ liệu ra PORTD[4]/SCL 0 I Dữ liệu vào/clock vào nối tiếp của I2C 1 O Dữ liệu ra/clock ra nối tiếp I2C PORTD[5]/SDA 0 I Dữ liệu vào/dữ liệu vào nối tiếp của I2C 1 O Dữ liệu ra/dữ liệu ra nối tiếp I2C PORTD[6]/CC 0 I Dữ liệu vào/ngõ vào của khối Compare 1 O Dữ liệu ra/ngõ ra của khối Capture PORTD[7]/T1CLK 0 I Dữ liệu vào/clock ngoài của Timer1 1 O Dữ liệu ra Cổng truy xuất dữ liệu © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 69 Bảng 9-13: Thanh ghi DIRD Tên Bit R/W Mô tả DIRD [7:0] R/W Thanh ghi xác định chiều dữ liệu của PortD. Mỗi bit trong thanh ghi DIRD tương ứng với một chân trong PortD. 0: DATAIND = PortD 1: PortD = DATAOUTD Bảng 9-14: Mô tả chức năng PORTD Tên Bit R/W Mô tả PORTD [7:0] R Khi CPU đọc tại địa chỉ PORTD, dữ liệu gửi về là từ thanh ghi DATAIND. Mỗi bit trong hanh ghi DATAIND tương ứng với một chân trong PortD. W Khi CPU ghi vào tại địa chỉ PORTD, dữ liệu được ghi vào thanh ghi DATAOUTD. Mỗi bit trong hanh ghi DATAOUTD tương ứng với một chân trong PortD khi DIRD = 1. Ngõ ra PortD[5:4] còn phụ thuộc vào bit I2CON trong thanh ghi I2CCON1 (xem phần 16.1.1 I2CCON1) Ngõ ra PortD[6] còn phụ thuộc vào bit T1ON và CCEN trong thanh ghi T1CON (xem phần 13.5.1 TxCON ). Bộ nhân 8-bit © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 70 10. Watchdog Timer Watchdog Timer là một bộ đếm tự do hoạt động với xung clock hệ thống. Trong trạng thái hoạt động bình thường, khi Watchdog Timer tràn (WDT timeout) sẽ tạo ra tín hiệu reset hệ thống. Khi chip ở trạng thái nghỉ (IDLE), WDT timeout sẽ đánh thức vi xử lý ra khỏi trạng thái nghỉ. Có thể xóa hay vô hiệu các bộ đếm của Watchdog Timer khi xóa bit WDTON. Giữa Timer 0 và Watchdog Timer có một bộ đếm 8-bit chia sẻ. Khi bộ đếm chia sẻ này dùng cho Timer 0 (bit PSS bằng 1) thì nó có nhiệm vụ như một bộ đếm chia tần trước (prescaler), khi được dùng cho Watchdog Timer thì nó hoạt động như một bộ đếm chia tần sau (postscaler). Không thể dùng bộ đếm này cho cả Timer 0 và Watchdog Timer, do đó khi sử dụng bộ đếm chia sẻ này cho Timer 0 thì Watchdog Timer sẽ không có bộ chia tần sau và ngược lại. WDT Counter :65536 Fosc WDTON 0 1 From Timer0 clock source Postscaler 1:2 to 1:256 PS2:PS0 1 0 PSS PSS Watchdog timeout (reset)/RST CLRWDT PSS (reset) Hình 10-1 : Mô tả khối Watchdog Timer Chú ý: 1. Khi xử lý lệnh CLRWDT (và bộ đếm chia sẻ được định nghĩa cho Watchdog Timer) thì bộ đếm chia sẻ sẽ bị xóa về 0. 2. Bộ đếm 16-bit WDT không hỗ trợ đọc/ghi, nó luôn đếm lên khi bit WDTON bằng 1. Bộ đếm này cũng bị xóa về 0 khi reset, WDTON bằng 0 hay khi thực thi lệnh CLRWDT. Bảng 10-1 : Mô tả thanh ghi WT0CON Tên bit R/W Mô tả WDTON [7] R/W Bit tắt/mở Watchdog Timer 0: Tắt/cấm Watchdog Timer 1: Mở/cho phép Watchdog Timer T0ON [6] R/W Xem mô tả 11.4.1 WT0CON (Timer 0) T0CKE [5] R/W Xem mô tả 11.4.1 WT0CON (Timer 0) T0CKS [4] R/W Xem mô tả 11.4.1 WT0CON (Timer 0) Bộ nhân 8-bit © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 71 PSS [3] R/W Bit gán bộ đếm chia sẻ 0: gán cho Timer 0 1: gán cho Watchdog Timer PS [2:0] R/W Bit chọn tỉ số chia cho Postscaler. 000: 1:2 001: 1:4 010: 1:8 011: 1:16 100: 1:32 101: 1:64 110: 1:128 111: 1:256 Chú ý: Bộ đếm chia sẻ 8-bit được gọi là prescaler khi sử dụng với Timer0 và postscaler khi sử dụng với Watchdog Timer. Xem phần mô tả 3.2 để biết thêm chi tiết về bit WDT0 trong thanh ghi CPUSTA. Timer0 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 72 11. Timer 0 Timer 0 là bộ đếm/định thời 8-bit. Các chức năng chính của Timer 0 như sau:  Thanh ghi bộ đếm/định thời 8-bit với bộ chia tần trước và sau.  Cho phép đọc trạng thái thanh ghi.  Phát ngắt khi tràn bộ đếm từ FFh qua 00h.  8-bit prescaler lập trình.  Cho phép chọn xung clock nội hay từ bên ngoài.  Chọn cạnh đồng bộ cho xung clock ngoài. 11.1. Mô tả Timer 0 Chế độ định thì được chọn khi xóa bit T0CKS. Trong chế độ định thì, Timer 0 chạy với xung clock hệ thống, thanh ghi T0REG sẽ đếm lên sau mỗi cạnh lên của xung clock (trong trường hợp không gán bộ đếm chia sẻ cho Timer 0) hay mỗi cạnh lên của ngõ ra bộ đếm chia sẻ (trong trường hợp dùng clock nguồn là clock thạch anh và bộ đếm chia sẻ gán cho Timer 0). Thanh ghi T0REG cho phép ghi giá trị khởi tạo của bộ định thì. Chế độ đếm sự kiện được chọn khi bit T0CKS bằng 1. Trong chế độ này, bộ đếm Timer 0 sẽ tăng một đơn vị tại mỗi cạnh (cạnh xuống hoặc cạnh lên) của xung clock ngoài hoặc cạnh lên của bộ chia tần trước nếu bộ chia này được gán cho Timer 0 (lúc này bộ chia tần trước cũng chạy theo cạnh lên hoặc cạnh xuống của xung clock ngoài). Bit T0CKE sẽ chọn cạnh lên hay cạnh xuống của xung clock ngoài làm xung đếm (T0CKE bằng 0 sẽ chọn cạnh lên và ngược lại). Chú ý: Khi sử dụng xung clock ngoài, PortB[4] phải được cấu hình là một ngõ vào. Bộ chia trước (prescaler) của Timer 0 là một bộ đếm 8-bit được chia sẻ giữa Timer 0 và Watchdog Timer (trong Watchdog Timer thanh ghi này được gọi là postscaler). Việc gán bộ đếm này cho Timer 0 hay Watchdog Timer phụ thuộc vào bit PSS, xóa bit PSS sẽ gán bộ đếm này cho Timer 0 và ngược lại gán cho Watchdog Timer khi PSS bằng 1. Bộ đếm chia sẻ không hỗ trợ đọc/ghi và tỉ số chia cho phép từ 1:2 đến 1:256. Timer0 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 73 Synchronize external clock and edge detect T0CKE Fosc 0 1 Programmable Prescaler T0CKS 3 PS[2:0] 1 0 PSS T0REG Set T0IF Portb[4]/T0CLK T0ON Hình 11-1: Mô tả sơ đồ khối Timer0 11.2. Ngắt Timer0 Ngắt Timer 0 phát khi thanh ghi đếm T0REG tràn từ FFh qua 00h. Tín hiệu phát ngắt sẽ được lưu trong cờ ngắt T0IF. Ngắt Timer 0 bị cấm khi bit mặt nạ ngắt T0IE bị xóa. Cờ ngắt T0IF phải xóa bằng phần mềm trong chương trình đáp ứng ngắt trước khi ngắt tiếp tục được cho phép. Chú ý: Khi ngắt Timer phát ngay khi có lệnh xóa bit cờ ngắt T0IF thì cờ ngắt sẽ không bị xóa. 11.3. Bộ chia tần trước Một bộ đếm 8-bit được chia sẻ giữa Timer 0 và Watchdog Timer. Khi bộ đếm này dùng cho Timer 0 (bit PSS bằng 1) thì nó có nhiệm vụ như một bộ đếm chia tần trước (prescaler), khi được dùng cho Watchdog Timer thì nó hoạt động như một bộ đếm chia tần sau (postscaler). Không thể dùng bộ đếm này cho cả Timer 0 và Watchdog Timer, do đó khi sử dụng bộ đếm này cho Timer 0 thì Watdog Timer sẽ không có bộ chia tần sau và ngược lại. Bit PSS quy định bộ đếm chia sẻ được gán cho Timer 0 hay cho Watchdog Timer, các bit PS[2:0] chọn tỉ số chia. Khi bộ đếm chia sẻ này được gán cho Timer 0, tất cả các lệnh ghi vào thanh ghi T0REG sẽ reset lại bộ đếm chia sẻ này. Khi gán bộ đếm chia sẻ này cho Watchdog Timer thì lệnh CLRWDT sẽ reset bộ đếm chia sẻ này, đồng thời cũng reset bộ đếm 16-bit của Watchdog Timer. Chú ý: Để tránh những reset không mong muốn từ Watchdog Timer khi chuyển bộ đếm chia sẻ từ Timer 0 qua Watchdog Timer và ngược lại, người sự dụng cần phải xóa thanh ghi đếm và bộ đếm chia sẻ trước khi chuyển: Khi chuyển bộ đếm chia sẻ từ Timer 0 qua Watchdog Timer: + Xóa thanh ghi T0REG về giá trị 0 + Chọn gán cho Watchdog Timer (PSS = 1), lập trình prescaler cho Watchdog Timer. Timer0 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 74 Khi chuyển bộ đếm chia sẻ từ Watchdog Timer qua Timer 0: + Xóa thanh ghi bộ đếm Watchdog Timer bằng lệnh CLRWDT + Chọn gán cho Timer 0 (PSS = 0), lập trình prescaler cho Timer 0. 11.4. Thanh ghi Timer 0 được điều khiển thông qua thanh ghi WT0CON, thanh ghi này đồng thời cũng chứa một số bit điều khiển của Watchdog Timer. 11.4.1. WT0CON Bảng 11-1: Mô tả thanh ghi WT0CON Tên bit R/W Mô tả WDTON [7] R/W Xem mô tả 10 Watchdog Timer T0ON [6] R/W Bit tắt/mở Timer0 0: tắt/cấm Timer0 1: mở/cho phép Timer0 T0CKE [5] R/W Bit chọn cạnh đếm của xung clock ngoài 0: đếm tại cạnh lên của cung clock ngoài 1: đếm tại cạnh xuống của cung clock ngoài T0CKS [4] R/W Bit chọn nguồn xung clock cho Timer 0 0: chọn xung clock nội 1: chọn xung clock ngoài PSS [3] R/W Bit gán bộ đếm prescaler/postscaler 0: gán cho Timer 0 1: gán cho Watchdog Timer PS [2:0] R/W Bit chọn tỉ số chia cho Postscaler. 000: 1:2 001: 1:4 010: 1:8 011: 1:16 100: 1:32 101: 1:64 110: 1:128 111: 1:256 Timer0 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 75 11.4.2. T0REG Bảng 11-2: Mô tả thanh ghi T0REG Tên bit R/W Mô tả T0REG [7:0] R/W Đây là thanh ghi bộ đếm chính của Timer 0. Khi Timer 0 bật, T0REG luôn đếm tại cạnh lên của xung clock hệ thống hoặc mỗi xung ngõ ra bộ chia tần trước. Ngắt sẽ phát sinh và cập nhật vào cờ ngắt T0IF khi thanh ghi này đếm tràn từ FFh về 00h. Chú ý: Xem phần 8.3, 8.4 và 8.5 để biết thêm chi tiết về các bit T0IE, T0IP và T0IF. Xem phần 9.2 để biết thêm chi tiết về thanh ghi chọn chiều của PortB. Timer1 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 76 12. Timer 1 Timer 1 là bộ đếm/định thời 16-bit. Các chức năng chính của Timer 1 như sau:  Thanh ghi bộ đếm/định thời 16-bit với bộ chia tần trước  Cặp thanh ghi bộ đếm 8-bit T1RH, T1RL cho phép đọc và ghi.  Hỗ trợ đọc ghi 16-bit.  Chọn lựa nguồn xung clock nội hay clock ngoài (đếm sự kiện).  Phát ngắt Timer và ngắt đo sự kiện (capture).  Hỗ trợ đo sự kiện và so sánh các sự kiện (compare). 12.1. Chức năng của Timer 1 12.1.1. Tổng quan chức năng định thời của Timer 1 Timer 1 là bộ đếm/định thời 16-bit (gồm hai thanh ghi cho phép đọc/ghi 8-bit T1RH và T1RL). Thanh ghi Timer 1 (T1RH:T1RL) đếm lên từ 0000h đến FFFFh và quay về 0000h. Ngắt Timer 1, khi được cho phép, sẽ phát tại thời điểm bộ đếm tràn và chứa sự kiện này trong cờ ngắt T1IF. Ngắt Timer sẽ bị cấm/được phép bằng cách sử dụng bit T1IE. Timer 1 chạy với hai chế độ:  Chế độ định thời  Chế độ đếm sự kiện Chế độ hoạt động của Timer 1 được quy định bằng bit chọn nguồn clock T1CKS. Trong chế độ định thời, bộ đếm Timer 1 sẽ tăng với mỗi cạnh lên của xung clock hệ thống. Trong chế độ đếm sự kiện, bộ đếm Timer 1 sẽ tăng tại cạnh lên của xung clock ngoài. Timer 1 có thể tắt/mở với bit cho phép T1ON. Timer 1 được hỗ trợ một bộ chia tần trước (prescaler) lập trình được. Timer1 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 77 Synchronize external clock and edge detect Portd[7]/T1CLK Fosc 0 1 T1CKS Prescaler 2 T1PRES1:T1PRES0 ST1RH T1RL T1ON Set T1IF Hình 12-1: Mô tả sơ đồ khối Timer 1 12.1.2. Các chế độ của Timer1 12.1.2.1. Chế độ định thời Chế độ định thời được chọn khi bit T1CKS bằng 0. Chế độ định thời hoạt động dựa trên clock hệ thống. Trước khi đưa vào bộ đếm, xung clock đếm có thể được chia theo tỉ lệ 1:1 đến 1:8 bằng cách sử dụng bit lập trình T1PRES[1:0]. Khi giá trị thanh ghi bộ đếm Timer 1 bằng FFFFh và quay về 0000h. Ngắt Timer 1, khi được cho phép, sẽ phát tại thời điểm bộ đếm tràn và lưu sự kiện này trong cờ ngắt T1IF. Ngắt Timer sẽ bị cấm/cho phép bằng cách sử dụng bit T1IE. Chú ý: Người sử dụng nên tắt Timer 1 (xóa bit T1ON) trước khi thay đổi cấu hình hoạt động của Timer 1. 12.1.2.2. Chế độ đếm sự kiện. Chế độ đếm sự kiện được chọn khi bit T1CKS bằng 1. Trong chế độ này, bộ đếm Timer 1 sẽ tăng lên tại mỗi cạnh lên của xung clock ngoài hay cạnh lên của xung clock ngoài sau khi đã chia xuống bằng bộ prescaler. Chú ý: Bộ chia tần trước bị reset khi có reset hệ thống, watchdog timeout và khi ghi vào thanh ghi T1RL (ghi vào thanh ghi T1RH không ảnh hưởng). Trong chế độ đếm sự kiện, portD[7] phải được cấu hình là một ngõ vào. Khi sử dung xung clock ngoài làm xung đếm thì tần số xung clock ngoài phải lớn hơn ít nhất hai lần tần số xung clock hệ thống. 12.1.2.3. Ngắt Timer1 Cặp thanh ghi bộ đếm Timer 1 (T1RH:T1RL) tăng dần từ 0000h (hoặc từ giá trị lập trình) tới FFFFh và tràn về 0000h. Tại thời điểm tràn này, ngắt Timer 1 sẽ xảy ra và cập nhật vào cờ ngắt T1IF. Nếu bit cho phép ngắt Timer 1 (T1IE) tích cực thì tín hiệu ngắt sẽ được gửi tới CPU. Chú ý: Khi ngắt Timer phát ngay khi có lệnh xóa bit cờ ngắt T1IF thì cờ ngắt sẽ không bị xóa. Timer1 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 78 12.1.3. Đọc và ghi 16-bit thanh ghi bộ đếm Timer1 Timer1 hỗ trợ đọc ghi 16-bit giá trị tại 1 thời điểm đối với thanh ghi bộ đếm (T1RH:T1RL). Khi lệnh đọc thanh ghi T1RL xảy ra, giá trị của T1RH đồng thời cập nhật vào một bộ đệm 8-bit ngay lập tức. Do đó T1RH sau đó luôn nhận được giá trị bộ đếm cao tại ngay thời điểm đọc T1RL (khi đọc T1RH sẽ đọc giá trị thanh ghi bộ đệm phụ). Ngược lại, quá trình ghi vào T1RH sẽ ghi giá trị muốn ghi vào bộ đệm, sau đó lệnh ghi vào T1RL đồng thời cũng cập nhật giá trị bộ đệm đã ghi trước đó vào thanh ghi bộ đếm cao. Người sử dụng cần phải tuân theo các bước được mô tả trong phần ghi chú dưới đây để nhận được giá trị bộ đếm đúng. Nếu không theo thứ tự mô tả, giá trị của T1RH sẽ cập nhật hoặc lấy sai. Chú ý: 1. Nếu người sử dụng muốn ghi 16-bit giá trị vào T1RH:T1RL thì phải tuân theo các bước sau: 1. Ghi 8-bit vào T1RH trước 2. Sau đó tiếp tục ghi 8-bit vào T1RL 2. Nếu người sử dụng muốn đọc 16-bit giá trị của T1RH:T1RL thì phải tuân theo các bước sau: 1. Đọc 8-bit giá trị từ T1RL trước 2. Sau đó đọc 8-bit giá trị từ T1RH 3. Do việc ghi vào T1RH không tác động trực tiếp vào thanh ghi bộ đếm (lúc này ghi vào bộ đệm), nên việc ghi vào T1RH không gây reset bộ prescaler. Chỉ có quá trình ghi vào T1RL mới gây reset prescaler. 12.2. Khối bắt và so sánh sự kiện Khi sử dụng khối bắt hoặc so sánh sự kiện, khối Timer 1 luôn chạy kèm theo hai chức năng này. Trong chế độ bắt sự kiện, cặp thanh ghi CCRH:CCRL sẽ cập nhật giá trị thanh ghi bộ đếm T1RH:T1RL khi có sự kiện xảy ra tại PortD[6], sự kiện đó là:  Mỗi cạnh xuống của ngõ vào.  Mỗi cạnh lên của ngõ vào.  Mỗi cạnh lên thứ 4 của ngõ vào.  Mỗi cạnh lên thứ 16 của ngõ vào. Trong chế độ so sánh sự kiện, giá trị của cặp thanh ghi CCRH:CCRL sẽ được so sánh với thanh ghi bộ đếm T1RH:T1RL. Khi hai cặp thanh ghi này bằng nhau thì ngõ ra tại PortD[6] sẽ xảy ra một trong các sự kiện sau: Timer1 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 79  Chuyển mức cao.  Chuyển mức thấp.  Không thay đổi.  Đổi trạng thái. Các sự kiện trên phụ thuộc vào 3 bit cấu hình chế độ CCMOD[2:0]. Cũng tại thời điểm này, cờ ngắt CCIF sẽ được cập nhật. Chú ý: 1. CCRH và CCRL là thanh ghi cho phép đọc/ghi. Ngoài ra trong chế độ bắt sự kiện, CCRH và CCRL cập nhật giá trị của T1RH và T1RL khi có sự kiện xảy ra. 2. Bộ bắt và so sánh sự kiện là một khối con trong Timer 1, chúng phải chạy kèm với timer 1 và được cho phép/cấm bằng bit CCEN. Bit T1ON có ưu tiên cao hơn bit CCEN, CCEN chỉ có tác dụng khi T1ON bằng 1, do đó người sử dụng cần mở Timer 1 trước (T1ON = 1) trước khi cho phép bộ bắt và so sánh sự kiện hoạt động (CCEN = 1). 3. Khi sử dụng chế độ so sánh sự kiện, sẽ rất nguy hiểm nếu bit CCEN được đặt lên trước bit T1ON vì lúc này, trạng thái cấu hình của ngõ ra không được xác định nên sẽ không thấy được sự kiện xảy ra trên PortD[6]. Người sử dụng phải bật Timer 1 trước trong chế độ này. 4. Trong chế độ bắt sự kiện, PortD[6] phải được cấu hình là một ngõ vào, ngược lại trong chế độ so sánh sự kiện thì PortD[6] phải được cấu hình là một ngõ ra. Khi PortD[6] được cấu hình thành ngõ ra, phép ghi xuống PortD[6] có thể gây ra sự kiện mà chế độ bắt sự kiện có thể nhầm lẫn. Sự nhầm lẫn này có thể gây ngắt không mong muốn nên người sử dụng cần phải xóa bit cho phép ngắt (CCIE = 0) để tránh ngắt sai và nên xóa bit CCIF trước khi sử dụng bất kỳ chế độ nào. 12.2.1. Chế độ bắt sự kiện Các sự kiện được chọn bằng bit CCMOD[2:0] (trong thanh ghi T1ON). Khi có sự kiện xảy ra, đồng thời cờ ngắt CCIF cũng đặt lên, cờ ngắt này chỉ xóa bằng phần mềm. Nếu một sự kiện khác xảy ra trước khi giá trị của CCRH:CCRL được đọc lên thì giá trị cũ sẽ bị mất. Khi sử dụng chế độ bắt sự kiện, một bộ chia trước được sử dụng và tỉ số chia phụ thuộc vào bit CCMOD[2:0]. Khi Timer 1 tắt hoặc không hoạt động trong chế độ bắt sự kiện hoặc bất kỳ reset nào xảy ra thì bộ chia này sẽ bị xóa về 0. Việc chuyển từ tỉ lệ chia này qua tỉ lệ khác có thể gây ngắt không mong muốn. Bên cạnh đó, do bộ chia không bị xóa khi bật chế độ này, do đó lần bắt sự kiện đầu tiên có thể được đếm từ một giá trị bộ đếm chia tần trước khác không. Khi người sử dụng muốn chuyển giá trị prescaler, người sử dụng cần phải tắt chế độ bắt sự kiện (CCEN = 0) trước khi chuyển đổi. Sau đó cho phép chế độ bắt sự kiện hoạt động trở lại (CCEN = 1). Timer1 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 80 Fall and rise edge detect prescaler CCMOD[2:0] CCEN (Capture Enable) CCRH CCRL T1RH T1RL Set CCIF PORTD[6]/CC Hình 12-2: Sơ đồ của khối bắt sự kiện Timer 1 có thể chạy ở chế độ định thời hay đếm sự kiện khi hoạt động với chế độ bắt sự kiện. 12.2.2. Chế độ so sánh sự kiện Khi sự kiện so sánh xảy ra, ngõ ra tại PortD[6] sẽ xảy ra một trong các sự kiện sau:  Chuyển mức cao.  Chuyển mức thấp.  Không thay đổi.  Đổi trạng thái. Người sử dụng phải cấu hình PortD[6] thành một ngõ ra trước khi sử dụng nó cho chế độ so sánh sự kiện. Khi hoạt động ở chế độ so sánh phát ngắt mềm (CCMOD[3:0] = 1110), không sử dụng chân PortD[6]. Chú ý: Khi tắt chế độ bắt/so sánh sự kiện (xóa bit CCEN) hoặc Timer 1 tắt (T1ON = 0) hoặc không trong chế độ so sánh sự kiện thì ngõ ra khối Timer 1 giữ mức thấp. Drive output DIRD[6] CCMOD[2:0] CCEN CCRH CCRL T1RH T1RL Comparator (match) Set CCIF PORTD[6]/CC Hình 12-3: Sơ đồ của khối so sánh sự kiện 12.3. Thanh ghi Timer 1 có 2 thanh ghi bộ đếm 8-bit: T1RH và T1RL tạo thành một bộ đếm 16-bit. Tất cả các chức năng của Timer 1 được điều khiển thông qua thanh ghi T1CON. Bên cạnh đó, Timer 1 còn có cặp thanh ghi CCRH và CCRL dùng cho chế độ bắt/so sánh sự kiện. Timer1 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 81 12.3.1. T1CON Bảng 12-1: Mô tả thanh ghi T1CON Tên bit R/W Mô tả T1ON [7] R/W Bit tắt/mở Timer 1 0: tắt/cấm Timer 1 1: mở/cho phép Timer 1 T1CKS [6] R/W Bit chọn nguồn xung clock cho Timer 1 0: chọn xung clock nội 1: chọn xung clock ngoài CCEN [5] R/W Bit cho phép chế độ bắt/so sánh sự kiện. 0: cấm chế độ bắt/so sánh sự kiện. 1: cho phép chế độ bắt/so sánh sự kiện CCMOD [4:2] R/W Bit chọn chế độ hoạt động (khi sử dụng bắt/so sánh sự kiện) 000: Chế độ Timer/Counter 16-bit kết hợp bắt sự kiện cạnh xuống. 001: Chế độ Timer/Counter 16-bit kết hợp bắt sự kiện cạnh lên. 010: Chế độ Timer/Counter 16-bit kết hợp bắt sự kiện cạnh lên thứ 4. 011: Chế độ Timer/Counter 16-bit kết hợp bắt sự kiện cạnh lên thứ 16. 100: Chế độ Timer/Counter 16-bit kết hợp so sánh sự kiện và chuyển mức cao ngõ ra. 101: Chế độ Timer/Counter 16-bit kết hợp so sánh sự kiện và chuyển mức thấp ngõ ra. 110: Chế độ Timer/Counter 16-bit kết hợp so sánh sự kiện và phát ngắt mềm. 111: Chế độ Timer/Counter 16-bit kết hợp so sánh sự kiện và chuyển trạng thái ngõ ra. T1PRES [1:0] Bit quy định tỉ lệ chia prescaler 00: tỉ lệ 1:1 01: tỉ lệ 1:2 10: tỉ lệ 1:4 11: tỉ lệ 1:8 Timer1 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 82 12.3.2. T1RH Bảng 12-2: Mô tả thanh ghi T1RH Tên bit R/W Mô tả T1RH [7:0] R/W Đây là thanh ghi lưu giá trị bộ đếm cao của Timer 1. Thanh ghi này là một bộ đệm 8-bit, giá trị của thanh ghi này sẽ cập nhật giá trị của bộ đếm cao khi người sử dụng đọc thanh ghi T1RL và sẽ lưu giá trị mà CPU muốn ghi vào bộ đếm cao. Xem thêm phần “Đọc và ghi 16-bit thanh ghi bộ đếm Timer 1” để biết thêm thông tin về thanh ghi này. 12.3.3. T1RL Bảng 12-3: Mô tả thanh ghi T1RL Tên bit R/W Mô tả T1RL [7:0] R/W Đây là 8-bit thanh ghi bộ đếm thấp của Timer 1. Thanh ghi này kết hợp với thanh ghi bộ đếm cao thành bộ đếm 16-bit. 12.3.4. CCRH Bảng 12-4: Mô tả thanh ghi CCRH Tên bit R/W Mô tả CCRH [7:0] R/W Đây là thanh ghi lưu giá trị cao của giá trị so sánh khi sử dụng trong chế độ so sánh sự kiện hoặc dùng để bắt giá trị (byte cao) trong chế độ bắt sự kiện. Thanh ghi nay chỉ nên ghi trong chế độ so sánh sự kiện và chỉ nên đọc trong chế độ bắt sự kiện. 12.3.5. CCRL Bảng 12-5: Mô tả thanh ghi CCRL Tên bit R/W Mô tả CCRL [7:0] R/W Đây là thanh ghi lưu giá trị thấp của giá trị so sánh khi sử dụng trong chế độ so sánh sự kiện hoặc dùng để bắt giá trị (byte thấp) trong chế độ bắt sự kiện. Thanh ghi nay chỉ nên ghi trong chế độ so sánh sự kiện và chỉ nên đọc trong chế độ bắt sự kiện. Chú ý: Xem phần 8.3, 8.4 và 8.5 để biết thêm chi tiết về các bit T1IE, T1IP và T1IF. Xem phần 8.6, 8.7 và 8.8 để biết thêm chi tiết về các bit CCIE, CCIP và CCIF Xem phần 9.4 để biết thêm chi tiết về các bit cấu hình chiều của PortD Timer1 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 83 13. Timer 2 và Timer 3 (Timer_x) 13.1. Tổng quan Timer_x Do Timer 2 và Timer 3 được thiết kế giống nhau, do đó chúng sẽ được mô tả chung và được gọi là Timer_x (x là 2 hoặc 3) Timer_x là bộ định thời/đếm sự kiện 10-bit hỗ trợ bộ chia tần trước (prescaler) và bộ chia tần sau (postscaler). Timer_x còn được dùng để tạo ra chu kỳ tần số của bộ tạo xung PWM (kết hợp với khối tạo xung PWM). Thanh ghi bộ đếm của Timer_x cho phép đọc/ghi và bị xóa khi reset. Timer_x hỗ trợ những tính năng sau:  Thanh ghi bộ đếm 10-bit (TxRH:Tx2RL) và thanh ghi đo chu kỳ thời gian 10-bit (TxPRH:TxPRL).  Cho phép đọc/ghi các thanh ghi.  Hỗ trợ bộ chia tần trước với tỉ số chia 1:1, 1:4, 1:16 và 1:64  Hỗ trợ bộ chia tần sau với tỉ số chia từ 1:1 đến 1:16  Hỗ trợ ngắt  Kết hợp sử dụng với SPI như một bộ tạo xung dịch. Khối Timer_x được điều khiển thông qua thanh ghi T2CON. Prescaler 1:4; 1:16; 1:64 Fosc T2ON ST2RH T2RL T2PRH T2PRL Postscaler 1:1,...1:16 T2PRES1:T2PRES0 T2POS3:T2POS0 (match) (reset) Set T2IF Timer2 outputComparator Hình 13-1: Sơ đồ khối Timer_x (Timer 2 hoặc Timer 3) 13.2. Hoạt động của Timer_x Ở chế độ bình thường, bộ đếm Timer_x sẽ tăng tại mỗi cạnh lên xung clock hệ thống hoặc ngõ ra khối chia tần trước trong trường hợp tỉ số chia tần trước khác 1:1). Tỉ số chia tần trước được chọn thông qua các bit TxPRES[1:0]. Giá trị thanh ghi bộ đếm Timer_x TxRH:TxRL sẽ được so sánh với giá trị của thanh ghi TxPRH:TxPRL tại mỗi chu kỳ xung clock hệ thống. Ngay khi hai giá trị này bằng nhau, bộ so sánh sẽ phát tín hiệu báo bằng nhau. Tín hiệu bằng nhau này được dùng để tạo chu kỳ xung PWM, hỗ trợ khối SPI, đồng thời dùng để reset giá tri bộ đếm TxRH:TxRL về 000h tại chu kỳ xung clock ngay sau đó và tích cực bộ chia tần ngõ ra. Timer1 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 84 Khi có tín hiệu reset, cặp thanh ghi TxRH:TxRL sẽ reset về 000h, trong khi cặp thanh ghi TxPRH:TxPRL sẽ quay về giá trị 3FFh. Cả bộ chia tần trước và bộ chia tần sau đều bị reset trong các trường hợp sau:  Lệnh ghi vào thanh ghi TxRL.  Bất kỳ tín hiệu reset nào (reset hệ thống, Watchdog timeout) Thanh ghi bộ đếm Timer_x không bị xóa khi xóa bit T2CON. 13.3. Ngắt Timer_x Ngõ ra Timer_x (tạo ra khi giá trị TxRH:TxRL bằng với TxPRH:TxPRL) cung cấp tín hiệu đếm lên cho bộ chia tần sau. Khi giá trị bộ đếm bộ chia tần sau bằng với giá trị cấu hình (bit TxPOS[3:0]) thì ngắt xảy ra và cập nhật tại bit cờ ngắt TxIF. Ngắt này sẽ phát tới CPU nếu bit cho phép ngắt TxIE bằng 1. Ngõ ra so sánh của Timer_x (ứng với tần số so sánh) được dùng như chu kỳ của xung PWM tạo ra từ bộ tạo xung PWM. Ngoài ra Timer_x còn được dùng như bộ tạo xung dịch cho khối SPI. Chú ý: Khi ngắt Timer phát ngay khi có lệnh xóa bit cờ ngắt TxIF, thì cờ ngắt sẽ không bị xóa. 13.4. Đọc/ghi 10-bit trong Timer_x. Timer_x hỗ trợ đọc ghi 10-bit giá trị tại 1 thời điểm đối với thanh ghi bộ đếm (TxRH:TxRL). Khi lệnh đọc thanh ghi TxRL xảy ra, giá trị của TxRH đồng thời cập nhật vào một bộ đệm 2 bit ngay lập tức. Do đó TxRH luôn nhận được giá trị bộ đếm cao tại ngay thời điểm đọc TxRL (khi đọc TxRH sẽ đọc giá trị thanh ghi bộ đệm phụ). Ngược lại, quá trình ghi vào TxRH sẽ ghi giá trị muốn ghi vào bộ đệm, sau đó lệnh ghi vào TxRL đồng thời cũng cập nhật giá trị bộ đệm đã ghi trước đó vào thanh ghi bộ đếm cao. Người sử dụng cần phải tuân theo các bước được mô tả trong phần ghi chú dưới đây để nhận được giá trị bộ đếm đúng. Nếu không theo thứ tự mô tả, giá trị của TxRH sẽ cập nhật hoặc lấy sai. Chú ý: 1. Nếu người sử dụng muốn ghi 10-bit giá trị vào TxRH:TxRL thì phải tuân theo các bước sau: 1. Ghi 2 bit vào TxRH trước 2. Sau đó tiếp tục ghi 8-bit vào TxRL Timer1 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 85 2. Nếu người sử dụng muốn đọc 10-bit giá trị của TxRH:TxRL thì phải tuân theo các bước sau: 1. Đọc 8-bit giá trị từ TxRL trước 2. Sau đó đọc 2 bit giá trị từ TxRH 3. Do việc ghi vào TxRH không tác động trực tiếp vào thanh ghi bộ đếm (lúc này ghi vào bộ đệm), nên việc ghi vào TxRH không gây reset bộ prescaler. Chỉ có quá trình ghi vào TxRL với gây reset prescaler. 13.5. Thanh ghi Thanh ghi bộ đếm Timer_x là cặp hai thanh ghi bộ đếm cao 2 bit TxRH và thanh ghi bộ đếm thấp 8-bit TxRL. Hai thanh ghi này có thể đọc và ghi. Thanh ghi bộ đếm Timer_x sẽ tăng từ giá trị lập trình đến giá trị so sánh và reset về 000h và tiếp tục quá trình đến giá trị so sánh. Ngắt Timer_x khi được phép sẽ phát ngắt tại ngõ ra bộ chia tần sau. 13.5.1. TxCON Bảng 13-1: Mô tả thanh ghi TxCON Tên bit R/W Mô tả TxON [7] R/W Bit tắt/mở Timer_x 0: tắt/cấm Timer_x 1: mở/cho phép Timer_x Dự trữ [6] - Bit dự trữ TxPRES [5:4] R/W Tỉ số chia tần trước. 00: tỉ lệ là 1:1 01: tỉ lệ là 1:4 10: tỉ lệ là 1:16 11: tỉ lệ là 1:64 TxPOS [3:0] Tỉ số chia tần sau 0000: tỉ lệ là 1:1 0001: tỉ lệ là 1:2 .. 1111: tỉ lệ là 1:16 13.5.2. TxRH Bảng 13-2 Mô tả thanh ghi TxRH Tên bit R/W Mô tả TxRH [1:0] R/W Đây là thanh ghi lưu giá trị bộ đếm cao của Timer_x. Thanh ghi Timer1 © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 86 này là một bộ đệm 2 bit, giá trị của thanh ghi này sẽ cập nhật giá trị của bộ đếm cao khi người sử dụng đọc thanh ghi TxRL và sẽ lưu giá trị mà CPU muốn ghi vào bộ đếm cao. Xem thêm phần “Đọc và ghi 10-bit thanh ghi bộ đếm Timer_x” để biết thêm thông tin về thanh ghi này. 13.5.3. TxRL Bảng 13-3 Mô tả thanh ghi TxRL Tên bit R/W Mô tả TxRL [7:0] R/W Đây là 8-bit thanh ghi bộ đếm thấp của Timer_x. Thanh ghi này kết hợp với thanh ghi bộ đếm cao thành bộ đếm 10-bit. 13.5.4. TxPRH Bảng 13-4 Mô tả thanh ghi TxPRH Tên bit R/W Mô tả TxPRH [7:0] R/W Đây là thanh ghi lưu 2 bit giá trị so sánh dùng để so sánh với 2 bit TxRH của bộ đếm Timer_x. 13.5.5. TxPRL Bảng 13-5 Mô tả thanh ghi TxPRL Tên bit R/W Mô tả TxPRL [7:0] R/W Đây là thanh ghi lưu 8 giá trị so sánh dùng để so sánh với 8-bit TxRL của bộ đếm Timer_x. Chú ý: Xem phần 8.3, 8.4 và 8.5 để biết thêm chi tiết về các bit TxIE, TxIP và TxIF. Bộ nhân 8-bit © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 87 14. Bộ tạo xung PWM (The Pulse Width Modulation) 14.1. Tổng quan PWM_x Chip SG8V1 được thiết kế với hai bộ tạo xung băm PWM: PWM 1 và PWM 2. Tài liệu này mô tả chung cho hai bộ tạo xung và gọi là PWM_x (x=1, 2). Bộ tạo xung PWM_x được sử dụng để tạo dạng xung băm dùng cho nhiều ứng dung như điều khiển động cơ, quản lý công suấtKhối PWM_x được dùng song song với Timer_x, người sử dụng có thể lựa chọn kết nối với Timer 2 hoặc Timer 3. Dạng sóng PWM ngõ ra có chu kỳ hoạt động chính là chu kỳ so sánh của Timer_x và chu kỳ nhiệm vụ ứng với thời gian mà ngõ ra ở mức cao. PWM_x có hai thanh ghi bộ so sánh 10-bit tạo chu kỳ nhiệm vụ: 8-bit thấp PWMxRL và hai bit cao PWMxRH. Cả hai thanh ghi này đều cho phép đọc và ghi. Chú ý: Khi khối PWM_x không hoạt động (PWMxON = 0) thì ngõ ra bộ tạo xung mặc định có giá trị 0. TxRH TxRL Timer_x output SPWM1RH SPWM1RL PWM1RH PWM1RL (reset) (update) Output drive DIRC[2] PORTC[2]/PWM1 Note: x = 2 or x = 3 comparator From PWM1CON[1:0] Hình 14-1: Sơ đồ của khối PWM_x 14.2. Chu kỳ xung PWM_x Chu kỳ xung PWM_x được đặc trưng bởi giá trị lưu trong cặp thanh ghi so sánh TxPRH:TxPRL của Timer_x. Chu kỳ xung PWM_x có thể được tính theo công thức sau: Công thức 14-1: Công thức tính chu kỳ PWM_x PWM_x period (s) = [(TxPRH:TxPRL) + 1] * TOSC * (giá trị bộ chia tần trước Timer_x) Bộ nhân 8-bit © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 88 Tần số xung băm được định nghĩa bằng 1/[PWM_x period]. Khi giá trị thanh ghi bộ đếm Timer_x TxRH:TxRL bằng với thanh ghi chu kỳ so sánh TxPRH:TxPRL thì các sự kiện sau sẽ xảy ra tại chu kỳ xung clock kế tiếp:  Thanh ghi bộ đếm Timer_x TxRH:TxRL bị xóa về 000h.  Giá trị chu kỳ nhiệm vụ PWM_x được chốt từ cặp thanh ghi PWMxRH:PWMxRL vào thanh ghi ảnh của chúng SPWMxRH:SPWMxRL là thanh ghi dùng để so sánh.  Ngõ ra bộ tạo xung PWM_x được đặt lên cao (trừ trường hợp chu kỳ nhiệm vụ bằng 0). Chú ý: Bộ chia tần sau Timer_x không được sử dụng để tạo ra dạng xung PWM. 14.3. Chu kỳ nhiệm vụ Chu kỳ nhiệm vụ PWM_x được đặc trưng bằng giá trị cặp thanh ghi PWMxRH:PWMxRL, PWMxRL chứa 8 bit thấp và PWMxRH chứa 2 bit cao tạo thành 10 bit so sánh tạo chu kỳ nhiệm vụ. Công thức sau mô tả cách tính chu kỳ nhiệm vụ: Công thức 14-2: Công thức tính chu kỳ nhiệm vụ PWM_x: PWM_x duty cycle (s) = (PWMxRH:PWMxRL) * Tosc * (giá trị bộ chia tần trước Timer_x) PWM1RH:PWM1RL có thể ghi bất cứ thời điểm nào, nhưng giá trị đó chỉ được cập nhật vào bộ so sánh tại thời điểm ngõ ra Timer_x tích cực (xong một chu kỳ PWM_x). Khi giá trị cặp thanh ghi PWMxRH:PWMxRL bằng giá trị bộ đếm Timer_x TxRH:TxRL, ngõ ra PWM_x sẽ bị xóa về. Tỉ số PWM_X lớn nhất (Max resolution) được mô tả bằng công thức sau: Công thức 14-3: Công thức tính “Max resolution” Max Resolution = log (Fosc/Fpwm) / log 2 Chú ý: Nếu chu kỳ nhiệm vụ lớn hơn chu kỳ xung PWM_x thì ngõ ra PWM_x luôn giữ mức cao. Bộ nhân 8-bit © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 89 Period cycle Period cycle Period cycle Period cycle Duty cycle(DC)DCDC Timer register = Period register Timer register = PWM1RH:PWM1RL Cập nhật giá trị mới Giá trị bộ đếm Timer Dạng sóng PWM DC = 0% Hình 14-2: Dạng sóng PWM 14.4. Cấu hình hoạt động cho khối PWM_x Khi sử dụng chức năng tạo xung, người sử dụng nên tuân theo các bước sau:  Cấu hình chu kỳ xung PWM bằng cách ghi vào thanh ghi TxPRH:TxPRL.  Cấu hình chu kỳ nhiệm vụ bằng cách ghi vào thanh ghi PWMxRH:PWMxRL.  Cấu hình PortC[2] hoặc PortC[3] là một ngõ ra bằng cách đặt bit DIRC[2] hoặc bit DIRC[3] lên mức cao. Người sử dụng nên xóa PORTC[2] hoặc PORTC[3] (trong thanh ghi PORTC) để hệ thống hoạt động tốt hơn (xem chú ý sau).  Cài đặt cho Timer_x: xác định tỉ lệ chia tần trước, bật Timer_x (TxON = 1).  Cho phép khối PWM_x hoạt động (PWMxON = 1). Chú ý: Khi khối PWM_x hoạt động (PWMxON = 1) và khối PWM_x được cấu hình sử dụng cho một ứng dụng nào đó (ví dụ điều khiển động cơ điện) thì PortC[2] hoặc PortC[3] được sử dung làm ngõ ra bộ tạo xung. Bình thường khi khối PWM_x bị tắt và PortC[2] hoặc PortC[3] được cấu hình thành ngõ ra thì ngõ ra lúc này chính là giá trị bit [2] hoặc [3] của thanh ghi PORTC. Khi khối PWM_x tắt từ trạng thái đang hoạt động, Port chức năng tương ứng được chuyển nhiệm vụ và ngõ ra lúc này sẽ giữ “0” hoặc “1” tùy giá trị thanh ghi PORTC. Nếu lúc đó mạch ngoài chưa ngắt chức năng điều xung thì sẽ nhận được tín hiệu điều xung nhỏ nhất (= 0) hoặc lớn nhất (= 1) bất chấp khối PWM_x đã tắt. Khi cả hai khối PWM 1 và PWM 2 cùng sử dụng một nguồn Timer, chúng sẽ có chu kỳ xung PWM, tần số cập nhật giống nhau nhưng chu kỳ nhiệm vụ có thể khác nhau. Bộ nhân 8-bit © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 90 14.5. Thanh ghi Khối PWM_x được điều khiển thông qua thanh ghi PWMxCON register. PWM_x có hai cặp thanh ghi 10-bit: PWMxRH:PWMxRL và SPWMxRH:SPWMxRL, một dùng để chứa giá trị so sánh của chu kỳ tiếp theo so sánh và một là thanh ghi so sánh. 14.5.1. PWMxCON Bảng 14-1: Mô tả thanh ghi PWMxCON Tên bit R/W Mô tả PWMxON [7] R/W Bit tắt/mở chức năng PWM 0: tắt/cấm PWM_x 1: mở/cho phép PWM_x PWMxST [6] R/W Bit chọn nguồn Timer 0: nguồn Timer là Timer 2 1: nguồn Timer là Timer 3 Dự trữ [5:2] - Bit dự trữ PWMxRH [1:0]] R/W Thanh ghi chứa 2 bit cao của bộ so sánh tạo chu kỳ nhiệm vụ. Hai bit này kết hợp với 8-bit PWMxRL tạo thành 10-bit so sánh với TxRH:TxRL. 14.5.2. PWMxRL Bảng 14-2: Mô tả thanh ghi PWMxRL Tên bit R/W Mô tả PWMxRL [7:0] R/W Thanh ghi chứa 8-bit thấp của bộ so sánh tạo chu kỳ nhiệm vụ. Tám bit này kết hợp với 2 bit PWMxRH tạo thành 10-bit so sánh với TxRH:TxRL. Chú ý: Xem phần 9.3 để biết thêm chi tiết về các bit cấu hình chiều của PortC SPI © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 91 15. Serial Peripheral Interface (SPI) 15.1. Giới thiệu SPI SPI là một khối truyền/nhận đồng bộ nối tiếp. Khối SPI hoạt động với chế độ master hoặc slave. Ở chế độ slave, khối SPI có thể giao tiếp với nhiều master. Giao tiếp SPI được sử dụng khá rộng rãi trong cuộc sống như: dùng để đọc ghi bộ nhớ EEPROM-SPI, điều khiển màn hình LCD, đọc dữ liệu từ các chip đo nhiệt độ chuyên dụng. SPISR SPIBUF PortC[5] / SDI PortC[6] / SDO prescale 4, 16, 64 Fsoc TMR2 / 2 clock select SCK_O SCK_I protocol controller SPIMS PortC[4] / SCK PortC[7] / SSx Shift clock SPISTASPICON internal data bus MODE[1:0] Hình15-1: Sơ đồ khối SPI Như mô tả hình trên, khối SPI có một bộ đệm 8-bit (SPIBUF) và một thanh ghi dịch (SPISR). Khi bắt đầu quá trình truyền dữ liệu, thanh ghi SPISR sẽ cập nhật dữ liệu từ thanh ghi SPIBUF. Khi có clock thì thanh ghi SPISR sẽ nhận dữ liệu từ SDI và phát ra ở SDO. Sau khi nhận và phát xong 1 byte thì dữ liệu từ SPISR sẽ được đưa đến SPIBUF và bit SPIBF sẽ lên 1. Giao tiếp của khối SPI gồm có các tín hiệu sau:  Ngõ ra nối tiếp (SDO) – PortC[6] /SDO  Ngõ vào nối tiếp (SDI) – PortC[5] /SDI  Clock nối tiếp (SCK) – PortC[4] /SCK  Trong chế độ slave có thể sử dụng thêm chân: SPI © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 92  Lựa chọn SPI slave (SSx) – PortC[7] /SSx 15.2. Các thanh ghi của SPI SPI có 3 thanh ghi. Chúng được sử dụng chung cho cả chế độ master và slave. Bảng 15-1: Thanh ghi SPI Tên thanh ghi Địa chỉ Mô tả SPICON 0x04F Thanh ghi điều khiển SPISTA 0x050 Thanh ghi trạng thái SPIBUF 0x051 Thanh ghi đệm Thanh ghi SPICON và SPISTA là thanh ghi điều khiển và thanh ghi trạng thái của SPI. Trong thanh ghi SPISTA có bit BF chỉ được đọc, các bit còn lại có thể đọc và ghi. Trong quá trình nhận dữ liệu, 2 thanh ghi SPIBUF và SPISR tạo thành bộ đệm 2 thanh ghi. Sau khi nhận xong 1 byte thì dữ liệu sẽ được đưa đến SPIBUF. Trong khi SPIBUF đang chờ CPU đọc dữ liệu thì SPISR có thể đang nhận byte thứ 2. Nếu SPISR nhận xong byte thứ 2 và giá trị trong SPIBUF vẫn chưa được đọc thì giá trị cũ bị mất đi, SPIBUF sẽ nhận giá trị mới từ SPISR và cờ tràn bật lên (SPIOV = 1). Sau khi nhận xong 1 byte thì cờ ngắt SPIIF bật lên để yêu cầu CPU đọc dữ liệu từ thanh ghi SPIBUF. 15.2.1. Thanh ghi điều khiển SPI - SPICON Bảng15-2: Thanh ghi điều khiển SPI- SPICON Tên Bit R/W Mô tả SPION [7] R/W Bit bật/tắt SPI 0: Khối SPI không được cho phép hoạt động. 1: Khối SPI được cho phép hoạt động. Dự trữ [6:4] R Không sử dụng Giá trị đọc ra là 0 CKP [4] R/W Trạng thái nghỉ của SCK 0: Trạng thái nghỉ của SCK là ở mức thấp 1: Trạng thái nghỉ của SCK là ở mức cao SPI © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 93 Tên Bit R/W Mô tả CKE [3] R/W Cạnh của SCK sử dụng để nhận dữ liệu 0: Nhận dữ liệu ở cạnh thứ hai 1: Nhận dữ liệu ở cạnh đầu tiên SPIMS [2] R/W Chế độ master hay slave 0: Chế độ master 1: Chế độ slave MODE [1:0] R/W Chế độ hoạt động của SPI. Chế độ slave, cho phép lập trình chế độ sử dụng SSx 00: Chân SSx được sử dụng như là tín hiệu cho phép SPI 01: SPI hoạt động không cần tín hiệu SSx Chế độ master, hai bit này sử dụng để lập trình tần số SCK cho SPI 00: SCK = Fosc/4 01: SCK = Fosc/16 10: SCK = Fosc/64 11: SCK = tmr2/2 Chú ý: 1. SPICON phải được lập trình trước khi lập trình bit SPION = 1. 2. Khi SPI trong chế độ slave và sử dụng chân SSx, khi SSx =1 thì quá trình truyền dữ liệu của SPI sẽ bị reset. 15.2.2. Thanh ghi trạng thái - SPISTA Bảng 15-3: Thanh ghi trạng thái SPI- SPISTA Tên Bit R/W Mô tả Dự trữ [7:3] R Không sử dụng Giá trị đọc ra là 0 SPIOV [2] R/W Bit tràn bộ đệm, chỉ sử dụng trong chế độ slave SPI © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 94 Tên Bit R/W Mô tả 0: Không bị tràn bộ đệm 1: Bị tràn bộ đệm. Khi SPI nhận xong 1 byte dữ liệu mà byte trước đó trong SPIBUF vẫn chưa được đọc. Dữ liệu mới sẽ ghi đè lên dữ liệu trước đó và bit SPIOV bật lên 1. Ghi vào giá trị 0 để xóa bit này SPIWCOL [1] R/W Xung đột dữ liệu trong quá trình phát. 0: Không bị xung đột 1: Bị xung đột, khi ghi dữ liệu vào thanh ghi SPIBUF để phát ra bên ngoài, Nếu quá trình ghi xảy ra khi SPI đang truyền dữ liệu trước đó thì bit SPIWCOL sẽ bật lên 1. Dữ liệu trong SPIBUF sẽ bị SPISR ghi đè lên khi truyền xong 1 byte. Nên ghi dữ liệu vào SPIBUF khi mới chuẩn bị truyền hoặc kết thúc byte truyền trước đó (SPIBF = 1). Ghi vào giá trị 0 để xóa bit này SPIBF [0] R Bit trạng thái của thanh ghi SPIBUF 0: Chưa nhận xong 1 byte 1: Nhận xong 1 byte Bit này được xóa khi đọc thanh ghi SPIBUF Chú ý: 1. Khi xung đột dữ liệu xảy ra thì dữ liệu phát đi có thể bị sai. 15.3. Hoạt động của SPI Khi sử dụng ngoại vi SPI, người sử dụng cần chú ý đến các điểm như sau khi lập trình:  SCK: Nếu ở chế độ master thì SCK là ngõ ra (SPIMS = 0) Nếu ở chế độ slave thì SCK là ngõ vào (SPIMS = 1).  CKP: Trạng thái nghỉ của SCK  CKE: Cạnh nhận dữ liệu  MODE : Nếu ở chế độ master thì MODE sử dụng để lập trình tần số SCK. Nếu ở chế độ slave thì MODE sử dụng để lập trình chế độ SSx. SPI © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 95 SPISR Truyền dữ liệu của SPI SPISR SPIBUF SBIBUF MASTER CONTROL SLAVE CONTROL SDI SDI SDO SDO SCK SSx MASTER SLAVE SCK GPIO Hình15-2: Sơ đồ kết nối của SPI Các trường hợp truyền nhận dữ liệu:  Master gửi dữ liệu thật – Slave gửi dữ liệu thật  Master gửi dữ liệu thật – Slave gửi dữ liệu giả  Master gửi dữ liệu giả – Slave gửi dữ liệu thật Dữ liệu thật là dữ liệu muốn truyền. Dữ liệu giả là dữ liệu không được quan tâm. bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0SDI/SDO SCK (CKP=0, CKE=0) SCK (CKP=0, CKE=1) SCK (CKP=1, CKE=1) SPIIF SSx SCK (CKP=1, CKE=0) Hình 15-3: các chế độ truyền dữ liệu của SPI Chú ý: Nếu ngắt SPI được cho phép (SPIIE=1) thì cờ ngắt sẽ xảy ra khi SPI phát/nhận xong 8-bit. SPI © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 96 15.4. Các bước lập trình SPI 15.4.1. Lập trình SPI ở chế độ master 1. Lập trình thanh ghi SPICON.  Chế độ master – SPIMS (SPICON [2] ) = 0.  Chế độ SCK – SPICKP: SPICKE (SPICON [4:3]).  Tốc độ truyền – SPIMODE [1:0] (SPICON [1:0]). 2. Lập trình ngắt và độ ưu tiên ngắt.  SPIIE (IE2 [6]), cho phép cờ ngắt SPIIF.  Lập trình SPIIP (IP2 [6]) để chọn mức ưu tiên ngắt. 3. Lập trình các chân giao tiếp  PortC[5] /SDI là ngõ vào  PortC[6] /SDO và PortC[4] /SCK là ngõ ra. 4. Bật SPION.  SPION (SPICON [7]) = 1. 5. Sử dụng một chân GPIO và kéo xuống zero để cho phép SPI slave. 6. Ghi dữ liệu muốn gửi vào SPIBUF 7. Kiểm tra bit trạng thái SPIBF  SPIBUF = 0: Chưa truyền xong 1 byte  SPIBUF = 1: Truyền xong 1 byte 8. Khi SPIBUF = 1, đọc thanh ghi SPIBUF để xóa bit SPIBUF. 9. Quay lại bước 6 để tiếp tục quá trình truyền nhận. Chú ý:  Chỉ ghi dữ liệu vào SPIBUF khi mà slave đã sẵn sàng nhận dữ liệu. SPI © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 97 15.4.2. Lập trình SPI ở chế độ slave 1. Lập trình thanh ghi SPICON.  Chế độ slave – SPIMS (SPICON [2] ) = 1.  Chế độ SCK – SPICKP: SPICKE (SPICON [4:3]).  Chế độ điều khiển SSx – SPIMODE [1:0] (SPICON [1:0]). 2. Lập trình ngắt và độ ưu tiên ngắt.  SPIIE (IE2 [6] = 1), cho phép cờ ngắt SPIIF.  Lập trình SPIIP (IP2 [6]) để chọn mức ưu tiên ngắt. 3. Lập trình các chân giao tiếp  PortC[5] /SDI và PortC[4] /SCK là ngõ vào  PortC[7] /SSx là ngõ vào nếu sử dụng chân lựa chọn slave  PortC[6] /SDO là ngõ ra 4. Bật SPION. SPION (SPICON [7]) = 1. 5. Ghi dữ liệu muốn gửi vào SPIBUF 6. Kiểm tra bit trạng thái SPIBF  SPIBUF = 0: Chưa truyền xong 1 byte  SPIBUF = 1: Truyền xong 1 byte 7. Khi SPIBUF = 1, đọc thanh ghi SPIBUF để xóa bit SPIBUF. 8. Quay lại bước 5 để tiếp tục quá trình phát và nhận. Nếu chỉ có quá trình nhận thì quay lại bước thứ 6. SPI © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 98 bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 SDI/ SDO SCK bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 byte 1 byte 2TDC Hình 15-4: dạng sóng của SPI slave (CKP = 0, CKE = 1) Chú ý: 1. Tần số SCK nhỏ hơn một nửa của clock hệ thống (SCK < FOSC / 2). 2. TDC lớn hơn 4 lần chu kỳ clock hệ thống. Nếu tần số SCK nhỏ hơn 4 lần clock hệ thống (SCK < FOSC / 4) thì TDC không cần quan tâm. Khi sử dụng SSx và SSx bị kéo lên cao khi đang truyền một byte, thì dữ liệu đó sẽ bị mất đi và không làm thay đổi các bit trạng thái của SPI bit 7 bit 6 bit 5SDI/SDO SCK (CKP=0, CKE=0) SCK (CKP=0, CKE=1) SCK (CKP=1, CKE=1) SPIIF SSx SCK (CKP=1, CKE=0) bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 Hình 15-5: đồng bộ tín hiệu SPI SSx Chú ý:  Trong quá trình truyền nhận dữ liệu không được thay đổi chế độ hoạt động (ghi dữ liệu vào thanh ghi SPICON

Các file đính kèm theo tài liệu này:

  • pdf7p1_979.pdf