CHƯƠNG 5 : HỌ VI ĐIỀU KHIỂN HCS12 VÀ VI ĐIỀU KHIỂN MC9S12DP512
5.2 Vi điều khiển được sử dụng trong Luận vă n MC9S12DP512
5.2.2 Khối chức năng thời gian (Timer )
Hệ thống chức năng thời gian của vi điều khiển MC9S12DP512 là sự tổng hợp đầy đủ các chức năng về thời gian của họ vi điều khiển HCS12 , gồm các chức năng chính như sau:
- Kết nối với 8 chân của Port T , mỗi chân của Port T là 1 kênh trong bộ Timer
- 8 kênh chung cho 2 chức năng :Bắt giữ ngõ vào ( Input Capture ) , So sánh ngõ ra( Output Compare). Và giữa các kênh chức năng bắt giữ ngõ vào với nhau sẽ cĩ 1 thanh ghi đệm 16-bit. - Một bộ đếm 16-bit ,và hỗ trợ bộ chia tỷ lệ 4-bit ( prescaler )
- 2 bộ đếm xung 16-bit: Pulse Accumulator A , B ; cĩ thể tách ra thành 4 bộ đếm xung 8-bit - 4 bộ tạo trễ (delay) , cĩ thể chọn bởi người dùng : để tăng độ triệt nhiễu cho các ngõ vào
5.2.2.1 Bộ đếm 16-bit:
- Thanh ghi đếm thời gian 16 bit : TCNT ( Timer Counter Register )
- Cĩ 3 thanh ghi điều khiển và trạng thái liên quan đến TCNT :
+ Thanh ghi điều khiển hệ thống thời gian 1: TSCR1 ( Timer System Control Register 1 )
Hình 5.10: Thanh ghi điều khiển hệ thống thời gian 1- TSCR1
TEN (Timer enable) : Bit khởi động chức năng thời gian
0 - Tắt mơ-đun chức năng thời gian ; 1 – Khởi động mơ-đun chức năng thời gian TSWAI (Timer stop while in wait mode) : Bit thiết lập cho Timer khi vi điều khiển ở chế độ chờ ( Wait mode )
0 – Cho phép Timer cứ tiếp tục chạy ngay cả khi vi điều khiển ở chế độ Chờ 1 - Tắt Timer khi vi điều khiển ở chế độ Chờ ( Wait mode)
TSFRZ ( Timer stop while in freeze mode ): Bit thiết lập cho Timer khi vi điều khiển ở chế độ “đĩng băng” ( GIẢ NGHỈ: Pseudo Stop )
0 - Cho phép Timer cứ tiếp tục chạy khi vi điều khiển ở chế độ “đĩng băng” 1 - Tắt Timer khi vi điều khiển ở chế độ “đĩng băng” (freeze mode)
TFFCA ( Timer fast flag clear all ) : Bit thiết lập chế độ xĩa các cờ trạng thái của hệ thống thời gian (Timer)
0 – Xĩa các cờ trạng thái bằng chế độ bình thường
1 – Xĩa các cờ trạng thái của các thanh ghi trạng thái bằng cách so sánh các giá trị kênh chức năng liên quan
+ Thanh ghi điều khiển hệ thống thời gian 2: TSCR2 (Timer System Control Register 2)
Hình 5.11: Thanh ghi điều khiển hệ thống thời gian 2- TSCR2
1 – Cho phép ngắt khi bit cờ báo tràn TOF ( Timer Overflow Flag) cĩ giá trị 1 TCRE: ( Timer counter reset enable ) : Bit cho phép khởi động lại bộ đếm
0 – Bộ đếm khơng tự động reset và Timer chạy tự do ,khơng kiểm sốt được 1 – Timer sẽ reset khi mỗi lần chức năng so sánh ngõ ra thứ 7 thành cơng
PR[2:0] ( PreScale ) : Bộ chia tỷ lệ tần số xung nhịp 3-bit , tạo ra xung nhịp cho bộ đếm thời gian từ tần số xung nhịp bus nội.
+ Thanh ghi cờ báo ngắt Timer 2: TFLG2 ( Timer Interrupt Flag 2 Register )
Hình 5.12: Thanh ghi cờ báo ngắt Timer 2- TFLG2
Chú ý: Bit cờ báo tràn TOF (bit 7) sẽ lên giá trị 1 mỗi khi bộ đếm thời gian tràn ( giá trị của thanh ghi TCNT đã đếm đủ từ $FFFF à $0000 )
· Ví dụ: Hệ thống cĩ tần số xung nhịp nội là 8 Mhz , bộ chia tỷ lệ ( Prescale) là 1:1 , thì khoảng thời gian cho mỗi lần Timer tràn sẽ là : 64K x (1 : 8 Mhz ) = 8.192 ms
Đoạn chương trình khởi động bộ đếm Timer ,và cho phép Ngắt khi Timer tràn. void Timer_Init(void){
TSCR1 = 0x80; // Cho phép bộ đếm TCNT hoạt động
TSCR2 = 0x80; // Cho phép ngắt khi Timer tràn , bộ chia tỷ lệ 1:1 PACTL = 0; //
TFLG2 = 0x80; // Xĩa cờ báo ngắt }
5.2.2.2 Bộ đếm xung ( Pulse Accumulator )
· Vi điều khiển MC9S12DP512 cĩ 2 bộ đếm xung 16-bit là : PACA (Pulse Accumulator A) -kết nối với chân PT7 và PACB (Pulse Accumulator B) – kết nối với chân PT0 · Bộ đếm xung cĩ 2 chức năng chính: Đếm sự kiện và chế độ Cổng
· Hai bộ đếm xung 16-bit này , cĩ thể tách ra thành 2 bộ đếm xung 8-bit riêng biệt + Bộ đếm 16-bit PACA gồm: PAC3 – PAC2 (8-bit)
+ Bộ đếm 16-bit PACB gồm: PAC1 – PAC0 ( 8-bit) · Bộ đếm xung PACA ( Pulse Accumulator A)
+ Cĩ 3 thanh ghi liên quan : PACTL( điều khiển ) , PAFLG( cờ ) ; PACN32 ( dữ liệu)
Hình 5.13: Các thanh ghi liên quan đến bộ đếm xung
bit PAEN
0 / 1 : Bộ đếm xung PACA khơng được sử dụng / được sử dụng bit PAMOD
0 / 1 : Chế độ Đếm sự kiện / Chế độ đếm thời gian Cổng bit PEGDE
0 : Đếm khi Xung xuống ( chế độ đếm xung) - Chọn Mức cao ( chế độ CỔNG) 1 : Đếm khi Xung lên ( chế độ đếm xung) - Chọn Mức thấp ( chế độ CỔNG) bit PAOVI
0 / 1 : Ngắt khi bộ đếm xung PACA tràn bị cấm / Cho phép Bit PAI
0 / 1 : Ngắt khi cĩ xung ở chân PT7 bị cấm / Cho phép
+ Thanh ghi chứa dữ liệu của bộ đếm xung PACA là thanh ghi 16-bit PAC32 : Chứa giá trị số xung đếm được ( trong chế độ đếm sự kiện ) hay thời gian của mức (trong chế độ CỔNG) + Thanh ghi 16-bit PACN32 là do 2 thanh ghi 8-bit ghép lại : PACN3 và PACN2
TCTL1 = TCTL1 & ~0xC0 ;
PACTL = 0x50 ; // Dùng bộ PACA ,chế độ đếm sự kiện , phát hiện xung lên PACN32 = 0 ; // Xĩa giá trị trong bộ đếm
}
· Bộ đếm xung PACB ( Pulse Accumulator B) :
+ Chỉ cĩ chức năng đếm sự kiện ,mà khơng cĩ chức năng đếm thời gian cổng
+ Cĩ các thanh ghi liên quan: PBCTL (điều khiển) , PBFLG (cờ) , PACN10 (dữ liệu) + Cách khai báo và sử dụng tương tự như bộ đếm xung PACA
5.2.3 Bộ điều rộng xung ( PWM : Pulse Width Modulation )
- Vi điều khiển MC9S12DP512 cĩ 8 kênh 8-bit PWM , được kết nối với Port P
- Hai kênh 8-bit PWM kế nhau cĩ thể kết hợp tạo thành một kênh 16-bit . Nên sẽ cĩ tối đa 4 kênh 16-bit PWM. Ở đây ta chỉ trình bày về chế độ điều rộng xung 8-bit .
- Cĩ tổng cộng 32 thanh ghi dùng để thiết lập thơng số cho 8 kênh PWM.
Ø Trình tự thiết lập cho bộ PWM: · Tạo tần số dao động cho bộ PWM:
- Việc chọn nguồn dao động cho bộ PWM là phụ thuộc vào giá trị thanh ghi PWMCLK : Cĩ các nguồn dao động là: Clock A , Clock SA , Clock B , Clock SB
+ Giá trị của nguồn dao động Clock SA sẽ được tạo ra bằng cách : Lấy giá trị Clock A chia cho giá trị trong thanh ghi PWMSCLA , sau đĩ lấy kết quả chia tiếp cho 2
+ Giá trị của nguồn dao động Clock SB sẽ được tạo ra bằng cách : Lấy giá trị Clock B
chia cho giá trị trong thanh ghi PWMSCLB , sau đĩ lấy kết quả chia tiếp cho 2
Hình 5.14: Thanh ghi PWMCLK
0 / 1 : Nguồn dao động là Clock B / Clock SB + PCLKy : Dùng cho các kênh PWMy ( y = 5 , 4 , 1 , 0) 0 / 1 : Nguồn dao động là Clock A / Clock SA
- Giá trị Tỷ lệ chia tỷ lệ ( Prescaler ) sẽ theo giá trị trong thanh ghi PWMPRCLK
· Chọn các thuộc tính của xung vng cần tạo , cho phép các kênh PWM hoạt động: - Chu kỳ của xung , được chọn bởi giá trị của thanh ghi : PWMPERn khi so sánh với giá trị trong bộ đếm PWMCNTn
- Duty_Cycle của xung , được chọn bởi giá trị của thanh ghi : PWMDTYn khi so sánh với giá trị trong bộ đếm PWMCNTn ( n : là thứ tự của kênh PWM , giá trị từ [ 0:7 ] ) - Thanh ghi PWMPOL dùng để chọn kiểu ưu tiên Mức của xung ra ( mức Cao hay Thấp)
Hình 5.15 : Thanh ghi PWMPOL
Bit PPOLn ( n = [ 0:7 ] ) cĩ trị :
0 / 1 : Xung ra sẽ bắt đầu bằng mức Thấp (mức 0) / bắt đầu bằng mức Cao(mức 1) - Thanh ghi cho phép bộ PWM hoạt động: PWME
Hình 5.16: Thanh ghi PWME
Giá trị của bit PWMEn ( n = [ 0:7 ] ) :
0 / 1 : Kênh PWMn bị cấm hoạt động / Kênh PWMn hoạt động
· Chọn chuẩn canh (Alignment ) cho xung ra , cĩ 2 chuẩn: Canh theo bên trái (left-
Hình 5.17: Thanh ghi PWMCAE
Giá trị của bit CAEn ( n = [ 0:7 ] ) :
0 / 1 : Kênh PWMn cĩ xung theo chuẩn left-aligned / center-aligned - Canh theo bên trái (left-aligned) :
Hình 5.18: Kiểu xung canh bên trái ( left-aligned)
Lúc đĩ ,ta cĩ các cơng thức liên quan:
+ PWMn frequency = Clock(A, B, SA, SB frequency) ¸ PWMPERn
+ Polarity = 0 : PWMn duty cycle = [(PWMPERn – PWMDTYn) ¸ PWMPERn] ´ 100% + Polarity = 1 : PWMn duty cycle = [PWMDTYn ¸ PWMPERn] ´ 100%
- Canh theo chính giữa (center-aligned ) :
Hình 5.19: Kiểu xung canh theo chính giữa ( center -aligned)
Lúc đĩ ,ta cĩ các cơng thức liên quan:
+ PWMn frequency = Clock (A, B, SA, or SB) frequency ¸ (2 ´ PWMPERn)
+ polarity = 0: PWMn duty cycle = [(PWMPERn – PWMDTYn) ¸ PWMPERn] ´ 100% + polarity = 1: PWMn duty cycle = [PWMDTYn ¸ PWMPERn] ´ 100%
Ví dụ : Chương trình sử dụng kênh PWM0 , tạo xung vng 10 Khz , duty_cycle = 40%
/* period (chu_kỳ) = PWMPER0 * 2^(PCKA+1) * PWMSCLA (Khi : PWMCLK = 1) Sử dụng bộ PLL --> Bus-Clock là 24Mhz */
void PWM_Init(void){
PWMCTL = PWMCTL & ~0xF0 ;
PWMPRCLK = PWMPRCLK & ~0x07 ; // PCKA = 0 PWMCLK = PWMCLK | 0x01 ; // sử dụng PWMSCLA
PWMPOL = PWMPOL | 0x01 ; // Chọn bắt đầu xủa xung là mức cao PWMSCLA = 6 ; // 10KHz of Square_Wave
PWMCAE = PWMCAE & ~0x01 ; // Chuẩn canh theo bên trái ( Left-aligned) PWMPER0 = 200 ; // Period = 200 : là mức so sánh với PWMCNT0 PWME = PWME | 0x01 ; // Cho phép kênh PWM0 hoạt động
PWMDTY0 = 50 ; // Hi_duty = 50: 200 = 40% }
5.2.4 Giao tiếp nối tiếp bất đồng bộ ( SCI : Asynchronous Serial Comunication Interface)
· Vi điều khiển MC9S12DP512 cĩ 2 bộ SCI : SCI0 và SCI1
· Bộ SCI0 cĩ : TxD kết nối với chân 1 của Port S , RxD kết nối với chân 0 của Port S · Bộ SCI1 cĩ : TxD kết nối với chân 3 của Port S , RxD kết nối với chân 2 của Port S · Hỗ trợ các tốc độ Baude như sau: 1200 ,2400 ,9600 , 19200 , 38400 ,115200 (hai tốc
độ: 38400 và 115200 chỉ sử dụng được khi cĩ dùng bộ PLL ,lúc đĩ tần số xung nhịp Bus nội là 24 Mhz )
· Mỗi bộ SCIn ( n = [0:1] , là thứ tự của 2 bộ SCI ) sẽ cĩ 8 thanh ghi điều khiển-trạng thái-dữ liệu liên quan: ( Cách thiết lập được trình bày ở Ví dụ về SCI )
sử dụng các loại ngắt thuộc bộ SCI khơng ( như: Ngắt truyền , ngắt nhận ) + Thanh ghi điều khiển ở chế độ đặc biệt : SCInCR0
+ Thanh ghi điều khiển dùng tách rời 2 mơ-đun Truyền và Nhận với nhau: SCInCR2 + Thanh ghi trạng thái ở chế độ hoạt động: SCInSR1 (bình thường) , SCInSR0(đặc biệt) + Thanh ghi bộ đệm truyền/nhận : SCInDRL
· Bộ tạo tốc độ truyền-nhận nối tiếp ( Baud Rate Generation ):
- Bộ phát và nhận hoạt động độc lập với nhau , cho dù sử dụng chung một bộ tạo tốc độ
Hình 5.20: Bộ tạo tốc độ truyền nhận SCI
Ø Ví dụ : Cách khởi tạo ,cĩ dùng ngắt cho bộ bộ SCI0 . Bus-Clock là 8 Mhz .
· Hàm con khởi tạo bộ SCI0 : Khi cần ta chỉ cần gọi hàm này với thơng số baudRate void SCI0_Init(unsigned long baudRate){
SCI0BDH = 0; // baud = MCLK/(16*baudRate) switch(baudRate){
case 2400: SCI0BDL=208; break; case 4800: SCI0BDL=104; break; case 9600: SCI0BDL=52; break; case 19200: SCI0BDL=26; break; case 38400: SCI0BDL=13; break;
} SCI0CR1 = 0; // Chế độ truyền nhận bình thường : 1 start, 8 data, 1 stop ,No Parity
SCI0CR2 = 0x2C ; // Chỉ cho phép ngắt nhận bởi bit RDRF , bộ thu phát được hoạt động
}
· Bây giờ nếu muốn khởi tạo bộ SCI0 với tốc độ baudrate là 38400 Bit/s :
SCI0_Init (38400 ) ; // Khởi tạo bộ SCI0 theo đúng yêu cầu baudRate = 38400 bit/s
5.2.5 Khối chức năng Key-WakeUp ( là: Chức năng đánh thức bằng Phím nhấn )
- Việc tiết kiệm năng lượng là rất quan trọng , nên khi ở trạng thái vi điều khiển khơng xử lý việc gì cả hay chờ sự kiện gì xảy ra, vi điều khiển sẽ hoạt động ở các chế độ tiết kiệm năng lượng như : Chờ ( Wait ) , Giả Nghỉ ( Pseudo-Stop ) , Nghỉ (Stop) . Khi cĩ sự việc yêu cầu xử lý xảy ra ,sẽ tạo ra 1 ngắt tức thì “đánh thức” vi điều khiển thực hiện việc yêu cầu.
- Tất cả các vi điều khiển thuộc họ HCS12 cĩ chức năng này ,gọi là Key-WakeUp . Cĩ cơng dụng chính là: Khi nhấn 1 phím – được kết nối trực tiếp với 1 chân của vi điều khiển ,sẽ
tạo ra 1 ngắt và vi điều khiển HCS12 sẽ đọc giá trị từ Port cĩ chân I/O kết nối với phím nhấn đĩ . Dựa vào giá trị này , vi điều khiển sẽ biết được ngay lập tức phím nào được nhấn
- Mơ-đun Key-WakeUp của MC9SDP512 cĩ tổng cộng là20 kênh , kết nối với 3 port: Port H , Port P , Port J .Các thanh ghi điều khiển tương ứng là: PIEX, PIFX ( X: là H hoặc P hoặc J)
5.2.6 Khối Mơ-đun chức năng CAN ( Controller Area Network )
o Giới thiệu về khối chức năng CAN của vi điều khiển MC9S12DP512 :
- Cĩ 5 mơ-đun MSCAN (Motorola Scalable CAN ), hỗ trợ 2 chuẩn CAN: V2.0A ,V2.0B - Mỗi mơ-đun MSCAN cĩ 5 bộ đệm nhận dữ liệu theo kiểu Vào-trước-Ra-trước ( FIFO: first-in-first-out memory ) và 3 bộ đệm truyền dữ liệu .Mỗi bộ đệm truyền sẽ được truy cập sử dụng dựa vào số thứ tự hoặc dựa vào tình trạng đầy hay trống.
- Bộ lọc số căn cước ( ID: Identifier ) cuả khung dữ liệu trong mỗi bộ CAN là: 1 bộ lọc 32-bit ( hỗ trợ cho chuẩn ID mở rộng ) , hay 2 bộ lọc 16-bit , hay 4 bộ lọc 8-bit
- Mơ-đun MSCAN cĩ tích hợp chế độ “quay vịng” ( Loopback mode ), nhằm cĩ thể tự kiểm tra hoạt động của khối chức năng trong mơ-đun và các bộ đệm truyền nhận mà khơng cần dùng thêm ngoại vi. Và cĩ thêm chế độ “lắng nghe” ( Listen-only mode ) ,nhằm chỉ giám sát hoạt động trên đường truyền- khơng gởi được dữ liệu đi.
- Cĩ tất cả là 4 ngắt cho mỗi mơ-đun MSCAN : Ngắt Nhận , Ngắt khi truyền bị cảnh báo , Ngắt truyền khi cĩ lỗi bị động , ngắt khi đứt dây đường truyền (bus off ) .
- Xung dao động cho mơ-đun MSCAN cĩ thể chọn là dao động của bộ Thạch anh hay là dao động nội của bus hệ thống . Cĩ 1 timer riêng để sử dụng .
- Mơ-đun MSCAN u cầu phải cĩ một bộ giao tiếp (Transceiver , cĩ thể là MCP2551 của Microchip,PCA82C250 của Phillip ) làm trung gian để cĩ thể kết nối với CAN-Bus.
· Thanh ghi điều khiển CANnCTL0 ( n = 0 -:- 4 ) : Dùng để thiết lập đầu tiên các chế độ hoạt động của mơ-đun MSCAN
Hình 5.22: Thanh ghi điều khiển - CANnCTL0
RXFRM ( Received frame flag ) : Cờ báo nhận dữ liệu vào 0 / 1: Khơng cĩ / Cĩ bức điện được nhận vào
SYNCH ( Synchronization status ): Trạng thái đồng bộ
0 / 1 : Mơ-đun MSCAN khơng đồng bộ với CAN-Bus / đồng bộ với CAN-Bus SLPRQ ( Sleep mode request) : yêu cầu vào chế độ “Ngủ”
0 : Mơ-đun MSCAN hoạt động bình thường
1: Mơ-đun MSCAN sẽ vào chế độ “Ngủ” khi khơng cĩ hoạt động trên đường truyền INITRQ ( Initialization mode request ): Yêu cầu vào trạng thái khởi động
0 / 1 : Hoạt động bình thường / Mơ-đun MSCAN vào chế độ khởi động
· Thanh ghi điều khiển CANnCTL1 ( n = 0 -:- 4 ): Cho phép mơ-đun CAN hoạt động ,và chọn chế độ hoạt động sau khi đã khởi động xong
Hình 5.23: Thanh ghi điều khiển - CANnCTL1 CANE ( MSCAN Enable ) : Cho phép mơ-đun MSCAN hoạt động 0 / 1 : Mơ-đun MSCAN bị cấm hoạt động / được phép hoạt động CLKSRC ( MSCAN Clock Source) :
0 / 1 : Xung clock dao động của mơ-đun MSCAN lấy từ dao động thạch anh / Bus-Clock LOOPB ( Loop back seft test mode) :
LISTEN ( Listen Only mode )
0 / 1 : Chế độ “lắng nghe” bị cấm / được sử dụng INITAK ( Initialization mode acknowledge ) :
0 / 1 : Mơ-đun MSCAN đang ở chế độ hoạt động bình thường / chế độ khởi động. · Các thanh ghi thiết lập các giá trị SJW (synchronization jump width) và tốc độ truyền
dữ liệu : CANnBTR0, CANnBTR1 ( n = 0 -:- 4 )
· Các thanh ghi dùng để lọc các bức điện cĩ chỉ số căn cước (ID) phù hợp: + Thiết lập bộ lọc ( 32-bit , 16-bit hay 8-bit) : CANnIDAC
+ Các thanh ghi tạo mặt nạ cho bộ lọc: CANxIDMR0~7 ,CANxIDAR0~7 + Các thanh ghi chứa giá trị số căn cước là : IDR0 , IDR1 , IDR2 , IDR3 · Các thanh ghi dùng cho việc nhận dữ liệu ( receiver ):
+ Thanh ghi trạng thái : CANnRFLG
+ Thanh ghi thiết lập ,cho phép việc sử dụng Ngắt nhận: CANnRIER