Đề tài Vi điều khiển pic18f458

Tài liệu Đề tài Vi điều khiển pic18f458: LỜI CẢM ƠN Lời đầu tiên của bản khóa luận này cho phép em được bày tỏ lời cảm ơn sâu sắc tới PGS. TS Ngô Diên Tập, người đã tận tình hướng dẫn chỉ bảo em trong suốt thời gian em làm khóa luận. Em xin chân thành cảm ơn sâu sắc tới các thầy cô giáo trong Trường Đại học Công Nghệ - ĐHQGHN đã chỉ bảo, dạy dỗ và cung cấp những kiến thức cơ bản và chuyên môn trong suốt 4 năm qua và tạo điều kiện thuận lợi để em hoàn thành bản khóa luận này. Cuối cùng em xin gửi lời cảm ơn tới gia đình, bạn bè đã nhiệt tình giúp đỡ và động viên em hoàn thành khóa luận này. Xin chúc thầy cô giáo và các bạn sức khỏe, hạnh phúc. Hà nội, tháng 05 năm 2008 Sinh viên: Nguyễn Văn Cường TÓM TẮT NỘI DUNG Khóa luận đã xây dựng được hệ thống thu thập số liệu đo lường trên cở sở dùng vi điều khiển PIC18F458. Với ứng dụng cụ thể là thu thập dữ liệu nhiệt độ môi trường. Hệ thống được xây dựng dựa trên việc kết hợp nhiều khối thiết bị ngoại vi khác, bao gồm bàn phím PS/2 cho phép nhập dữ liệu có thể là địa điểm củ...

doc92 trang | Chia sẻ: hunglv | Lượt xem: 2128 | Lượt tải: 1download
Bạn đang xem trước 20 trang mẫu tài liệu Đề tài Vi điều khiển pic18f458, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
LỜI CẢM ƠN Lời đầu tiên của bản khóa luận này cho phép em được bày tỏ lời cảm ơn sâu sắc tới PGS. TS Ngô Diên Tập, người đã tận tình hướng dẫn chỉ bảo em trong suốt thời gian em làm khóa luận. Em xin chân thành cảm ơn sâu sắc tới các thầy cô giáo trong Trường Đại học Công Nghệ - ĐHQGHN đã chỉ bảo, dạy dỗ và cung cấp những kiến thức cơ bản và chuyên môn trong suốt 4 năm qua và tạo điều kiện thuận lợi để em hoàn thành bản khóa luận này. Cuối cùng em xin gửi lời cảm ơn tới gia đình, bạn bè đã nhiệt tình giúp đỡ và động viên em hoàn thành khóa luận này. Xin chúc thầy cô giáo và các bạn sức khỏe, hạnh phúc. Hà nội, tháng 05 năm 2008 Sinh viên: Nguyễn Văn Cường TÓM TẮT NỘI DUNG Khóa luận đã xây dựng được hệ thống thu thập số liệu đo lường trên cở sở dùng vi điều khiển PIC18F458. Với ứng dụng cụ thể là thu thập dữ liệu nhiệt độ môi trường. Hệ thống được xây dựng dựa trên việc kết hợp nhiều khối thiết bị ngoại vi khác, bao gồm bàn phím PS/2 cho phép nhập dữ liệu có thể là địa điểm của khu vực đặt hệ thống.v.v., đồng hồ thời gian thực dựa trên vi mạch DS1307 cho phép cập nhật thời gian cho hệ thống với đồng hồ này thông chỉ cần cài đặt một lần đồng hồ sẽ chạy cho tới khi không còn một nguồi nuôi nào, khối giao tiếp thẻ nhớ MMC lưu trữ tất cả dữ liệu mà người sử dụng cần với mục đích sử dụng hệ thống ví dụ địa điểm đặt hệ thống, thông tin về nhiệt độ đo được cập nhật cùng thời gian của hệ thống, và cuối cùng là khối hiển thị dùng LCD 16 cột 2 dòng hiển thị cùng lúc 32 ký tự, thể hiện những thông tin người thiết lập hệ thống muốn thông báo trong quá trình kiểm tra hoặc khi sử dụng…. Tất cả hệ thống được lắp ráp trên một bo mạch tương đối nhỏ gọn. MỤC LỤC CHƯƠNG 1: TỔNG QUAN VỀ VẤN ĐỀ NGHIÊN CỨU 1.1 Tổng quan về hệ thống đo lường và điều khiển. Hệ thông đo lường và điều khiển là một hệ thống tập hợp các thiết bị kỹ thuật có cùng một nhiệm vụ, cùng một thuật toán chức năng làm sao để thu nhận được thông tin, biến đổi nó, gia công và chuyển nó thành một dạng mà con người có thể thu nhận được và đưa đến bộ điều khiển. Thiết bị thu nhận và đo Thiết bị gia công và biến đổi thông tin đo Thiết bị lưu trữ thông tin đo Thiết bị thể hiện thông tin đo Bộ điều khiển Đối tượng nghiên cứu Người quan sát Hình 1.1: Sơ đồ khối của hệ thống Để có một hệ thống đo đạt hiệu quả và phù hợp với công việc thì việc thiết kế một mô hình ban đầu rất quan trọng nó ảnh hưởng đến toàn bộ công việc sau này của chúng ta. Trong thực tế có nhiều mô hình cấu trúc như là mô hình nối tiếp, mô hình song song, mô hình nối tiếp song song.v.v.. Mỗi mô hình được ứng dụng trong từng trường hợp nhưng tùy thuộc vào yêu cầu của công việc chúng ta phải lựa chọn một mô hình cho phù hợp. Yêu cầu về một hệ thống đo và thu thập thông tin trong công nghiệp là cần phải đạt độ chính xác cao, khả năng đo được nhiều kênh, có thể kết nối được với nhiều thiết bị khác, lượng dữ liệu lưu trữ được trong quá trình đo phải lớn để có thể đánh giá được sự biến đổi của đối tượng trong một thời gian dài từ đo đưa ra được những phương án điều khiển phù hợp. 1.2 Hệ thống đo lường nhiệt độ. Môi trường Sensor LM35 Vi điều khiển PIC Hiển thị LCD MMC Lấy mẫu Đồng hồ thời gian thực Bàn phím Hình 1.2: Sơ đồ khối của hệ thống đo lường nhiệt độ. Khóa luận đã khảo sát đối tượng là nhiệt độ môi trường. Một sensor nhiệt độ được sử dụng với mục đích cảm nhận. Đầu ra là giá trị điện áp tùy thuộc vào sự biến đổi của đối tượng, được đưa vào bộ biến đổi ADC chuyển thành các giá trị số. Tiếp tục vi điều khiển đảm nhận làm nhiệm vụ tính toán và xử lý, kết quả của quá trình này được hiển thị thông qua LCD để quan sát. Trong khóa luận này đã ứng dụng thêm mạch giao tiếp với thẻ nhớ MMC qua đó ta có thể lưu trữ nhiều giá trị nhiệt độ đo được mà ít phải quan tâm đến việc đầy bộ nhớ như việc ghép nối với các EPROM truyền thống. Thêm một lợi điểm nữa của việc dùng thẻ nhớ là ta có thể tháo lắp và đọc các giá trị đã ghi được một cách rất đễ dàng. Không chỉ là đo nhiệt độ hiển thị, và lưu giá trị nhiệt độ. Khóa luận đã phát triển thêm các giao tiếp với bàn phím PS/2 và đồng hồ thời gian thực. Với ghép nối PS/2 cho phép ta nhập các dữ liệu, thông tin về địa điểm đặt đầu đo, thông tin về hệ thống.v.v..Còn đồng hồ sẽ cho biết thông tin về thời gian mà nhiệt độ được đo. Tất cả dữ liệu nhập từ bàn phím và thông tin về thời gian cũng như nhiệt độ đo được sẽ được lưu vào thẻ nhớ. Với một hệ thống với nhiều đầu đo đặt tại nhiều vị trí hoặc khi triển khai hệ thống trên một phạm vi rộng, thì việc kết hợp những giao tiếp như trên sẽ rất có lợi cho việc quản lý và giám sát các thiết bị. ================================================= CHƯƠNG 2: VI ĐIỀU KHIỂN PIC18F458 2.1 Tổng quan về vi điều khiển PIC. Hiện nay trên thị trường có rất nhiều họ vi điều khiển như 8051, Motorola 68HC, AVR, ARM,... Ngoài họ 8051 được hướng dẫn một cách căn bản ở môi trường đại học, bản thân em đã chọn họ vi điều khiển PIC để mở rộng vốn kiến thức và phát triển các ứng dụng trên công cụ này vì các nguyên nhân sau: Họ vi điều khiển này có thể tìm mua dễ dàng tại thị trường Việt Nam. Giá thành không quá đắt. Có đầy đủ các tính năng của một vi điều khiển khi hoạt động độc lập. Là một sự bổ sung rất tốt về kiến thức cũng như về ứng dụng cho họ vi điều khiển mang tính truyền thống: họ vi điều khiển 8051. Số lượng người sử dụng họ vi điều khiển PIC. Hiện nay tại Việt Nam cũng như trên thế giới, họ vi điều khiển này được sử dụng khá rộng rãi. Điều này tạo nhiều thuận lợi trong quá trình tìm hiểu và phát triển các ứng dụng như: số lượng tài liệu, số lượng các ứng dụng mở đã được phát triển thành công, dễ dàng trao đổi, học tập, dễ dàng tìm được sự chỉ dẫn khi gặp khó khăn,… Sự hỗ trợ của nhà sản xuất về trình biên dịch, các công cụ lập trình, nạp chương trình từ đơn giản đến phức tạp… Các tính năng đa dạng của vi điều khiển PIC, và các tính năng này không ngừng được phát triển. 2.1.1 Sơ đồ chân của vi điều khiển PIC18F458. Hình 2.1: Sơ đồ chân vi điều khiển PIC18F458. 2.1.2 Một vài thông số về vi điều khiển PIC18F458. 2.1.2.1 CPU theo kiến trúc RISC Bộ nhớ chương trình 32 Kbyte. Bộ nhớ dữ liệu (RAM) 1536 Byte. Hệ thống có thể hoạt động với tốc lên tới 10 triệu lênh trên giây. Tần số thạch anh tối đa là 40 MHz. Các lệnh có độ dài 16 bit và các đường dữ liệu rộng 8 bit. Có các mức độ ưu tiên ngắt khác nhau. 2.1.2.2 Các đặc tính ngoại vi. Dòng sinh cao khoảng 25 mA. Có 3 chân ngắt ngoài. Khối Timer0 có thể là 8 bit hoặc 16 bit timer/counter với bộ chia tần 8 bit. Khối Timer1 là 16 bit timer/counter. Khối Timer2 8 bit timer/counter vói thanh ghi chu kỳ 8 bit (ứng dụng với PWM). Khối Timer3 16 bit timer/counter. Các khối Capture/Compare/PWM. Truyền dữ liệu nối tiếp đồng bộ với khối SPI 3 đường dây, hỗ trợ cả 4 chế độ SPI I2C cho cả chế độ Master và Slave. Khối UART truyền dữ liệu nối tiếp. 8 kênh chuyển đổi AD 10 bit. 2.2 Các ứng dụng được sử dụng trong khóa luận. 2.2.1 Bộ chuyển đổi tương tự số ADC. ADC (Analog to Digital Converter) là bộ chuyển đổi tín hiệu giữa hai dạng tương tự và số. PIC18F458 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 ghi ADRESH: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 GO/DONE (ADCON0) được xóa về 0 và cờ ngắt ADIF được thiết lập. Qui trình chuyển đổi từ tương tự sang số bao gồm các bước sau: 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 ghi ADCON1) 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). Thiết lập các cờ ngắt cho bộ AD Clear bit ADIF. Set bit ADIE. Set bit PEIE. Set bit GIE. Đợi cho tới khi quá trình lấy mẫu hoàn tất. Bắt đầu quá trình chuyển đổi (set bit GO/DONE). Đợi cho tới khi quá trình chuyển đổi hoàn tất bằng cách: Kiểm tra bit GO/DONE. Nếu = 0, quá trình chuyển đổi đã hoàn tất. Kiểm tra cờ ngắt. Đọc kết quả chuyển đổi và xóa cờ ngắt, set bit GO/DONE (nếu cần tiếp tục chuyển đổi). Tiếp tục thực hiện các bước 1 và 2 cho quá trình chuyển đổi tiếp theo. Hình 2.2: Cách lưu kết quả chuyển đổi AD. Hình 2.3: Sơ đồ khối bộ chuyển đổi AD Cần chú ý là có hai cách lưu kết quả chuyển đổi AD, việc lựa chọn cách lưu được điều khiển bởi bit ADFM và được minh họa cụ thể ở hình 2.2. 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). PIR1 (đị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ào analog ở PORTE. 2.2.2 Truyền nối tiếp đồng bộ SPI. Chuẩn giao tiếp SPI cho phép truyền nhận đồng bộ. Hình 2.4: Sơ đồ khối SPI Ta cần sử dụng 4 pin cho chuẩn giao tiếp này: RC5/SDO: ngõ ra dữ liệu dạng nối tiếp (Serial Data output). RC4/SDI/SDA: ngõ vào dữ liệu dạng nối tiếp (Serial Data Input). RC3/SCK/SCL: xung đồng bộ nối tiếp (Serial Clock). RA5/AN4/SS/C2OUT: chọn đối tượng giao tiếp (Serial Select) khi giao tiếp ở chế độ Slave mode. Các thanh ghi liên quan đến MSSP khi hoạt động ở chuẩn giao tiếp SPI bao gồm: Thanh ghi điều khiển SSPCON, thanh ghi này cho phép đọc và ghi. Thanh ghi trạng thái SSPSTAT, thanh ghi này chỉ cho phép đọc và ghi ở 2 bit trên, 6 bit còn lại chỉ cho phép đọc. Thanh ghi đóng vai trò là buffer truyền nhận SSPBUF, dữ liệu truyền đi hoặc nhận được sẽ được đưa vào thanh ghi này. SSPBUF không có cấu trúc đệm hai lớp (doubled buffer), do đó dữ liệu ghi vào thanh ghi SSPBUF sẽ lập tức được ghi vào thanh ghi SSPSR. Thanh ghi dịch dữ liệu SSPSR dùng để dịch dữ liệu vào hoặc ra. Khi 1 byte dữ liệu được nhận hoàn chỉnh, dữ liệu sẽ từ thanh ghi SSPSR chuyển qua thanh ghi SSPBUF và cờ hiệu được set, đồng thời ngắt sẽ xảy ra. Khi sử dụng chuẩn giao tiếp SPI trước tiên ta cần thiết lập các chế độ cho giao diện bằng cách đưa các giá trị thích hợp vào hai thanh ghi SSPCON và SSPSTAT. Các thông số cần thiết lập bao gồm: Master mode hay Slave mode. Đối với Master mode, xung clock đồng bộ sẽ đi ra từ chân RC3/SCK/SCL. Đối với Slave mode, xung clock đồng bộ sẽ được nhận từ bên ngoài qua chân RC3/SCK/SCL. Các chế độ của Slave mode. Mức logic của xung clock khi ở trang thái tạm ngưng quá trình truyền nhận (Idle). Cạnh tác động của xung clock đồng bộ (cạnh lên hay cạnh xuống). Tốc độ xung clock (khi hoạt động ở Master mode). Thời điểm xác định mức logic của dữ liệu (ở giữa hay ở cuối thời gian 1 bit dữ liệu được đưa vào). Master mode, Slave mode và các chế độ của Slave mode được điều khiển bởi các bit SSPM3:SSPM0 (SSPCON). MSSP bao gồm một thanh ghi dịch dữ liệu SSPSR và thanh ghi đệm dữ liệu SSPBUF. Hai thanh ghi này tạo thành bộ đệm dữ liệu kép (doubled-buffer). Dữ liệu sẽ được dịch vào hoặc ra qua thanh ghi SSPSR, bit MSB được dịch trước. Đây là một trong những điểm khác biệt giữ hai giao diện MSSP và USART (USART dịch bit LSB trước). Trong quá trình nhận dữ liệu, khi dữ liệu đưa vào từ chân RC4/SDI/SDA trong thanh ghi SSPSR đã sẵn sàng (đã nhận đủ 8 bit), dữ liệu sẽ được đưa vào thanh ghi SSPBUF, bit chỉ thị trạng thái bộ đệm BF (SSPSTAT) sẽ được set để báo hiệu bộ đệm đã đầy, đồng thời cờ ngắt SSPIF (PIR1) cũng được set. Bit BF sẽ tự động reset về 0 khi dữ liệu trong thanh ghi SSPBUF được đọc vào. Bộ đệm kép cho phép đọc tiếp byte tiếp theo trước khi byte dữ liệu trước đó được đọc vào. Tuy nhiên ta nên đọc trước dữ liệu từ thanh ghi SSPBUF trước khi nhận byte dữ liệu tiếp theo. Quá trình truyền dữ liệu cũng hoàn toàn tương tự nhưng ngược lại. Dữ liệu cần truyền sẽ được đưa vào thanh ghi SSPBUF đồng thời đưa vào thanh ghi SSPSR, khi đó cờ hiệu BF được set. Dữ liệu được dịch từ thanh ghi SSPSR và đưa ra ngoài qua chân RC5/SDO. Ngắt sẽ xảy ra khi quá trình dịch dữ liệu hoàn tất. Tuy nhiên dữ liệu trước khi được đưa ra ngoài phải được cho phép bởi tín hiệu từ chân RA5/SS . Chân này đóng vai trò chọn đối tượng giao tiếp khi SPI ở chế độ Slave mode. Khi quá trình truyền nhận dữ liệu đang diễn ra, ta không được phép ghi dữ liệu vào thanh ghi SSPBUF. Thao tác ghi dữ liệu này sẽ set bit WCON (SSPCON). Một điều cần chú ý nữa là thanh ghi SSPSR không cho phép truy xuất trực tiếp mà phải thông qua thanh ghi SSPBUF. Cổng giao tiếp của giao diện SPI được điều khiển bởi bit SSPEN (SSPSON). Bên cạnh đó cần điều khiển chiều xuất nhập của PORTC thông qua thanh ghi TRISC sao cho phù hợp với chiều của giao diện SPI. Cụ thể như sau: RC4/SDI/SDA sẽ tự động được điều khiển bởi khối giao itếp SPI. RS5/SDO là ngõ ra dữ liệu, do đó cần clear bit TRISC. Khi SPI ở dạng Master mode, cần clear bit TRISC để cho phép đưa xung clock đồng bộ ra chân RC3/SCK/SCL. Khi SPI ở dạng Slave mode, cần set bit TRISC để cho phép nhận xung clock đồng bộ từ bên ngoài qua chân RC3/SCK/SCL. Set bit TRISC để cho phép chân RA5/AN4/SS/C2OUT nhận tín hiệu điều khiển truy xuất dữ liệu khi SPI ở chế độ Slave mode. Hình 2.5: Sơ đồ ghép nối theo chuẩn SPI. Theo sơ đồ kết nối này, khối Master sẽ bắt đầu quá trình truyền nhận dữ liệu bằng cách gửi tín hiệu xung đồng bộ SCK. Dữ liệu sẽ dịch từ cả hai thanh ghi SSPSR đưa ra ngoài nếu có một cạnh của xung đồng bộ tác động và ngưng dịch khi có tác động của cạnh còn lại. Cả hai khối Master và Slave nên được ấn định chung các qui tắc tác động của xung clock đồng bộ để dữ liệu có thể dịch chuyển đồng thời. 2.2.3 Truyền nối tiếp đồng bộ I2C. Đây là một dạng khác của MSSP. Chuẩn giao tiếp I2C cũng có hai chế độ Master, Slave và cũng được kết nối với ngắt. I2C sẽ sử dụng 2 pin để truyền nhận dữ liệu: RC3/SCK/SCL: chân truyền dẫn xung clock. RC4/SDI/SDA: chân truyền dẫn dữ liệu. Các khối cơ bản trong sơ đồ khối của I2C không có nhiều khác biệt so với SPI. Tuy nhiên I2C còn có thêm khối phát hiện bit Start và bit Stop của dữ liệu (Start and Stop bit detect) và khối xác định địa chỉ (Match detect). Các thanh ghi liên quan đến I2C bao gồm: Thanh ghi SSPCON và SSPCON2: điều khiển MSSP. Thanh ghi SSPSTAT: thanh ghi chứa các trạng thái hoạt động của MSSP. Thanh ghi SSPBUF: buffer truyền nhận nối tiếp. Thanh ghi SSPSR: thanh ghi dịch dùng để truyền nhận dữ liệu. Thanh ghi SSPADD: thanh ghi chứa địa chỉ của giao diện MSSP. Các thanh ghi SSPCON, SSPCON2 cho phép đọc và ghi. Thanh ghi SSPSTAT chỉ cho phép đọc và ghi ở 2 bit đầu, 6 bit còn lại chỉ cho phép đọc. Thanh ghi SSPBUF chứa dữ liệu sẽ được truyền đi hoặc nhận được và đóng vai trò như một thanh ghi đệm cho thanh ghi dịch dữ liệu SSPSR. Thanh ghi SSPADD chứa địa chỉ của thiết bị ngoại vi cần truy xuất dữ liệu của I2C khi hoạt động ở Slave mode. Khi hoạt động ở Master mode, thanh ghi SSPADD chứa giá trị tạo ra tốc độ baud cho xung clock dùng để truyền nhận dữ liệu. Trong quá trình nhận dữ liệu, sau khi nhận được 1 byte dữ liệu hoàn chỉnh, thanh ghi SSPSR sẽ chuyển dữ liệu vào thanh ghi SSPBUF. Thanh ghi SSPSR không đọc và ghi được quá trình truy xuất thanh ghi này phải thông qua thanh ghi SSPBUF. Trong quá trình truyền dữ liệu, dữ liệu cần truyền khi được đưa vào thanh ghi SSPBUF cũng sẽ đồng thời đưa vào thanh ghi SSPSR. I2C có nhiều chế độ hoạt động và được điều khiển bởi các bit SSPCON, bao gồm: I2C Master mode, xung clock = fosc/4*(SSPADD+1). I2C Slave mode, 7 bit địa chỉ. I2C Slave mode, 10 bit địa chỉ. I2C Slvae mode, 7 bit địa chỉ, cho phép ngắt khi phát hiện bit Start và bit Stop. I2C Slave mode, 10 bit địa chỉ, cho phép ngắt khi phát hiện bit Start và bit Stop. I2C Firmware Control Master mode. Trên đây là những tóm lược về vi điều khiển PIC18F458 và các ngoại vi của nó được ứng dụng trong khóa luận. Các modul được dùng sẽ được nói rõ hơn ở các chương tiếp theo với các ứng dụng cụ thể. =================================================== CHƯƠNG 3: CẢM BIẾN NHIỆT ĐỘ VÀ VI MẠCH LM35 3.1 Nhiệt độ và ý nghĩa của đo nhiệt độ. Nhiệt độ là một tham số vật lý quan trọng, thường hay gặp trong kỹ thuật, công nghiệp, nông nghiệp và trong đời sống sinh hoạt hàng ngày. Nó là tham số có liên quan đến tính chất của rất nhiều vật chất, thể hiện hiệu suất của các máy nhiệt và là nhân tố trọng yếu ảnh hưởng đến sự truyền nhiệt. Vì lẽ đó mà trong các nhà máy, trong hệ thống nhiệt... đều phải dùng nhiều dụng cụ đo nhiệt độ khác nhau. Chất lượng và số lượng sản phẩm sản xuất được đều có liên quan tới nhiệt độ, nhiều trường hợp phải đo nhiệt độ để đảm bảo cho yêu cầu thiết bị và cho quá trình sản xuất. Hiện nay yêu cầu đo chính xác nhiệt độ từ xa cũng là một việc rất có ý nghĩa đối với sản xuất và nghiên cứu khoa học.... 3.2 Cảm biến nhiệt độ LM35. Trong đề tài này ứng dụng cụ thể một loại sensor để khảo sát nhiệt độ môi trường. LM35 được chọn cho mục đích này. Hình 3.1: LM35. 3.3.1 Một số đặc tính của LM35. Một số đặc tính của LM35 có thể chỉ ra như sau: Chuẩn đo được lấy trực tiếp theo thang bách phân  oC Tuyến tính với độ thay đổi 10mV/0C Độ chính xác là 0.5oC khảo sát ở nhiệt độ 25oC Có thể đo trong khoảng nhiệt độ -55 đến 150oC Điện thế cung cấp có thể từ 4-30V Dòng tiêu thụ nhỏ hơn 60mA … 3.3.2 Sơ đồ ghép nối với vi điều khiển. Với ứng dụng trong đề tài chỉ là khảo sát nhiệt độ môi trường. Kết hợp với điều kiện khí hậu của Việt Nam việc giá trị nhiệt độ nhỏ hơn 0oC là hiếm gặp do vậy em đã chọn cách mặc LM35 cụ thể như sau: Vcc (+5V) Hình 3.2: Ghép nối LM35 với vi điều khiển. 3.3.3 Xử lý và tính toán kết quả Với cách mắc như trên khoảng nhiệt độ mà sensor có thể đo được là từ 2-150 0C. Khi sử dụng LM35 việc xử lý tính toán rất đơn giản do điện thế đầu ra thay đổi 10mV/0C, giả sử với nhiệt độ môi trường là 250C thì thế đầu ra của LM35 tại chân Output (chân 2) là 25*10 = 250mV = 0,25V so với đất. Khi ghép nối với vi điều khiển PIC, giả sử thiết lập ADC là 10 bit thì ta có sẽ 1023 mức, ứng với các điện thế tham chiếu Vref+ = 5V và Vref- = 0V (GND). Giả sử nhiệt độ môi trường là 25oC như trên, khi đó điện áp chân 2 của LM35 so với đất sẽ là 0,25V. Từ đây tính ra được giá trị mức trên thang ADC 10 bit nhận được là: (1023 * 0,25)/5 =~ 51. Từ đây ta dễ dàng tính được ngược lại nhiệt độ môi trường khi đọc được giá trị ADC qua bộ biến đổi AD của PIC. Và nhiệt độ sẽ được tính theo công thứ sau: temp = 5 * value * 100 /1023 Với value là giá trị nhận được từ việc đọc giá trị của ADC từ thanh ghi ADRESH:ADRESL. Quá trình xử lý và tính toán để có được nhiệt độ môi trường ở trên vi điều khiển thực hiện theo các bước sau: Thiết lập kênh ADC trên PIC để đọc giá trị tại đầu ra của LM35 setup_port_a(ALL_ANALOGS); setup_adc(ADC_CLOCK_INTERNAL); //xung lấy mẫu nội setup_adc_channel(0); //kênh AN0 là đầu vào ADC Đọc ADC và chuyển đổi sang nhiệt độ tương ứng theo thang bách phân Celcius Value = read_adc(); temp = 5 * value * 100 /1023; //đã thiết lập ADC 10 bit từ trước. Printf (lcd_putc, “Nhiet do: %d”,temp); ======================================================= CHƯƠNG 4: BÀN PHÍM PS/2 VÀ GIAO TIẾP BÀN PHÍM VỚI VI ĐIỀU KHIỂN 4.1 Bàn phím PS/2. Bàn phím là một ma trận lớn của các phím. Tất cả được giám sát bởi 1 bộ xử lý ở trên bo mạch gọi là bộ mã hóa bàn phím (keyboard encoder). Bộ xử lý cụ thể có thể thay đổi tùy loại bàn phím nhưng chúng đều phải thực hiện công việc cơ bản là: Giám sát mỗi khi có 1 hoặc nhiều phím được nhấn/thả và gửi dữ liệu tương ứng tới host. Bộ xử lý này sẽ cho phép dữ liệu được gửi đi hoặc gữi lại thông qua 16byte bộ đêm (buffer). Mạch điều khiển bàn phím (keyboard contrllor) lưu trữ toàn bộ bộ giải mã dữ liệu nhận đựợc từ bàn phim và những thông tin sẽ phục vụ mục đích điều khiển. Việc truyền thông giữa host và keyboard thông qua giao thức “IBM protocol”. 4.2 Giao diện vật lý. Có 2 kiểu đầu cắm PS/2 là loại 5 chân DIN và loại 6 chân mini-DIN. Hai loại kết nối này cho giống nhau hoàn toàn về mặt tín hiệu điện. Chỉ khác nhau ở cách bố trí các chân. Chúng có thể chuyển đổi thông qua một thiết bị phần cứng đơn giản. Chuẩn DIN được xây dựng bởi German Standardization Organization. Hình sau chỉ rõ sơ đồ chân của mỗi loại kết nối: Male (Plug) Female  (Socket) 5-pin DIN (AT/XT):  1 - Clock 2 - Data 3 - Not Implemented 4 - Ground 5 - Vcc (+5V) Male (Plug) Female (Socket) 6-pin Mini-DIN (PS/2): 1 - Data 2 - Not Implemented 3 - Ground 4 - Vcc (+5V) 5 - Clock 6 - Not Implemented Hình 4.1: Đầu cắm PS/2 4.3 Truyền nhận dữ liệu. Dòng điện cung cấp cho bàn phím không đươc lớn hơn 275mA. Điện áp cung cấp nằm trong khoảng +4,5 đến +5,5V. Các đường dữ liệu và clock của bàn phím là những đường collector hở. Cần phải có điện trở kéo trong giao tiếp, trong sơ đồ ghép nối với PIC điện trở kéo này không cần thiết vì RB0 của vi điều khiển đã có trở kéo nội. Khi nối với “host” có những trạng thái trên Bus như sau: Data = high, Clock = high:  Trạng thái thả nổi, Data = high, Clock = low:  Tryền nhận dữ liệu Data = low, Clock = high:  Host Request-to-Send Dữ liệu có độ dài 1 byte, và mỗi byte được gửi trên khung truyền có độ dài 11-12 bit. Những bit trong khung dữ liệu gồm: Một bit “start”, Bit nay luôn có giá trị bằng 0, 8 bit dữ liệu, 1 bit kiểm tra chẳn lẻ, 1 bit stop, 1 bit acknowledge (ack) chỉ truyền từ host tới keyboard. 4.2.1 Thông tin từ bàn phím tới host. Khi keyboard muốn gửi thông tin, đầu tiên nó sẽ kiểm tra tín hiệu xung Clock, phải đảm bảo là đang ở mức cao. Nếu không host sẽ ngăn chặn viêc truyền nhận và thiết bị (bàn phím) phải đệm dữ liệu, cho đến khi host phát Clock. Tín hiệu này đảm bảo ở mức cao trong vòng 50us trước khi bàn phím bắt đầu truyền dữ liệu. Khung dữ liệu gồm 11 bit trong đó có: 1 start bit.  Luôn luôn là 0This is always 0. 8 data bits, bit LSB là bit đầu tiên 1 parity bit, kiểm tra chăn lẻ. 1 stop bit.  Luôn luôn là 1. Đường dữ liệu sẽ thay đổi trạng thái khi Clock ở mưc cao và dữ liệu là hợp lệ khi Clock ở mức thấp. Hình 4.2: Giản đồ xung Mã quét của phím “Q”(15h) gửi từ bàn phím tới máy tính. Kênh A là tín hiệu Clock, kênh B là tín hiệu của dữ liệu. --- Hình 4.3: Giản đồ xung chi tiết Tần số clock nằm trong khoảng 10 – 16,7kHz. Thời gian từ sườn lên của xung clock tới khi có 1 dữ liệu được truyền nhỏ nhất 5us. Còn thời gian của tín hiệu từ khi 1 dữ liệu truyền tới sườn xuống của xung clock nhỏ nhất là 5us và không lớn hơn 25us. 4.2.2 Thông tin từ host tới bàn phím. Các thiết bị PS/2 luôn có 1 máy phát xung. Nếu host muốn gửi dữ liệu thì trước tiên phải đặt các đường Data và Clock trong trạng thái “Request to send” khi đó: Ngăn chăn truyền nhận bằng việc ghim Clock ở mưc thấp trong vòng nhỏ nhât là 100us. Cho phép “Request to send” bằng việc giữ đường Data ở mưc thấp, sau đó phát xung Clock. Bàn phím kiểm tra trạng thái trong vòng không quá 10ms. Khi phát hiện thấy trạng thái này, nó sẽ bắt đầu phát xung Clock , 8 bit dữ liệu và 1 bít stop. Host chỉ thay đổi đường dữ liệu khi đường Clock ở mức thấp, và dữ liệu được bàn phím đọc khi Clock ở mưc cao. Cái này ngược hoàn toàn với quá trình từ bàn phím tới host. Sau khi nhận được bit stop, bàn phím báo đã nhận được byte bằng cách đưa đường dữ liệu xuông thấp và phát thêm 1 xung nữa. Nếu host không nhả đường dữ liệu sau 11 xung thì bàn phím sẽ tiếp tục xung quá trình chỉ kêt thúc khi đường dữ liệu được giải phóng. Tóm lại các bước mà host phải thực hiện để truyền dữ liệu đến PS/2 keyboard là Đưa đường Clock xuống thấp ít nhất là 100us. Đường dữ liệu xuống thâp. Giải phóng đường Clock. Đợi để bàn phím đưa đường Clock của nó xuống thâp. Set/reset đường dữ liệu để gửi bit đầu tiên. Đợi bàn phím đưa Clock lên mưc cao. Đợi bàn phím đưa Clock xuống thấp. Lặp lại bước 5-7 cho các bit dữ liệu khác và bit kiểm tra lỗi. Giải phóng đường dữ liệu. Đợi bàn phím đưa Data xuống thấp. Đợi bàn phím đưa Clock xuống thấp. Đợi bàn phím giải phóng Data và Clock. Hình mô tả xung khi host gửi tới bàn phím: Hình 4.3: Giản đồ xung Chi tiết quá trình trình truyền nhận host tới bàn phím. Hình 4.4: Chi tiết quá trình truyền nhận từ host tời bàn phím Hình 4.4 có 2 thông số là a,b trong đó. (a) là khoảng thời gian để bàn phím bắt đầu phát xung sau khi host khởi tạo với đường Clock ở mức thấp, khoảng thời gian này không lớn hơn 15 ms. (b) là khoảng thời gian để gói dữ liệu được gửi thời gian này không lớn hơn 2ms. 4.3 Mã quét. Bộ xử lý bàn phím sử dụng phần lớn thời gian vào việc quét, hoặc giám sát ma trận phím. Nếu tìm thấy phím được ấn, thả, hoặc giữ, bàn phím sẽ gửi một gói tin chứa thông tin về mã quét (scan code) được tới host. Có hai loại mã quét là make code và break code. Một make code sẽ được gửi đi khi có một phím được ấn hoặc giữ. Break code sẽ được gửi tiếp đi khi có một phím được nhả. Mỗi phím được gán cho một make code và break code duy nhất vì thế host có thể quyết định chính xác cái gì đã xảy ra. Việc gán make code và brake code cho mỗi phím cho ta chuẩn mã quét phím (scan code set). Có 3 chuẩn scan code set là 1,2, và 4. Bàn phím hiện nay mặc định cài đặt theo loại 2. Chi tiết các bảng chuẩn mã quét bàn phím xem phần phụ lục. Không có công thức tính toán cho việc tìm ra mã của một phím bất kỳ. Muốn biết make code và break code chỉ còn cách tra bảng. 4.4.1 Make Codes, Break Codes, và Typematic Repeat 4.4.1.1 Make code. Khi nhấn 1 phím sẽ có một mã make code gửi tới host. Không hề có mối liên hệ nào giữa make code và ASCII code. Khi tới host, scan code sẽ được dịch ra ký tự hoặc lệnh tương ứng. Mặc dù phần lớn các make code theo chuẩn 2 (set 2) có độ rộng là 1 byte, tuy nhiên có một số phím mở rông (extended key) có make code là 2 hoặc 4 byte. Những make code này có thể được nhân biệt thông qua byte đầu tiên có giá trị là E0h. 4.4.1.2 Break code. Khi nhấn một phím thì có một make code gửi tới host còn khi nhả ra thì có thêm một mã nữa được gửi đó là break code. Với mỗi phím thì có một make code và break code duy nhất. Không hề mối liên hệ nào giữa make code và break code. Hầu hết các break code chuẩn 2 có độ dài 2 byte trong đó byte đầu có giá trị là F0h byte thứ 2 có giá trị đúng bằng giá trị của make code của phím đó. Break code của các phím mở rộng thông thường là 3 byte với giá trị của 2 byte đầu là E0h, F0h và byte thư 3 là byte cuối cùng của make code của phím đó. Bảng sau là một ví dụ: Ví dụ: chuỗi make code và break code khi gửi tới host (chẳng hạn máy tính ) là như thế nào khi ký tự “G” xuất hiện. Để có được một chữ hoa như trên thì chuỗi sự kiện được thực hiện là: ấn phím “shift”, ấn phím “G” (trên bàn phím là chữ hoa), nhả phím “G”, nhả phím “shift”. Mã quét được theo chuỗi sự kiên đó sẽ là: make code cho phím “shift”(12h), make code cho phím “G”(34h), break code phím “G”(F0h,34h), break code phím “shift”(F0h,12h). Vậy kết quả dữ liệu được gửi tới host sẽ là: 12h, 34h, F0h, 34h, F0h, 12h. 4.4.1.3 Typematic. Khi ấn 1 phím một make code sẽ được gửi tới host. Khi nhấn và giữ một phím thì phím đó trở thành typematic, điều này có nghĩa là bàn phím sẽ vẫn tiếp tục gửi make code của phím đó cho tới khi phím đó được nhả hoặc phím khác được bấm. Có thể kiểm tra lại điều này khi ta mở một trình soạn thỏa và giữ phím “A”. Khi ấn phím ký tự “a” xuất hiện ngay trên màn hình. Sau một khoảng thời gian ngắn những chữ “a” khác sẽ xuất hiện tiếp theo, chuỗi ký tự “a” này chỉ kết thúc khi ta nhả phím “A”. Có hai tham số quan trọng ở đây là: Typematic delay: là khoảng trễ ngắn giữa chữ “a” đầu tiên và thứ 2 Typematic rate: là số ký tự xuất hiện trong 1 giây trên màn hình (đối với máy tính) sau khoảng thời gian typematic delay Typematic delay nằm trong khoảng từ 0,25 đến 1 giây. Còn typematic rate có thể thay trong khoảng 2-30 ký tự trên giây. Có thể thay đổi 2 thông số này bằng lệnh “Set typematic rate/delay”(0xF3). Trong trường hợp có nhiều hơn 1 phím được giữ chỉ có phím ấn sau mới trở thành typematic. Chú ý: Trên thực tế phím “Pause/Break” không có break code đối với cả chuẩn mã quét 1 và 2. Khi phím được bấm thì nó gửi make code còn khi nhả ra nó không gửi gì cả. 4.4 Cài đặt. 4.4.1 Quá trình khởi động. Khi bật nguồn hoặc reset bằng phần mềm (lệnh reset) thì bàn phím sẽ thực thi kiểm tra chuẩn đoán độ tin cậy gọi là BAT( Basic Assurance Test) và sau đó là tải các giá trị mặc định bao gồm: Typematic delay 500ms. Typematic rate 10.9 cps( ký tự trên giây). Mã quét theo chuẩn 2. Thiết lập tất cả phím typematic/make/break. Trong quá trình BAT, bàn phím sẽ bật sang 3 đèn chỉ thị và sẽ tắt chúng khi quá trình BAT hoàn thành. Trong thời gian này một mã hoàn thành BAT được gửi tới host nều là 0xAA có nghĩa là quá trình BAT là thành công còn nều là 0xFC thì là đã xảy ra lỗi. Mã hoàn thành BAT này được gửi sau khoảng 500 ~ 700 ms sau khi bật nguồn. 4.4.2 Các lệnh thiêt lập. Các lệnh được nêu sau đây được gửi từ host tới bàn phím. 0xFF ( Reset): bàn phím đáp ứng với “ack” (0xFA), sau đó vào quá trình reset. 0xFE (Resend): bàn phím sẽ đáp ứng bằng việc gửi lại byte cuối cùng. Trường hợp ngoại lệ nếu byte cuối cùng cùng là 0xFE khi đó bàn phím gửi lại byte cuối với giá trị không phải lài 0xFE. Lệnh resend được sử dụng khi host phát hiện có lội trong quá trình nhận. 0xF6 (Set default): tải nhưng thông số mặc định của typematic rate/delay (10.9cps/500ms), loại phím (tất cả các phím typematic/make/break), và loại quét bàn phím là 2 (scan code set 2). 0xF5 (Disable) dừng quá trình quét phím, tải lại các giá trị mặc định (Set default), và đợi trong vài chu kỳ lệnh. 0xF4 (Enable) cho phép bàn phím sau khi sử dụng lệnh disable. 0xF3 (Set typematic rate/delay) thiết lập các thông số typematic rate/delay). Host sẽ gửi lệnh này với đối số là 1 byte định nghĩa các thông số trên. Các giá trị được cho trong bảng sau: 0xF2 (Read ID) bàn phím sẽ đáp ứng bằng việc gửi trở lại 2 byte là 0xAB và 0x84. 0xF0 (Set scan code set) bàn phím sẽ đáp ứng với “ack”, sau khi đọc được byte đối số được gửi từ host. Byte đối số này có thể là 0x01, 0x02, 0x03 tương ứng với lựa chọn scan code set là 1, 3, hay là 4. 0xEE (Echo) bàn phím cũng đáp ứng lài là “Echo”(0xEE). 0xED (Set/Reset LEDs) host sẽ gửi kèm theo lệnh này 1 byte đối số chỉ rõ trạng thái đèn của các phím Num Lock, Caps Lock, và Scroll Lock. Byte đối số đó như sau: Các trạng thái on/off tương ứng với giá trị là 1/0. 4.5 Mạch điều khiển bàn phím i8042. Một vi điều khiển intel 8042 hoặc tương thích sẽ được sử dụng trong mạch điều khiển bàn phím của máy tính. Với những máy tính hiện nay những vi điều khiển loại này được tích hợp trên chipset của bo mạch chính. Tùy thuộc vào bo mạch chủ mà mạch điều khiển bàn phím có thể là 1 trong 2 loại là: tương thích với AT hay là tương thích với PS/2. Ngày nay cả chuột PS/2 cũng được hỗ trợ luôn trên bo mạch chính. Khi đó 8042 cũng đảm nhận luôn cả việc điều khiển chuột. 4.6 PIC điều khiển bàn phím. Trong khóa luận sử dụng vi điều khiển PIC làm mạch điều khiển bàn phím theo chuẩn PS/2. Tuy đây không phải là loại IC chuyên dụng dùng điều khiển bàn phím tuy nhiên nó hoàn toàn đảm nhận được việc này, khi ta thực hiện được đúng ghép nối phần cứng theo chuẩn PS/2 và xây dựng được firmware để thực hiện đọc ghi lệnh và dữ liệu. 4.6.1 Sơ đồ ghép nối Keyboard PS/2 với PIC 18F452. Hình 4.5: Ghép nối bàn phím với vi điều khiển. 4.6.2 Khởi tạo giao tiếp và các hàm chức năng. 4.6.2.1 Khởi tạo giao tiếp. Để thực hiện được giao tiếp giữa bàn phím và PIC cần có quá trình khởi tạo để 2 thiết bị nhận nhau. Quy trình khởi tạo thực hiện qua các bước: Xóa bộ đệm vào ra Thiết lập đầu vào dữ liệu và xung Cấu hình ngắt ngoài Cho phép ngắt Qúa trình khởi tạo được minh họa bằng đoạn code sau: //////////////khoi tao keyboard///////////////////////// void PS2KeyInit(void){ PS2KeyNRead =0; //xoa viec doc nhung phim so PS2KeyBufInIx =0; //xoa bo dem vao PS2KeyBufOutIx =0; //xoa bo dem ra PS2_BREAKCODE =FALSE; //khong nhan breakcode PS2_SHIFT =FALSE; //khong nhan shift PS2Key_DataTris =1; //thiet lap dau vao du lieu PS2Key_ClkTris =1; //thiet lap dau vao xung clock ext_int_edge(0, H_TO_L); //ngat theo suon xuong enable_interrupts(INT_EXT); //cho phep ngat ngoai tai RB0 } /////////////////////////////////////////////////////// 4.6.2.2 Các hàm chức năng sử dụng trong chương trình. Một số hàm sử dụng trong chương trình phục vụ cho quá trình giao tiếp giữa vi điều khiển và bàn phím. - INT8U PS2KeyGetKey(void); Nhận 1 mã quét từ bàn phím hàm trả về giá trị 1 nếu đang xứ lý, còn -1 nếu qúa trình không kết thúc. - Void PS2SendComm(INT8U cmd); Gửi 1 byte lệnh tới bàn phím - BOOLEAN PS2KeyHit(void); Phát hiện phím được bấm giá trị 1 trả về nếu xảy ra, bằng 0 nếu không có hiện tượng. - void PS2KeyIntHandler( void ); Hàm sử dụng cho chức năng ngắt tại chân B0, sườn ngắt từ cao xuống thấp. - void PS2KeyBufIn (INT8U code) Chèn 1 ký tự vào bộ nhớ đệm của bàn phím. ===================================================== CHƯƠNG 5: ĐỒNG HỒ THỜI GIAN THỰC 5.1 Mô tả chung về DS1307 DS1307 là một IC thời gian thực với nguồn cung cấp nhỏ, dùng để cập nhật thời gian và ngày tháng với 56 bytes NVRAM, với loại bộ nhớ này dữ liệu sẽ không bị xóa khi mất nguồn nuôi. Địa chỉ và dữliệu được truyền nối tiếp với giao diện ghép nối I2C qua 2 đường, truyền song công. Nó cung cấp thông tin về giờ, phút, giây, thứ, ngày, tháng, năm. Đồng hồ có thể hoạt động ở dạng 24 giờ hoặc 12giờ với chỉ thị AM/PM. DS1307 có một mạch cảm biến điện áp dùng để dò các điện áp lỗi và tự động chuyến sang dùng nguồn cung cấp từ pin. Trong ghép nối với vi điều khiển DS1307 hoạt động với vai trò của một slave. Việc truy cập được thi hành với chỉ thị START và một mã nhậ dạng thiết bị. Tiếp theo đó các thanh ghi sẽ được truy cập liên tục đến khi chỉ thị STOP được thực thi. Sơ đồ khối của DS1307 Hinh 5.1: Sơ đồ khối của DS1307 5.2 Hoạt động của các chân. Vcc,GND: nguồn một chiều được cung cấp tới các chân này. Vcc là đầu vào 5V. Khi được cấp nguồn 5V thì IC có thể được truy xuất cách đây đủ, dữ liệu có thể đọc và viết. Khi pin 3V được nối tới thiết bị này và Vcc nhỏ hơn 1,25 x Vbat thì quá trình đọc và viết không được thực thi, tuy nhiên chức năng đồng hồ không bị ảnh hưởng. Khi Vcc nhỏ hơn Vbat thì RAM và đồng hồ sẽ chuyển sang dùng nguồn cùng câp ngoài (thường là nguồn 1 chiều 3V) từ pin Vbat: Đầu vào pin cho bất kỳ chuẩn pin lithium 3V hoặc nguồn năng lượng khác. Điện áp này phải được giữ trong khoảng từ 2,5 đến 3V để đảm bảo cho sự hoạt động của thiết bị. SCL (serial clock input): SCL được sử dụng để đồng bộ sự chuyển dữ liệu trên giao diện nối tiếp. SDA(serial data input/out): là chân vào ra của giao dien I2C. Chân SDA thiết kế theo kiểu cực máng hở, đòi hỏi phải có một điện trở kéo trong khi hoạt động. SQW/OUT (square wave/output driver): khi được kích hoạt thì bit SQWE được thiết lập bằng 1, chân SQW/OUT phát ra 1 trong 4 tần số (1Hz,4kHz,8kHz,32kHz). Chân này cũng cần có trở kéo lên trong quá trình hoạt động. Hoạt động trong cả chế độ nguồn Vcc và Vbat. X1,X2: được nối với một thạch anh tần số 32,768kHz. Là một mạch tạo dao động ngoài. 5.3 Tổ chức bộ nhớ RAM của DS1307 Thông tin về thời gian và ngày tháng được lấy ra bằng cách đọc các byte trong thanh ghi thích hợp. Thời gian và ngày tháng được thiết lập cũng thông qua các thanh ghi này bằng cách viết vào đó những giá trị thích hợp. Nội dung của các thanh ghi dưới dạng mã BCD (binary coded decreaseimal). Bit 7 của thanh ghi 0 là bit clock halt (CH), khi bit này được thiết lập bằng 1 thì không cho phép dao động, khi được xoá về 0 thì dao động được cho phép. Chú ý khi mới bắt đầu bật nguồn thì các thanh ghi chưa được định nghĩa, do đó một điều quan trọng trong khi khởi tạo cấu hình là phải cho phép dao động bit CH xóa về 0 (CH=0). 5.3.1 Các thanh ghi thời gian của DS1307. Hình 5.2: Thanh ghi thời gian của DS1307. DS1307 có thể chạy ở chế độ 24h cũng như 12h. Bit thứ 6 của thanh ghi hours là bit chọn chế độ 24h hoặc 12h. Khi bit này ở mức cao thì chế độ 12h được chọn. Ở chế độ 12h thì bit 5 là bit AM/PM với mức cao là PM. Ở chế độ 24h thì bit 5 là bit chỉ 20h (từ 20h đến 23h). 5.3.2 Thanh ghi điều khiển. DS1307 có thanh ghi 7 dùng để điều khiển hoạt động của chân SQW/OUT OUT (output control): bit điều khiển mức lối ra của chân SQW/OUT khi đầu ra xung vuông là disable. Nếu SQWE = 0, thì mức logic ở chân SQW/OUT sẽ là 1 nếu OUT = 1, và là 0 nếu OUT = 0. Nếu SQWE = 1, cho phép đầu ra của bộ tạo dao động. Tần số của đầu ra sóng vuông phụ thuộc vào giá trị của RS1 và RS0 được cho ở bảng dưới: RS1 RS0 Tần số lố ra SQW 0 0 1 Khz 0 1 4,096 Khz 1 0 8,192 Khz 1 1 32,768 KHz 5.3 Cấu hình phần cứng. DS1307 hỗ trợ bus dữ liệu nối tiếp 2 dây, 2 chiều và giao thức truyền dữ liệu. Thiết bị gửi dữ liệu lên bus được gọi là bộ phát và thiết bị nhận gọi là bộ thu. Thiết bị điều khiển quá trình này gọi là master, còn thiết bị nhận sự điều khiển của master gọi là slave. Các bus nhận sự điều khiển của master, là thiết bị phát ra chuỗi xung clock (SCL), master sẽ điều khiển sự truy cập bus, và tạo ra các chỉ thị START và STOP. Giao diện truyền nối tiếp trên 2 đường Hinh 5.3: Giao diện ghép nối theo chuẩn I2C. 5.4 Truyền dữ liệu theo chuẩn I2C. Tuỳ thuộc vào bit R/W mà có 2 loại truyền dữ liệu sẽ được thực thi: Hình 5.4: Truyền tín hiệu trên 2 đường dây. Truyền dữ liệu từ master tới slave : Master sẽ truyền byte đầu tiên là địa chỉ của slave. Tiếp sau đó là các byte dữ liệu. Slave sẽ gửi lại bit thông báo đã nhận được (bit acknowledge) sau mỗi byte dữ liệu nhận được. Dữ liệu sẽ truyền từng bit từ bit có ý nghĩa nhất (MSB). Truyền dữ liệu từ slave tới master : byte đầu tiên (địa chỉ của slave) được truyền tới slave bởi master. Sau đó slave sẽ gửi lại master bit acknowledge. Tiếp theo đó slave sẽ gửi các byte dữ liệu tới master. Master sẽ gửi cho slave các bit acknowledge sau mỗi byte nhận được trừ byte cuối cùng, sau khi nhận được byte cuối cùng thì bit acknowledge sẽ không được gửi . Master phát ra tất cả các chuỗi xung clock và các chỉ thị START và STOP. Quá trình truyền sẽ kết thúc với chỉ thị STOP hoặc chỉ thị quay vòng START. Khi chỉ thị START quay vòng thì qúa trình truyền chuỗi dữ liệu tiếp theo được thực thi và các bus vẫn chưa được giải phóng. Dữ liệu truyền luôn bắt đầu bằng bit MSB. DS1307 có thể hoạt động ở 2 chế độ 5.5.1 Ghi dữ liệu vào DS1307. Chế độ slave receiver (ghi vào DS1307) : chuỗi dữ liệu và chuỗi xung clock sẽ được nhận thông qua SDA và SCL. Sau mỗi byte được nhận thì1 bit acknowledge sẽ được truyền ngược trở lại master. Các chỉ thị START và STOP dùng để nhận biết khi bắt đầu và kết thúc một khung truyền. Nhận dạng địa chỉ được thực hiện bởi phần cứng sau khi chấp nhận địa chỉ của slave và bit dẫn hướng. Byte địa chỉ là byte đầu tiên nhận được sau khi điều kiện START được phát ra từ master. Byte địa chỉ có chứa 7 bit (0b1101000) là địa chỉ của DS1307 bit dẫn hướng (R/W) cho phép ghi khi nó bằng 0. Sau khi nhận và giải mã byte địa chỉ thì thiết bị sẽ phát đi 1 tín hiệu acknowledge lên đường SDA. Sau khi nhận được địa chỉ master sẽ gửi địa chỉ thanh ghi sẽ được ghi vào tới DS1307 , tạo ra một con trỏ thanh ghi trên DS1307 và master sẽ truyền từng byte dữ liệu cho DS1307 sau mỗi bit acknowledge nhận được. Sau đó master sẽ truyền điều kiện STOP khi việc ghi hoàn thành. Hinh 5.5: Quá trình ghi dữ liệu vào DS1307. Giá trị 0xD0 được gửi từ master bao gồm 7 bit 0b1101000 là địa chỉ của DS1307 giá trị này được quy định từ trước và bit cuối cùng là 0 cho phép ghi vào DS1307. 5.5.2 Đọc dữ liệu từ DS1307. Chế độ slave transmitter (đọc từ DS1307) : byte đầu tiên slave nhận được tương tự như chế độ slave nhận. Tuy nhiên trong chế độ này thì bit dẫn hướng lại chỉ chiều truyền ngược lại. Chuỗi dữ liệu được phát đi trên chân SDA của DS1307, trong khi chuỗi xung clock vào đi chân SCL. Các điều kiện START và STOP được nhận dạng khi bắt đầu hoặc kết thúc khung truyền một chuỗi. Byte địa chỉ nhận được đầu tiên khi master phát đi điều kiện START. Byte địa chỉ chứa 7 bit địa chỉ của slave và 1 bit đẫn hướng cho phép đọc là 1. Sau khi nhận và giải mã byte địa chỉ thì thiết bị phát 1 ack lên đường SDA. Đữ liệu về địa chỉ đọc được gửi tới DS1307, chờ tín hiệu ack phản hồi, quá trình đọc DS1307 bắt đầu. DS1307 sẽ nhận được một tín hiệu Not Acknowledge khi kết thúc quá trình đọc. Hịnh 5.6: Quá trình đọc dữ liệu DS1307. 5.5 Sơ đồ ghép nối PIC với DS1307 theo chuẩn I2C Hình 5.6: Ghép nối PIC và DS1307. 5.6 Sơ đồ khối qúa trình khởi tạo và các hàm chức năng cho DS1307. 5.6.1 Khởi tạo đồng hồ thời gian thực. Bắt đầu Cài đặt thời gian (ghi vào DS1307) Cập nhật thời gian (đọc ra từ DS1307) Hiển thị Kiểm tra cài đặt Không Có Hình 5.7: Sơ đồ khối cơ bản việc cài đặt đồng hồ thời gian thực. 5.6.2 Các hàm chức năng. Qúa trình cài đặt thời gian bao gồm giờ, phút, giây, ngày, thứ, tháng, năm, thực hiện dựa vào chế độ slave receiver của DS1307. Các giá trị cài đặt được thực hiện ngay trong chương trình hoặc sử dụng các phím bấm từ khối giao tiếp bên ngoài. Công việc kiểm tra cài đặt có thể sử dụng ngắt ngoài của vi điều khiển, khi đó chỉ còn là quá trình cập nhật thời gian rồi hiển thị. Các giá trị về thời gian trong DS1307 sẽ luôn được cập nhật nếu ít nhất duy trì được 1 nguồn nuôi từ Vcc và Vbat. 5.6.2.1 Hàm cài đặt thời gian cho đồng hồ. Đoạn code sau viết bằng ngôn ngữ C trên trình dịch CCS v5.068 cho ta quá trình cài đặt thời gian ban đầu cho đồng hồ /////////////// Cai thoi gian ////////////// i2c_start(); //bắt đầu i2c_write(0xD0); //Cho phép ghi vào DS1307 i2c_write(0x00); //Bắt đầu từ thành ghi 0 i2c_write(set_sec(sec)); // thanh ghi 0 i2c_write(set_min(min)); // thanh ghi 1 i2c_write(set_hour(hr)); // thanh ghi 2 i2c_write(set_dow(dow)); // thanh ghi 3 i2c_write(set_day(day)); // thanh ghi 4 i2c_write(set_mth(mth)); // thanh ghi 5 i2c_write(set_year(year)); // thanh ghi 6 i2c_write(0x80); //thanh ghi7 -bo qua phat xung i2c_stop(); /////////////////////////////////////////////// 5.6.2.2 Hàm cập nhật thời gian từ đồng hồ. Sau khi cài đặt thời gian, đồng hồ bên trong DS1307 đã chạy. Muốn cập nhật thông tin từ đồng hồ, cần phải truy xuất tới IC đọc các giá trị trong các thanh ghi, các giá trị này sẽ cho ta các thông số chính xác về thời gian. Để làm được điều này phải sử dụng chế độ “slave transmitter”. Vi điều khiển gửi chỉ thị START sau đó là giá trị 0xD1, khi giá trị này tới DS1307, IC cho phép đọc các thanh ghi bắt đầu tư địa chỉ được đưa tới cho tới khi có chỉ thị STOP dừng quá trình đọc. Đoạn code sau sẽ cho ta thực hiên thao tác đó. ///////////////Doc dữ liệu DS1307/////////// i2c_start(); i2c_write(0xD0); //Gui dia chi cua slave i2c_write(0x00); //thiet lap lai con i2c_stop(); I2C_start(); I2C_write(0xD1); /* gui lenh doc du lieu */ sec = i2c_read(1); /* bat dau tu thanh ghi 0*/ min = i2c_read(1); hour = i2c_read(1); //che do 24h ko can AND dow = i2c_read(1); date = i2c_read(1); month = i2c_read(1); year = i2c_read(0); i2c_stop(); //////////////////////////////////////////// 5.7 Giao tiếp I2C mềm. Trong một số trường hợp các vi điều khiển không có khối giao diện I2C để điều khiển truyền nhận dữ liệu với slave, master hoặc như có nhưng đã sử dụng vào một ứng dụng khác. Khi đó ta hoàn toàn có thể sử dụng các chân khác của vi điều khiển và dùng phần mềm viết một khối giao tiếp I2C cho vi điều khiển. Tuy công việc này có hơi mất công tuy nhiên ta có thể tạo ra nhiều hơn 1 giao diện I2C ở trên vi điều khiển thuận tiện cho việc ghép nối với các ngoại vi sử dụng giao thức truyền dữ liệu theo loại này. Vi điều khiển PIC18F458 có một khối giao diện I2C các chân được sử dụng là PIN_C3 (SCL) và PIN_C4 (SDA) tuy nhiên các chân này lại được sử dụng vào mục đích ghép nối với thẻ nhớ MMC trong giao diện SPI, giao diện SPI các chân được sử dụng PIN_C3 (CLK), PIN_C4 (DI), PIN_C5 (DO), được trình bày rõ ở chương về MMC. Vì vậy I2C mềm được lựa chọn để ghép nối DS1307 với vi điều khiển 5.7.1 Các bước thực hiện. Để có được khối I2C mềm phải thực hiện các bước sau: Định nghĩa các chân được sử dụng cho ghép nối. Tạo ra các hàm bao gồm : khởi tạo giao thức, kết thúc giao thức, hàm đọc dữ liệu, hàm ghi dữ liệu và 1 số hàm phụ khác. 5.7.2 Hàm thư viện của khối I2C mềm. Để viết được hàm thư viện cho khối giao tiếp I2C trước hết ta phải biết về cơ chế truyền dữ liệu theo chuẩn này là như thế nào ? Hoạt động theo các bước sau: Ban đầu tín hiệu SDA và SCL cùng ở mức cao Quá trình giao tiếp bắt đầu bằng việc chuyển mức tín hiệu của SDA từ cao xuống thấp (HàL). Dữ liệu bắt đầu truyền khi SCL ở mức thấp. Thời gian của dữ liệu kéo dài trong 1 chu kỳ xung SCL. Số lượng bít truyền trong 1 khung tùy thuộc thiết bị Quá trình truyền nhận kết thúc khi SCL ở mức cao và tín hiệu SDA chuyển từ thấp lên cao (LàH). Hình 5.8: Giản đồ xung của chuẩn I2C. Dữ liệu khi đọc ghi DS1307 có độ dài 1 byte với bit MSB đi đầu. Sau khi tạo được các hàm ta chỉ cần đính thư viện vào trong chương trình và sử dụng chúng như một khối giao diện cứng. Đoạn code mô tả quá trình đọc ghi dữ liệu của DS1307 theo chuẩn I2C. ///////////////Tao giao dien I2C////////////// #define SDA_PIN RB5 // RB.5 #define SCL_PIN RB4 // RB.4 #define SDA_DIR trisb5 #define SCL_DIR trisb4 /////cac ham duoc su dung///// int8 i2c_read(void); void i2c_write(byte o_byte); void i2c_nack(void); void i2c_start(void); void i2c_stop(void); void i2c_high_sda(void); void i2c_low_sda(void); void i2c_high_scl(void); void i2c_low_scl(void); //////////////////////////////////////////// byte i2c_read(void){ byte i_byte, n; i2c_high_sda(); for (n=0; n<8; n++){ i2c_high_scl(); if (SDA_PIN){ i_byte=(i_byte << 1)|0x01; // msbit trước } else{ i_byte = i_byte << 1; } i2c_low_scl(); } return(i_byte); } ////////////////////////////////////////////// void i2c_write(byte o_byte){ byte n; for(n=0; n<8; n++){ if(o_byte&0x80){ i2c_high_sda(); } else{ i2c_low_sda(); } i2c_high_scl(); i2c_low_scl(); o_byte = o_byte << 1; } i2c_high_sda(); } //////////////////////////////////////////////// ======================================================= CHƯƠNG 6: MMC VÀ ỨNG DỤNG ĐỌC GHI DỮ LIỆU MultiMediaCards (MMC) là loai bộ nhớ nối tiếp dạng Flash được tích hợp cao và có khả năng truy xuất dữ liệu ngẫu nhiên. Nó được đọc ghi thông qua một giao diện nối tiếp rõ ràng vì vậy việc truyền dữ liệu tỏ ra nhanh chóng và an toàn. Những thẻ MMC có hệ thống các tiểu chuẩn về đặc tính kỹ thuật như điện áp số chân…, đã được định nghĩa. MultiMediaCards là một phát kiến mới trong thiết bị lưu trữ dựa trên công nghệ bán dẫn. Nó được phát triển để tạo ra những thiết bị lưu trữ rẻ và có dung lượng trung bình, ứng dụng cho các phương tiên giải trí đa phương tiện. Hinh 6.1: Cấu trúc của MMC. Hình 6.2: Hình ảnh thực tế của MMC và RS-MMC. 6.1 Chuẩn giao tiếp của MMC. MultiMediaCards có thể hoạt động trong hai loại chuẩn khác nhau như sau: MultiMedia card Mode SPI Mode Cả hai cách chuẩn (mode) sử dụng các chân giống nhau. Mặc định khi ghép nối là mode MultiMediaCard. SPI mode chỉ được lựa chọn khi kích hoạt chân CS và gủi đi CMD0. 6.1.1 MultiMediaCard Mode. Trong chuẩn MultiMedia card dữ liệu được truyền trên số đường dây nhỏ nhất. Trong trường hợp này dữ liệu là lệnh sẽ được truyền trên một đường dây riêng còn dữ liệu trên một dây riêng. CLK: với mỗi chu kỳ của tín hiệu này 1bit lệnh và dữ liệu sẽ được truyền trên đương dây. Tần số có thể thay đổi từ 0 đến 20Mhz. CMD: là kênh truyền lệnh 2 hướng sử dụng cho việc khởi tạo card và truyền dữ liệu là lệnh. Những lệnh được gửi đi từ bus master tới MultiMedia card và đáp ứng ngược trở lại cũng chạy trên đường này. DAT: cũng là một kênh song hướng dung để truyền dữ liệu. RSV: chân này được kéo lên nguồn với điện trở 2MΩ. Hinh 6.3: Ghép nối MMC với host với MultiMediaCard mode Các chân trong chuẩn MultiMedia card được mô tả như sau: Chân Tên Loại Mô tả 1 RSV NC Không sử dụng 2 CMD I/O/PP/OD Lệnh/Đáp ứng 3 Vss S Nguồn (Đất) 4 Vdd S Nguồn 5 CLK I Xung clock 6 Vss S Nguồn (Đất) 7 DAT I/O/PP Dữ liệu S: power supply; I: input; O: output; PP: push-pull; OD: open-drain; NC: not connected 6.1.2 SPI Mode. SPI (Serial Peripheral Interface) là giao tiếp nối tiếp đồng bộ được biết đến đầu tiên ở các vi điều khiển của hãng Motorola. Các thẻ nhớ MMC trên thị trường đều tương thích với chuẩn SPI này. Giống như các thiết bị khác sử dụng chuẩn này, ghép nối của MMC như sau: CS: tín hiệu lựa chọn chip (chip select) tới thẻ . CLK: tín hiệu xung nhịp (clock) tơi thẻ. DataIn: tín hiệu dữ liệu truyền tới thẻ. DataOut: tín hiệu dữ liệu đọc từ thẻ. Đặc tính chung của chuẩn SPI là truyền dữ liệu theo byte và thẻ nhớ cũng không phải là một ngoại lệ. Tất cả dữ liệu được biểu diễn thành những byte có độ dài 8 bit và được đồng bộ theo tín hiệu CS. Các chân trong chuẩn SPI được định nghĩa như bảng sau: Chân Tên Loại Mô tả 1 CS I Lựa chọn chip 2 DI I/PP Dữ liệu vào 3 Vss S Nguồn (Đất) 4 Vdd S Nguồn 5 CLK I Xung clock 6 Vss S Nguồn (Đất) 7 DAT I/O/PP Dữ liệu ra 6.2 Sơ đồ ghép nối MMC với PIC và một số linh kiện được sử dụng. 6.2.1 Sơ đồ ghép nối. Hình 6.4: Sơ đồ ghép nối modun MMC với PIC 6.2.2 CD4050 và LM1117-3.3V. 6.2.2.1 CD4050. Là vi mạch cho phép chuyển giá trị điện áp từ mức CMOS ra TTL, đầu vào của IC được nối tới vi điều khiển, giá trị điện áp đầu ra là mức TTL phù hợp với MMC. Hình 6.5: Mô hình vi mạch CD4050. Hình 6.7: Cách ghép nối cho chức năng chuyển đổi mức điện áp. 6.2.2.2 LM1117-3.3V. Với vi mạch này cho ta lối ra ổn áp 3,.3V là điện áp nuôi MMC. Hinh 6.8: Vị trí chân và cách đóng gói vi mạch. Hình 6.9: Cách ghép nối cho điện thế đầu ra ổn ap 3,3V 6.3 Đặc tính của MMC trong chuẩn SPI. SPI mode được lựa chọn cho ứng dụng của đề tài, khi đó MMC được ghép nối với vi điều khiển cụ thể là PIC18F458 theo đúng khối phần cứng được tích hợp sẵn trên PIC. Trong mode hoạt động này có 4 loại tín hiệu được sử dụng giao tiếp với host (PIC) là: clock, data in, data out, chip select. Clock : được dùng để duy trì sự đồng bộ giữa hệ thống và card. Data in: sử dụng khi truyền lệnh từ host tới thẻ, đồng thời cũng được dùng vào mục đích ghi dữ liệu vào thẻ. Data out: được dùng với mục đích ngược với data in là gửi đáp ứng từ thẻ về host và đọc dữ liệu từ thẻ. Chip select: tín một thể cụ thể sẽ được lựa chọn khi tín hiệu này kích hoạt trên nó. Dưới đây sẽ là hình ảnh minh họa quá trình truyền nhận dữ liệu giữa vi điểu khiển PIC với thẻ MMC sử dụng chuẩn SPI. Hình 6.10: Truyền nhận dữ liệu theo chuẩn SPI. Chuẩn SPI của MMC cho phép truyền dữ liệu theo 1 khối (single block) hoặc nhiều khối (multiple block). Kích thước tối đa của khối dữ liệu này có thể thay đổi tuy hãng sản xuất nằm trong khoảng từ 1- 2048 byte. Hinh 6.11: Truyền dữ liệu theo từng khối Các gói dữ liệu truyền nối tiếp nhau với các lệnh điều khiển CMD17 và CMD24 . Kiểm tra lỗi CRC: CRCs (cycle redundancy codes) được thêm vào khung truyền lệnh, đáp ứng, và dữ liệu của MMC. CRC sẽ được kích hoạt để phát hiện lỗi trước khi truyền dữ liệu, cho phép truyền lại khi một lỗi được tìm thấy. CRC nâng cao độ tin cậy của hệ thống. Trong MMC mode, CRCs là bắt buộc, 7 bit CRC được thêm vào mỗi lệnh và 16 bit CRC với 512 byte dữ liệu. Với SPI mode, CRC là một tùy chọn. 6.3.1 Các thanh ghi của MMC. Bảng danh sách các thanh ghi trong MMC. Tên thanh ghi Độ dài Mô tả OCR Operation conditions register 32 bit Định nghĩa điện thế của hệ thống MMC 1 bit = 10mV CID Card indentification register 128 bit Thông tin về nhà sản xuất, OEM, ID của thẻ. RCA Relative card address register 16 bit Sử dụng để đặt tên cho thẻ từ host CSD Card specific data register 128 bit Lưu trữ nhưng thông tin riêng của thẻ, Sự phù hợp với CIS của PCMCIA DSR Driver stage register 16 bit Sử dụng để thiết lập thông lượng trên MMC bus Status register 32 bit Chỉ thi trạng thái và tình trạng của lỗi 6.3.2 Định dạng khung lệnh của MMC. Dữ liệu nối tiếp [47] Lệnh [0] Bảng sau cho ta chi tiết ý nghĩa của các bit: Vị trí bit 47 46 [45:40] [39:8] [7:1] 0 Số bit 1 1 6 32 7 1 Giá trị 0 1 X X X 1 Mô tả Bit start Bit truyền Chỉ số lệnh Đối số CRC7 Bit kết thúc Một lệnh gồm 48 bit bit đầu tiên là “bit start” luôn luôn là 0, bit thứ 2 là bit truyền và được đặt bằng 1, 6 bit tiếp theo cho biết chỉ số của lệnh, ví dụ với CMD0 thì 8 bit đầu tiên có giá trị là 01000000b (0x40). Tiếp theo là 32 bit trường đối số có thể là 1 địa chỉ tương đối, địa chỉ đọc hoặc địa chỉ ghi, 8 bit cuối cùng là phần kiểm tra lỗi CRC với bít cuối cùng luôn là 1 6.3.3 Các lệnh được sử dụng. 6.3.3.1 Lớp các lệnh sử dụng. Các lệnh được chia thành các lớp (classes) như basic command, read command, write command và erase command. Bảng sau chỉ rõ điều này Lớp Tên lớp MMC mode SPI mode 6.3.3.2 Chi tiết các lệnh được sử dụng. Đây chỉ là những lệnh cơ bản được xem là cần thiết để 1 MMC có thể hoạt động được trong chế độ SPI. Ngoài những lệnh này còn 1 số lệnh tùy chọn khác. Chỉ số Đối số Đáp ứng Tên tóm tắt Mô tả lệnh CMD0 Không R1 GO_IDLE_STATE Lênh cho phép reset thẻ Nếu lệnh được sử dụng khi chân CS dang ở mưc thấp thì cho phép lựa chon mode hoạt động là SPI. Sau khi có lệnh này thì các lệnh CMD1 và CMD58 mới có thể sử dụng được CMD1 Không R1 SEND_OP_COND Sử dụng để khởi tạo thẻ. Host sẽ tham dò với CMD1 cho tới khi đáp ứng chuyển từ 01h (Busy) sang 00h (Ready). CMD9 Không R1 SEND_CSD Sử dụng để đọc các thông tin trong thanh ghi CSD CMD10 Không R1 SEND_CID Đọc những thông tin từ CID CMD13 Không R2 SEND_STATUS Lệnh cho phép truyền theo thứ tự những thông tin ở thanh ghi trạng thái của thẻ (status register) CMD16 [31:0] Độ dài củ khối R1 SET_BLOCKEN Lệnh dùng để thay đổi độ dài của khối dữ liệu được sử dụng trong các lệnh CMD17 đọc 1 khối (single block read) và CMD24 ghi 1 khôi (single block write). Trong các thẻ nhở thông thương giá trị này mặc định là 512 byte. CMD17 [31:0] Địa chỉ dữ liệu R1 READ_SINGLE_ BLOCK Lệnh đọc dữ liệu từ thẻ, bắt đầu từ địa chỉ ở đối số và với độ dài được thiết lập ở lênh CMD16 (mặc đinh là 512 byte). CMD24 [31:0] Địa chỉ dữ liệu R1 WRITE_BLOCK Sử dụng để đọc dữ liệu từ thẻ bắt đầu từ địa chỉ ở đối số và độ dài của khối dữ liệu được đọc được cài đặt ở lênh CMD16. CMD27 Không R1b PROGRAM_CSD Lênh sử dụng cho việc lập trình bit programmale (cho phép chương trình hóa) ở trong thanh ghi CSD CMD58 Không R3 READ_OCR Lệnh đọc nội dung của thanh ghi OCR CMD59 [31:1] Stuff bit [0:0] CRC option R1 CRC_ON_OFF Lệnh bật tắt chức năng kiểm tra lỗi CRC. Mặc định trong SPI mode là tắt bit CRC option = 1 à CRC on CRC option = 0 à CRC off 6.3.4 Đáp ứng của các lênh. Như hình 6.10 cho thấy khi mỗi Command được gửi đến MMC trên đường DI từ host, thì sẽ có một Response từ MMC gửi trở lại host qua đường DO. Trong chế độ SPI thì có 2 loại Response là R1 và R2. R2 16 bit là đáp ứng trả về từ MMC khi gửi lệnh CMD13 từ host còn R1 8 bit cho tất cả các lệnh còn lại. Phần 8 bit thấp của R2 hoàn toàn giống với R1 R1, R1b : là đáp ứng với tất cả các lệnh ngoại trừ lệnh SEND_STATUS Dữ liệu nối tiếp Bit 7 Bit 0 Ý nghĩa của các bit: Bit 7: Luôn nhận giá trị 0 Bit 6 : Lỗi tham số Bit 5 : Lỗi địa chỉ Bit 4 : Lỗi chuỗi xóa Bit 3 : Lỗi CRC Bit 2 : Lệnh không hợp lệ Bit 1 : Xóa lại Bit 0 : Trạng thái chờ. R2 : là đáp ứng dành riêng cho lệnh SEND_STATUS (CMD13). Dữ liệu nối tiếp Bit 7 Byte 1 Bit 0 | Bit 7 Byte 2 Bit 0 0 0 Ý nghĩa các bit: Byte 1: Nội dung của byte 1 của R2 hoàn toàn giống với R1. Byte 2: Bit 7 : Luôn là 0 Bit 6 : Thông số xóa Bit 5 : Vi phạm chế độ bảo vệ ghi. Bit 4 : Lỗi ecc thẻ Bit 3 : Lỗi CC Bit 2 : Lỗi Bit 1 : Bỏ qua chế độ bảo vệ ghi hoặc lỗi lệnh khóa/mở khóa thẻ Bit 0 : Khóa thẻ Các thông số trên nhận được khi các bit có giá trị là 1. 6.4 Khởi tạo MMC trong chế độ SPI. Quá trình khởi tạo trong chế độ SPI: Sau khi cấp nguồn MMC hoạt động ở MMC mode. Để chuyển sang SPI mode cần phải thực hiện quy trình sau: Cấp điện áp cho thẻ nhớ đợi trong vòng ít nhất là 1ms, thiêt lập DI và CS ở mức cao, sau khoảng 74 xung được gửi tới chân SCLK thì thẻ nhớ sẽ cho phép lệnh. 6.4.1 Thiết lập lại phần mềm. Gửi lệnh CMD0 với chân CS ở mức thấp để reset thẻ. MMC lấy mẫu tín hiệu CS khi lệnh CMD0 được phát hiện sử dụng. Nếu tín hiệu CS ở mưc thấp thì thẻ nhớ sẽ hoạt động ở chế độ SPI. Lệnh CMD0 phải là lệnh đầu tiên, trường CRC phải có giá trị hợp lệ, với lệnh CMD0 thì CRC là 0x96. Khi vào hoạt động ở chế độ SPI, thì mã kiểm tra CRC được vô hiệu hóa. Sau khi lệnh CMD0 được chấp nhận, thẻ nhớ sẽ rơi vào trạng thái chờ (idle state) một đáp ứng R1 sẽ được gửi trở lại host. Giá trị của của bit idle state là 1, byte R1 là 0x01. CRC cũng có thể cho phép lại bằng lệnh CMD59. 6.4.2 Khởi tạo. Với trạng thái chờ (idle state), thẻ nhớ chỉ cho phép các lệnh CMD0, CMD1, và CMD58. Những lệnh khác sẽ bị loại bỏ. Khi thẻ phát hiện ra CMD1 nó sẽ bắt đầu quá trình khởi tạo. Để kết thúc việc thăm dò khi khởi tạo thẻ, mạch điều khiển của host phải lặp lại quá trình gửi CMD1 và kiểm tra đáp ứng. Khi đã khởi tạo thành công, thì bit “In Idle State” trong đáp ứng R1 được xóa về 0. Xử lý qúa trình khởi tạo có thể mất tới vài trăm ms (milliseconds). Sau khi quá trình khởi tạo kêt thúc thì việc đọc/ghi sẽ được chấp nhận. Trong thời gian này, OCR và CSD có thể được đọc để cấu hình các thuộc tính của thẻ. Ban đầu giá trị về độ dài của 1 khối có thể lớn hơn 512 byte, vì vậy nếu muốn thay đổi giá trị này ta sử dụng CMD16. Quá trình trên có thể mô tả bắng sơ đồ: Hình 6.12: Sơ đồ khối khởi tạo MMC CMD0 Trạng thái đợi (Idle state) CMD1 Trạng thái không hoạt động Trạng thái sẵn sàng Bận hoặc điện thế không phù hợp Điện thế không phù hợp Đoạn code sau sẽ mô tả quá trình khởi tạo thẻ. /////////////////////////////////////////////////////// int1 MMC_Initialize(void) {    int8 i, r1;    output_high(PIN_C7);   //tat lua chon MMC    for(i=0; i < 20; i++)       spi_write(0xFF);    output_low(PIN_C7);    //delay_ms(20);    if(MMC_Command(0x40,0,0,0x95, 1, 99) != 1) goto ErrorMMC; MMCLoop:    r1 = MMC_Command(0x41, 0, 0, 0xFF, 0, 0x40);    //LCD_SetCursor(0,6);    //printf(LCD_putc, "41_R1: %X", r1);    if(r1 != 0) {       goto MMCLoop;    }    spi_write(0xFF);    output_high(PIN_C7);    spi_write(0xFF);    return TRUE; ErrorMMC:    output_high(PIN_C7);    spi_write(0xFF);    return FALSE; } //////////////////////////////////////////////////////// 6.5 Quá trình đọc ghi khối dữ liệu đối với MMC trong SPI mode. Hình 6.13: Đọc ghi dữ liệu theo từng block. Còn đây là code để thực hiện 2 công việc trên Với lệnh ghi CMD24 thì 8 bit đầu tiên của khung lệnh là “0101 1000B” giá trị này trong hệ hexa là 0x58, còn với lệnh đọc CMD17 thì 8 bit đó sẽ là “0101 0001B” trong hệ hexa là 0x51. /////////////////Ghi 512 byte du lieu///////////////////// if (Command(0x58,0,512,0xFF) !=0) puts("Write error "); SPI(0xFF); SPI(0xFF); SPI(0xFE); SPI("Begin\n\r");   // 7 ky tu     for(i=0; i < 500; i++){   // con 512 ky tu    SPI('M'); } SPI("\n\rEnd");   // 5 ky tu SPI(255);       SPI(255); i=SPI(0xFF); i &=0b00011111; if (i != 0b00000101) puts("Write Error "); while(SPI(0xFF) !=0xFF);//doi qua trinh xu ly ket thuc //************************************* /////////////////Doc 512 byte////////////////////// if (Command(0x51,0,512,0xFF) !=0) puts("Read Error "); while(SPI(0xFF) != 0xFE);    for(i=0; i < 512; i++) {      putc(SPI(0xFF));      // gui du lieu } SPI(0xFF);     //gui 2 byte gia tri 255 de ket thuc SPI(0xFF); /////////////////////////////////////////////////////// 6.6 Hệ thống tệp tin. Qúa trình ghi dữ liệu lên thẻ có thể thực hiện theo 2 cách là ghi theo kiểu nhị phân (raw) hoặc theo kiểu hệ thống định dạng tệp tin (FAT). Với cách ghi theo kiểu nhị phân dữ liệu sẽ được ghi lần lượt vào thẻ nhớ, với cách ghi này nếu trót lỡ ghi vào master boot record (MBR) ở sector0 thì khả năng thẻ nhớ không thể sử dụng được là rất cao. Mặt khác với cách ghi raw thì khi cắm thẻ nhớ vào đầu đọc thẻ trên máy tinh thì Window sẽ không cho phép sử dụng thiết bị và bắt định dạng (reformat). Định dạng thẻ theo hệ thống tập tin (FAT) sẽ cho phép ta xem các dữ liệu đã ghi lên thẻ trên máy tính. Với cách ghi này dữ liệu chỉ được ghi vào vùng dữ liệu được quy ước trên thẻ. Một số hệ thống định dạng tệp tin mà hệ điều hành Windows sử dụng là FAT12, FAT16, FAT32, NTFS. Theo tiêu chuẩn ISO/IEC 9293 hệ thống lưu trữ dữ liệu trên các sector. Mỗi một sector có độ dài là 512 byte. Một nhóm các sector cho ta 1 cluster. Sector đầu tiên ở trên thẻ là Master Boot Record (MBR). MBR chứa thông tin về các phân vùng. Mỗi phân vùng này được định dạng với một hệ thông tệp tin duy nhất. Đặc trưng của SD card và MMC là chỉ có một phân vùng được kích hoạt. Thông tin phân vùng gồm có: Boot sector FAT regions Root Directory region Data region n : số bảng FAT Hình 6.14: Cấu trúc bộ nhớ MMC Sector khởi động (boot sector): là sector đầu tiên của mỗi phân vùng, ở đây chứa những thông tin cơ bản về loại hệ thống tệp tin. Vùng FAT (FAT region): là một bản đồ thực tế ở trên thẻ, cho biết những cluster nào được chỉ định trong vùng dữ liệu (data region). Thông thường có 2 bản sao chép của FAT ở trong vùng FAT (FAT region). Vùng thư mục gốc (root directory region): nằm tiếp theo vùng FAT chứa danh sách các file và thư mục ở trên thẻ. Vùng dữ liệu (data region): 3 phần trên là vùng hệ thống. Khoảng trống còn lại trên là vùng dữ liệu. Dữ liệu trên vùng này còn nguyên vẹn nếu không bị xóa hoặc ghi đè. Hệ thống FAT16 sử dùng 16 bit cho mỗi “FAT entry”, cho phép đánh dấu được khoảng chừng 66.536 (216) cluster. Có 1 byte trong boot sector định nghĩa số sector trên một cluster. Với hệ thống tệp tin FAT16 thì có thể hỗ trợ thể hỗ trợ tối đa phân vùng là 2GB. Hình sau chỉ ra cấu trúc bộ nhớ của MMC 6.6.1 Master Boot Record. MBR chứa những thông tin được sử dụng khi khởi động thẻ, cũng như thông tin về phân vùng. Những thông tin trong master boot record đã được chương trình hóa từ khi sản xuất. Những cố gắng để ghi vào MBR có thể làm thẻ không thể dùng được. Nội dung của MBR chỉ ra ở bảng sau. Địa chỉ byte Miêu tả Kích thước 000h Boot code 446 byte 1BEh Partition Entry 1 16 bytes 1CEh Partition Entry 2 16 bytes 1DEh Partition Entry 3 16 bytes 1EEh Partition Entry 4 16 bytes 1FEh Boot Signature Code (55h AAh) 2 bytes 6.6.1.1 Mục phân vùng trên MBR. Thông tin về một phân vùng trên thẻ được chứa trong mục bảng phân vùng trên master boot record. Một mô tả hệ thống tệp tin được chứa trong mục này để chỉ ra loại hệ thống file được sử dụng khi định dạng thẻ. Đối với MMC thì chỉ có một phân vùng được hoạt động. Bảng sau đưa ra nội dung mục bảng phân vùng. Địa chỉ byte Ý nghĩa Kích thước 00h Boot Descriptor (bằng 80h nếu phân vùng hoạt động, 00h nếu không hoạt động 1 byte 01h Sector đầu tiên của phân vùng 3 byte 04h Miêu tả hệ thống tệp tin 1 byte 05h Sector cuối cùng của phân vùng 3 byte 08h Số sector ở giữa MBR và sector đầu tiên của phân vùng 4 byte 0Ch Số sector trong phân vùng 4 byte 6.6.2 Sector khởi động. Sector khởi động (boot sector): là sector đầu tiên của của một phân vùng, chứa các thông tin về hệ thống tệp tin được sử dụng trong phân vùng đó và một số thông tin quan trọng khác. Mục đầu tiên trong boot sector là một lệnh nhảy để bỏ qua những thông tin khởi động. Nội dung chi tiết của boot sector được cho ở bảng sau. Địa chỉ byte Ý nghĩa Kích thước 00h Lệnh nhảy 3 byte 03h Tên OEM 8 byte 0Bh Số byte trên một sector 2 byte 0Dh Số sector trên một cluster 1 byte 0Eh Số sector của vùng để dành 2 byte 10h Số bảng phân bố dữ liệu (FAT) 1 byte 11h Số để mục trong thư mục gốc 2 byte 13h Tổng số sector (bit 0 – 15 trên tổng số 48 bit) 2 byte 15h Môi trường thẻ 1 byte 16h Số sector của một FAT 2 byte 18h Số sector trên một Track 2 byte 1Ah Sô head 2 byte 1Ch Số sector ẩn 4 byte 20h Tổng số sector (bít 16 – 47) 4 byte 24h Số ổ vật lý 1 byte 25h Head hiện tại 1 byte 26h Chữ ký khởi động 1 byte 27h ID của phân vùng 4 byte 2Bh Nhãn của phân vùng 11 byte 36h Loại hệ thồng file ( không được chỉ rõ) 8 byte 1FEh Chữ ký của hệ điều hành (55h, AAh) 2 byte 6.6.3 Thư mục gốc. Thư mục gốc (root directory) nằm ngay sau vùng FAT ở trong phân vùng, được chia thành các đề mục (entry) kích thước 32 byte để lưu trữ thông tìn về tệp tin và thư mục. Mỗi một entry chứa tên file, kich thước file, cluster đầu tiên của file, thời gian mà file được tạo ra hoặc đựợc bổ sung sữa chữa. Địa chỉ byte Ý nghĩa Kích thước 00h Tên file 8 byte 08h Đuôi mở rộng của file 3 byte 0Bh Thuộc tính của file 1 byte 0Ch Dữ phòng 1 byte 0Dh Thời gian tao file (phần ms) 1 byte 0Eh Thời gian tạo file ( giờ, phút, giây) 2 byte 10h Ngày tạo ra 2 byte 12h Ngày truy xuất cuối cùng 2 byte 14h Địa chỉ mở rộng 2 byte 16h Thời gian của lần sửa cuối cùng ( giờ, phút, giây) 2 byte 18h Ngày sửa cuối cùng 2 byte 1Ah Cluster đầu của file 2 byte 1Ch Kích thước file 4 byte 6.6.4 Bảng phân bố dữ liệu. Bảng phân bố dữ liệu (File Allocation Table) FAT :là một danh sách móc nối sử dụng cùng với bảng thư mục để theo dõi sát vị trí của dữ liệu ( file) trên thẻ và để sắp xếp chỗ trống để lưu trữ các file mới. FAT nằm ngay sau sector khởi đồng và phần để dành. Vùng lưu trữ dữ liệu trên đĩa được chia thành các trang (cluster), cấp phát các vùng nhớ trên đĩa cho file theo từng trang, một file không nhất thiết phải chiếm các trang liên tiếp nhau mà có thể chiếm các trang nằm rải rác trên thẻ. Chính vì lý do này cần phải lưu trữ bản đồ các trang – đó chính là FAT. FAT được chia thành các phần bằng nhau gọi là các đề mục (entry), mọi trang (cluster) trên thẻ đều có một đề mục tương ứng của nó, đề mục chứa một con số chỉ ra số của trang tiếp theo, hoặc một con số biểu diễn trang thái khác của trang. Nội dung các đề mục trong bảng FAT có ý nghĩa như cho ở bảng: Giá trị Ý nghĩa 0000h Báo rằng trang tương ứng còn trống 0001h Để dành 0002 – FFEFh Chỉ trang tiếp theo của file FFF0 – FFF6h Dành cho mục đích khác, không sử dụng FFF7h Trang hỏng FFF8 – FFFFh Trang tương ứng là kết thúc của file. Hình 6.16: Vi dụ phân bố dữ liệu của 1 file. Số đề mục trong FAT phải lơn hơn hoặc bằng số trang trên thẻ, kích thước (số bit) của mỗi đề mục FAT phải chứa được số hiệu trang của trang cuối cùng trên thẻ. Ta có thể hình dung FAT là một cái bảng mà mỗi phần tử là một đề mục. Thông qua nội dung trong các để mục để biết các trang còn trống để cấp phát cho các file, các trang đã cấp là thuộc file nào, trang nào bị hỏng không dùng.v.v. Với định dạng FAT16 thì mỗi đề mục FAT có kích thước 16 bit, do vậy nó chứa được con số lớn nhất là 65536 (216), tùy vào số sector trên 1 cluster mà dung lượng tối đa với định dạng FAT16 này sẽ khác nhau. Ví dụ như 1 cluster = 1 sector, thì dung được của thể được định dạng theo FAT16 là : 216 * 512 byte = 32Mbyte… 6.6.5 Sử dụng hàm khi định dạng thẻ theo FAT16. Có 13 hàm mà người dùng có thể sử dụng để quản lý file và thao tác với thẻ. Bảng sau cung cấp 1 cách tổng quan về các hàm. Tên hàm Ý nghĩa FSInit Là hàm khởi tạo thẻ, nạp vào MBR (thông tin về phân vùng), nạp vào sector khởi và cập nhật những thông sô hợp lệ cho nó FSfclose Hàm này cập nhật thông tin file, ngừng lại việc ghi tới entry và giải phóng RAM. Hàm này cũng cập nhật thông tin về mốc thời gian cho file. FSfoef Hàm phát hiện nếu việc kết thúc của 1 file đã được hoàn thành FSfopen Nếu file đã tồn tại, FSfopen có thể mở nó để ghi thêm vào từ điểm kêt thúc ơ lần mở trước, xóa nó và tạo một file mới cùng tên để ghi vào hoặc đơn giản chỉ là để đọc file. Nếu file không tồn tại, FSfopen có thể tạo ra nó. FSfopenpgm Hàm mở một file trên SD card kết hợp với FSFILE structure (stream). Hàm sử dụng đối số đã định nghĩa trong ROM. Hàm cần thiết cho kiến trúc PIC18. FSfread Hàm sẽ đọc thông tin từ một file mở tới một bộ đệm. Số byte ghi có thể được định nghĩa bằng các tham số. Nếu FSfread được gọi liên tiếp trên cùng 1 file giống nhau thì quá trình đọc sẽ tiếp tục từ điểm dừng ở lần đọc trước. Hàm này trả lại giá trị của dữ liệu đã đọc. FSfwrite Hàm đọc thông tin từ bộ đệm tới 1 file mở. Thuật toán sử dụng là đọc một sector từ vùng dữ liệu trên thẻ tới SRAM. Việc ghi các block với khối dữ liệu lớn, sẽ mất thời gian hơn ta ghi những block giống nhau nhưng block nhỏ. FSremove Hàm tìm kiếm các file cơ sở với tên hợp lệ cho nó. Nếu tìm thấy thì đề mục thư mục gốc được xóa mặt nạ và đề mục FAT được tẩy. FSremovepgm Xóa file được xác định bằng tên cho trước. Nếu file đã được mở với FSfopen, nó phải xóa file đó trước và gọi lai FSremovepgm. Tên file phải được định nghĩa ở trong ROM. Chức năng này chỉ cần thiết với PIC18. FSrewind Hàm thiết lập lại vị trí bắt đầu của file SetClockVars Hàm được sử dụng trong mode đồng hồ đã đước sử dụng có thiết lập thời gian hiện tại. Ngày giờ sẽ được áp dụng cho file mà đã tạo hoặc sử chữa. FSmkdir Thao tác với thư mục, hám sẽ tạo một thư muc con trong thư mục hiện thời. FSchdir Thao tác với thư mục, hàm sẽ thay đổi thư mục làm việc hiện thời thành 1 thư mục được định danh bởi người dùng FSrmdir Thao tác với thư mục, hàm sẽ xóa thư mục được chỉ định bởi người dùng FSgetcwd Thao tac với thư mục, hàm sẽ trả lại giá trị tên của thư mục đang làm việc hiện tại tới người dùng FindFirst Hàm sẽ định vị trí của file trong thư mục hiên thời cái mà phù hợp với tên và thuộc tính được đặt bởi người dùng. Với mỗi file được chỉ định, tên kích cỡ file, ngày giờ tạo, thuộc tính trong cấu trúc SearchRec sẽ được cập nhật với thông tin file chính xác. FindFirstpgm Giống với hàm FindFirst, hàm chỉ cần thiết đối với PIC18 FindNext Hàm định vị trí tiếp theo trong thư mục hiện tại sau khi đã gọi các hàm FindFirst hoặc FindFirstpgm FSformat Hàm sẽ xóa toàn bộ bảng thư mục gốc và bảng phân bố dữ liệu. Khi người dùng gọi hàm này nó sẽ tạo ra một boot sector mới dựa trên những thông tin lấy từ MBR FSfprintf Hàm sẽ ghi 1 chuỗi lên file. Ví dụ: Khởi tạo FAT16 và tạo một file. Đinh dạng MMC với hàm FSinit sau đó gọi hàm FSfopen để tạo 1 file mới, tiếp đến FSfopenpgm được gọi, đây là hàm giống với FSfopen tuy nhiên nó cho phép những thông số ROM. Hàm này thực hiện hành động mở 1 file đã tồn tại trong chế độ đọc. Quá trình tiếp tục với việc đọc 10byte dữ liệu từ file, rồi lại ghi 15 byte tới 1 file mới rồi đóng cả 2 file. Kết thúc công việc là xóa file cũ, để thực hiện được việc xóa file thì phải đảm bảo file đã đươc đóng bằng hàm FSfclose. Đoạn code sau mô tả các công việc trên. /////////////////////////////////////////////// #include #define bfrsize 5 void main(void){ FSFILE *pOldFile, pNewFile; char myData[20]; char bfr [6]; int bytesRead, bytesWritten; char newFile[] = “newfile.txt”; char writeArg = “w”; // khoi tao thu vien FAT16, chuan SPI va cac chan co lien quan if( !FSInit() ) //Loi qua trinh khoi tao FAT16 return 1; // the khong hien dien hoac dinh dang sai // tao 1 file moi pNewFile = FSfopen (newFile, writeArg); // mo 1 file da ton tai va doc pOldFile = FSfopenpgm (“myfile.txt”, “r”); if ( pOldFile == NULL ) return 1; // doc 10 byte du lieu tu file. bytesRead = FSfread((void*)myData,10,1,pOldFile); bytesRead = FSfread((void *)bfr,1,bfrSize, pOldFile); // ghi 15 byte len file bytesWritten = FSfwrite((void *) myData, 10, 1,pNewFile); bytesWritten = FSfwrite((void *)bfr,1, bfrSize, pNewFile); // dong tat ca cac file FSfclose( pOldFile ); FSfclose (pNewFile); //xoa file cu FSremovepgm (“myfile.txt”); } ///////////////////////////////////////////////////////// ===================================================== CHƯƠNG 7: LCD Hầu hết các LCD hiển thị ký tự hiện tại sử dụng bộ điều khiển HD44780 của hãng Hitachi. Bộ điều khiển này có thể dùng để điều khiển hiển thị LCD 16x1, 16x2, 20x2, 20x4.… Phần tiếp sau sẽ giới thiệu tổng quan về LCD 16x2, cách ghép nối với vi điều khiển và điều khiển hoạt động. 7.1 Giới thiệu LCD. LCD sử dụng trong khóa luận là loại 2 dòng và 16 cột, cho phép hiển hiển thị cùng lúc 32 ký tự. Với 14 chân điều khiển và 2 chân mở rộng, sơ đồ chân được chỉ ra ở hinh. Hình 7.1: Ảnh LCD1602. Hình 7.2: Số thứ tự và tên chân tương ứng. 7.1.1 Bảng mô tả các chân của LCD: Số thứ tự Tên Ý nghĩa 1 Vss Đất 2 Vcc Cung cấp nguồn +5V 3 Vee Điều khiển độ tương phản 4 RS 0 = đầu vào là lệnh 1 = đầu vào là dữ liệu 5 R/W 0 = ghi tới LCD 1 = đọc từ LCD 6 EN Chân cho phép 7 D0 Đường dữ liệu 0 (LSB) 8 D1 Đường dữ liệu 1 9 D2 Đường dữ liệu 2 10 D3 Đường dữ liệu 3 11 D4 Đường dữ liệu 4 12 D5 Đường dữ liệu 5 13 D6 Đường dữ liệu 6 14 D7 Đường dữ liệu 7 (MSB) 7.1.2 RAM chứa dữ liệu hiển thị. Display data RAM : lưu trữ dữ liệu hiển thị với mã ký tự 8 bit. Có dung lượng 80 x 8 bit, hoặc là 80 ký tự. Khi gửi dữ liệu đến Display data RAM (DDRAM) giá trị đó sẽ được hiển thị ngay trên LCD. Với LCD 2 x 16, chỉ nhìn thấy được 32 ký tự, vì thế sau ký tự thứ 32 cho dù có ghi tới DDRAM thì giá trị cũng không được hiển thị lên LCD. Vùng DDRAM không dùng cho việc hiển thị có thể sử dụng làm bộ nhớ dữ liệu thông thường. 7.1.3 ROM phát ký tự. Một câu hỏi đặt ra, khi gửi một giá trị ASCII đến DDRAM làm thế nào ký tự đó hiển thị được trên LCD? Câu trả lời đó là Character Generator ROM (CGROM). CGROM tạo ra kiểu dáng ký tự có thể là 5x8 điểm hoặc 5x10 điểm từ 8 bit mã ký tự. Người dùng có thể định nghĩa kiểu dáng của ký tự thông qua mặt nạ chương trình ROM. Bảng dưới đây cho hình dáng hiển thì của ký tự trên màn hình LCD theo kiều 5x8 điểm. Hình 7.3: Bảng các ký tự hiển thị trên LCD. 7.1.4 Thanh ghi chỉ thị và thanh ghi dữ liệu. Là 2 thanh ghi 8 bit trong bộ điều khiển HD44780. Thanh ghi chỉ thị lệnh (instruction register) chứa các lệnh được gửi từ vi điều khiển để điều khiển LCD như lệnh dịch LCD, xóa LCD, địa chỉ LCD .v.v.. Thanh ghi dữ liệu (data register) được sử dụng để lưu trữ dữ liệu để hiển thị trên LCD. Khi tín hiệu cho phép gửi của LCD được xác nhận, dữ liệu trên các chân sẽ được chốt tới thanh ghi dữ liệu và dữ liệu này sau đó sẽ được tự động chuyển tới DDRAM và sau đó sẽ hiển thị lên LCD. 7.2 Lệnh và chỉ thị. Chỉ có thanh ghi chỉ thị (instruction register) và thanh ghi dữ liệu (data register) của LCD mới có thể điều khiển được bằng vi điều khiển. Sự hoạt động bên trong của LCD được xác định bằng các tín hiệu được gửi đến từ MCU. Những tín hiệu đó bao gồm : tín hiệu lựa chon thanh ghi, tín hiệu đọc/ghi, và dữ liệu trên bus (D0 tới D7), có 4 loại lệnh của LCD là: Chỉ rõ chức năng của LCD như định dạng hiển thị, độ dài dữ liệu .v.v. Thiết lập địa chỉ RAM trong Thực hiện truyền dữ liệu với RAM trong Thực hiện một số chức năng khác. Bảng sau tóm tắt một danh sách các lệnh thường xuyên sử dụng khi làm viêc với LCD. Số thứ tự Chỉ thị Mã lệnh (hex) Mã lênh (decimal) 1 Thiết lập : 8 bit, 1 dòng, 5x7 điểm 0x30 48 2 Thiết lập : 8 bit, 2 dòng, 5x7 điểm 0x38 56 3 Thiết lập : 4 bit, 1 dòng, 5x7 điểm 0x20 32 4 Thiết lập : 4 bit, 2 dòng, 5x7 điểm 0x28 40 5 Tắt hiển thị, tắt con trỏ 0x08 8 6 Bật hiển thị, bật con trỏ 0x0E 14 7 Bật hiển thị, tắt con trỏ 0x0C 12 8 Bật hiển thị, nhấp nháy con trỏ 0x0F 15 9 Dịch hiển thị sang trái 0x18 24 10 Dịch hiển thị sang phải 0x1C 30 11 Di chuyển con trỏ sang trái 1 ký tự 0x10 16 12 Dich chuyển con trỏ sang phải 1 ký tự 0x14 20 13 Xóa hiểm thị đồng thời cũng xóa nội dung trong DDRAM 0x01 1 14 Thiết lập địa chỉ DDRAM hoặc vị trí con trỏ hiển thị 0x80 + add 128 + add 15 Thiết lập địa chỉ CGRAM hoặc cài đặt con trỏ tới vùng CGRAM 0x40 + add 64 + add 7.3 Khởi tạo LCD. Trước khi sử dụng LCD vào mục đích hiển thị, thì LCD cần được khởi tạo. Có thể khởi tạo bằng cách dùng mạch reset trong hoặc dùng các lệnh thiết lập cho LCD. Trong khóa luận chỉ đưa ra cách khởi tạo sử dụng lệnh. Qúa trình khởi tạo LCD được chỉ ra ơ lưu đồ. Hình 7.4: Quá trình khởi tạo LCD. Đoạn chương trình sau cho ta quá trình khởi tạo LCD ////////////////////////////////////////////////////////// void LCD_init() {      LCD_data = 0x28;     //thiet lap:2 dong,8-bit,5x7 diem      LCD_rs   = 0;        //lua chon thanh ghi lenh      LCD_rw   = 0;        //dl ghi vao thanh ghi du lieu      LCD_en   = 1;        //cho phep H->L      LCD_en   = 0;      LCD_busy();          //Doi lcd xu ly      LCD_data = 0x0F;     //bat hien thi con tro nhap nhay      LCD_rs   = 0;        //chon thanh ghi lenh      LCD_rw   = 0;        /du lieu ghi vao thah ghi du lieu      LCD_en   = 1;        //cho phep H->L      LCD_en   = 0;      LCD_busy();          //cho LCD xu ly      LCD_data = 0x01;     //xoa LCd      LCD_rs   = 0;        //chon thanh ghi lenh      LCD_rw   = 0;        /du lieu ghi vao thah ghi du lieu      LCD_en   = 1;        //cho phep H->L      LCD_en   = 0; LCD_busy();          //cho LCD xu ly      LCD_data = 0x06;          LCD_rs   = 0;        //chon thanh ghi lenh      LCD_rw   = 0;        /du lieu ghi vao thah ghi du lieu      LCD_en   = 1;        //cho phep H->L      LCD_en   = 0; LCD_busy();          // cho LCD xu ly } ///////////////////////////////////////////////////////// 7.4 Các hàm thao tác cơ bản với LCD. 7.4.1 Cờ bận và đọc cờ bận. Busy Flag : là cờ chỉ thị trạng thái cho LCD. Khi gửi 1 lệnh hoặc dữ liệu tới LCD để xử lý thì cờ này được bật (BF =1). Quá trình kết thúc cờ này được xóa về không (BF = 0). Để đọc được cờ BF thì điều kiện là RS = 0 và R/W = 1, bit MSB của dữ liệu LCD (D7) chứa giá trị nhận được của BF. Khi BF = 1 có nghĩa là LCD đang bận và sẽ không nhận bất cứ lệnh nào, còn khi BF = 0 cho biết LCD đã sẵn sàng nhận lệnh hoặc dữ liệu để xử lý. Khi gửi lệnh thì BF hoặc D7 của LCD sẽ nhận giá trị 1 thông báo LCD đang bận xử lý, quá trình kết thúc BF = 0. Các bước sau chỉ ra quá trình đọc cờ bận. Lựa chọn thanh ghi lệnh Lựa chọn thao tác đọc Gửi tín hiệu cho phép Đọc cờ. Đoạn code sau sẽ cho ta qúa trình đọc cờ bận /////////////////////////////////////////////////////// void LCD_busy(){      LCD_D7   = 1;            LCD_en   = 1;                LCD_rs   = 0;                LCD_rw   = 1;           //cho phep doc    while(LCD_D7){          //doc lai co ban cho toi khi nhan gia tri 0            LCD_en   = 0;     //cho phep       LCD_en   = 1;      } } /////////////////////////////////////////////////// Thao tác đọc cờ bận có thể thay thế bằng một khoảng thời gian trễ của hệ thống, để quá trình xử lý trên LCD hoàn thành. Có thể dùng hàm sau: ///////////////////////////////////////////////////// void LCD_busy(){          unsigned char i,j;          for(i=0;i<50;i++)    //mot vong lap don gian            for(j=0;j<255;j++); } ///////////////////////////////////////////////////// 7.4.2 Gửi lệnh và dữ liệu đến LCD. Gửi lệnh: qúa trình gửi lệnh thực hiện giống hệt như trong hàm khởi tạo có thể xây dựng hàm con với các bước sau: Di chuyển dữ liệu tới cổng của LCD Lựa chọn thanh ghi lệnh Lựa chọn thao tác ghi Gửi tín hiệu cho phép Đợi cho LCD xử lý Đây là hàm mô tả quá trình trên: ///////////////////////////////////// void LCD_command(unsigned char var){      LCD_data = var;// var la lenh can thao tac       LCD_rs   = 0      LCD_rw   = 0;              LCD_en   = 1;              LCD_en   = 0;      LCD_busy() } /////////////////////////////////////// 7.4.3 Cài đặt vị trí con trỏ trên LCD. Để thiết lập vị trí con trỏ trên LCD, cần gửi tới địa chỉ DDRAM Bit7  6   5   4   3   2   1   0  1   AD6 AD5 AD4 AD3 AD2 AD1 AD0 Bit thứ 7 luôn luôn là 1, các bit từ 0 tới 7 là địa chỉ của DDRAM. Nếu muốn đặt con trỏ tại vị trí đầu tiên tức dòng 1 cột 1, thì địa chỉ sẽ phải là ‘10000000B’ hay 0x80. Với LCD 2 dòng 16 cột, địa chỉ từ 0x80 tới 0x8F cho phép nhìn thấy trên dòng 1 và từ địa chỉ từ 0xC0 tới 0xCF nhìn thấy được trên dòng 2, vùng còn trống của DDRAM vẫn được dùng, tuy nhiên sẽ không nhìn thấy được trên LCD. Để kiểm tra điều này cách đơn giản là xuất 1 chuỗi ký tự lớn hơn 16 và dịch hiển thị thì những ký tự không được nhìn thấy sẽ trở lại từ phía sau. 7.4.4 Gửi dữ liệu tới LCD. Gửi dữ liệu đơn giản chỉ cần lựa chọn thanh ghi dữ liệu, các công việc khác hoàn toàn giống với thao tác gửi lệnh. Được mô tả bằng các bước sau: Di chuyển dữ liệu tới cổng LCD Lựa chọn thanh ghi dữ liệu Lựa chọn thao tác ghi Gửi tín hiệu cho phép Đợi cho LCD xử lý. Qúa trình trên được mô tả bằng đoạn code viết bằng C như sau: ////////////////////////////////////////////// void LCD_senddata(unsigned char var){      LCD_data = var      LCD_rs   = 1;              LCD_rw   = 0;              LCD_en   = 1;              LCD_en   = 0;      LCD_busy(); } ////////////////////////////////////////////// 7.5 LCD hoạt động ở chế độ 4 bit. Có nhiều nguyên nhân của việc chọn sử dụng chế độ 4 bit của LCD trong khóa luận. Một trong số đó là với chế độ này sẽ sử dụng một số ít chân của vi điều khiển để giao tiếp với LCD. Với chế độ 4 bit dữ liệu sẽ được gửi thành các nhóm 4 bit (nible), nible cao sẽ được gửi trước sau đó mới đến nible thấp. Để cho phép LCD hoạt động trong chế độ này thì chuỗi quá trình để khởi tạo là: Đợi khoảng 20mS Gửi giá trị khơi tạo lần đầu tiên (0x30) Đợi 10mS Gửi giá trị khởi tạo lần hai (0x30) Đợi 1mS Lựa chọn chế độ 4 bit (0x02) Đợi 1ms Sơ đồ ghép nối: Hình 7.5: Ghép nối LCD ở chế độ 4 bit. 7.5.1 Khởi tạo LCD ở chế độ 4 bit. ///////////////////////////////////////////////// void lcd_reset() {         lcd_port = 0xFF;         delayms(20);         lcd_port = 0x03+LCD_EN;         lcd_port = 0x03;         delayms(10);         lcd_port = 0x03+LCD_EN;         lcd_port = 0x03;         delayms(1);         lcd_port = 0x03+LCD_EN;         lcd_port = 0x03;         delayms(1);         lcd_port = 0x02+LCD_EN;         lcd_port = 0x02;         delayms(1); } void lcd_init () {         lcd_reset();                 lcd_cmd(0x28);               lcd_cmd(0x0C);         lcd_cmd(0x06);         lcd_cmd(0x80);  } //////////////////////////////////////////////////// 7.5.2 Gửi lệnh và dữ liệu tới LCD. //////////////////////////////////////////////////// void lcd_cmd (char cmd) {         lcd_port = ((cmd >> 4) & 0x0F)|LCD_EN;         lcd_port = ((cmd >> 4) & 0x0F);         lcd_port = (cmd & 0x0F)|LCD_EN;         lcd_port = (cmd & 0x0F);         delayus(200);         delayus(200); } void lcd_data (unsigned char dat){         lcd_port = (((dat >> 4) &0x0F)|LCD_EN|LCD_RS);         lcd_port = (((dat >> 4) & 0x0F)|LCD_RS);         lcd_port = ((dat & 0x0F)|LCD_EN|LCD_RS);         lcd_port = ((dat & 0x0F)|LCD_RS);         delayus(200);         delayus(200); } /////////////////////////////////////////////////// ========================================================== CHƯƠNG 8: KẾT QUẢ THỰC NGHIỆM Quá trình làm khóa luận tôi đã xây dựng được mạch với các modul giao tiếp giao bao gồm: giao tiếp bàn phím PS/2, ghép nối cảm biến nhiệt độ LM35, ghép nối với vi mạch thời gian thực DS1307, ghép nối thẻ nhớ MMC và khối hiển thị LCD với vi điều khiển PIC18F458. Ngoài ra còn các modul nguồn cung cấp ổn áp 5V và 3.3V các mạch chuyển mức điện áp…, để thực hiện những yêu cầu mà đề tài đặt ra. Sơ đồ nguyên lý được chỉ rõ ở phụ lục 1. Còn đây là mạch in sau khi thi công. Hình 8.1: Bo mạch sau thi công và hàn linh kiện Đã áp dụng thành công chuẩn nạp ICSP, nạp ngay trên mạch cho vi điều khiển. Sử dụng mạch nạp PICkit2 của Microchip, với chuẩn nạp này cho thời gian nạp chương trình tương đối nhanh, khoảng 30 giây cho chương trình 5 Kbyte. Không mất thời gian tháo chip ra khỏi đế, tránh được đứt chân vi mạch sau một vài lần tháo gắn, nạp tốc độ cao là một số ưu điểm dễ dàng nhận thấy khi sử dụng chuẩn nạp “on board” này. Khi thực hiện khóa luận thì quá trình xây dựng và kiểm tra kết quả được đã thực hiện theo từng modul, gồm các modul đầu vào và đầu ra của dữ liệu, thông tin. Đầu vào gồm có đầu vào dữ liệu từ bàn phím PS/2, đầu vào dữ liệu từ sensor nhiệt độ LM35 và dữ liệu đọc từ vi mạch thời gian thực DS1307. Với đầu vào dữ liệu từ bàn phím PS/2 đã thực hiện ghép nối trên bo mạch thiết kế, giao tiếp được thể hiện qua việc gõ các ký tự trên bàn phím và các ký tự này được hiển thị trên màn hình LCD các chuỗi ký tự được lưu vào trong thẻ nhớ sau khi bấm “enter”. Hình 8.2: Kết quả thức hiện giao tiếp với bàn phím PS/2. Đầu vào dữ liệu từ sensor nhiệt độ LM35 qua bộ chuyển đổi tương tự - số của PIC và quá trình tính toán, cho ta giá trị nhiệt độ tính theo thang bách phân Cecilus được hiển thị lên màn hình LCD, và sau đó cũng được lưu vào trong thẻ nhớ với một khoảng thời gian định kỳ được ấn định tùy thuộc mục đích và người lập trình. Dữ liệu về thời gian: Sau thiết lập thời gian cho vi mạch thời gian thực DS1307, các giá trị được ghi vào NVRAM do vậy sẽ không bị mất bi mất điện và đồng hồ của vi mạch sẽ chạy chừng nào vẫn còn nguồn cung cấp hoặc từ pin hoặc từ nguồn ngoài. Giá trị về thời gian được đọc ra và cũng được hiển thị lên màn hình LCD để có thể biết được thời gian thực mà hệ thống đang chạy. Dữ liệu này sẽ được lưu cùng với thông số nhiệt độ, và là thành phần có ý nghĩa rất lớn khi ta tổng hợp và phân tích kết qủa thu được từ sensor nhiệt độ. Hình 8.3: Kết quả hiển thị đồng hồ thời gian thực và nhiệt độ Đầu ra gồm có: khối hiển thị LCD, thẻ nhớ MMC lưu dữ liệu và kết qủa Khối hiển thị được tận dụng rất triệt để trong việc thể hiện các thông tin từ các đầu vào, nó thể hiện trung thực các kết quả mà vi điều khiển xuất ra, là một thành phần rất quan trọng để biết hệ thống của mình có chay và chạy có chính xác hay không. Bộ nhớ lưu trữ dữ liệu và kết quả MMC đây là một ứng dụng làm cho đề tài có khả năng triển khai thực tế cao. Với dung lượng nhớ ngày các gia tăng mà giá thành càng giảm, khi được ứng dụng làm tăng thời gian thu thập số liệu, dữ liệu được lưu không bó buộc chỉ là dữ liệu thu thập như khi dùng các bộ nhớ EEPROM truyền thống, ta có thể lưu thêm nhiều trường thông tin khác như thời gian, địa điểm ở nơi khảo sát. Khóa luận đã thành công trong việc ghi dữ liệu vào trong thẻ nhớ và quan sát được dữ liệu này trên máy tính. ====================================== KẾT LUẬN Sau một khoảng thời gian tìm hiểu và nghiên cứu đề tài, đã giúp em nắm vững thêm các kiến thức đã được học, và cũng bổ sung thêm được một khối lượng kiến thức mới về đo lường cũng như các hệ thống đo lường dựa trên vi điều khiển. Từng bước làm quen, nắm bắt và triển khai thực hiện xây dựng mạch nguyên lý và mạch in trên phần mềm Altium Design. Thành công trong việc sử dụng phần mền CCS v4.068 để viết chương trình trên ngôn ngữ C. Sử dụng thành thạo công cụ mô phỏng Proteus để thực hiện mô phỏng một số phần việc trước khi triển khai lên mạch thật…. Đề tài thể hiện được tính ứng dụng cao, dễ dàng đưa vào triển khai trong thực tế và có thể áp dụng với quy mô lớn trong việc đo lường và lưu trữ các thông số môi trường. Ứng dụng. Với hệ thống như trên có thể ứng dụng trên nhiều trong thực tế. Ví dụ có thể dùng lấy số liệu trong một thời gian dài về nhiệt độ của một khu vực để vẽ biểu đồ nhiệt độ phục vụ cho công tác cảnh báo cháy rừng….Hay như với đầu đo không phải là nhiệt độ mà là độ ẩm thì lại dùng cho nghiên cứu khí tượng, còn nều muốn đo sự biến đổi mức nước của một dòng sông ta có thể dùng đầu đo độ sâu… Đầu đo nhiệt đồ chỉ là một ví dụ cụ thể cho ứng dụng này, nhằm mục đích nhanh cho kết quả để thử nghiệm. Có thể thay thế bằng bất kỳ đầu đo nào tùy vào mục đích và ứng dụng cụ thể. Hướng phát triển. Sau khi thực hiện thành công hệ thống với đầu đo nhiệt độ, nếu có điều kiện em sẽ triển khai hệ thống với những đầu đo khác để có thể áp dụng cho nhiều môi trường xung quanh chúng ta. Một vấn đề khác là vấn đề nguồn nuôi và năng lượng để duy trì hệ thống khi nguôn nuôi không phải là từ điện lưới qua biến đổi AC - DC, có thể đó là pin lithium hay pin năng lượng mặt trời…, khi đó vấn đề tiết kiệm năng lượng cho hệ thống mà vẫn duy trì sự hoạt động ổn định của hệ thống là bài toán khá phức tạp cần phải được tính đến. Một trong những hướng giải quyết là sử dụng các vi mạch có mức tiêu thụ năng lượng thấp, hoặc như có những cơ chế như “sleep” cho vi điều khiển, vi điều khiển sẽ “ngủ” khi các thành phần khác của hệ thông hoạt động và chỉ được đánh thức khi có nhu cầu xử lý…. Cuối cùng là việc nghiên cứu để có thể áp dụng được định dạng thẻ theo hệ thống tập tin FAT32. Với FAT16 giới hạn thẻ nhớ có dung lượng nhỏ hơn 2 Gbyte, còn với FAT32 thẻ nhớ có thể có dung lượng lên tới 8TByte, với con số nay thì không phải nghi đến việc ghi được trong bao lâu mà là ghi những cái gì! ============================================ PHỤ LỤC 2: Keyboard Scan Codes: Set 2 101-, 102-, and 104-key keyboards: KEY MAKE BREAK ----- KEY MAKE BREAK ----- KEY MAKE BREAK A 1C F0,1C 9 46 F0,46 [ 54 FO,54 B 32 F0,32 ` 0E F0,0E INSERT E0,70 E0,F0,70 C 21 F0,21 - 4E F0,4E HOME E0,6C E0,F0,6C D 23 F0,23 = 55 FO,55 PG UP E0,7D E0,F0,7D E 24 F0,24 \ 5D F0,5D DELETE E0,71 E0,F0,71 F 2B F0,2B BKSP 66 F0,66 END E0,69 E0,F0,69 G 34 F0,34 SPACE 29 F0,29 PG DN E0,7A E0,F0,7A H 33 F0,33 TAB 0D F0,0D U ARROW E0,75 E0,F0,75 I 43 F0,43 CAPS 58 F0,58 L ARROW E0,6B E0,F0,6B J 3B F0,3B L SHFT 12 FO,12 D ARROW E0,72 E0,F0,72 K 42 F0,42 L CTRL 14 FO,14 R ARROW E0,74 E0,F0,74 L 4B F0,4B L GUI E0,1F E0,F0,1F NUM 77 F0,77 M 3A F0,3A L ALT 11 F0,11 KP / E0,4A E0,F0,4A N 31 F0,31 R SHFT 59 F0,59 KP * 7C F0,7C O 44 F0,44 R CTRL E0,14 E0,F0,14 KP - 7B F0,7B P 4D F0,4D R GUI E0,27 E0,F0,27 KP + 79 F0,79 Q 15 F0,15 R ALT E0,11 E0,F0,11 KP EN E0,5A E0,F0,5A R 2D F0,2D APPS E0,2F E0,F0,2F KP . 71 F0,71 S 1B F0,1B ENTER 5A F0,5A KP 0 70 F0,70 T 2C F0,2C ESC 76 F0,76 KP 1 69 F0,69 U 3C F0,3C F1 05 F0,05 KP 2 72 F0,72 V 2A F0,2A F2 06 F0,06 KP 3 7A F0,7A W 1D F0,1D F3 04 F0,04 KP 4 6B F0,6B X 22 F0,22 F4 0C F0,0C KP 5 73 F0,73 Y 35 F0,35 F5 03 F0,03 KP 6 74 F0,74 Z 1A F0,1A F6 0B F0,0B KP 7 6C F0,6C 0 45 F0,45 F7 83 F0,83 KP 8 75 F0,75 1 16 F0,16 F8 0A F0,0A KP 9 7D F0,7D 2 1E F0,1E F9 01 F0,01 ] 5B F0,5B 3 26 F0,26 F10 09 F0,09 ; 4C F0,4C 4 25 F0,25 F11 78 F0,78 ' 52 F0,52 5 2E F0,2E F12 07 F0,07 , 41 F0,41 6 36 F0,36 PRNT SCRN E0,12, E0,7C  E0,F0, 7C,E0, F0,12  . 49 F0,49 7 3D F0,3D SCROLL 7E F0,7E / 4A F0,4A 8 3E F0,3E PAUSE E1,14,77, E1,F0,14, F0,77 -NONE- ACPI Scan Codes: Key Make Code Break Code Power E0, 37 E0, F0, 37 Sleep E0, 3F E0, F0, 3F Wake E0, 5E E0, F0, 5E Windows Multimedia Scan Codes: Key Make Code Break Code Next Track E0, 4D E0, F0, 4D  Previous Track E0, 15 E0, F0, 15 Stop E0, 3B E0, F0, 3B Play/Pause E0, 34 E0, F0, 34 Mute E0, 23 E0, F0, 23 Volume Up E0, 32 E0, F0, 32 Volume Down E0, 21 E0, F0, 21 Media Select E0, 50 E0, F0, 50 E-Mail E0, 48 E0, F0, 48 Calculator E0, 2B E0, F0, 2B My Computer E0, 40 E0, F0, 40 WWW Search E0, 10 E0, F0, 10 WWW Home E0, 3A E0, F0, 3A WWW Back E0, 38 E0, F0, 38 WWW Forward E0, 30 E0, F0, 30 WWW Stop E0, 28 E0, F0, 28 WWW Refresh E0, 20 E0, F0, 20 WWW Favorites E0, 18 E0, F0, 18 TÀI LIỆU THAM KHẢO Tài liệu Tiếng Việt. [1] Nguyễn Đình Việt, Kiến trúc máy tính, Nhà xuất bản Đại học Quốc Gia, 2005. [2] GS. Nguyễn Văn Ất, Kỹ thuật lập trình C, Nhà xuất bản Thống Kê, 2003. Tài liệu Tiếng Anh. [1] AN1045a, Implementing File I/O Functions Using Microchip’s Memory Disk Drive File System Library, Microchip Technology Inc, 2007. [2] Adam Chapweske, The PS/2 Mouse/Keyboard Protocol, 2003. [3] Datasheet LM35DZ, CD4050, LM1117-3.3V, DS1307, PIC18F458. [4] [5] [6]

Các file đính kèm theo tài liệu này:

  • docthu th7853p d7919 li7879u nhi7879t 2737897 mi tr4327901ng.doc