MỤC LỤC
&1 – GIỚI THIỆU AVR MCU ATMEL 01
I – Tổng quan về AVR .01
1. Giới thiệu .01
2. Ưu thế của MCU AVR 01
3. Một số dòng AVR .02
II – Một số dòng AVR phổ biến .03
&2 – ATMEGA16 – KIẾN TRÚC TỔNG QUAN .05
I – Ưu điểm 05
II – Kiến trúc .05
1. Sơ đồ chân .05
2. Sơ đồ khối 06
3. Các port xuất nhập .06
4. Các chân khác .07
III – Các khối chính .07
1. CPU .07
2. Con trỏ ngăn xếp SP 09
3. Memory .10
4. Quá trình thực thi lệnh .12
&3 – CÁC MODULE ĐIỀU KHIỂN TRONG ATMEGA16 .13
I – Input & Ouput .13
1. Giới thiệu .13
2. Cấu tạo chân .14
3. Thiết lập truy xuất I/O . .15
II – Timer & Counter 16
1. Giới thiệu .16
2. Cấu trúc bộ định thời 8 bit Timer 0 .16
3. Mô tả chi tiết các thanh ghi của bộ định thời 19
4. Sử dụng timer/counter .21
5. Các chế độ hoạt động của Timer 0 21
6. Các bước sử dụng Timer .24
III – Interrupt .25
1. Giới thiệu .25
2. Ngắt ngoài ATMEGA16 .26
3. Các thanh ghi phục vụ ngắt .27
4. Thiết lập ngắt ngoài .28
IV – ADC 30
1. Giới thiệu .30
2. Cấu trúc .30
3. Các thanh ghi điều khiển ADC .31
4. Quá trình chuyển đổi ADC .37
5. Các bươc lập trình điều khiển ADC .38
V – USART .39
1. Giới thiệu .39
2. Cấu trúc của một USART .40
3. Tạo xung clock cho USART .41
4. Một số khái niệm liên quan đến USART .42
5. Các thanh ghi điều khiển USART .44
6. Sử dụng USART .49
VI – SPI .51
1. Giới thiệu .51
2. Cấu trúc của một SPI 54
3. Các thanh ghi điều khiển SPI 55
4. Sử dụng SPI .59
VII – TWI-I2C .61
1. Giới thiệu .61
2. Cấu trúc của một I2C 64
3. Các thanh ghi điều khiển I2C 65
4. Sử dụng TWI-I2C .68
Kết luận .70
74 trang |
Chia sẻ: netpro | Lượt xem: 4990 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đề tài Tìm hiểu về AVR MCU ATMEL, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
iệu so sánh ngõ ra. Các bit này điều khiển hoạt động của chân OC0. Nếu một hoặc cả hai bit COM01:0 được đặt lên 1, ngõ ra OC0 sẽ hoạt động.
Bit 2:0: CS02:0: Chọn xung đồng hồ
Bảng trạng thái:
Thanh ghi bộ định thời/ đếm TCNT0:
Là 1 thanh ghi 8 bit chứa giá trị vận hành của T/C0. Thanh ghi này cho phép đọc và ghi giá trị một cách trực tiếp.
Thanh ghi ngõ ra so sánh OCR:
Thanh ghi này chứa một giá trị 8 bit và liên tục được so sánh với giá trị của bộ đếm.
Thanh ghi mặt nạ ngắt TIMSK:
Là thanh ghi mặt nạ cho ngắt của tất cả các T/C trong Atmega 16, trong đó chỉ có bit TOIE0 tức bit số 0 (bit đầu tiên) trong thanh ghi này là liên quan đến T/C0, bit này có tên là bit cho phép ngắt khi có tràn ở T/C0. Tràn (Overflow) là hiện tượng xảy ra khi bộ giá trị trong thanh ghi TCNT0 đã đạt đến MAX (255) và lại đếm thêm 1 lần nữa.
Bit 1-OCIE0: Cho phép ngắt báo hiệu so sánh
Bit 0-TOIE0: Cho phép ngắt tràn bộ đếm
Thanh ghi cờ ngắt bộ định thời:
Là thanh ghi cờ nhớ cho tất cả các bộ T/C. Trong thanh ghi này bit số 0, TOV0 là cờ chỉ thị ngắt tràn của T/C0. Khi có ngắt tràn xảy ra, bit này tự động được set lên 1.
Bit 1-OCF0: Cờ so sánh ngõ ra 0
Bit 0-TOV0: Cờ tràn bộ đếm
Sử dụng timer/Counter:Một số giá trị cần lưu ý khi sử dụng Timer/Counter:
BOTTOM: là giá trị thấp nhất mà một T/C có thể đạt được, giá trị này luôn là 0.
MAX: là giá trị lớn nhất mà một T/C có thể đạt được, giá trị này được quy định bởi bởi giá trị lớn nhất mà thanh ghi đếm của T/C có thể chứa được. Ví dụ với một bộ T/C 8 bit thì giá trị MAX luôn là 0xFF (tức 255 trong hệ thập phân), với bộ T/C 16 bit thì MAX bằng 0xFFFF (65535).
TOP: là giá trị mà khi T/C đạt đến nó sẽ thay đổi trạng thái, giá trị này không nhất thiết là số lơn nhất 8 bit hay 16 bit như MAX, giá trị của TOP có thể thanh đổi bằng cách điều khiển các bit điều khiển tương ứng hoặc có thể nhập trừ tiếp thông qua một số thanh ghi.
Các chế độ hoạt động của Timer 0:
Normal Mode:
Đây là chế độ hoạt động đơn giản nhất của Timer. Bộ đếm sẽ liên tục đếm tăng lên cho đến khi vượt quá giá trị lớn nhất TOP và sau đó sẽ được khởi động lại tại giá trị Bottom.Trong các hoạt động thông thường thì cờ tràn sẽ được thiết lập khi giá trị trong Timer đạt giá trị không và không bị xoá đi.Tuy nhiên nếu mà ngắt tràn được chấp nhận thì cờ ngắt sẽ tự động bị xoá khi ngắt được thực hiện.Giá trị trong Timer có thể được viết vào bất cứ lúc nào.
Chế Độ So Sánh (CTC):
Đây là chế độ mà giá trị trong Timer luôn được so sánh với giá trị trong thanh ghi ORC .Khi giá trị trong Timer bằng giá trị trong thanh ghi ORC thì giá trị trong Timer sẽ bị xoá đi. Giá trị trong ORC đóng vai trò là giá trị TOP cho bộ đếm. Chế độ này cũng cho phép tạo ra tần số so sánh ở đầu ra.Tuy nhiên trong chế độ này nếu giá trị mới ghi vào thanh ghi ORC mà nhỏ hơn giá trị tức thời của bộ đếm thì thì 1 so sánh sẽ bị lỡ, khi đó bộ đếm sẽ đếm đến giá trị lớn nhất sau đó rơi xuống giá trị 0 trước khi so sánh tiếp theo xuất hiện.
Chế Độ Fast PWM:
Cho phép tạo ra sóng với tần số cao.Sự khác biệt cơ bản giữa Fast PWM với các loại PWM khác là nó chỉ sử dụng 1 sườn dốc. Bộ đếm sẽ đếm từ Bottom đến Max sau đó khởi động lại từ bottom. Trong chế độ không đảo đầu ra của chân so sánh OCx sẽ bị xoá khi có phép toán so sánh giữa TCNTx và thanh ghi ORC là bằng nhau. Và sẽ được sét lên 1 khi giá trị đạt Bottom. Trong chế độ đảo ,đầu ra đảo sẽ được set lên 1 khi sự so sánh giữa thanh ghi ORC và giá trị trong Timer bằng nhau và sẽ bị xoá khi giá trị đạt Bottom.
Trong cả hai trường hợp này tần số của chế đô Fast PWM đều gấp đôi so với chế độ phase correct PWM sử dụng hai sườn dốc. Với tần số cao này chế độ độ Fast PWM rất tốt cho các ứng dụng như ADC hay chỉnh lưu.Ngoài ra với tần số cao giúp làm giảm kích thước của thiết bị ngoài như cuộn dây tụ từ đó giúp làm giảm toàn bộ chi phí cho hệ thống.
Chế độ Phase correct PWM:
Chế độ này hoạt động dựa trên hai sườn lên xuống.Bộ đếm sẽ đếm liên tục từ giá trị BOTTOM đến giá trị MAX và sau đó từ giá trị MAX đến giá trị BOTTOM. Trong chế độ so sánh không đảo chân so sánh (OCx) sẽ bị xóa khi giá trị TCNTx bằng giá trị OCRx trong quá trình đếm lên và sẽ được set bằng 1 khi giá trị so sánh xuất hiện trong quá trình đếm xuống. Chế độ so sánh đảo thì các giá trị là ngược lại.
Với hoạt động hai sườn xung này thì chế độ này không tạo ra được tần số nhỏ như chế độ một sườn xung. Nhưng do tính cân đối của hai sườn xung thì nó tốt hơn cho điều khiển động cơ. Chế độ phase correct PWM hoạt động cố định là 8 bit. Trong chế độ này bộ đếm sẽ tăng cho đến khi đạt giá trị MAX ,khi đó nó sẽ đổi chiều đếm.
Các bước sử dụng Timer:
Step 1: Set pin Timer là output bằng cách set giá trị trong thanh ghi DDRn.X
Step 2: chọn chế độ Timer bằng cách set thanh ghi TCCRX
Step 3: chọn xung clock bằng cách set thanh ghi TCCRX
Step 4: chọn giá trị của thanh ghi OCRX-TCNTX
Step 5: bắt đầu Timer
Code Example:#include #include #include int main(void){ DDRB=0xFF; //PORTB la output PORT PORTB=0x00; TCCR0=(1<<CS01);// CS02=0, CS01=1, CS00=0: chon Prescaler = 8 TCNT0=131; //gan gia tri khoi tao cho T/C0 TIMSK=(1<<TOIE0);//cho phep ngat khi co tran o T/C0 sei(); //set bit I cho phep ngat toan cuc while (1){ //vòng lặp vô tận //do nothing } return 0;}
Interrupt:
Giới thiệu:
Ngắt là một cơ chế cho phép thiết bị ngoại vi báo cho CPU biết về tình trạng sẵn sàng cho đổi dữ liệu của mình.Ví dụ: Khi bộ truyền nhận UART nhận được một byte nó sẽ báo cho CPU biết thông qua cờ RXC,hoặc khi nó đã truyền được một byte thì cờ TX được thiết lập…
Khi có tín hiệu báo ngắt CPU sẽ tạm dừng công việc đạng thực hiện lại và lưu vị trí đang thực hiên chương trình (con trỏ PC) vào ngăn xếp sau đó trỏ tới vector phuc vụ ngắt và thức hiện chương trình phục vụ ngắt đó chơ tới khi gặp lệnh RETI (return from interrup) thì CPU lại lấy PC từ ngăn xếp ra và tiếp tục thực hiện chương trình mà trước khi có ngăt nó đang thực hiện. Trong trường hợp mà có nhiều ngắt yêu cầu cùng một lúc thì CPU sẽ lưu các cờ báo ngắt đó lại và thực hiện lần lượt các ngắt theo mức ưu tiên.
Atmega 16 có các ngắt sau:
Ngắt ngoài Atmega 16:
Quá trình ngắt:
Atmega16 có 3 ngắt ngoài INT0(PORTD.2) INT1(PORTD.3) và INT2(PORTB.2). Khi xảy ra một trong các sự kiện đối với các chân này :
Low level - Điện áp ở chân ngắt xuống mức logic 0 V
Any change - Bất kì sự thay đổi điện áp từ chân ngắt
Falling Edge - Khi có 1 sườn điện áp xuống (5V->0V)
Rising Edge -Khi có 1 sườn điện áp lên (0V->5V)Sau đó 1 cờ ngắt sẽ dựng lên 1 và báo cho biết có ngắt , nhảy đến chương trình con thực hiện ngắt .
Các thanh ghi phục vụ ngắt:
MCUCR – MCU Control Register:
Thanh ghi MCUCR chứa các bits cho phép chúng ta chọn 1 trong 4 MODE trên cho các ngắt ngoài. MCUCR là một thanh ghi 8 bit nhưng đối với hoạt động ngắt ngoài, chúng ta chỉ quan tâm đến 4 bit thấp của nó (4 bit cao dùng cho Power manager và Sleep Mode). Bốn bit thấp là các bit Interrupt Sense Control (ISC) trong đó 2 bit ISC11:ISC10 dùng cho INT1 và 2 bit ISC01:ISC00 dùng cho INT0. Bảng chân trị cho các bit ISC01, ISC00 hoàn toàn tương tự.
MCUCSR – MCU Control and Status Register:
Bit 6 – ISC2: Interrupt Sense Control 2: là bit quan trọng nhất trong thanh ghi này dùng ghi và xóa cờ ngắt INT2.
GICR – General Interrup Control Register:
GICR cũng là 1 thanh ghi 8 bit nhưng chỉ có 2 bit cao (bit 6 và bit 7) là được sử dụng cho điều khiển ngắt. Bit 7 – INT1 gọi là bit cho phép ngắt 1(Interrupt Enable), set bit này bằng 1 nghĩa bạn cho phép ngắt INT1 hoạt động, tương tự, bit INT0 điều khiển ngắt INT0.
Thanh ghi cờ ngắt chung – GIFR (General Interrupt Flag Register) có 2 bit INTF1 và INTF0 là các bit trạng thái (hay bit cờ - Flag) của 2 ngắt INT1 và INT0. Nếu có 1 sự kiện ngắt phù hợp xảy ra trên chân INT1, bit INTF1 được tự động set bằng 1 (tương tự cho trường hợp của INTF0), chúng ta có thể sử dụng các bit này để nhận ra các ngắt, tuy nhiên điều này là không cần thiết nếu chúng ta cho phép ngắt tự động, vì vậy thanh ghi này thường không được quan tâm khi lập trình ngắt ngoài.
Thiết lập ngắt ngoài:
Step 1: chọn chế độ ngắt trong than ghi MCUCR
Step 2: cho phép ngắt toàn cục trên thanh ghi GICR
Step 3: cho phép ngắt trong thanh ghi trạng thái SREG
Code Example:#include #include #include volatile int8_t val=0int main(void){ DDRD=0x00; //khai báo PORTD là Input để sử dụng 2 chân ngắt. PORTD=0xFF; //sử dụng điện trở nội kéo lên. MCUCR|=(19) val=0; //giới hạn không vượt quá 9 PORTB=val;}
ADC:
Giới thiệu:
Hầu hết trong tự nhiên các tín hiệu cần xử lý ở dạng tương tự như nhiệt độ, ánh sáng. Các hệ thống số chỉ làm việc ở các mức logic do đó ta cần chuyển đổi từ tín hiệu tương tự sang tín hiệu số. ADC là một bộ chuyển đổi tương tự sang số được sử dụng nhiều trong các hệ thống điều khiển.
Atmega 16 tích hợp sẵn Module ADC được input ở PORTA. Đây là bộ ADC với những đặc điểm sau:
Độ phân giải 10 bit
Sai số tuyến tính: 0.5LSB
Độ chính xác +/-2LSB
Thời gian chuyển đổi:65-260μs
8 Kênh đầu vào có thể được lựa ch
Có hai chế độ chuyển đổi free run
Có nguồn báo ngắt khi hoàn thành
Loại bỏ nhiễu trong chế độ ngủ
Cấu trúc:
Sơ đồ khối:
Các thanh ghi điều khiển ADC:Có 4 thanh trong bộ ADC trên AVR trong đó có 2 thanh ghi data chứa dữ liệu sau khi chuyển đổi, 2 thanh ghi điều khiển và chứa trạng thái của ADC.
ADMUX (ADC Multiplexer Selection Register):
Là 1 thanh ghi 8 bit điều khiển việc chọn điện áp tham chiếu, kênh và chế độ hoạt động của ADC.
Bit 7:6- REFS1:0 (Reference Selection Bits): là các bit chọn điện áp tham chiếu cho ADC, 1 trong 3 nguồn điện áp tham chiếu có thể được chọn là: điện áp ngoài từ chân VREF, điện áp tham chiếu nội 2.56V hoặc điện áp AVCC. Bảng 2 tóm tắt giá trị các bit và điện áp tham chiếu tương ứng.
Bit 5-ADLAR (ADC Left Adjust Result): là bit cho phép hiệu chỉnh trái kết quả chuyển đổi. Sở dĩ có bit này là vì ADC trên AVR có độ phân giải 10 bit, nghĩa là kết quả thu được sau chuyển đổi là 1 số có độ dài 10 bit (tối đa 1023), AVR bố trí 2 thanh ghi data 8 bit để chứa giá trị sau chuyển đổi. Như thế giá trị chuyển đổi sẽ không lắp đầy 2 thanh ghi data, trong một số trường hợp người dùng muốn 10 bit kết quả nằm lệch về phía trái trong khi cũng có trường hợp người dùng muốn kết quả nằm về phía phải. Bit ADLAR sẽ quyết định vị trí của 10 bit kết quả trong 16 bit của 2 thanh ghi data. Nếu ADLAR=0 kết quả sẽ được hiệu chỉnh về phía phải (thanh ghi ADCL chứa trọn 8 bit thấp và thanh ghi ADCH chứa 2 bit cao trong 10 bit kết quả), và nếu ADLAR=1 thì kết quả được hiệu chỉnh trái (thanh ghi ADCH chứa trọn 8 bit cao nhất, các bit từ 9 đến 2, và thanh ADCL chứa 2 bit thấp nhất trong 10 bit kết quả (bạn xem hình cách bố trí 2 thanh ghi ADCL và ADCH bên dưới để hiểu rõ hơn).
Bits 4:0-MUX4:0 (Analog Channel and Gain Selection Bits): là 5 bit cho phép chọn kênh, chế độ và cả hệ số khuyếch đại cho ADC. Do bộ ADC trên AVR có nhiều kênh và cho phép thực hiện chuyển đổi ADC kiểu so sánh (so sánh điện áp giữa 2 chân analog) nên trước khi thực hiện chuyển đổi, chúng ta cần set các bit MUX để chọn kênh và chế độ cần sử dụng. Bảng 3 tóm tắt các chế độ hoạt động của ADC thông qua các giá trị của các bit MUX. Trong bảng này, ứng với các giá trị từ 00000 đến 00111 (nhị phân), các kênh ADC được chọn ở chế độ đơn kênh (tín hiệu input lấy trực tiếp từ các chân analog và so sánh với 0V), giá trị từ 01000 đến 11101 tương ứng với chế độ chuyển đổi so sánh.
ADCSRA (ADC Control and Status RegisterA):
Là thanh ghi chính điều khiển hoạt động và chứa trạng thái của module ADC.
Bit 7 - ADEN(ADC Enable): viết giá trị 1 vào bit này tức bạn đã cho phép module ADC được sử dụng. Tuy nhiên khi ADEN=1 không có nghĩa là ADC đã hoạt động ngay, bạn cần set một bit khác lên 1 để bắt đầu quá trình chuyển đổi, đó là bit ADSC.
Bit 6 - ADSC(ADC Start Conversion): set bit này lên 1 là bắt đầu khởi động quá trình chuyển đổi. Trong suốt quá trình chuyển đổi, bit ADSC sẽ được giữ nguyên giá trị 1, khi quá trình chuyển đổi kết thúc (tự động), bit này sẽ được trả về 0. Vì vậy bạn không cần và cũng không nên viết giá trị 0 vào bit này ở bất kỳ tình huống nào. Để thực hiện một chuyển đổi, thông thường chúng ta sẽ set bit ADEN=1 trước và sau đó set ADSC=1.
Bit 4 – ADIF(ADC Interrupt Flag): cờ báo ngắt. Khi một chuyển đổi kết thúc, bit này tự động được set lên 1, vì thế người dùng cần kiểm tra giá trị bit này trước khi thực hiện đọc giá trị chuyển đổi để đảm bảo quá trình chuyển đổi đã thực sự hoàn tất.
Bit 3 – ADIE(ADC Interrupt Enable): bit cho phép ngắt, nếu bit này được set bằng 1 và bit cho phép ngắt toàn cục (bit I trong thanh ghi trạng thái của chip) được set, một ngắt sẽ xảy ra khi một quá trình chuyển đổi ADC kết thúc và các giá trị chuyển đổi đã được cập nhật (các giá trị chuyển đổi chứa trong 2 thanh ghi ADCL và ADCH).
Bit 2:0 – ADPS2:0(ADC Prescaler Select Bits): các bit chọn hệ số chia xung nhịp cho ADC. ADC, cũng như tất cả các module khác trên AVR, cần được giữ nhịp bằng một nguồn xung clock. Xung nhịp này được lấy từ nguồn xung chính của chip thông qua một hệ số chia. Các bit ADPS cho phép người dùng chọn hệ số chia từ nguồn clock chính đến ADC. Tham khảo bảng 4 để biết cách chọn hệ số chia.
ADCL và ADCH (ADC Data Register):
Là 2 thanh ghi chứa giá trị của quá trình chuyển đổi. Do module ADC trên AVR có độ phân giải tối đa 10 bits nên cần 2 thanh ghi để chứa giá trị chuyển đổi. Tuy nhiên tổng số bít của 2 thanh ghi 8 bit là 16, con số này nhiều hơn 10 bit của kết quả chuyển đổi, vì thế chúng ta được phép chọn cách ghi 10 bit kết quả vào 2 thanh ghi này. Bit ADLAR trong thanh ghi ADMUX quy định cách mà kết quả được ghi vào.
SFIOR(Special FunctionIO Register C):
Là thanh ghi chức năng đặc biệt, 3 bit cao trong thanh ghi này quy định nguồn kích ADC nếu chế độ Auto Trigger được sử dụng. Đó là các bit ADTS2:0 (Auto Trigger Source 2:0).
Quá trình chuyển đổi ADC:
ADC có nhiệm vụ chuyển đổi tín hiệu điện áp tương tự thành tín hiệu số có độ phân giải 10 bit.Với giá trị nhỏ nhất của điện áp đặt ở chân AGND và giá trị cực đại của điện áp tương tự được mắc vào chân AREF. Tám kênh tương tự đầu vào được chọn lựa thông qua ADMUX và ADMUX này được điều khiển bởi thanh ghi ADMUX.
ADC này có thể hoạt động được ở hai chế độ. Đó là chuyển đổi đơn: chỉ chuyển đổi một lần khi có lệnh chuyển đổi và chế độ tự chuyển đổi (Free running mode) đây là chế độ mà ADC tự động chuyển đổi khi được hoạt động và công việc chuyển đổi có tính tuần hoàn (chỉ cần khởi động một lần).
ADC được phép hoạt động nhờ thiết lập bit ADEN. Quá trình chuyển đổi được bắt đầu bằng việc ghi vào bit ADSC mức logic 1 và trong suốt quá trình chuyển đổi bit này luôn được giữ ở mức cao. Khi quá trình chuyển đổi hoàn thành thì bit này được xóa bằng phần cứng và cờ AIDF được bật lên.
Dữ liệu sau khi chuyển đổi được đưa ra thanh ghi dữ liệu ADCL và ADCH, nhưng chú ý khi đọc dữ liệu từ hai thanh ghi này thì đọc ADCL trước rồi mới đọc ADCH. Nếu đọc ADCH trước thì dữ liệu cập nhật có thể ghi đè lên ADCL (Vi điều khiển nghĩ rằng đã đọc xong dữ liệu).
Các bước lập trình điều khiển ADC:
Step 1: Định nghĩa các cổng vào cho tín hiệu tương tự. Xóa bit tương ứng với chân đó trong thanh ghi DDRA. Sau đó loại bỏ điện trở treo bằng cách xóa bit tương ứng ở thanh ghi PORTA.
Step 2: Chọn kênh tương tự vào (chọn chân vào cho ADC) thông qua thanh ghi ADMUX (có thể thay đổi trong quá trình hoạt động).
Step 3: hiết lập các thông số cho ADC. Tốc độ chuyển đổi thông qua xung nhip chuyển đổi. Chế độ chuyển đổi : đơn hoặc tự động. Sử dụng ngắt hoặc không.
Step 4: Bắt đầu chuyển đổi và đọc dữ liệu.
Code Example:#include
#include
int main(void){
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS0); //enable ADC, khong dung interrupt
ADMUX=ADC_VREF_TYPE; //chon kieu dien ap tham chieu
while (1){ //vòng lặp vô tận //do nothing } return 0;
USART:
Giới thiệu:
Thuật ngữ USART trong tiếng anh là viết tắt của cụm từ: Universal Synchronous & Asynchronous serial Reveiver and Transmitter, nghĩa là bộ truyền nhận nối tiếp đồng bộ và không đồng bộ. Cần chú ý rằng khái niệm USART (hay UART nếu chỉ 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ần phả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 giao tiếp nào đó. Ví dụ, chuẩn RS232 (hay COM) trên các máy tính cá nhân là sự kết hợp của chip UART và chip chuyển đổi mức điện áp. Tín hiệu từ chip UART thường theo mức TTL: mức logic high là 5, mức low là 0V. Trong khi đó, tín hiệu theo chuẩn RS232 trên máy tính cá nhân thường là -12V cho mức logic high và +12 cho mức low.
Atmega 16 sử dụng hai pin sau cho USART đó là:
Bộ truyền nhận nối tiếp đồng bộ và bất đồng bộ là một thiết truyền thông nối tiếp có các chức năng chính như sau:
Hoạt động song công (các thanh ghi truyền và nhận nối tiếp độc lập với nhau).
Hoạt động đồng bộ hoặc bất đồng bộ.
Bộ tạo tốc độ baud có độ chính xác cao
Hỗ trợ khung truyền nối tiếp với 5, 6, 7, 8, hoặc 9 bit dữ liệu và 1 hoặc 2 bit
Kiểm tra chẵn lẻ
Phát hiện tràn dữ liệu
Phát hiện lỗi khung
Lọc nhiễu, bao gồm phát hiện bit start lỗi và bộ lọc thông thấp số
Ngắt khi kết thúc truyền, thanh ghi truyền hết dữ liệu và kết thúc nhận
Chế độ truyền thông đa vi xử lý
Chế độ truyền đồng bộ tốc độ cao
Cấu trúc của một USART:
Sơ đồ khối:USART bao gồm 3 phần chính: bộ tạo xung clock, bộ truyền và bộ nhận. Các thanh ghi điều khiển được sử dụng chung giữa các phần này.
Tạo xung clock cho USART:
Bộ tạo xung clock tạo ra xung đồng hồ căn bản cho bộ truyền và bộ nhận. USART hỗ trợ 4 chế độ hoạt động xung clock: bất đồng bộ, bất đồng bộ tốc độ cao, truyền đồng bộ master và truyền đồng bộ slave. Sơ đồ khối của bộ tạo xung clock như sau:
txclk: xung đồng hộ bộ truyền
rxclk: xung đồng hồ bộ nhận
xcki: tín hiệu vào từ chân XCK, sử dụng cho hoạt động truyền đồng bộ master
xcko: tín hiệu xung clock ngõ ra tới chân XCK, sử dụng cho hoạt động truyền đồng
bộ slave
fosc: tần số từ chân XTAL
Một số khái niệm liên quan đến USART:
Baud rate (tốc độ Baud): là số bit truyền trong 1 giâ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ày phả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ền bao 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. Mô hình khung truyền như sau:
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 bit start 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 bit start 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 bạn 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ối cù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ách tươ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 parity 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. 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ành kiểm tra khung truyền để đảm bảo tính chính xác của dữ liệu. Stop bits là các bits bắt buộc xuất hiện trong khung truyền, trong AVR USART có thể là 1 hoặc 2 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 cao (5V).
Các thanh ghi điều khiển USART:
UDR – Usart I/O Data Register:
Là 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ỉ. Đọc UDR 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. Trong các khung 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.
UCSRA - USART Control and Status Register A:
Thanh ghi UCSRA chủ yếu chứa các bit trạng thái như bit báo quá trình nhậ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), cần lưu ý một số bit sau:
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ếp theo.
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. Các bit được mô tả như sau:
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 1 khi USART được dùng 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.
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ìm hiểu thanh ghi UCSRC.
RXB8 (Receive Data Bit 8) gọi là bit dữ liệu 8. 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 trong thanh ghi UDR, cần có 1 bit khác đóng vai trò bit thứ chín, RXD8 là bit thứ chín này.
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 dùng 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. Thanh ghi này lại có địa chỉ với thanh ghi UBRRH (thanh ghi chứa byte cao dùng để xác lập tốc độ baud). Vì thế bit 7 trong thanh ghi này, tức bit URSEL là bit chọn thanh ghi. Khi URSEL=1, thanh ghi này được chip AVR hiểu là thanh ghi điều khiển UCSRC, nhưng nếu bit URSEL=0 thì thanh ghi UBRRH sẽ được sử dụng. Các bit trong thanh ghi này đượ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.
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ó 2 Stop bit được dùng.
Hai bit UCSZ1 và UCSZ2 (Character Size) kết hợp với bit UCSZ2 trong thanh ghi UCSRB tạo thành 3 bit quy đ
Các file đính kèm theo tài liệu này:
- Báo cáo đề tài vi điều khiển avr.docx