I. Atmega8
7. Bộ định thời/đếm timer/counter1 16-bit
11.4 Khởi tạo USART
Quá trình khởi tạo USART bao gồm việc thiết lập tốc độ baud, thiết lập định dạng khung và kích hoạt bộ truyền và bộ nhận.
Ví dụ dưới đây thiết lập hoạt động truyền bất động bộ sử dụng polling (không dùng ngắt) và định dạng khung truyền là cố định. Tốc độ baud là một tham số của hàm.
void USART_Init( unsigned int baud ) {
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8); UBRRL = (unsigned char)baud; /* Enable receiver and transmitter */ UCSRB = (1<<RXEN)|(1<<TXEN); /* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); }
Bộ truyền USART được kích hoạt bằng cách thiết lập bit TXEN trong thanh ghi UCSRB. Khi bộ truyền được kích hoạt, chân TxD hoạt động như ngõ ra của bộ truyền nối tiếp. Tốc độ baud, chế độ hoạt động và định dạng khung truyền phải được thiết lập trước khi thực hiện truyền dữ liệu.
Truyền khung 5 đến 8 bit dữ liệu
Việc truyền dữ liệu được thiết lập bằng cách nạp dữ liệu truyền vào bộ đệm truyền. Dữ liệu trong bộ đệm sẽ được đưa vào thanh ghi dịch khi thanh ghi dịch đã sẵn sàng gửi một khung mới.
Truyền khung 9 bit dữ liệu
Nếu sử dụng 9 bit dữ liệu, bit thứ 9 phải được ghi vào bit TXB8 trong thanh ghi UCSRB trước khi byte còn lại được ghi vào UDR.
Nhận dữ liệu-bộ nhận USART
Bộ nhận USART được kích hoạt bằng cách đặt bit RXEN trong thanh ghi UCRSB lên 1. Khi bộ nhận được kích hoạt, chân RxD hoạt động như ngõ vào của bộ nhận nối tiếp. Tốc độ baud, chế độ hoạt động và định dạng khung truyền phải được thiết lập trước khi thực hiện truyền dữ liệu.
Nhận khung với 5 đến 8 bit dữ liệu
Bộ nhận bắt đầu nhận dữ liệu khi nó phát hiện một bit start hợp lệ. Mỗi bit theo sau bit start sẽ được lấy mẫu tại tốc độ baud hoặc tốc độ đồng hồ XCK, và được dịch vào trong thanh ghi dịch của bộ nhận cho đến khi phát hiện một bit stop đầu tiên. Nội dung của thanh ghi dịch sau đó được đưa vào bộ đệm. Bộ đệm của bộ nhận có thể được đọc bằng cách đọc UDR.
Nhận khung với 9 bit dữ liệu
Nếu nhận dữ liệu 9 bit, bit thứ 9 phải được đọc từ bit RXB8 trong thanh ghi UCSRB trước khi đọc các bit thấp trong UDR.
12.HỆ THỐNG XUNG CLOCK
Để cấu hình cho chip hoạt động theo chế độ xung clock nào, người ta dùng các bit cầu chì ( fuse bit ) CKSEL 3, CKSEL2, CKSEL 1. Ngoài ra khi vi điều khiển được đánh thức từ các chế độ nghỉ sang chế độ hoạt động bình thường, bộ tạo dao động cần có một khoảng thời gian để ổn định, khoảng thời gian này gọi là thời gian khởi động ( start-up time ). CPU chỉ thực hiện lệnh khi hết khoảng thời gian khởi động này. Khi ta reset CPU cũng cần một khoảng thời gian trì hoãn (delay time ) để nguồn nuôi đạt mức ổn định trước khi thực bắt đầu thực thi lệnh. Người ta dùng các bit cầu chì CKSEL 0, SUT1, SUT0 để thiết lập thời gian khởi động và thời gian trì hoãn. Khoảng thời gian khởi động và thời gian trì hoãn được đo được đo bằng một đồng hồ riêng, đó là bộ dao động Watchdog. Tần số của bộ dao động
Watchdog phụ thuộc vào điện thế nguồn nuôi và nhiệt độ môi trường. Ở Vcc = 5V và nhiệt độ 25oC thì tần số của bộ dao động Watchdog là 1 MHz. Liên quan đến việc thiết lập của hệ thống xung clock người ta còn dùng tới bit cầu chì CKOPT mà vai trò của nó khá linh hoạt tùy theo việc thiết lập xung clock cho hệ thống như thế nào. Hình 18 cho thấy ATmega128 có tới 7 bộ tạo xung clock có thể được lựa chọn. Dưới đây là mô tả cụ thể cho từng trường hợp cấu hình xung clock của hệ thống.
12.1BỘ DAO ĐỘNG THẠCH ANH
Bộ dao động thạch anh được mắc theo hình 19. Trong đó chân XTAL1 và XTAL2 ( tương ứng chân số 24 , 23 của vi điều khiển ) lần lượt là ngõ vào và ngõ ra của bộ
khuếch đại đảo được tích hợp sẵn trong chip.
Hình 19. Ghép nối bộ dao động thạch anh
Giá trị của tụ C1 và C2 phải bằng nhau và thường có giá trị vào khoảng 12pF – 22pF. Với ATmega8 thì tần số xung clock hệ thống tối đa là 16MHz và để đạt được tần số tối đa này bit cầu chì CKOPT phải được lập trình ( ghi thành 0 ). Nếu bit CKOPT không được lập trình ( ghi giá trị 1 ) thì tần số tối đa chỉ là 8 MHz. Các bit
CKSEL3..1 được dùng để lựa chọn dải tần số tối ưu như trong bảng 8. Các bit CKSEL0 và SUT1..0 được dùng để thiết lập thời gian khởi động ( start-up ) và thời gian trì hoãn ( delay time ) như trong bảng 9. Ta cũng có thể thay thế tinh thể thạch anh ( Quartz crystal ) bằng gốm cộng hưởng ( Ceramic Resonator ).
Tối ưu dải tần số
Lựa chọn (1) chỉ nên dùng cho gốm cộng hưởng, không nên dùng cho thạch anh
Thiết lập thời gian khởi động và trì hoãn
Ví dụ để sử dụng thạch anh 16 MHz làm xung clock hệ thống, thời gian khởi động là 16 K ( 16384 chu kì xung clock của bộ dao động watchdog ) và thời gian trì hoãn là 65 ms thì tacần thiết lập cho các bit cầu chì là :
{ CKOPT, CKSEL3..0, SUT1..0 } = { 0, 1, 0, 1, 1, 1, 1 }
12.2.BỘ DAO ĐỘNG THẠCH ANH CÓ TẦN SỐ THẤP
Thạch anh trong trường hợp này có tần số thấp 32,768 KHz được mắc vào mạch như hình 19. Tần số thấp được sử dụng để giảm công suất tiêu thụ của hệ thống và thích hợp cho các ứng dụng cần đo thời gian thực. Để cấu hình cho hệ thống xung clock theo chế độ này, cần thiết lập các bit cầu chì { CKSEL3..0 } = { 1, 0, 0, 1 }. Các tụ C1, C2 cũng có thể được bỏ đi bằng cách lập trình cho bit CKOPT để cho phép tụ bên trong chip hoạt động. Tụ bên trong chip có giá trị định danh là 36 pF. Thời gian khời động và thời gian trì hoãn được lựa chọn nhờ vào các bit cầu chì SUT1..0 theo như bảng 10.
Bảng 10. Thiết lập thời gian khởi động và trì hoãn
12.3 BỘ DAO ĐỘNG R-C BÊN NGOÀI
Bộ dao động R-C bên ngoài thích hợp cho những ứng dụng không đòi hỏi cao về sự chính xác thời gian . Mạch R-C được mắc như hình 20. Tần số dao động vào khoảng:
f=1/3RC
Trong đó giá trị của C phải tối thiểu là 22 pF. Tuy nhiên ta cũng có thể bỏ đi tụ C bằng cách lập trình cho bit cầu chì CKOPT để cho phép tụ bên trong chip ( mắc giữa
XTAL1 và GND ) hoạt động. Giá trị định danh của tụ bên trong chip là 36 pF. Các bit cầu chì CKSEL3..0 sẽ cấu hình dãi tần số tối ưu như bảng 11 và các bit cầu chì SUT1..0 sẽ thiết
lập thời gian khởi động và thời gian trì hoãn như bảng 12. Mạch dao động R-C
Bảng 12. Thiết lập thời gian khởi động và trì hoãn
12.4 BỘ DAO ĐỘNG NỘI R-C TINH CHỈNH ĐƯỢC
Bộ dao động nội RC cung cấp các tần số xung clock cố định 1 MHz, 2 MHz, 4 MHz, 8 MHz ( ở Vcc = 5V và nhiệt độ 25oC ). Ta có thể dùng xung clock này như là xung clock của hệ thống bằng cách cấu hình cho các bit cầu chì CKSEL 3..0 được chỉ ra ở bảng 13. Khi sử dụng xung clock của bộ dao động nội làm xung clock của hệ thống ta không cần phải dùng bộ dao động bên ngoài. Khi cấu hình xung clock hệ thống theo trường hợp này bit cầu chì CKOPT không được lập trình ( ghi là 1 ). Vì bộ dao động watchdog độc lập với bộ dao động nội RC ( xem hình 18 ) nên khi hệ thống hoạt động theo xung clock của bộ dao động nội RC thì bộ dao động watchdog vẫn được sử dụng cho bộ định thời watchdog. Ngoài ra, người dùng có thể tinh chỉnh tần số của bộ dao động nội bằng cách thay đổi giá trị của thanh ghi OSCCAL. Lí do của việc tinh chỉnh này là bởi vì trong quá trình đếm ( tức phát xung clock ) của bộ dao động nội, sau 1 thời gian thì sẽ có sai số, ví dụ bộ dao động nội có tần số 1 MHz sau 1000000 lần đếm thì khoảng thời gian tương ứng 1s sẽ trôi qua. Nếu thời gian đếm kéo dài sẽ có thể có sai số. Do đó người ta cần tinh chỉnh lại tốc độ của bộ dao động nội bằng cách làm cho nó đếm nhanh hơn hay chậm đi so với giá trị định danh. Để làm được điều này người ta tăng hay giảm giá trị của thanh ghi OSCCAL.
Bảng 13. Lựa chọn tần số dao động nội
Khoảng thời gian khởi động và thời gian trì hoãn được thiết lập bởi các bit cầu chì SUT1..0 theo bảng 14.
Bảng 14. Thiết lập thời gian khởi động và trì hoãn
12.5 BỘ TẠO XUNG CLOCK BÊN NGOÀI
Người dùng cũng có thể sử dụng một máy phát xung clock bên ngoài để làm xung clock cho hệ thống. Sơ đồ ghép nối với máy tạo xung clock bên ngoài được thể hiện ở hình21.
Hình 21. Ghép nối với máy phát xung clock bên ngoài
Bảng 16. Thiết lập thời gian khởi động và trì hoãn
Trong trường hợp này các bit cầu chì CKSEL3..0 phải ghi thành “0000”. Người
dùng cũng có thể cho phép tụ bên trong chip ( giữa XTAL1 và GND ) hoạt động bằng cách lập trình cho bit CKOPT ( ghi CKOPT thành 0 ). Giá trị định danh của tụ bên trong chip là 36 pF. Thời gian khởi động và thời gian trì hoãn được thiết lập bởi các bit SUT1..0 được cho ở bảng 16.
Người dùng cũng có thể mắc trực tiếp bộ dao động thạch anh vào giữa 2 chân TOSC1 và TOSC2 của vi điều khiển ( không cần tụ ) để tạo xung clock cho hệ thống như hình 21b. Bộ dao động được tối ưu cho tần số thạch anh 32,768 KHz.
13.BỘ BIẾN ĐỔI A/D( Analog/Digital)
Vi điều khiểnAtmega8 có một bộ biến đổi ADC tích hợp trong chip với các đặc điểm:
Độ 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
6 Kênh đầu vào có thể được lựa chọn
Có hai chế độ chuyển đổi free running và single conversion
Có nguồn báo ngắt khi hoàn thành chuyển đổi
Sơ đồ bộ biến đổi A/D
Tám đầu vào của ADC là tám chân của PORTA và chúng được chọn thông qua một MUX. Để điều khiển hoạt động vào ra dữ liệu của ADC và CPU chúng ta có 3 thanh ghi: ADMUX là thanh ghi điều khiển lựa chọn kênh đầu vào cho ADC, ADCSRA là thanh ghi điều khiển và thanh ghi trạng thái của ADC, ADCH và ADCL là 2 thanh ghi dữ liệu.
13.1. ADMUX: Multiplexer select register
Hình 7.2. Thanh ghi ADMUX
Với 4 bit được định nghĩa là MUX3, MUX2, MUX1,và MUX0, ứng với các tổ hợp logic ta có thể chọn kênh đầu vào. Cụ thể:
Các bit REFS1 và REFS0 dùng để chọn giá trị điện áp tham khảo cho ADC, như sau:
Chú ý: Nếu như ta thay đổi kênh trong thời điểm mà ADC đang chuyển đổi thì khi quá trình chuyển đổi đã hoàn thành thì kênh vào mới được thay đổi.
13.2. ADCSR-ADC control and status register
Hình 7.3. Thanh ghi điều khiển và trạng thái ADC
13.2.1. Bit 7-ADEN:ADC enable
Đây là bit điều khiển hoạt động của ADC.Khi bit này được set 1 thì ADC có thể hoạt động và ngược lại.Nếu như ta ngừng hoạt động của ADC trong khi nó đang chuyển đổi thì nó sẽ kết thúc quá trình chuyển đổi.Mặc dù chưa chuyển đổi xong.
13.2.2. Bit 6-ADSC: ADC start conversion
Trong chế độ chuyển đổi đơn thì bit này phải được set lên 1 để bắt đầu chuyển đổi.Trong chế độ chuyển đổi tự do thì bit này cần được set lên 1 để bắt đầu lần chuyển đổi đầu tiên.Bit này được giữ sốt trong quá trình chuyển đổi và được xóa khi mà chuyển đổi xong.
13.2.3. Bit 5-ADATE :ADC Auto Trigger enable
Khi bit này được set thì ADC sẽ bắt đầu chuyển đổi mỗi khi có một nguồn kích hoạt xuất hiện. Việc lựa chọn nguồn kích hoạt được thực hiện bằng cách set các bit trong thanh ghi SFIOR.
13.2.4. Bit 4-ADIF: ADC interrupt Flag
Bit này được set lên 1 bởi phần cứng khi quá trình chuyển đổi đã hoàn thành và thanh ghi dữ liệu đã được cập nhật. Bit này được xóa bằng phần cứng nếu như ngắt này được phép và được phục vụ. Hoặc nó có thể được xóa bằng cách ghi giá trị logic “0”vào cờ này. Cụ thể khi ngắt bị cấm ta có thể sử dụng các lệnh sbi và cbi để tác dụng lên bit này.
13.2.5. Bit 3-ADIE:ACD interrupt Enable
Nếu bit này set 1 và ngắt toàn cục được cho phép thì ngắt này được phép phục vụ (khi chuyển đổi xong dữ liệu) và nếu bị xóa thì ngược lại.
13.2.6. Bit 2.1.0-ADPS2…ADPS0: Bit lựa chọn xung nhịp(Tốc độ)
Nguồn xung được lấy từ nguồn xung của Vi điều khiển(XTAL) và được chia tần thông qua bộ chia tần.
13.3. Thanh ghi dữ liệu ACDH và ADCL
Thanh ghi này chứa dữ liệu chuyển đổi từ tương tự sang số, được sắp xếp như hình dưới đây.
Thanh ghi dữ liệu ADC
13.4. Nguyên tắc hoạt động và lập trình điều khiển
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).
Để điều khiển vào ra dữ liệu với ADC, các bước thực hiện như sau: Bước 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.
Bước 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).
Bước 3: Thiế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.
Bước 4: Bắt đầu chuyển đổi và đọc dữ liệu.
II. Cấu trúc cổng nối tiếp
1. Khái Quát
Cổng nối tiếp được sử dụng để truyền dữ liệu hai chiều giữa máy tính và ngoại vi, có các ưu điểm sau:
- Khoảng cách truyền xa hơn truyền song song.
- Số dây kết nối ít.
- Có thể truyền không dây dùng hồng ngoại.
- Có thể ghép nối với vi điều khiển hay PLC (Programmable Logic Device).
- Cho phép nối mạng.
- Có thể tháo lắp thiết bị trong lúc máy tính đang làm việc.
- Có thể cung cấp nguồn cho các mạch điện đơn giản
Các thiết bị ghép nối chia thành 2 loại: DTE (Data Terminal Equipment) và
tín hiệu thông thường qua 2 chân RxD (nhận) và TxD (truyền). Các tín hiệu còn lại có chức năng hỗ trợ để thiết lập và điều khiển quá trình truyền, được gọi là các tín hiệu bắt