Cácthanh ghi SFR thường xuyên được sử dụng ví dụ như thanh ghi STATUS sẽđược đặt ở tất cà các bank của bộ nhớ dữ liệu giúp thuận tiện trong quá trình truyxuất và làm giảm bớt lệnh của ch
Trang 1PIC là viết tắt của “Programable Intelligent Computer”, có thể tạm dịch là
“máy tính thông minh khả trình” do hãng Genenral Instrument đặt tên cho viđiều khiển đầu tiên của họ: PIC1650 được thiết kế để dùng làm các thiết bịngoại vi cho vi điều khiển CP1600 Vi điều khiển này sau đó được nghiên cứuphát triển thêm và từ đó hình thành nên dòng vi điều
khiển PIC ngày nay
1.2 SƠ ĐỒ CHÂN VI ĐIỀU KHIỂN PIC16F887
Trang 21.3 MỘT VÀI THÔNG SỐ VỀ VI ĐIỀU KHIỂN PIC16F887
Đây là vi điều khiển thuộc họ PIC16F8xx với tập lệnh gồm 35 lệnh có độdài 14 bit Mỗi lệnh đều được thực thi trong một chu kì xung clock Tốc độ hoạtđộng tối đa cho phép là 20 MHz với một chu kì lệnh là 200ns Bộ nhớ chươngtrình 8Kx14 bit, bộ nhớ dữ liệu 368x8 byte RAM và bộ nhớ dữ liệu EEPROMvới dung lượng 256x8 byte Số PORT I/O là 5 với 35 pin I/O
Các đặc tính ngoại vi bao gồmcác khối chức năng sau:
Timer0: bộ đếm 8 bit với bộ chia tần số 8 bit
Timer1: bộ đếm 16 bit với bộ chia tần số, có thể thực hiện chức năngđếm dựa vào xung clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độsleep
Timer2: bộ đếm 8 bit với bộ chia tần số, bộ postcaler
Hai bộ Capture/so sánh/điều chế độ rông xung
Các chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port), SPI vàI2C
Chuẩn giao tiếp nối tiếp USART với 9 bit địa chỉ
Cổng giao tiếp song song PSP (Parallel Slave Port) với các chân điềukhiển RD, WR,
CS ở bên ngoài
Các đặc tính Analog:
8 kênh chuyển đổi ADC 10 bit
Hai bộ so sánh
Bên cạnh đó là một vài đặc tính khác của vi điều khiển như:
Bộ nhớ flash với khả năng ghi xóa được 100.000 lần
Bộ nhớ EEPROM với khả năng ghi xóa được 1.000.000 lần
Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm
Khả năng tự nạp chương trình với sự điều khiển của phần mềm Nạpđược chương trình ngay trên mạch điện ICSP (In Circuit Serial Programming)thông qua 2 chân Watchdog Timer với bộ dao động trong
Chức năng bảo mật mã chương trình
Chế độ Sleep
Có thể hoạt động với nhiều dạng Oscillator khác nhau
Thạch anh gắn ngoài tối đa 20MHz
Tầm điện áp hoạt động 2.0V- 5.5V
5 port, 35 chân xuất nhập (I/O pins)
Có đầy đủ các chức năng cần thiết của Vi điều khiển 8-bit: Timer (3 bộ),ADC (14 kênh ADC 10-bit), USART, SPI, I2C, PWM, Compare, … được lựachọn để bắt đầu
Trang 31.4 SƠ ĐỒ KHỐI VI ĐIỀU KHIỂN PIC16F887
1.5 TỔ CHỨC BỘ NHỚ
Trang 4Cấu trúc bộ nhớ của vi điều khiển PIC16F887 bao gồm bộ nhớ chươngtrình (Program memory) và bộ nhớ dữ liệu (Data Memory).
1.5.1 BỘ NHỚ CHƯƠNG TRÌNH
Bộ nhớ chương trình của vi điều khiểnPIC16F887 là bộ nhớ flash, dung lượng bộ
nhớ 8K word (1 word = 14 bit) và được phân
thành nhiều trang (từ page0 đến page 3)
Như vậy bộ nhớ chương trình có khảnăng chứa được 8*1024 = 8192 lệnh (vì một
lệnh sau khi mã hóa sẽ có dung lượng 1 word
(14 bit)
Để mã hóa được địa chỉ của 8K word
bộ nhớ chương trình, bộ đếm chương trình có
dung lượng 13 bit (PC<12:0>)
Khi vi điều khiển được reset, bộ đếmchương trình sẽ chỉ đến địa chỉ 0000h (Reset
vector) Khi có ngắt xảy ra, bộ đếm chương
trình sẽ chỉ đến địa chỉ 0004h (Interrupt
vector)
Bộ nhớ chương trình không bao gồm:
Bộ nhớ stack và không được địa chỉhóa bởi bộ đếm chương trình Bộ nhớ stack sẽ
được đề cập cụ thể trong phần sau
1.5.2 BỘ NHỚ DỮ LIỆU
Bộ nhớ dữ liệu của PIC là bộ nhớ EEPROM được chia ra làm nhiều bank Đốivới PIC16F887 bộ nhớ dữ liệu được chia ra làm 4 bank Mỗi bank có dunglượng 128 byte, bao gồm các thanh ghi có chức năng đặc biệt SFG (SpecialFunction Register) nằm ở các vùng địa chỉ thấp và các thanh ghi mục đích chungGPR (General Purpose Register) nằm ở vùng địa chỉ còn lại trong bank Cácthanh ghi SFR thường xuyên được sử dụng (ví dụ như thanh ghi STATUS) sẽđược đặt ở tất cà các bank của bộ nhớ dữ liệu giúp thuận tiện trong quá trình truyxuất và làm giảm bớt lệnh của chương trình Sơ đồ cụ thể của bộ nhớ dữ liệuPIC16F887 như sau:
Trang 61.5.2.1 THANH GHI CHỨC NĂNG ĐẶC BIỆT SFR
Đây là các thanh ghi được sử dụng bởi CPU hoặc được dùng để thiết lập
và điều khiển các khối chức năng được tích hợp bên trong vi điều khiển Có thểphân thanh ghi SFR làm hai lọai: thanh ghi SFR liên quan đến các chức năngbên trong (CPU) và thanh ghi SRF dùng để thiết lập và điều khiển các khối chứcnăng bên ngoài (ví dụ như ADC, PWM, …) Phần này sẽ đề cập đến các thanhghi liên quan đến các chức năng bên trong Các thanh ghi dùng để thiết lập vàđiều khiển các khối chức năng sẽ được nhắc đến khi ta đề cập đến các khối chứcnăng đó Thanh ghi STATUS (03h, 83h, 103h, 183h):thanh ghi chứa kết quả thựchiện phép toán của khối ALU, trạng thái reset và các bit chọn bank cần truy xuấttrong bộ nhớ dữ liệu Thanh ghi OPTION_REG (81h, 181h): thanh ghi này chophép đọc và ghi, cho phép điều khiển chức năng pull-up của các chân trongPORTB, xác lập các tham số về xung tác động, cạnh tác động của ngắt ngoại vi
và bộ đếm Timer0
Trang 7Thanh ghi INTCON (0Bh, 8Bh,10Bh, 18Bh):thanh ghi cho phép đọc vàghi, chứa các bit điều khiển và các bit cờ hiệu khi timer0 bị tràn, ngắt ngoại viRB0/INT và ngắt interrput-on-change tại các chân của PORTB.
Thanh ghi PIE1 (8Ch): chứa các bit điều khiển chi tiết các ngắt của cáckhối chức năng ngoại vi
Thanh ghi PIR1 (0Ch) chứa cờ ngắt của các khối chức năng ngoại vi, cácngắt này được cho phép bởi các bit điều khiển chứa trong thanh ghi PIE1
Thanh ghi PIE2 (8Dh): chứa các bit điều khiển các ngắt của các khốichức năng
CCP2, SSP bus, ngắt của bộ so sánh và ngắt ghi vào bộ nhớ EEPROM
Thanh ghi PIR2 (0Dh): chứa các cờ ngắt của các khối chức năng ngoại vi,các ngắt này được cho phép bởi các bit điều khiển chứa trong thanh ghi PIE2
Thanh ghi PCON (8Eh): chứa các cờ hiệu cho biết trạng thái các chế độreset của vi điều khiển
1.5.2.2 THANH GHI MỤC ĐÍCH CHUNG GPR
Các thanh ghi này có thể được truy xuất trực tiếp hoặc gián tiếp thông quathanh ghi FSG (File Select Register) Đây là các thanh ghi dữ liệu thông thường,người sử dụng có thể tùy theo mục đích chương trình mà có thể dùng các thanhghi này để chứa các biến số, hằng số, kết quả hoặc các tham số phục vụ chochương trình
Trang 81.5.3 STACK
Stack không nằm trong bộ nhớ chương trình hay bộ nhớ dữ liệu mà là mộtvùng nhớ đặc biệt không cho phép đọc hay ghi Khi lệnh CALL được thực hiệnhay khi một ngắt xảy ra làm chương trình bị rẽ nhánh, giá trị của bộ đếm chươngtrình PC tự động được vi điều khiển cất vào trong stack Khi một trong các lệnhRETURN, RETLW hat RETFIE được thực thi, giá trị PC sẽ tự động được lấy ra từtrong stack, vi điều khiển sẽ thực hiện tiếp chương trình theo đúng qui trình địnhtrước
Bộ nhớ Stack trong vi điều khiển PIC họ 16Fxx có khả năng chứa được 8 địa chỉ
và hoạt động theo cơ chế xoay vòng Nghĩa là giá trị cất vào bộ nhớ Stack lần thứ
9 sẽ ghi đè lên giá trị cất vào Stack lần đầu tiên và giá trị cất vào bộ nhớ Stack lầnthứ 10 sẽ ghi đè lên giá tri6 cất vào Stack lần thứ 2
Cần chú ý là không có cờ hiệu nào cho biết trạng thái stack, do đó ta khôngbiết được khi nào stack tràn Bên cạnh đó tập lệnh của vi điều khiển dòng PICcũng không có lệnh POP hay PUSH, các thao tác với bộ nhớ stack sẽ hoàn toànđược điều khiển bởi CPU
1.6 CÁC CỔNG XUẤT NHẬP CỦA PIC16F887
Cổng xuất nhập (I/O port) chính là phương tiện mà vi điều khiển dùng đểtương tác với thế giới bên ngoài Sự tương tác này rất đa dạng và thông qua quátrình tương tác đó, chức năng của vi điều khiển được thể hiện một cách rõ ràng
Một cổng xuất nhập của vi điều khiển bao gồm nhiều chân (I/O pin), tùytheo cách bố trí và chức năng của vi điều khiển mà số lượng cổng xuất nhập và sốlượng chân trong mỗi cổng có thể khác nhau Bên cạnh đó, do vi điều khiển đượctích hợp sẵn bên trong các đặc tính giao tiếp ngoại vi nên bên cạnh chức năng làcổng xuất nhập thông thường, một số chân xuất nhập còn có thêm các chức năngkhác để thể hiện sự tác động của các đặc tính ngoại vi nêu trên đối với thế giới bênngoài Chức năng của từng chân xuất nhập trong mỗi cổng hoàn toàn có thể đượcxác lập và điều khiển được thông qua các thanh ghi SFR liên quan đến chân xuấtnhập đó
Vi điều khiển PIC16F887 có 5 cổng xuất nhập, bao gồm PORTA, PORTB,PORTC, PORTD và PORTE Cấu trúc và chức năng của từng cổng xuất nhập sẽđược đề cập cụ thể trong phần sau
1.6.1 PORTA
PORTA (RPA) bao gồm 6 I/O pin Đây là các chân “hai chiều”(bidirectional pin), nghĩa là có thể xuất và nhập được Chức năng I/O này đượcđiều khiển bởi thanh ghi TRISA (địa chỉ 85h) Muốn xác lập chức năng của mộtchân trong PORTA là input, ta “set” bit điều khiển tương ứng với chân đó trong
Trang 9thanh ghi TRISA và ngược lại, muốn xác lập chức năng của một chân trongPORTA là output, ta “clear” bit điều khiển tương ứng với chân đó trong thanh ghiTRISA Thao tác này hoàn toàn tương tự đối với các PORT và các thanh ghi điềukhiển tương ứng TRIS (đối với PORTA là TRISA, đối với PORTB là TRISB, đốivới PORTC là TRISC, đối với PORTD là TRISD vàđối với PORTE là TRISE).Bên cạnh đó PORTA còn là ngõ ra của bộ ADC, bộ so sánh, ngõ vào analog ngõvào xung clock của Timer0 và ngõ vào của bộ giao tiếp MSSP (MasterSynchronous Serial Port) Đặc tính này sẽ được trình bày cụ thể trong phần sau.Các thanh ghi SFR liên quan đến PORTA bao gồm:
PORTA (địa chỉ 05h) : chứa giá trị các pin trong PORTA
TRISA (địa chỉ 85h) : điều khiển xuất nhập
CMCON (địa chỉ 9Ch) : thanh ghi điều khiển bộ so sánh
CVRCON (địa chỉ 9Dh) : thanh ghi điều khiển bộ so sánh điện áp ADCON1(địa chỉ 9Fh) : thanh ghi điều khiển bộ ADC
1.6.2 PORTB
PORTB (RPB) gồm 8 pin I/O Thanh ghi điều khiển xuất nhập tương ứng
là TRISB Bên cạnh đó một số chân của PORTB còn được sử dụng trong quá trìnhnạp chương trình cho vi điều khiển với các chế độ nạp khác nhau PORTB cònliên quan đến ngắt ngoại vi và bộ Timer0 PORTB còn được tích hợp chức năngđiện trở kéo lên được điều khiển bởi chương trình Các thanh ghi SFR liênquan đến PORTB bao gồm:
PORTB (địa chỉ 06h,106h) : chứa giá trị các pin trong PORTB
TRISB (địa chỉ 86h,186h) : điều khiển xuất nhập
OPTION_REG (địa chỉ 81h,181h) : điều khiển ngắt ngoại vi và bộ Timer0
1.6.3 PORTC
PORTC (RPC) gồm 8 pin I/O Thanh ghi điều khiển xuất nhập tương ứng
là TRISC Bên cạnh đó PORTC còn chứa các chân chức năng của bộ so sánh, bộTimer1, bộ PWM và các chuẩn giao tiếp nối tiếp I2C, SPI, SSP, USART Cácthanh ghi điều khiển liên quan đến PORTC:
PORTC (địa chỉ 07h) : chứa giá trị các pin trong PORTC
TRISC (địa chỉ 87h) : điều khiển xuất nhập
1.6.4 PORTD
PORTD (RPD) gồm 8 chân I/O, thanh ghi điều khiển xuất nhập tương ứng
là TRISD PORTD còn là cổng xuất dữ liệu của chuẩn giao tiếp PSP (ParallelSlave Port) Các thanh ghi liên quan đến PORTD bao gồm:
Thanh ghi PORTD : chứa giá trị các pin trong PORTD
Thanh ghi TRISD : điều khiển xuất nhập
Thanh ghi TRISE : điều khiển xuất nhập PORTE và chuẩn giao tiếp PSP
1.6.5 PORTE
Trang 10PORTE (RPE) gồm 3 chân I/O Thanh ghi điều khiển xuất nhập tương ứng
là TRISE Các chân của PORTE có ngõ vào analog Bên cạnh đó PORTE còn làcác chân điều khiển của chuẩn giao tiếp PSP
Các thanh ghi liên quan đến PORTE bao gồm:
PORTE : chứa giá trị các chân trong PORTE
TRISE : điều khiển xuất nhập và xác lập các thông số cho chuẩn giao tiếp PSP.ADCON1 : thanh ghi điều khiển khối ADC
1.7 TIMER_0
Sơ đồ khối của Timer0 như sau:
Đây là một trong ba bộ đếm hoặc bộ định thời của vi điều khiểnPIC16F877A Timer0 là bộ đếm 8 bit được kết nối với bộ chia tần số (prescaler) 8bit Cấu trúc của Timer0 cho phép ta lựa chọn xung clock tác động và cạnh tíchcực của xung clock Ngắt Timer0 sẽ xuất hiện khi Timer0 bị tràn Bit TMR0IE(INTCON<5>) là bit điều khiển của Timer0 TMR0IE=1 cho phép ngắt Timer0tác động, TMR0IF= 0 không cho phép ngắt Timer0 tác động
Muốn Timer0 hoạt động ở chế độ Timer ta clear bit TOSC(OPTION_REG<5>), khi đó giá trị thanh ghi TMR0 sẽ tăng theo từng chu kì xungđồng hồ (tần số vào Timer0 bằng ¼ tần số oscillator) Khi giá trị thanh ghi TMR0
từ FFh trở về 00h, ngắt Timer0 sẽ xuất hiện Thanh ghi TMR0 cho phép ghi vàxóa được giúp ta ấn định thời điểm ngắt Timer0 xuất hiện một cách linh động
Muốn Timer0 hoạt động ở chế độ counter ta set bit TOSC(OPTION_REG<5>) Khi đó xung tác động lên bộ đếm được lấy từ chânRA4/TOCK1 Bit TOSE (OPTION_REG<4>) cho phép lựa chọn cạnh tác độngvào bột đếm Cạnh tác động sẽ là cạnh lên nếu TOSE=0 và cạnh tác động sẽ làcạnh xuống nếu TOSE=1
Trang 11Khi thanh ghi TMR0 bị tràn, bit TMR0IF (INTCON<2>) sẽ được set Đâychính là cờ ngắt của Timer0 Cờ ngắt này phải được xóa bằng chương trình trướckhi bộ đếm bắt đầu thực hiện lại quá trình đếm Ngắt Timer0 không thể “đánhthức” vi điều khiển từ chế độ sleep.
Bộ chia tần số (prescaler) được chia sẻ giữa Timer0 và WDT (WatchdogTimer) Điều đó có nghĩa là nếu prescaler được sử dụng cho Timer0 thì WDT sẽkhông có được hỗ trợ của prescaler và ngược lại Prescaler được điều khiển bởithanh ghi OPTION_REG Bit PSA (OPTION_REG<3>) xác định đối tượng tácđộng của prescaler Các bit PS2:PS0 (OPTION_REG<2:0>) xác định tỉ số chiatần số của prescaler Xem lại thanh ghi OPTION_REG để xác định lại một cáchchi tiết về các bit điều khiển trên Các lệnh tác động lên giá trị thanh ghi TMR0 sẽxóa chế độ hoạt động của prescaler Khi đối tượng tác động là Timer0, tác độnglên giá trị thanh ghi TMR0 sẽ xóa prescaler nhưng không làm thay đổi đối tượngtác động của prescaler Khi đối tượng tác động là WDT, lệnh CLRWDT sẽ xóaprescaler, đồng thời prescaler sẽ ngưng tác vụ hỗ trợ cho WDT
Các thanh ghi điều khiển liên quan đến Timer0 bao gồm:
TMR0 (địa chỉ 01h, 101h) : chứa giá trị đếm của Timer0
INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE vàPEIE)
OPTION_REG (địa chỉ 81h, 181h): điều khiển prescaler
1.8 TIMER_1
Timer1 là bộ định thời 16 bit, giá trị của Timer1 sẽ được lưu trong haithanh ghi (TMR1H:TMR1L) Cờ ngắt của Timer1 là bit TMR1IF (PIR1<0>) Bitđiều khiển của Timer1 sẽ là TMR1IE (PIE<0>) Tương tự như Timer0, Timer1cũng có hai chế độ hoạt động: chế độ định thời (timer) với xung kích là xungclock của oscillator (tần số của timer bằng ¼ tần số của oscillator) và chế độ đếm(counter) với xung kích là xung phản ánh các sự kiện cần đếm lấy từ bên ngoàithông qua chân RC0/T1OSO/T1CKI (cạnh tác động là cạnh lên) Việc lựa chọnxung tác động (tương ứng với việc lựa chọn chế độ hoạt động là timer haycounter) được điều khiển bởi bit TMR1CS (T1CON<1>) Sau đây là sơ đồ khốicủa Timer1:
Trang 12Ngoài ra Timer1 còn có chức năng reset input bên trong được điều khiểnbởi một trong hai khối CCP (Capture/Compare/PWM) Khi bit T1OSCEN(T1CON<3>) được set, Timer1 sẽ lấy xung clock từ hai chân RC1/T1OSI/CCP2
và RC0/T1OSO/T1CKI làm xung đếm Timer1 sẽ bắt đầu đếm sau cạnh xuốngđầu tiên của xung ngõ vào Khi đó PORTC sẽ bỏ qua sự tác động của hai bitTRISC<1:0> và PORTC<2:1> được gán giá trị 0 Khi clear bit T1OSCEN Timer1
sẽ lấy xung đếm từ oscillator hoặc từ chân RC0/T1OSO/T1CKI Timer1 có haichế độ đếm là đồng bộ (Synchronous) và bất đồng bộ (Asynchronous) Chế độđếm được quyết định bởi bit điều khiển (T1CON<2>) Khi =1 xung đếm lấy từbên ngoài sẽ không được đồng bộ hóa với xung clock bên trong, Timer1 sẽ tiếptục quá trình đếm khi vi điều khiển đang ở chế độ sleep và ngắt do Timer1 tạo rakhi bị tràn có khả năng “đánh thức” vi điều khiển Ở chế độ đếm bất đồng bộ,Timer1 không thể được sử dụng để làm nguồn xung clock cho khối CCP(Capture/Compare/Pulse width modulation) Khi =0 xung đếm vào Timer1 sẽđược đồng bộ hóa với xung clock bên trong Ở chế độ này Timer1 sẽ không hoạtđộng khi vi điều khiển đang ở chế độ sleep
Các thanh ghi liên quan đến Timer1 bao gồm:
INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE vàPEIE)
PIR1 (địa chỉ 0Ch): chứa cờ ngắt Timer1 (TMR1IF)
PIE1( địa chỉ 8Ch): cho phép ngắt Timer1 (TMR1IE)
TMR1L (địa chỉ 0Eh): chứa giá trị 8 bit thấp của bộ đếm Timer1
TMR1H (địa chỉ 0Eh): chứa giá trị 8 bit cao của bộ đếm Timer1
T1CON (địa chỉ 10h): xác lập các thông số cho Timer1
Trang 13được đưa qua bộ chia tần
số prescaler 4 bit (với các
tỉ số chia tần số là 1:1,
1:4 hoặc 1:16 và được
điều khiển bởi các bit T2CKPS1:T2CKPS0 (T2CON<1:0>))
Timer2 còn được hỗ trợ bởi thanh ghi PR2 Giá trị đếm trong thanh ghiTMR2 sẽ tăng từ 00h đến giá trị chứa trong thanh ghi PR2, sau đó được reset về00h Kh I reset thanh ghi PR2 được nhận giá trị mặc định FFh Ngõ ra của Timer2được đưa qua bộ chia tần số postscaler với các mức chia từ 1:1 đến 1:16.Postscaler được điều khiển bởi 4 bit T2OUTPS3:T2OUTPS0 Ngõ ra củapostscaler đóng vai trò quyết định trong việc điều khiển cờ ngắt
Ngoài ra ngõ ra của Timer2 còn được kết nối với khối SSP, do đó Timer2còn đóng vai trò tạo ra xung clock đồng bộ cho khối giao tiếp SSP
Các thanh ghi liên quan đến Timer2 bao gồm:
INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép toàn bộ các ngắt (GIE vàPEIE)
PIR1 (địa chỉ 0Ch): chứa cờ ngắt Timer2 (TMR2IF)
PIE1 (địa chị 8Ch): chứa bit điều khiển Timer2 (TMR2IE)
TMR2 (địa chỉ 11h): chứa giá trị đếm của Timer2
T2CON (địa chỉ 12h): xác lập các thông số cho Timer2 PR2 (địa chỉ 92h): thanhghi hỗ trợ cho Timer2
Ta có một vài nhận xét về Timer0, Timer1 và Timer2 như sau:
Timer0 và Timer2 là bộ đếm 8 bit (giá trị đếm tối đa là FFh), trong khiTimer1 là bộ đếm 16 bit (giá trị đếm tối đa là FFFFh) Timer0, Timer1 và Timer2đều có hai chế độ hoạt động là timer và counter Xung clock có tần số bằng ¼ tần
số của oscillator Xung tác động lên Timer0 được hỗ trợ bởi prescaler và có thểđược thiết lập ở nhiều chế độ khác nhau (tần số tác động, cạnh tác động) trong khicác thông số của xung tác động lên Timer1 là cố định Timer2 được hỗ trợ bởi hai
Trang 14bộ chia tần số prescaler và postcaler độc lập, tuy nhiên cạnh tác động vẫn được cốđịnh là cạnh lên Timer1 có quan hệ với khối CCP, trong khi Timer2 được kết nốivới khối SSP Một vài so sánh sẽ giúp ta dễ dàng lựa chọn được Timer thích hợpcho ứng dụng.
1.10 ADC
ADC (Analog to Digital Converter) là bộ chuyển đổi tín hiệu giữa hai dạngtương tự và số PIC16F887 có 8 ngõ vào analog (RA4:RA0 và RE2:RE0) Hiệuđiện thế chuẩn VREF có thể được lựa chọn là VDD, VSS hay hiệu điện thể chuẩnđược xác lập trên hai chân RA2 và RA3 Kết quả chuyển đổi từ tín tiệu tương tựsang tín hiệu số là 10 bit số tương ứng và được lưu trong hai thanh ghiADRESH:ADRESL Khi không sử dụng bộ chuyển đổi ADC, các thanh ghi này
có thể được sử dụng như các thanh ghi thông thường khác Khi quá trình chuyểnđổi hoàn tất, kết quả sẽ được lưu vào hai thanh ghi ADRESH:ADRESL, bit(ADCON0<2>) được xóa về 0 và cờ ngắt ADIF được set
Qui trình chuyển đổi từ tương tự sang số bao gồm các bước sau:
a Thiết lập các thông số cho bộ chuyển đổi ADC:
Chọn ngõ vào analog, chọn điện áp mẫu (dựa trên các thông số của thanh ghiADCON1)
Chọnh kênh chuyển đổi AD (thanh ghi ADCON0)
Chọnh xung clock cho kênh chuyển đổi AD (thanh ghi ADCON0)
Cho phép bộ chuyển đổi AD hoạt động (thanh ghi ADCON0)
b Thiết lập các cờ ngắt cho bộ AD
Clear bit ADIF
Set bit ADIE
Set bit PEIE
Set bit GIE
c Đợi cho tới khi quá trình lấy mẫu hoàn tất.
d Bắt đầu quá trình chuyển đổi (set bit ).
e Đợi cho tới khi quá trình chuyển đổi hoàn tất bằng cách:
Kiểm tra bit Nếu =0, quá trình chuyển đổi đã hoàn tất
Các thanh ghi liên quan đến bộ chuyển đổi ADC bao gồm:
INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép các ngắt (các bit GIE,PEIE)
Trang 15PIR1 (địa chỉ 0Ch): chứa cờ ngắt AD (bit ADIF).
PIE1 (địa chỉ 8Ch): chứa bit điều khiển AD (ADIE)
ADRESH (địa chỉ 1Eh) và ADRESL (địa chỉ 9Eh): các thanh ghi chứa kết quảchuyển đổi AD
ADCON0 (địa chỉ 1Fh) và ADCON1 (địa chỉ 9Fh): xác lập các thông số cho bộchuyển đổi AD
PORTA (địa chỉ 05h) và TRISA (địa chỉ 85h): liên quan đến các ngõ vào analog ởPORTA PORTE (địa chỉ 09h) và TRISE (địa chỉ 89h): liên quan đến các ngõ vàoanalog ở PORTE
1.11 COMPARATOR
Bộ so sánh bao gồm hai bộ so so sánh tín hiệu analog và được đặt ởPORTA gõ vào bộ so sánh là các chân RA3:RA0, ngõ ra là hai chân RA4 vàRA5 Thanh ghi điều khiển bộ so sánh là CMCON Các bit CM2:CM0 trong thanhghi CMCON đóng vai trò chọn lựa các chế độ hoạt động cho bộ Comparator (hình2.10)
Cơ chế hoạt động của bộ
Comparator như sau:
Tín hiệu analog ở chân VIN+ sẽ được só sánh với điện áp
chuẩn ở chân VIN- và tín hiệu ở
ngõ ra bộ so sánh sẽ thay đổi tương
ứng như hình vẽ Khi điện áp ở
chân VIN+ lớn hơn điện áp ở chân
VIN+ ngõ ra sẽ ở mức 1 và ngược
lại
Dựa vào hình vẽ ta thấy đápứng tại ngõ ra không phải là tức
thời so với thay đổi tại ngõ vào mà
cần có một khoảng thời gian nhất
định để ngõ ra thay đổi trạng thái
(tối đa là 10us) Cần chú ý đến
khoảng thời gian đáp ứng này khi sử dụng bộ so sánh
Cực tính của các bộ so sánh có thể thay đổi dựa vào các giá trị đặt vào cácbit C2INV
và C1INV (CMCON<4:5>)
Trang 16Các chế độ hoạt động của bộ comparator.
Các bit C2OUT và C1OUT (CMCON<7:6>) đóng vai trò ghi nhận sự thay đổi tínhiệu analog so với điện áp đặt trước Các bit này cần được xử lí thích hợp bằngchương trình để ghi nhận sự thay đổi của tín hiệu ngõ vào Cờ ngắt của bộ so sánh làbit CMIF (thanh ghi PIR1) Cờ ngắt này phải được reset về 0 Bit điều khiển bộ sosánh là bit CMIE (Tranh ghi PIE)
Các thanh ghi liên quan đến bộ so sánh bao gồm:
CMCON (địa chỉ 9Ch) và CVRCON (địa chỉ 9Dh): xác lập các thông số cho bộ sosánh
Thanh ghi INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): chứa các bit cho phép cácngắt
Trang 17(GIE và PEIE).
Thanh ghi PIR2 (địa chỉ 0Dh): chứa cờ ngắt của bộ so sánh (CMIF)
Thanh ghi PIE2 (địa chỉ 8Dh): chứa bit cho phép bộ so sánh (CNIE)
Thanh ghi PORTA (địa chỉ 05h) và TRISA (địa chỉ 85h):
1.12 BỘ TẠO ĐIỆN ÁP SO SÁNH
Bộ so sánh này chỉ hoạt động khi bộ Comparator đựơc định dạng hoạt động
ở chế độ ‘110’ Khi đó các pin RA0/AN0 và RA1/AN1 (khi CIS = 0) hoặc pinRA3/AN3 và RA2/AN2 (khi CIS = 1) sẽ là ngõ vào analog của điện áp cần sosánh đưa vào ngõ VIN- của 2 bộ so sánh C1 và C2 (xem chi tiết ở hình 2.10).Trong khi đó điện áp đưa vào ngõ VIN+ sẽ được lấy từ một bộ tạo điện áp sosánh Sơ đồ khối của bộ tạo điện áp so sánh đựơc trình bày trong hình vẽ sau:
Bộ tạo điện áp so sánh này bao gồm một thang điện trở 16 mức đóng vaitrò là cầu phân áp chia nhỏ điện áp VDD thành nhiều mức khác nhau (16 mức).Mỗi mức có giá trị điện áp khác nhau tùy thuộc vào bit điều khiển CVRR(CVRCON<5>) Nếu CVRR ở mức logic 1, điện trở 8R sẽ không có tác dụng nhưmột thành phần của cầu phân áp (BJT dẫn mạnh và dòng điện không đi qua điệntrở 8R), khi đó 1 mức điện áp có giá trị VDD/24 Ngược lại khi CVRR ở mứclogic 0, dòng điện sẽ qua điện trở 8R và1 mức điện áp có giá trị VDD/32 Cácmức điện áp này được đưa qua bộ MUX cho phép ta chọn được điện áp đưa ra pinRA2/AN2/VREF-/CVREF để đưa vào ngõ VIN+ của bộ so sánh bằng cách đưacác giá trị thích hợp vào các bit CVR3:CVR0
Trang 18Bộ tạo điện áp so sánh này có thể xem như một bộ chuyển đổi D/A đơngiản Giá trị điện áp cần so sánh ở ngõ vào Analog sẽ được so sánh với các mứcđiện áp do bộ tạo điện áp tạo ra cho tới khi hai điện áp này đạt được giá trị xấp xỉbằng nhau Khi đó kết quả chuyển đổi xem như được chứa trong các bitCVR3:CVR0.
Các thanh ghi liên quan đến bộ tạo điện áp so sánh này bao gồm:
Thanh ghi CVRCON (địa chỉ 9Dh): thanh ghi trực tiếp điều khiển bộ so sánh điệnáp
Thanh ghi CMCON (địa chỉ 9Ch): thanh ghi điều khiển bộ Comparator
1.13 CCP
CCP (Capture/Compare/PWM) bao gồm các thao tác trên các xung đếmcung cấp bởi các bộ đếm Timer1 và Timer2 PIC16F887 được tích hợp sẵn haikhối CCP : CCP1 và CCP2.Mỗi CCP có một thanh ghi 16 bit (CCPR1H:CCPR1L
và CCPR2H:CCPR2L), pin điều khiển dùng cho khối CCPx là RC2/CCP1 vàRC1/T1OSI/CCP2 Các chức năng của CCP bao gồm:
Capture
So sánh (Compare)
Điều chế độ rộng xung PWM (Pulse Width Modulation)
Cả CCP1 và CCP2 về nguyên tắc hoạt động đều giống nhau và chức năng củatừng khối là khá độc lập Tuy nhiên trong một số trường hợp ngoại lệ CCP1 vàCCP2 có khả năng phối hợp với nhau để để tạo ra các hiện tượng đặc biệt (Specialevent trigger) hoặc các tác động lên Timer1 và Timer2 Các trường hợp này đượcliệt kê trong bảng sau:
Khi hoạt động ở chế độ Capture thì khi có một “hiện tượng” xảy ra tại pinRC2/CCP1 (hoặc RC1/T1OSI/CCP2), giá trị của thanh ghi TMR1 sẽ được đưavào thanh ghi CCPR1 (CCPR2) Các “hiện tượng” được định nghĩa bởi các bitCCPxM3:CCPxM0 (CCPxCON<3:0>) và có thể là một trong các hiện tượng sau:
♦ Mỗi khi có cạnh xuống tại các pin CCP
Trang 19♦ Sau khi giá trị của thanh ghi TMR1 được đưa vào thanh ghiCCPRx, cờ ngắt CCPIF được set và phải được xóa bằng chương trình Nếu hiệntượng tiếp theo xảy ra mà giá trị trong thanh ghi CCPRx chưa được xử lí, giá trịtiếp theo nhận được sẽ tự động được ghi đè lên giá trị cũ
Một số điểm cần chú ý khi sử dụng CCP như sau:
Các pin dùng cho khối CCP phải được ấn định là input (set các bit tươngứng trong thanh ghi TRISC) Khi ấn định các pin dùng cho khối CCP là output,việc đưa giá trị vào PORTC cũng có thể gây ra các “hiện tượng” tác động lên khốiCCP do trạng thái của pin thay đổi Timer1 phải được hoạt động ở chế độ Timerhoặc chế độ đếm đồng bộ Tránh sử dụng ngắt CCP bằng cách clear bit CCPxIE(thanh ghi PIE1), cờ ngắt CCPIF nên được xóa bằng phần mềm mỗi khi được set
để tiếp tục nhận định được trạng thái hoạt động của CCP
CCP còn được tích hợp bộ chia tần số prescaler được điều khiển bởi các bitCCPxM3:CCPxM0 Việc thay đổi đối tượng tác động của prescaler có thểtạo ra hoạt động ngắt Prescaler được xóa khi CCP không hoạt động hoặc khireset
Xem các thanh ghi
điều khiển khối CCP
với giá trị trong thanh
ghi TMR1 Khi hai
thanh ghi chứa giá trị
bằng nhau, các pin
của CCP được thay
đổi trạng thái (được đưa lên mức cao, đưa xuống mức thấp hoặc giữ nguyên trạngthái), đồng thời cờ ngắt CCPIF cũng sẽ được set Sự thay đổi trạng thái của pin cóthể được điều khiển bởi các bit CCPxM3:CCPxM0 (CCPxCON <3:0>)
Tương tự như ởchế độ Capture, Timer1
năng tạo ra hiện tượng
đặc biệt (Special Event
trigger) làm reset giá
trị thanh ghi TMR1 và
Trang 20khởi động bộ chuyển đổi ADC Điều này cho phép ta điều khiển giá trị thanh ghiTMR1 một cách linh động hơn Khi hoạt động ở chế độ PWM (Pulse WidthModulation _ khối điều chế độ rộng xung), tín hiệu sau khi điều chế sẽ được đưa
ra các pin của khối CCP (cần ấn định các pin này là output) Để sử dụng chứcnăng điều chế này trước tiên ta cần tiến hành các bước cài đặt sau:
1 Thiết lập thời gian của 1 chu kì của xung điều chế cho PWM (period) bằngcách đưa giá trị thích hợp vào thanh ghi PR2
2 Thiết lập độ rộng xung cần điều chế (duty cycle) bằng cách đưa giá trị vàothanh ghi CCPRxL và các bit CCP1CON<5:4>
3 Điều khiển các pin của CCP là output bằng cách clear các bit tương ứng trongthanh ghi TRISC
4 Thiết lập giá trị bộ chia tần số prescaler của Timer2 và cho phép Timer2 hoạtđộng bằng cách đưa giá trị thích hợp vào thanh ghi T2CON
Thanh ghi TMR2 tự động được xóa Pin của khối CCP được set.Giá trị thanh ghi CCPR1L (chứa giá trị ấn định độ rộng xung điều chế duty cycle)được đưa vào thanh ghi CCPRxH Độ rộng của xung điều chế (duty cycle) đượctính theo công thức:
Trang 21chia tần số prescaler, pin của khối CCP lại được đưa về mức thấp, như vậy ta cĩđược hình ảnh của xung điều chế tại ngõ ra của khối PWM như hình 2.14.
Một số điểm cần chú ý khi sử dụng khối PWM:
Timer2 cĩ hai bộ chia tần số prescaler và postscaler Tuy nhiên bộpostscaler khơng được sử dụng trong quá trình điều chế độ rộng xung của khốiPWM
Nếu thời gian duty cycle dài hơn thời gian chu kì xung period thì xung ngõ
ra tiếp tục được giữ ở mức cao sau khi giá trị PR2 bằng với giá trị TMR2
2 NGƠN NGỮ LẬP TRÌNH CCS
_ CCS là trình biên dịch dùng ngôn ngữ C lập trình cho VĐK Đây là ngôn ngữ lập trình đầy sức mạnh , giúp bạn nhanh chóng trong việc viết chương trình hơn so với ngôn ngữ Assembly
_ Mã lệnh được tối ưu khi biên dịch
_ Tuy nhiên C không phải là vạn năng , có thể thực hiện mọi thứ như ý muốn Trong 1 số trường hợp , nó có thể sinh mã chạy sai
_ CCS chứa rất nhiều hàm phục vụ cho mọi mục đích và có rất nhiều cách lập trình mã cho cùng 1 vấn đề dẫn đến khác nhau tốc độ thực thi mã , độ dài chương trình Sự tối ưu là do kỹ năng lập trình C của bạn
_ CCS C có đủ khả năng để bạn không cần phải
chèn thêm bất kỳ dòng lệnh ASSEMBLY nào , và mặc dù vẫn cho phép bạn phối hợp ASSEMBLY cùnh với C , tuynhiên CCS sẽ không bảo đảm chương trình chạy chính xác
- Để viết 1 chương trình C mới : chạy CCS , vào New để tạo 1 file C mới Trên thanh toolbar :
_ Chọn “Microchip 12 bit” để viết chương trình cho PIC 12 bit “Microchip
14 bit” để viết chương trình cho PIC 14 bit “Microchip PIC18” để viết chươngtrình cho PIC18
_ Chọn “Compiler” để biên dịch chương trình bạn đang viết
_ CCS là trình biên dịch dùng ngơn ngữ C lập trình cho VĐK Đây là ngơnngữ lập trình đầy sức mạnh , giúp bạn nhanh chĩng trong việc viết chương trìnhhơn so với ngơn ngữ Assembly
_ Mặt khác , nĩ sinh mã khơng theo ý muốn ( dù khơng sai , ví dụ như sinhnhiều mã lệnh khơng quan trọng khi thực thi hàm ngắt ) làm chậm tốc độ thực
Trang 22thi chương trình nếu bạn đòi hỏi chương trình xử lý với tốc độ cao , ví dụ nhưđiều chế PWM
_ Nhưng CCS C cho phép bạn phối hợp ASSEMBLY cùnh với C , điều nàycho phép chương trình của bạn sẽ trở nên rất uyển chuyển , kết hợp được sứcmạnh của cả 2 ngôn ngữ , dù rằng việc phối hợp sẽ làm cho việc viết chươngtrình trở nên khó khăn hơn
_ CCS cung cấp các công cụ tiện ích giám sát hoạt động chương trình như :C/ASM list : cho phép xem mã ASM của file bạn biên dịch , giúp bạn quản lý
mã và nắm được các thức mã sinh ra và nó chạy như thế nào , là công cụ rấtquan trọng , bạn có thể gỡ rối chương trình và nắm được hoạt động của nó ;SYMBOL hiển thị bộ nhớ cấp phát cho từng biến , giúp quản lý bộ nhớ các biếnchương trình , CallTree hiển thị phân bổ bộ nhớ
Trang 23CHƯƠNG II Ethernet, Truyền thông nối tiếp không đồng bộ và lưu đồ giải thuật
1 Sơ lược lịch sử phát triển Ethernet
Ethernet có một lịch sử phát triển đầy màu sắc Ban đầu nó được tạo ra tại viện nghiên cứu Xerox Palo Alto Research Center (PARC), người phát triển là Bob Metcalfe vào năm 1972 Trong năm 1979, Digital Equipment Corp, Intel và Xerox đã đưa ra chuẩn khung gói tin (frame) DIX V1.0; hai năm sau họ nâng cấp lên phiên bản Version 2.0 Vào năm 1981 tổ chức kỹ sư Insitute of Electrical and Electronic Engineers (IEEE) có một dự án mang tên 802 và quyết định lựa trọn dự
án con là 802.3 đồng nghĩa với Ethernet hiện nay Trong bảng dưới đây tôi sẽ liệt
kê toàn bộ các chuẩn trong Ethernet, từ bảng này các bạn có thể biết được vật liệu truyền dẫn, mô hình kết nối, khoảng cách tối đa và tên gọi của mỗi chuẩn đó Với các nhóm được chia như: Switched, Fast, và Gigabit Ethernet, được đưa ra bởi Robert Breyer và Sean Riley
Breyer và Riley nghiên cứu và đưa ra bước đột phá vô cùng lớn trong Ethernet Với sự phát triển và xây dựng trên nền tảng có sẵn hai người đã cung cấp một chuẩn với tốc độ truyền cao hơn rất nhiều, kết nối đơn giản hơn
Ethernet đã có 28 năm xây dựng phát triển và trong tương lai nó vẫn sẽ liên tục được cải tiến và đưa ra các chuẩn tốc độ cao hơn, và các chuẩn mới dựa trên các nền tảng có sẵn
Tên gọi các chuẩn của IEEE cũng được chuẩn hoá như: 10Base-T, 10 có nghĩa là tốc độ truyền dữ liệu là 10 Mbps, T có nghĩa là sử dụng cáp xoắn (Twisted-pair), trong khi chữ F là chuẩn cho công nghệ truyền sử dụng Cáp Quang (fiber) Các phiên bản trước sử dụng cáp đồng trục như 10Base-5 và 10Base-2 với tên gọi không được chuẩn hoá
2 Truyền thông nối tiếp không đồng bộ.
Thuật ngữ USART trong tiếng anh là viết tắt của cụm từ: UniversalSynchronous & Asynchronous serial Reveiver and Transmitter, nghĩa là bộtruyền nhận nối tiếp đồng bộ và không đồng bộ khái niệm USART (hay UARTchỉ nói đến bộ truyền nhận không đồng bộ) thường để chỉ thiết bị phần cứng(device, hardware), không phải chỉ một chuẩn giao tiếp USART hay UART cầnphải kết hợp với một thiết bị chuyển đổi mức điện áp để tạo ra một chuẩn giaotiếp nào đó Ví dụ, chuẩn RS232 (hay COM) trên các máy tính cá nhân là sự kếthợp của chip UART và chip chuyển đổi mức điện áp Tín hiệu từ chip UARTthường theo mức TTL: mức logic high là 5, mức low là 0V Trong khi đó, tín
Trang 24hiệu theo chuẩn RS232 trên máy tính cá nhân thường là -12V cho mức logichigh và +12 cho mức low (tham khảo hình 1)
Hình 1 Tín hiệu tương đương của UART và RS232
+ Truyền thông nối tiếp: giả sử ta đang xây dựng một ứng dụng phức tạp
cần sử dụng nhiều vi điều khiển (hoặc vi điều khiển và máy tính) kết nối vớinhau Trong quá trình làm việc các vi điều khiển cần trao đổi dữ liệu cho nhau,
ví dụ tình huống Master truyền lệnh cho Slaver hoặc Slaver gởi tín hiệu thu thậpđược về Master xử lí…Giả sử dữ liệu cần trao đổi là các mã có chiều dài 8 bits,bạn có thể sẽ nghĩ đến cách kết nối đơn giản nhất là kết nối 1 PORT (8 bit) củamỗi vi điều khiển với nhau, mỗi line trên PORT sẽ chịu trách nhiệm truyền/nhận
1 bit dữ liệu Đây gọi là cách giao tiếp song song, cách này là cách đơn giản nhất
vì dữ liệu được xuất và nhận trực tiếp không thông qua bất kỳ một giải thuật biếnđổi nào và vì thế tốc độ truyền cũng rất nhanh Tuy nhiên, như bạn thấy, nhượcđiểm của cách truyền này là số đường truyền quá nhiều, bạn hãy tưởng tượngnếu dữ liệu của bạn có giá trị càng lớn thì số đường truyền cũng sẽ nhiều thêm
Hệ thống truyền thông song song thường rất cồng kềnh và vì thế kém hiệu quả.Truyền thông nối tiếp sẽ giải quyết vần đề này, trong tuyền thông nối tiếp dữ liệuđược truyền từng bit trên 1 (hoặc một ít) đường truyền Vì lý do này, cho dù dữliệu của bạn có lớn đến đâu bạn cũng chỉ dùng rất ít đường truyền Hình 2 mô tả
sự so sánh giữa 2 cách truyền song song và nối tiếp trong việc truyền con số 187thập phân (tức 10111011 nhị phân)
Trang 25Hình 2 Truyền 8 bit theo phương pháp song song và nối tiếp.
Một hạn chế rất dễ nhận thấy khi truyền nối tiếp so với song song là tốc độtruyền và độ chính xác của dữ liệu khi truyền và nhận Vì dữ liệu cần được “chianhỏ” thành từng bit khi truyền/nhận, tốc độ truyền sẽ bị giảm Mặt khác, để đảmbảo tính chính xác của dữ liệu, bộ truyền và bộ nhận cần có những “thỏa hiệp”hay những tiêu chuẩn nhất định Phần tiếp theo trong chương này giới thiệu cáctiêu chuẩn trong truyền thông nối tiếp không đồng bộ
Khái niệm “đồng bộ” để chỉ sự “báo trước” trong quá trình truyền Lấy ví dụthiết bị 1 (tb1) kết với với thiết bị 2 (tb2) bởi 2 đường, một đường dữ liệu và 1đường xung nhịp Cứ mỗi lần tb1 muốn send 1 bit dữ liệu, tb1 điều khiển đườngxung nhịp chuyển từ mức thấp lên mức cao báo cho tb2 sẵn sàng nhận một bit.Bằng cách “báo trước” này tất cả các bit dữ liệu có thể truyền/nhận dễ dàng với
ít “rủi ro” trong quá trình truyền Tuy nhiên, cách truyền này đòi hỏi ít nhất 2đường truyền cho 1 quá trình (send or receive) Giao tiếp giữa máy tính và cácbàn phím (trừ bàn phím kết nối theo chuẩn USB) là một ví dụ của cách truyềnthông nối tiếp đồng bộ
Khác với cách truyền đồng bộ, truyền thông “không đồng bộ” chỉ cần mộtđường truyền cho một quá trình “Khung dữ liệu” đã được chuẩn hóa bởi cácthiết bị nên không cần đường xung nhịp báo trước dữ liệu đến Ví dụ 2 thiết bịđang giao tiếp với nhau theo phương pháp này, chúng đã được thỏa thuận vớinhau rằng cứ 1ms thì sẽ có 1 bit dữ liệu truyền đến, như thế thiết bị nhận chỉ cầnkiểm tra và đọc đường truyền mỗi mili-giây để đọc các bit dữ liệu và sau đó kếthợp chúng lại thành dữ liệu có ý nghĩa Truyền thông nối tiếp không đồng bộ vìthế hiệu quả hơn truyền thông đồng bộ (không cần nhiều lines truyền) Tuynhiên, để quá trình truyền thành công thì việc tuân thủ các tiêu chuẩn truyền làhết sức quan trọng Chúng ta sẽ bắt đầu tìm hiểu các khái niệm quan trọng trongphương pháp truyền thông này
Trang 26+ Baud rate (tốc độ Baud): như trong ví dụ trên về việc truyền 1 bit trong
1ms, bạn thấy rằng để việc truyền và nhận không đồng bộ xảy ra thành công thìcác thiết bị tham gia phải “thống nhất” nhau về khoảng thời dành cho 1 bittruyền, hay nói cách khác tốc độ truyền phải được cài đặt như nhau trước, tốc độnày gọi là tốc độ Baud Theo định nghĩa, tốc độ baud là số bit truyền trong 1giây Ví dụ nếu tốc độ baud được đặt là 19200 thì thời gian dành cho 1 bit truyền
là 1/19200 ~ 52.083us
+ Frame (khung truyền): do truyền thông nối tiếp mà nhất là nối tiếp không
đồng bộ rất dễ mất hoặc sai lệch dữ liệu, quá trình truyền thông theo kiểu nàyphải tuân theo một số quy cách nhất định Bên cạnh tốc độ baud, khung truyền làmột yếu tốc quan trọng tạo nên sự thành công khi truyền và nhận Khung truyềnbao gồm các quy định về số bit trong mỗi lần truyền, các bit “báo” như bit Start
và bit Stop, các bit kiểm tra như Parity, ngoài ra số lượng các bit trong một data cũng được quy định bởi khung truyền Hình 1 là một ví dụ của một khung truyềntheo UART, khung truyền này được bắt đầu bằng một start bit, tiếp theo là 8 bitdata, sau đó là 1 bit parity dùng kiểm tra dữ liệu và cuối cùng là 2 bits stop
+ Start bit: start là bit đầu tiên được truyền trong một frame truyền, bit này cóchức năng báo cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền tới
Ở module USART trong AVR, đường truyền luôn ở trạng thái cao khi nghỉ(Idle), nếu một chip AVR muốn thực hiện việc truyền dữ liệu nó sẽ gởi một bitstart bằng cách “kéo” đường truyền xuống mức 0 Như vậy, với AVR bit start làmang giá trị 0 và có giá trị điện áp 0V (với chuẩn RS232 giá trị điện áp của bitstart là ngược lại) start là bit bắt buộc phải có trong khung truyền
Data : data hay dữ liệu cần truyền là thông tin chính mà chúng ta cần gởi vànhận Data không nhất thiết phải là gói 8 bit, với AVR ta có thể quy định sốlượng bit của data là 5, 6, 7, 8 hoặc 9 (tương tự cho hầu hết các thiết bị hỗ trợUART khác) Trong truyền thông nối tiếp UART, bit có ảnh hưởng nhỏ nhất(LSB – Least Significant Bit, bit bên phải) của data sẽ được truyền trước và cuốicùng là bit có ảnh hưởng lớn nhất (MSB – Most Significant Bit, bit bên trái)
Parity bit: parity là bit dùng kiểm tra dữ liệu truyền đúng không (một cáchtương đối) Có 2 loại parity là parity chẵn (even parity) và parity lẻ (odd parity).Parity chẵn nghĩa là số lượng số 1 trong dữ liệu bao gồm bit parity luôn là sốchẵn Ngược lại tổng số lượng các số 1 trong parity lẻ luôn là số lẻ Ví dụ, nếu
dữ liệu của bạn là 10111011 nhị phân, có tất cả 6 số 1 trong dữ liệu này, nếu
Trang 27parity chẵn được dùng, bit parity sẽ mang giá trị 0 để đảm bảo tổng các số 1 là sốchẵn (6 số 1) Nếu parity lẻ được yêu cầu thì giá trị của parity bit là 1 Hình 1 mô
tả ví dụ này với parity chẵn được sử dụng Parity bit không phải là bit bắt buộc
và vì thế chúng ta có thể loại bit này khỏi khung truyền
Stop bits: stop bits là một hoặc các bit báo cho thiết bị nhận rằng một gói dữ
liệu đã được gởi xong Sau khi nhận được stop bits, thiết bị nhận sẽ tiến hànhkiểm tra khung truyền để đảm bảo tính chính xác của dữ liệu Stop bits là cácbits bắt buộc xuất hiện trong khung truyền, trong AVR USART có thể là 1 hoặc 2bits (Trong các thiết bị khác Stop bits có thể là 2.5 bits) Trong ví dụ ở hình 1,
có 2 stop bits được dùng cho khung truyền.Giá trị của stop bit luôn là giá trị nghỉ(Idle) và là ngược với giá trị của start bit, giá trị stop bit trong AVR luôn là mức
(Chú ý : khung truyền phổ biến nhất là : start bit+ 8 bit data+1 stop bit)
Tóm lại, để truyền dữ liệu theo giao diện USART bất đồng bộ, ta cần thực hiện tuần tự các bước sau:
1 Tạo xung truyền baud bằng cách đưa các giá trị cần thiết vào thanh ghi RSBRG
và bit điều khiển mức tốc độ baud BRGH
2 Cho phép cổng giao diện nối tiếp nối tiếp bất đồng bộ bằng cách clear bitSYNC và set bit PSEN
3 Set bit TXIE nếu cần sử dụng ngắt truyền
4 Set bit TX9 nếu định dạng dữ liệu cần truyền là 9 bit
5 Set bit TXEN để cho phép truyền dữ liệu (lúc này bit TXIF cũng sẽ được set)
6 Nếu định dạng dữ liệu là 9 bit, đưa bit dữ liệu thứ 9 vào bit TX9D
7 Đưa 8 bit dữ liệu cần truyền vảo thanh ghi TXREG
8 Nếu sử dụng ngắt truyền, cần kiểm tra lại các bit GIE và PEIE (thanh ghiINTCON)
Trang 28Các thanh ghi liên quan đến quá trình truyền dữ liệu bằng giao diệnUSART bất đồng bộ:
Thanh ghi INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép tất cả các ngắt
Thanh ghi PIR1 (địa chỉ 0Ch): chứa cờ hiệu TXIF Thanh ghi PIE1 (địa chỉ8Ch): chứa bit cho phép ngắt truyền TXIE
Thanh ghi RCSTA (địa chỉ 18h): chứa bit cho phép cổng truyền dữ liệu (hai pinRC6/TX/CK và RC7/RX/DT)
Thanh ghi TXREG (địa chỉ 19h): thanh ghi chứa dữ liệu cần truyền
Thanh ghi TXSTA (địa chỉ 98h): xác lập các thông số cho giao diện
Thanh ghi SPBRG (địa chỉ 99h): quyết định tốc độ baud
khi sử dụng giao diện nhận dữ liệu USART bất đồng bộ cần tiến hành tuần tự các bước sau:
1 Thiết lập tốc độ baud (đưa giá trị thích hợp vào thanh ghi SPBRG và bitBRGH
2 Cho phép cổng giao tiếp USART bất đồng bộ (clear bit SYNC và set bitSPEN)
3 Nếu cần sử dụng ngắt nhận dữ liệu, set bit RCIE
4 Nếu dữ liệu truyền nhận có định dạng là 9 bit, set bit RX9
5 Cho phép nhận dữ liệu bằng cách set bit CREN
6 Sau khi dữ liệu được nhận, bit RCIF sẽ được set và ngắt được kích hoạt (nếubit RCIE được set)
7 Đọc giá trị thanh ghi RCSTA để đọc bit dữ liệu thứ 9 và kiểm tra xem quá trìnhnhận dữ liệu có bị lỗi không
8 Đọc 8 bit dữ liệu từ thanh ghi RCREG
9 Nếu quá trình truyền nhận có lỗi xảy ra, xóa lỗi bằng cách xóa bit CREN
Trang 2910 Nếu sử dụng ngắt nhận cần set bit GIE và PEIE (thanh ghi INTCON).
Các thanh ghi liên quan đến quá trình nhận dữ liệu bằng giao diện USARTbất đồng bộ:
Thanh ghi INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): chứa các bit cho phéptoàn bộ các ngắt (bit GIER và PEIE)
Thanh ghi PIR1 (địa chỉ 0Ch): chứa cờ hiệu RCIE
Thanh ghi PIE1 (địa chỉ 8Ch): chứa bit cho phép ngắt RCIE
Thanh ghi RCSTA (địa chỉ 18h): xác định các trang thái trong quá trình nhận
dữ liệu
Thanh ghi RCREG (địa chỉ 1Ah): chứa dữ liệu nhận được
3 Truyền thông nối tiếp không đồng bộ với UART
Vi điều khiển Atmega32 có 1 module truyền thông nối tiếp USART Có 3chân chính liên quan đến module này đó là chân xung nhịp - XCK (chân số 1),chân truyền dữ liệu – TxD (Transmitted Data) và chân nhận dữ liệu – RxD(Reveived Data) Trong đó chân XCK chỉ được sử dụng như là chân phát hoặcnhận xung giữ nhịp trong chế độ truyền động bộ Tuy nhiên chúng ta chỉ cầnquan tâm đến 2 chân TxD và RxD Vì các chân truyền/nhận dữ liệu chỉ đảmnhiệm 1 chức năng độc lập (hoặc là truyền, hoặc là nhận), để kết nối các chipAVR với nhau (hoặc kết nối AVR với thiết bị hỗ trợ UART khác) cần phải đấu
“chéo” 2 chân này TxD của thiết bị thứ nhất kết nối với RxD của thiết bị 2 vàngược lại Module USART trên chip Atmega32 hoạt động “song công” (FullDuplex Operation), nghĩa là quá trình truyền và nhận dữ liệu có thể xảy ra đồngthời
3.1 Thanh ghi:
Cũng như các thiết bị khác trên AVR, tất cả hoạt động và tráng thái củamodule USART được điều khiển và quan sát thông qua các thanh ghi trong vùngnhớ I/O Có 5 thanh ghi được thiết kế riêng cho hoạt động và điều khiển củaUSART, đó là:
UDR: hay thanh ghi dữ liệu, là 1 thanh ghi 8 bit chứa giá trị nhận được và phát
đi của USART Thực chất thanh ghi này có thể coi như 2 thanh ghi TXB(Transmit data Buffer) và RXB (Reveive data Buffer) có chung địa chỉ ĐọcUDR thu được giá trị thanh ghi đệm dữ liệu nhận, viết giá trị vào UDR tươngđương đặt giá trị vào thanh ghi đệm phát, chuẩn bị để gởi đi Chú ý trong cáckhung truyền sử dụng 5, 6 hoặc 7 bit dữ liệu, các bit cao của thanh ghi UDR sẽkhông được sử dụng
Trang 30UCSRA (USART Control and Status Register A): là 1 trong 3 thanh ghi điều
khiển hoạt động của module USART
Thanh ghi UCSRA chủ yếu chứa các bit trạng thái như bit báo quá trìnhnhận kết thúc (RXC), truyền kết thúc (TXC), báo thanh ghi dữ liệu trống(UDRE), khung truyền có lỗi (FE), dữ liệu tràn (DOR), kiểm tra parity có lỗi(PE)…Bạn chú ý một số bit quan trọng của thanh ghi này:
* UDRE (USART Data Register Empty) khi bit bày bằng 1 nghĩa là thanh ghi
dữ liệu UDR đang trống và sẵn sàng cho một nhiệm vụ truyền hay nhận tiếptheo Vì thế nếu bạn muốn truyền dữ liệu đầu tiên bạn phải kiểm tra xem bitUDRE có bằng 1 hay không, sau khi chắc chắn rằng UDRE=1 hãy viết dữ liệuvào thanh ghi UDR để truyền đi
* U2X là bit chỉ định gấp đôi tốc độ truyền, khi bit này được set lên 1, tốc độ
truyền so cao gấp 2 lần so với khi bit này mang giá trị 0
* MPCM là bit chọn chế độ hoạt động đa xử lí (multi-processor).
UCSRB (USART Control and Status Register B): đây là thanh ghi quan trọng
điều khiển USART Vì thế chúng ta sẽ khảo sát chi tiết từng bit của thanh ghinày
RXCIE (Receive Complete Interrupt Enable) là bit cho phép ngắt khi quá trình
nhận kết thúc Việc nhận dữ liệu truyền bằng phương pháp nối tiếp không đồng
bộ thường được thực hiện thông qua ngắt, vì thế bit này thường được set bằng 1khi USART được dung nhận dữ liệu
* TXCIE (Transmit Complete Interrupt Enable) bit cho phép ngắt khi quá trình
truyền kết thúc
* UDRIE (USART Data Register Empty Interrupt Enable) là bit cho phép ngắt
khi thanh ghi dữ liệu UDR trống
Trang 31* RXEN (Receiver Enable) là một bit quan trọng điều khiển bộ nhận của
USART, đề kích hoạt chức năng nhận dữ liệu bạn phải set bit này lên 1
* TXEN (Transmitter Enable) là bit điều khiển bộ phát Set bit này lên 1 bạn sẽ
khởi động bộ phát của USART
* UCSZ2 (Chracter size) bit này kết hợp với 2 bit khác trong thanh ghi UCSRC
quy định độ dài của dữ liệu truyền/nhận Chúng ta sẽ khảo sát chi tiết khi tìmhiểu thanh ghi UCSRC
* RXB8 (Receive Data Bit 8) gọi là bit dữ liệu 8 Bạn nhớ lại rằng USART trong
AVR có hỗ trợ truyền dữ liệu có độ dài tối đa 9 bit, trong khi thanh ghi dữ liệu làthanh ghi 8 bit Do đó, khi có gói dữ liệu 9 bit được nhận, 8 bit đầu sẽ chứa trongthanh ghi UDR, cần có 1 bit khác đóng vai trò bit thứ chín, RXD8 là bit thứ chínnày Bạn chú ý là các bit được đánh số từ 0, vì thế bit thứ chín sẽ có chỉ số là 8,
vì lẽ đó mà bit này có tên là RXD8 (không phải RXD9)
* TXB8 (Transmit Data Bit 8), tương tự như bit RXD8, bit TXB8 cũng đóng vai
trò bit thứ 9 truyền thông, nhưng bit này được dung trong lúc truyền dữ liệu
*UCSRC (USART Control and Status Register C): thanh ghi này chủ yếu quyđịnh khung truyền và chế độ truyền Tuy nhiên, có một rắc rối nho nhỏ là thanhghi này lại có cùng địa chỉ với thanh ghi UBRRH (thanh ghi chứa byte cao dùng
để xác lập tốc độ baud), nói một cách khác 2 thanh ghi này là 1 Vì thế bit 7trong thanh ghi này, tức bit URSEL là bit chọn thanh ghi Khi URSEL=1, thanhghi này được chip AVR hiểu là thanh ghi điều khiển UCSRC, nhưng nếu bitURSEL=0 thì thanh ghi UBRRH sẽ được sử dụng
Các bit còn lại trong thanh ghi UCSRC được mô tả như sau:
* UMSEL (USART Mode Select) là bit lựa chọn giữa 2 chế độ truyền thông
đồng bộ và không đồng bộ Nếu UMSEL=0, chế độ không đồng bộ được chọn,ngược lại nếu UMSEL=1, chế độ đồng bộ được kích hoạt
* Hai bit UPM1 và UPM0( Parity Mode) được dùng để quy định kiểm tra pariry.Nếu UPM1:0=00, parity không được sử dụng (mode này khá thông dụng),UPM1:0=01 không được sử dụng, UPM1:0=10 thì parity chẵn được dùng,UPM1:0=11 parity lẻ được sử dụng (xem thêm bảng 1)
Bảng 1: chọn kiểm tra parity
Trang 32* USBS (Stop bit Select), bit Stop trong khung truyền bằng AVR USART có thể
là 1 hoặc 2 bit, nếu USBS=0 thì Stop bit chỉ là 1 bit trong khi USBS=1 sẽ có 2Stop bit được dùng
* Hai bit UCSZ1 và UCSZ2 (Character Size) kết hợp với bit UCSZ2 trong thanhghi UCSRB tạo thành 3 bit quy định độ dài dữ liệu truyền Bảng 2 tóm tắt cácgiá trị có thể có của tổ hợp 3 bit này và độ dài dữ liệu truyền tương ứng.Bảng 2: độ dài dữ liệu truyền
* UCPOL (Clock Pority) là bit chỉ cực của xung kích trong chế độ truyền thôngđồng bộ nếu UCPOL=0, dữ liệu sẽ thay đổi thay đổi ở cạnh lên của xung nhịp,nếu UCPOL=1, dữ liệu thay đổi ở cạnh xuống xung nhịp Nếu bạn sử dụng chế
độ truyền thông không đồng bộ, hãy set bit này bằng 0
UBRRL và UBRRH (USART Baud Rate Register): 2 thanh ghi thấp và cao quy định tốc độ baud
Nhắc lại là thanh ghi UBRRH dùng chung địa chỉ thanh ghi UCSRC, bạnphải set bit này bằng 0 nếu muốn sử dụng thanh ghi UBRRH Như bạn quan sáttrong hình trên, chỉ có 4 bit thấp của UBRRH được dùng, 4 bit này kết hợp với 8bit trong thanh ghi UBRRL tạo thành thanh ghi 12 bit quy định tốc độ baud Chú
ý là nếu bạn viết giá trị vào thanh ghi UBRRL, tốc độ baud sẽ tức thì được cậpnhật, vì thế bạn phải viết giá trị vào thanh ghi UBRRH trước khi viết vào thanhghi UBRRL
Trang 33Giá trị gán cho thanh ghi UBRR không phải là tốc độ baud, nó chỉ đượcUSART dùng để tính tốc độ baud Bảng 3 hướng dẫn cách tính tốc độ baud dựavào giá trị của thanh ghi UBRR và ngược lại, cách tính giá trị cần thiết gán chothanh ghi UBRR khi đã biết tốc độ baud.
Trang 344.Lưu đồ giải thuật:
Bắt đầu
Mã kết nối:E
Chờ nhận lệnh kết
nối
Hiển thị trạng thái kết nối
Chờ nhận lệnh tiếp theo
Trang 35CHUONG III.Tổng Quan về module UART2Ethernet
UART2Ethernet là thiết bị cho phép bất kỳ một ứng dụng hay thiết bị nào có cổngSerial(UART) có thể kết nối với mạng Ethernet vàoInternet, truyền hay nhận dữliệu từ Ethernet thông qua Serial Nó là một thiết bị đắc lực khi xây dựng ứngdụng có sử dụng truyền thông qua mạng, bạn có thể kết nối tới ứng dụng của mình
từ bất kỳ nơi nào trên thế giới thông qua Internet hay tạo một kết nối đến Servercủa bạn từ U2E hoặc tạo kết nối giữa 2 thiết bị U2E với nhau qua mạng Ethernethay Internet Thiết bị U2E dễ dàng được cấu hình thông qua trang Web, hay quacổng Serial Bạn có thể sử dụng DHCP(tự
động lấy IP) hay gán IP tĩnh cho U2E
Trang 362 Sơ đồ chân
Figure 1 U2E Pin Configuration
Trang 37PIN 1 CFG: Chân cấu hình, Cạnh xuống vào mode cấu hình, mức 0 duy trì mode cấu hình, mức 1 trở lại mode hoạt động.
PIN 2 MCLR: Giao diện ICSP
PIN 3 RX UART Rx
PIN 4 TX UART Tx
PIN 5 PGD: Giao diện ICSP/Trạng thái kết nối
PIN 6 PGC: Giao diện ICSP/RESET (Nối xuống 0 trong 5s để Reset U2E – Bìnhthường phải được nối lên mức 1)
PIN 7 VCC: Nguồn VCC 3.3V
PIN 8 GND: Nguồn GND
3 Cấu hình thông qua trang Web
Mỗi một thiết bị U2E có một Netbios Name, được in trên nhãn của nó Trang web cấu
hình của U2E được truy xuất bằng chính tên này
Figure 2 Truy xuất Web cấu hình
Mặc định tên đăng nhập và mật khẩu của U2E là admin và admin
Figure 3 Username "admin", Password "admin" để đăng nhập vào Web cấu hình
cho U2E
Trang 38Figure 4 Status, thông tin cấu hình hiện hành của U2E
Figure 5 Network, cấu hình dùng DHCP, IP tĩnh(LAN)…
Trang 39Figure 6 UART, Chọn UART Baudrate (mặc định 19200, 1 bit stop, không flow
control, không parity, data bit 8)
Figure 7 U2E, cấu hình kiểu kết nối, sử dụng dịch vụ DDNS
Trang 40Figure 8 Passsword, thay đổi password
Figure 9 Reboot, khởi động U2E để tải cấu hình mới
4 Cấu hình qua UART
Gởi từ thiết bị khác đến U2E
- HEADER: Bắt đầu 1 khung dữ liệu, 1 byte, từ thiết bị khác tới U2E, giá trị:
0xBA
- LEN: Chiều dài khung dữ liệu, bao gồm CMD và DATA