. 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]).
98 trang |
Chia sẻ: chaien | Lượt xem: 1523 | Lượt tải: 0
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:
- 7p1_979.pdf