Articles by "Vi Điều Khiển"

10 4.104 8051 9 Acquy adc pic All datasheet ALTIUM Altium Designer AM-FM Arduino ARM ARM là gì Ấn Tượng Bản tin công nghệ Bản tin Thiết Bị Số Barobo bất động sản biến Binary Bit board lpc2378 Bộ chuyển đổi ADC Bộ Đếm Bộ điều khiển cửa cuốn Bộ Định Thời Buy Khóa Số Điện Tử Buy Mạch đếm sản phẩm Buy Mạch giao thông Buy Mạch nạp Buy Matrix Byte C cho AVR các hàm vào ra các loại lõi arm các mạch DAC cơ bản các ngắt trong pic Cách đọc điện trở Cách Đọc Giá Trị Điện Trở Cách đọc giá trị tụ điện Cách hàn linh kiện dán cách làm mạch khóa số cách tạo linh kiện dán cad/cam Cài Đặt cài đặt proteus 8 cảm biến Cấu Kiện Logic Khả Trình cấu tạo cấu trúc arm cấu trúc lệnh CCS Chân chân Transistor Chip Khả Trình chuyển đổi Chuyển đổi số tương tự Chuyển Đổi Tương Tự/Số - ADC Chuyển động số chương trình City Clip Điện Tử Code 8051 - ASM Code 8051 - C Code 8051-C code ASM code ASM mẫu 8086 Code AVR - C code C Code Lập Trình Code led sao băng code maupic code mẫu 8051 Code Mẫu 8086 Code Mẫu cho ARM - LPC1343 code mẫu pic Code PIC - C codemaupic Counter Cổng Vào Ra Cơ Bản Cuộn Cảm Cửa cuốn DA DAC Debug Decimal Delay8051 Dev-C++ Diode DIY Dò đường Do It Yourself doanh nghiệp Download DTMF Mobile đảo chiều động cơ Điện Trở Điện Tử Điện Tử Cơ Bản điều chế độ rộng xung điều chế xung PWM điều khiển bằng điện thoại Điều khiển cửa cuốn Điều khiển cửa cuốn bằng điện thoại điều khiển động cơ đo điện áp đo nhiệt độ đo nhiệt độ hiển thị lên lcd trên 8051 Đo Nhiệt Độ LM35 + LCD Đo Nhiệt Độ LM35 + Led 7 thanh đọc màu điện trở đồ chơi động cơ chân không Động cơ nhiên liệu Động cơ robo đồng hồ thời gian thực Ebook Đại Học ebook điện tử Ebook đồ án Ebook Tin Học Encoder Encoder là gì Full Giải Thuật Giải thuật PID Giáo Dục giao tiếp i2c pic 16f877a giao tiếp i2c pic16f877a với ic ds1307 giao tiếp máy tính qua rs232 Giao Tiếp Máy Tính VB6 giao tiếp rs232 giao tiếp spi giữa 2 pic giao tiếp spi trong pic Giáo Trình Điện Tử Giới thiệu 8051 Giới thiệu cơ bản GPIO Graphic Design hàm Hàn linh kiện dán Hexadecimal Hệ Hexa Hệ Nhị Phân Hệ Thập Lục Phân Hệ Thập Phân hiển thị lên lcd 16x2 Hoạt Động Học Học 8051 qua các ví dụ đơn giản Học ALtium Designer học AVR Học Corel Draw X3 Học Eagle HỌC LẬP TRÌNH 16F877A Học Lập Trình 8051 Học Lập Trình C Học Orcad Học Protues hoc-lam-robot-do-duong-qua-video Hồng ngoại hướng dẫn hướng dẫn Altium Designer hướng dẫn đo đồng hồ VOM hướng dẫn keil - C lập trình 8051 hướng dẫn làm led sao băng hướng dẫn làm led trái tim hướng dẫn lập trình ARM Hướng Dẫn Lập Trình ARM - LPC1343 hướng dẫn lập trình ARM-LPC2378 hướng dẫn lập trình CCS hướng dẫn lập trình PIC Hướng Dẫn Led Trái Tim hướng dẫn module sim548c hướng dẫn sử dụng keil hướng dẫn sử dụng proteus 8 Hyper Terminal hercules 3.2.4 I/O IC 555 IC 7447 IC 74HC151 IC 74HC154 IC 74HC245 IC 74HC595 IC 74LS138 IC DS1307 IC đồng hồ thời gian thực IC LM324 IC LM342 IC LM7805 IC số IC số opamp LM324 IC Thông Dụng IC555 Interrupt Keil 4 Full keil arm Keil C Keil uVision3 kế toán kiểm toán khái niệm Khái Niệm Cơ Bản Kho Vật Liệu khóa điện tử khóa số dùng 8051 khóa số dùng 89s52 Khóa Số Điện Tử khuếch đại kiểm tra Kinh doanh maketing kinh tế quản lí Kỹ Thuật Kỹ Thuật Vi Xử Lý làm mạch điện lý thú Làm quen AVR Lap Trinh Dieu Khien Robot Lập Trình lập trình 8051 Lập Trình AVR Lập Trình C lập trình c++ Lập Trình Led Quảng Cáo Lập Trình Nhúng Lập trình pic Lập trình Robot Lập Trình Vi Điều Khiển Lập Trình Với AVR Studio LCD 16x2 Lcd16x2 Led Clock Led Quay led sao băng led trai tim Led Trái Tim Lịch sử ra đời Linh Kiện Cơ Bản linh kiện điện tử Loa LPC 2378 LSB lý thú Mã AVR - C Mạch 7seg Mạch Amply.Mạch Loa Mạch Autorobo Mạch bảo vệ Mạch Cảm Biến mạch cảm ứng sờ tay Mạch Cầu H Mạch cube Mạch Đếm Sản Phẩm Mạch điện cơ bản Mạch điện hay Mạch Điện Ứng Dụng Mạch Điều khiển động cơ Mạch Động Cơ Mạch đồng hồ Mạch đồng hồ 4 led Mạch giao thông Mạch IC số Mạch in mạch khóa số mạch khuếch đại thuật toán mạch led chúc mừng năm mới mạch led đẹp Mạch Led đơn Mạch Led Quảng Cáo mach led trai tim mạch led trái tim Mạch Led Vumeter mạch lý thú Mạch Ma trận Phím Mạch Matrix Mạch nạp Mạch nguồn Mạch Nút Bấm mạch sóng rf mạch tăng áp Mạch thu phát Mạch tổ hợp MSI Mạch trái tim Mạch Vi điều khiển Microbicho module module GSM/GPS Module Sim548 Module Sim548 giao tiếp với vi điều khiển PIC Module Sim548C Mosfet Motor Mô Phỏng Phần Cứng Mô Tả Phần Cứng MSB mua led sao băng News Ngắt Ngắt Trong LPC23xx ngân hàng Ngôn Ngữ Ngôn Ngữ C Ngôn Ngữ Tự Học Lập Trình C Ngôn Ngữ VHDL Nguyên Lý nguyên lý ic 555 Nguyên Tắc nháy led Nhập môn C Nhỏ Gọn Nibble opamp People Phần Mềm phần mềm altium Designer Phần mềm điện tử Phần Mềm Điện Tử Phần Mềm Điện Tử Hay Phần Mềm Hay Phần Mềm Led Quảng Cáo phần mềm proteus 8 Phần mềm vi tính Phần Mền Phương pháp hàn linh kiện dán PIC pic16f877a Print Design Proteus Proteus 7.8 SP2 FULL PWM quà tặng bạn gái quà tặng độc đáo quản trị doanh nghiệp quản trị kinh doanh quét led 7 đoạn Relay robocon Robot ROBOT DÒ ĐƯỜNG rút gọn mạch logic tổ hợp Sach Dien Tu Sản Phẩm Thú Vị Sản Phẩm Thương Mại Sáng tạo Short Smart Home SMD sơ đồ nguyên lý spi Sports Sử Dụng Sử Dụng Đồng Hồ sử dụng đồng hồ VOM sử dụng ngắt trong pic sự khác nhau Sức mạnh số Tải tài chính tài chính doanh nghiệp tài chính ngân hàng Tài Khoản Chia Sẻ Tài Liệu Tài Liệu 8051 tài liệu avr Tài liệu Điện Tử Tài Liệu Pic Tài liệu robocon tài liệu về ngân hàng Tài Liệu Vi Điều Khiển tailieuvn Tạo cổng Com ảo Tạo cổng nối tiếp ảo tạo dự án trong keil arm Tạo Project trong Vi Xử Lý ARM tạo thư viện altium designer tạo xung vuông Tạp chí Tạp Chí Hay tăng áp Tập lệnh AT Team Support TEAMPLATE PROTEUS Test thị trường tài chính Thiết Bị Thú Vị Thiết kế robot Thiết lập Fuse Bits Thiết Lập Pin Thuật Toán Thuật Toán Điều Khiển PID Thuật Toán Quine MCCluskey Thư viện Protues Thực Hành Thyristor Timer Timer/Counter Tin Học Chia Sẻ Tổ Chức Bộ Nhớ tổng quan về proteus 8 Transistor Tranzito Tranzitor Trao đổi học tập Travel Trình Biên Dịch Trình Dịch Trong Suốt Truyền Thông Nối Tiếp Không Đồng Bộ- UART truyền thông nối tiếp RS232 Tụ điện TUT - 8051 - ASM TUT - 8051 - KeilC tự hành Tự Học C Tự Học Lập Trình C Tý hon UART Update USB Ứng Dụng Led Quảng Cáo ứng dụng mạch khuếch đại thuật toán vẽ mạch in vẽ mạch nguyên lý VHDL Vi Điều Khiển Vi điều khiển - Ứng dụng vi điều khiển PIC Vi mạch số Vi Xử Lý Vi Xử Lý 8051 Vi Xử Lý 8086 Vi Xử Lý ARM Vi Xử Lý PIC Video Video Mach Điện Virtual Serial Port Driver VOM vxl Web Design xác định góc quay động cơ xử lý chuỗi
Hiển thị các bài đăng có nhãn Vi Điều Khiển. Hiển thị tất cả bài đăng


        Nếu bạn đã có một bộ Arduino, và đã có thêm một số linh kiện khác thì giờ chính là lúc bạn bắt tay vào thử nghiệm. Làm sao để lập trình với sản phẩm Arduino? Làm sao để cài đặt và nạp code vào thiết bị. Bài viết này sẽ hướng dẫn bạn tất cả.

Cài đặt Drivers

Mac OSX:
         Chỉ cần download phiên bản mới nhất của Arduino Package, sau đó chạy file FTDIUSBSerial. Sau khi hoàn thành, kéo ứng dụng vào folder application rồi khởi động lại máy tính.

         Sau khi cắm Arduino vào rồi, OSX sẽ tự động nhận diện thiết bị. Chỉ cần click Network Preferences và chọn Apply

Windows 7:
         Bạn download driver tại đây và giải nén. Dung lượng file khoảng 85Mb và 230Mb sau khi giải nén.
         Cắm Arduino vào cổng USB. Nếu máy tính không tự nhận driver. Bạn mở phần Device Manager trong My Computer hoặc vào Start gõ devmgmt.msc vào bấm Enter.


         Bên dưới phần Other Devices bạn sẽ thấy phần Arduino Uno. Double click, chọn Update Drivers và chọn đến phần thư mục bạn đã giải nén.


Cài đặt
         Mở chương trình Arduino từ folder đã download. Đầu tiên bạn sẽ phải cài đặt cổng và mạch. Vào Tools và chọn:

- Đúng loại board. Mặc định sẽ chọn là Uno
- Đúng loại port. Trên Windows, port sẽ tự động nhận.


- Trên Mac, tên port sẽ đa dạng hơn như cơ bản vẫn là một trong các port đã nêu.



Kiểm thử
         Xem qua thanh toolbar.



Từ trái qua:

- Play: biên dịch code và kiểm tra nhưng không nạp vào Arduino trừ khi bạn bấm nút upload.
- Stop: dừng biên dịch nhưng không dừng bất kỳ chương trình đang chạy nào trên Arduino.
- New file: tạo project mới
- Mũi tên lên: mở project có sẵn.
- Mũi tên xuống: lưu lại
- Mũi tên phải: nạp code hiện tại vào Arduino
- Serial Monitor: cho phép kiểm tra kết nối với Arduino khi kết nối với máy tính.
         Bạn có thể bắt đầu một chương trình đơn giản bằng cách click Open, chọn ví dụ 1, Basics -> Blink. Code như sau:


         Để kiểm tra Arduino hoạt động đúng hay không, click Upload. sau một vài giây, đèn kem được đánh dấu TX/RX trên Arduino sẽ bật. Việc này nghĩa là tín hiệu đã đúng. Khi hoàn tất tiến trình, code sẽ tự động chạy.




Nguồn:makeuseof.com

     
        Nếu bạn là một người đam mê điện tử và bạn thật sự muốn làm gì đó để thỏa mãn đam mê nhưng lại bị gò bó thời gian, thiếu kiến thức và khó khăn trong bắt đầu. Bạn thích tìm hiểu bên trong các thiết bị nhưng lại không biết làm gì hơn.
         Vậy thì Arduino chính là câu trả lời cho bạn, nó sẽ giúp bạn tự học cũng như nghiên cứu và thỏa mãn đam mê của bạn.


        Về mặt kỹ thuật, Arduino là một thiết bị lập trình logic. Ngoài ra nó còn là nền tảng mã nguồn mở (open-source electronics prototyping platform). Nhưng thực sự nó là gì?
        Nó như một chiếc máy tính mà bạn có thể lập trình để làm bất cứ việc gì, nó tương tá với thế giới thông qua các cảm biến điện tử, ánh sáng, động cơ. Về bản chất, nó có thể được xem là một thiết bị hữu dụng với bất kỳ ai muốn sáng tạo và tìm hiểu mày mò.

Bạn có thể làm gì với nó?
         Trước khi thảo luận về những gì khiến Arduino trở nên một thiết bị tuyệt vời, bạn có thể xem qua vài dự án được thực hiện với Arduino.

The Maker-Bot
         Đây là một thiết bị giúp tạo ra các mẫu vật 3D bằng nhựa. Arduino giúp quản lý sự nóng chảy của nhựa và di chuyển để tạo hình.

Puff the Magic Dragon Fighting Robot
         Nó được xây dựng trên cơ bản là một robot với Arduino, 2 động cơ và 2 cảm ứng ánh sáng. Thiết bị này có thể tìm ra nguồn nhiệt, di chuyển...

Laser Harp
         Một thiết bị nhấp nháy theo âm thanh và đèn laser

Baker Tweet
         Một thiết bị giúp báo khách hàng biết khi nào bánh mì ra lò...

LED Cubes
         Bạn sẽ bất ngờ và cảm thấy thú vị với ứng dụng này !

Mã nguồn mở
         Phần cứng lẫn phần mềm đều là mã nguồn mở - sơ đồ mạch có sẵn trên trang chủ nên nếu bạn không muốn mua Arduino, bạn có thể tự mua phụ kiện và tự thực hiện chúng. Nhưng nếu có thể bạn hãy ủng hộ đội ngũ chế tạo để cải tiến thiết bị này trong tương lai.



Kết nối
         Là một thiết bị phần cứng, Arduino có thể hoạt động độc lập (như một robot), kết nối với máy tính, hoặc một thiết bị Arduino khác, các thiết bị điện tử khác...



Hỗ trợ
         Có hàng ngàn người và tổ chức đang sử dụng, nghiên cứu và dùng Arduino. Bạn có thể yên tâm nếu như mới bắt đầu và cần sự hỗ trợ.



Tính linh hoạt và chi phí
         Giá chính thức cho một bản hoàn chỉnh là 50$, rẻ hơn rất nhiều so với nhiều thiết bị điều khiển khác mà hiệu năng lại không kém là bao.
        Ngôn ngữ lập trình cho thiết bị này rất đơn giản, nếu bạn đã có kinh nghiệm với Java hoặc các ngôn ngữ khác sẽ có thể dễ dàng nắm được.
         Ngoài ra nó còn rất tuyệt vời để học, bạn có thể trải nghiệm với điện tử và học những thứ cơ bản.



Nguồn:makeuseof.com


        Các bài viết trước đã giới thiệu cơ bản về Arduino. Bài viết này sẽ giới thiệu cách để upload code và cấu trúc của một phần mềm Arduino.

Phần cứng

Xem kỹ về bảng mạch Arduino:



- Theo như hình minh họa, có 14 cổng in/out (đánh số 0-13). Đây là các chân cắm của Arduino và có chức năng input hoặc output, tạo nên cốt lõi của thiết bị.
- Có 6 chân kỹ thuật số, được đánh dấu bởi dấu ~ để thực hiện Xung.
- Chân 13 đặc biệt có một LED được ghép vào. Việc này giúp cho việc thử nghiệm. Bạn có thể sử dụng LED có sẵn, bằng cách xuất ra chân 13 hoặc ra các chân khác.
- Ở phần bên phải ở dưới có một cổng analog 6 chân input. Chúng giúp đọc các giá trị của cảm biến analog.
- Ở bên trái là các cổng analog tương tự cổng nguồn. bạn chỉ cần nguồn 3,3 vol hoặc 5 vol.
- Cuối cùng, một công tắc chuyển dùng để reset Arduino. nó sẽ giúp khởi động lại bất kỳ chương trình nào trong bộ nhớ.
- Arduino có một khoảng bộ nhớ, và nếu chương trình của bạn quá lớn, compiler sẽ báo lỗi.

Cấu trúc một chương trình Arduino
         Mỗi chương trình Arduino được chia làm 2 chức năng (nếu bạn không biết bạn có thể xem lại bài trước)
Đầu tiên là cài đặt chức năng. Việc này giúp khởi tạo và dùng để Arduino biết sẽ kết nối đến thiết bị nào, cũng như khởi tạo biến mà bạn cần trong chương trình.
         Thứ hai là vòng lặp. Đây là nền tảng của mỗi chương trình Arduino. Khi Arduino hoạt động, sau khi chức năng cài đặt hoàn tất, vòng lặp sẽ chạy tất cả các code, sau đó thực hiện lại đến khi nào mất nguồn hoặc bị reset. Quãng thời gian để hoàn thành dựa trên code được nạp vào. Bạn có thể viết code để chạy vài giờ nếu không muốn lặp quyết định.

Cấu trúc của chương trình:



Giải thích chương trình

Cùng xem lại cấu trúc một chương trình:

Hàm khởi tạo:


void setup() {
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards:
pinMode(13, OUTPUT);
}
         Đầu dòng được bắt đầu với // để compiler hiểu đây là chú thích, và sẽ không được đưa vào bộ nhớ Arduino. Code chỉ thực sự bắt đầu từ dòng cuối có nghĩa là "đưa tín hiệu đầu ra đến chân 13", là chân có LED

Sau đó là vòng lặp:

void loop(){
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second
}
         Chú thích ở cuối mỗi dòng giải thích cách code làm việc. HIGH và LOW tương tự với trạng thái ON và OFF. Bạn cũng có thể viết ON/OFF. Delay sẽ cho Arduino biết thời gian chờ là 1000 mili giây (hoặc 1 giây).
         Cuối cùng, một lưu ý về code được dùng ở đây. Chú thích cả hai hàm khởi tạo và lặp đều có từ khóa void ở đầu. Đây là từ khóa đặc biệt để báo không có gì khác, vì hàm trả về không có gì khi được gọi và chỉ chạy code bên trong. Toàn bộ code còn lại sẽ được chạy nếu nằm trong 2 dấu {} và phải kết thúc bằng dấu ;
Nguồn:makeuseof.com

Khái niệm cơ bản trong kỹ thuật Vi xử lý

I. CẤU TRÚC PHẦN CỨNG CỦA MỘT VI XỬ LÝ



Intel 4004, vi xử lý 4 bit thương mại đầu tiên năm 1971
Bộ vi xử lý Intel 80486DX2
        Những kiến thức được diễn đạt trong tài liệu này là những ý kiến mang tính chủ quan mà người viết muốn san sẻ với các bạn đọc có cùng mối quan tâm và chỉ liên quan đến những vấn đề cơ bản của kỹ thuật vi xử lý nói chung, không phải là kiến thức áp dụng cho một loại vi xử lý cụ thể.

        Trước hết để tránh những băn khoăn đáng tiếc trong khi nghiên cứu tài liệu, tôi xin được giới thiệu đôi chút về 02 khái niệm “vi xử lý” (microprocessor) và “vi điều khiển (microcontroller). Về cơ bản hai khái niệm này không khác nhau nhiều, “vi xử lý” là thuật ngữ chung dùng để đề cập đến kỹ thuật ứng dụng các công nghệ vi điện tử, công nghệ tích hợp và khả năng xử lý theo chương trình vào các lĩnh vực khác nhau. Vào những giai đoạn đầu trong quá trình phát triển của công nghệ vi xử lý, các chip (hay các vi xử lý) được chế tạo chỉ tích hợp những phần cứng thiết yếu như CPU cùng các mạch giao tiếp giữa CPU và các phần cứng khác. Trong giai đoạn này, các phần cứng khác (kể cả bộ nhớ) thường không được tích hợp trên chip mà phải ghép nối thêm bên ngoài. Các phần cứng này được gọi là các ngoại vi (Peripherals). Về sau, nhờ sự phát triển vượt bậc của công nghệ tích hợp, các ngoại vi cũng được tích hợp vào bên trong IC và người ta gọi các vi xử lý đã được tích hợp thêm các ngoại vi là các “vi điều khiển”. Việc tích hợp thêm các ngoại vi vào trong cùng một IC với CPU tạo ra nhiều lợi ích như làm giảm thiểu các ghép nối bên ngoài, giảm thiểu số lượng linh kiện điện tử phụ, giảm chi phí cho thiết kế hệ thống, đơn giản hóa việc thiết kế, nâng cao hiệu suất và tính linh hoạt. Trong tài liệu này, ranh giới giữa hai khái niệm “vi xử lý” và “vi điều khiển” thực sự không cần phải phân biệt rõ ràng. Chúng tôi sẽ dùng thuật ngữ “vi xử lý” khi đề cập đến các khái niệm cơ bản của kỹ thuật vi xử lý nói chung và sẽ dùng thuật ngữ “vi điều khiển” khi đi sâu nghiên cứu một họ chip cụ thể.


Về cơ bản kiến trúc của một vi xử lý gồm những phần cứng sau:


- Đơn vị xử lý trung tâm CPU (Central Processing Unit).

- Các bộ nhớ (Memories).

- Các cổng vào/ra song song (Parallel I/O Ports).

- Các cổng vào/ra nối tiếp (Serial I/O Ports).

- Các bộ đếm/bộ định thời (Timers).


        Ngoài ra với mỗi loại vi điều khiển cụ thể còn có thể có thêm một số phần cứng khác như bộ biến đổi tương tự-số ADC, bộ biến đổi số-tương tự DAC, các mạch điều chế dạng sóng WG, điều chế độ rộng xung PWM…

        Bộ não của mỗi vi xử lý chính là CPU, các phần cứng khác chỉ là các cơ quan chấp hành dưới quyền của CPU. Mỗi cơ quan này đều có một cơ chế hoạt động nhất định mà CPU phải tuân theo khi giao tiếp với chúng. Để có thể giao tiếp và điều khiển các cơ quan chấp hành (các ngoại vi), CPU sử dụng 03 loại tín hiệu cơ bản là tín hiệu địa chỉ (Address), tín hiệu dữ liệu (Data) và tín hiệu điều khiển (Control). Về mặt vật lý thì các tín hiệu này là các đường nhỏ dẫn điện nối từ CPU đến các ngoại vi hoặc thậm chí là giữa các ngoại vi với nhau. Tập hợp các đường tín hiệu có cùng chức năng gọi là các bus. Như vậy ta có các bus địa chỉ, bus dữ liệu và bus điều khiển.

Sau đây là mô tả sơ bộ về các phần cứng bên trong một vi xử lý:


1. Đơn vị xử lý trung tâm CPU

        CPU có cấu tạo gồm có đơn vị xử lý số học và lôgic (ALU), các thanh ghi, các khối lôgic và các mạch giao tiếp. Chức năng của CPU là tiến hành các thao tác tính toán xử lý, đưa ra các tín hiệu địa chỉ, dữ liệu và điều khiển nhằm thực hiện một nhiệm vụ nào đó do người lập trình đưa ra thông qua các lệnh (Instructions).


2. Bộ nhớ

        Nhìn chung có hai loại bộ nhớ là bộ nhớ chương trình và bộ nhớ dữ liệu. Bộ nhớ chương trình dùng để chứa mã chương trình hướng dẫn CPU thực hiện một nhiệm vụ nào đó. Thông thường thì bộ nhớ chương trình là các loại bộ nhớ “không bay hơi” (non-volatile), nghĩa là không bị mất nội dung chứa bên trong khi ngừng cung cấp nguồn nuôi. Có thể kể ra một số bộ nhớ thuộc loại này như: ROM, PROM, EPROM, EEPROM, Flash. Bộ nhớ dữ liệu là bộ nhớ dùng để chứa dữ liệu (bao gồm các tham số, các biến tạm thời…). Tuỳ thuộc loại dữ liệu mà bộ nhớ loại này có thể là loại “không bay hơi” hoặc “bay hơi” (mất dữ liệu khi cắt nguồn nuôi). Loại “bay hơi” thường thấy là các bộ nhớ SRAM.


3. Cổng vào/ra song song

        Đây là các đường tín hiệu được nối với một số chân của IC dùng để giao tiếp với thế giới bên ngoài IC. Giao tiếp ở đây là đưa điện áp ra hoặc đọc vào giá trị điện áp tại chân cổng. Các giá trị điện áp đưa ra hay đọc vào chỉ có thể đwocj biểu diễn bởi một trong hai giá trị lôgic (0 hoặc 1). Trong kỹ thuật vi xử lý, người ta thường dùng quy ước lôgic dương: giá trị lôgic 0 ứng với mức điện áp thấp xấp xỉ 0VDC, giá trị lôgic 1 ứng với mức điện áp cao xấp xỉ +5VDC. Tùy loại vi xử lý mà “khoảng xấp xỉ” đó là khác nhau nhưng nhìn chung là tương thích với mức lôgic TTL. Mỗi cổng vào/ra song song thường gồm 08 đường vào/ra khác nhau và gọi là các cổng 08 bit. Các đường tín hiệu vào/ra của các cổng và thuộc cùng một cổng là độc lập với nhau. Điều đó có nghĩa là ta có thể đưa ra hay đọc vào các giá trị lôgic khác nhau đối với từng chân cổng (từng đường tín hiệu vào/ra). Một điều cần chú ý nữa đối với các cổng vào/ra đó là chúng có thể được tích hợp thêm (nói đúng hơn là kiêm thêm) các chức năng đặc biệt liên quan đến các ngoại vi khác.


4. Cổng vào/ra nối tiếp

        Khác với cổng song song, với cổng nối tiếp các bit dữ liệu được truyền lần lượt trên cùng một đường tín hiệu thay vì truyền cùng một lúc trên các đường tín hiệu khác nhau. Thông thường thì việc truyền dữ liệu bằng cổng nối tiếp phải tuân theo một cơ chế, một giao thức hay một nguyên tắc nhất định. Có thể kể ra một số giao thức như SPI, I2C, SCI…


Cổng nối tiếp có 02 kiểu truyền dữ liệu chính:

- Truyền đồng bộ (synchronous): thiết bị truyền và thiết bị nhận đều dùng chung một xung nhịp (clock).

- Truyền dị bộ (asynchronous): thiết bị truyền và thiết bị nhận sử dụng hai nguồn xung nhịp riêng. Tuy nhiên hai nguồn xung nhịp này không được khác nhau quá nhiều.


Xung nhịp là yếu tố không thể thiếu trong truyền dữ liệu nối tiếp và nó có vaitrò xác định giá trị của bit dữ liệu (hay nói đúng hơn là xác định thời điểm đọc mức lôgic trên đường truyền dữ liệu).


Cổng nối tiếp có thể có một trong các tính năng sau:

-Đơn công: thiết bị chỉ có thể hoặc truyền hoặc nhận dữ liệu.

-Bán song công: thiết bị có thể truyền và nhận dữ liệu nhưng tại một thời điểm chỉ có thể làm một trong hai việc đó.

-Song công: thiết bị có thể truyền và nhận dữ liệu đồng thời.


5. Bộ đếm/Bộ định thời

        Đây là các ngoại vi được thiết kế để thực hiện một nhiệm vụ đơn giản: đếm các xung nhịp. Mỗi khi có thêm một xung nhịp tại đầu vào đếm thì giá trị của bộ đếm sẽ được tăng lên 01 đơn vị (trong chế độ đếm tiến/đếm lên) hay giảm đi 01 đơn vị (trong chế độ đếm lùi/đếm xuống).

        Xung nhịp đưa vào đếm có thể là một trong hai loại: Xung nhịp bên trong IC. Đó là xung nhịp được tạo ra nhờ kết hợp mạch dao động bên trong IC và các linh kiện phụ bên ngoài nối với IC. Ta có thể ví đó là “nhịp tim” để toàn bộ các phần cứng bên trong vi xử lý (bao gồm cả CPU và các ngoại vi) có thể hoạt động được. Trong trường hợp sử dụng xung nhịp loại này, người ta gọi là các bộ định thời (timers). Do xung nhịp bên loại này thường đều đặn nên ta có thể dùng để đếm thời gian một cách khá chính xác. Xung nhịp bên ngoài IC. Đó là các tín hiệu lôgic thay đổi liên tục giữa 02 mức 0-1 và không nhất thiết phải là đều đặn. Trong trường hợp này người ta gọi là các bộ đếm (counters). Ứng dụng phổ biến của các bộ đếm là đếm các sự kiện bên ngoài như đếm các sản phầm chạy trên băng chuyền, đếm xe ra/vào kho bãi…

        Một khái niệm quan trọng cần phải nói đến là sự kiện “tràn” (overflow). Nó được hiểu là sự kiện bộ đếm đếm vượt quá giá trị tối đa mà nó có thể biểu diễn và quay trở về giá trị 0. Với bộ đếm 8 bit, giá trị tối đa là 255 và là 65535 với bộ đếm 16 bit. Ngoài các phần cứng nêu trên còn phải kể đến một khối lôgic khác là khối giao tiếp bus. Khối này có chức năng ghép nối giữa các bus bên trong chip và các chân đưa ra ngoài chip. Mục đích của việc đưa các tín hiệu địa chỉ, dữ liệu và điều khiển ra ngoài là nhằm mở rộng khả năng phối ghép thêm của vi xử lý với các ngoại vi khác (chủ yếu là các bộ nhớ ngoài) ngoài các ngoại vi được tích hợp trên IC. Thông thường thì số lượng các đường tín hiệu là giữ nguyên khi đưa ra ngoài chip, tuy nhiên trong một số trường hợp số lượng các đường tín hiệu có thể nhỏ hơn số lượng thực bên trong (ví dụ như trường hợp của vi xử lý 8088, bus dữ liệu bên trong là 16 bit nhưng đưa ra ngoài chỉ có 8 bit). Khi đưa ra ngoài, các tín hiệu địa chỉ và dữ liệu có thể được ghép với nhau (cùng sử dụng chung một số chân nào đó) hoặc được tách riêng (tín hiệu địa chỉ dùng một số chân, tín hiệu dữ liệu dùng một số chân khác). Người ta thường “dồn kênh” (multiplex), tức là ghép chức năng, giữa bus địa chỉ và bus dữ liệu để giảm thiểu số chân cần thiết. Trong trường hợp này, tín hiệu địa chỉ sẽ xuất hiện trước, sau đó là tín hiệu dữ liệu trên cùng một tập hợp các đường tín hiệu. Để tách được 2 loại tín hiệu đó thì nhà sản xuất cung cấp cho người sử dụng một đường tín hiệu điều khiển có tên là tín hiệu chốt địa chỉ (thường ký hiệu là ALE). Tín hiệu này sẽ tích cực khi tín hiệu địa chỉ xuất hiện và không tích cực khi tín hiệu dữ liệu xuất hiện trên bus. Các IC thích hợp với việc tách tín hiệu địa chỉ và dữ liệu là các IC thuộc họ 74xx373/374 hoặc 74xx573/574.

        Trên đây là mô tả sơ bộ cấu trúc phần cứng của một vi xử lý. Trước khi đi tiếp, tôi xin chia sẻ với bạn một kinh nghiệm quý báu khi nghiên cứu kỹ thuật vi xử lý. Đó là bạn phải biết chấp nhận. Đúng! Kỹ thuật vi xử lý không phải là một cái gì đó tâm linh, đó là một môn khoa học có cả cơ sở lý thuyết và minh chứng thực tế rõ ràng, đúng đắn. Tuy nhiên sẽ là không sai nếu tôi nói rằng nó cũng rất trừu tượng. Đối với bạn, khi các bạn đang đọc những dòng chữ trong tài liệu này, chúng ta ngầm hiểu rằng bạn mới chỉ bắt đầu quá trình nghiên cứu. Đó là một lĩnh vực có thể nói ít nhiều mới mẻ và bạn chắc chắn hầu như chưa có nhiều hình dung về cái gì đang diễn ra trong một con chip chỉ bé bằng đầu ngón tay! Điều đó làm bạn cũng như tôi trước đây, và tôi nghĩ là đúng với tất cả những ai đã từng nghiên cứu kỹ thuật vi xử lý, cảm thấy có cái gì đó thật trừu tượng, khó hiểu, rất gây tò mò trong các khái niệm (dù là khái niệm đơn giản) liên quan đến lĩnh vực này. Chúng ta khi mới bắt đầu đều tự đưa ra những câu hỏi cho mình đại loại như: tại sao vi xử lý có thể làm được nhiều việc đến vậy? cái gì diễn ra bên trong chip khi chúng ta cấp nguồn nuôi cho nó? tại sao ta lại có thể tác động đến timer hay các ngoại vi khác thông qua các dòng lệnh viết cho CPU? hoặc thậm chí là mạch điện bên trong một vi xử lý, một ngoại vi, một cổng vào/ra như thế nào? Nhưng bạn có biết nếu đi tìm câu trả lời cho những thắc mắc đó, bạn sẽ có thể mất rất nhiều thời gian, công sức mà hiệu quả nghiên cứu sẽ không cao, và cho đến khi tìm thấy câu trả lời thỏa mãn cho một vấn đề mà bạn băn khoăn, có thể bạn đã quên mất một vài hay tất cả những kiến thức còn lại! Như tôi đã nói, khi mới bắt đầu nghiên cứu, bạn hãy chấp nhận những kiến thức cơ bản như chấp nhận các tiên đề. Hãy coi đó là những cái mà người ta đã xây dựng nên một cách đúng đắn, giờ đây bạn không phải mất công tìm tòi, chứng minh sự đúng đắn của chúng. Thay vào đó, bạn chỉ cần tiếp thu và thừa hưởng. Hãy công nhận chúng như một điều gì đó hiển nhiên. Một cách đơn giản, bạn không cần phải tìm hiểu vấn đề đến mức rõ ràng từng đường tín hiệu trong một mạch điện đã được tích hợp bé xíu trong chip. Vào lúc này (vâng, tôi nói là vào lúc này!), bạn chỉ cần biết, cái mạch điện đó người ta gọi là cái “bộ đếm”, là cái “cổng vào/ra”, chức năng của chúng là gì, nguyên lý hoạt động ra sao và để điều khiển được chúng thì cần phải làm những gì (cụ thể là phải viết những gì trong khi lập trình). Tuy nhiên, nói như vậy không có nghĩa tôi khuyên các bạn học một cách “hổng”, không cần đến kiến thức cơ bản. Nếu bạn là người đã có ít nhiều kiến thức điện tử (đặc biệt là điện tử số), bạn quả là may mắn khi đã có một nền tảng kiến thức vững chắc khi tiếp cận với kỹ thuật vi xử lý. Bạn có thể hiểu dễ dàng cấu tạo của một bộ đếm, nguyên lý hoạt động của nó và chắc chắn bạn thấy dễ dàng tiếp thu hơn nếu như trong bài học tôi nói với bạn rằng “trong vi điều khiển họ 8051 có tích hợp ít nhất 02 ngoại vi gọi là các bộ đếm”. Đó là vì bạn đã có những khái niệm cơ bản, những hình dung về những cái gọi là “bộ đếm”. Nếu chưa có những khái niệm cơ bản, chưa có những mường tượng sơ bộ, bạn sẽ cảm thấy khó hiểu, nhưng sự khó hiểu đó chính là lý do để chúng ta làm việc với nhau! Chỉ cần kiên nhẫn đôi chút, những gì bạn phải chấp nhận một cách gượng ép và đôi khi có vẻ như vô lý vào lúc này, bạn sẽ nhận lại được câu trả lời thỏa mãn trong quá trình tìm hiểu kỹ thuật vi xử lý cùng tôi, đặc biệt khi bạn nghiên cứu và thực hành với các vi điều khiển cụ thể.


II. NGUYÊN LÝ HOẠT ĐỘNG CỦA MỘT VI XỬ LÝ


        Trước hết, tôi sẽ nói qua về một khái niệm rất hay được nhắc tới trong kỹ thuật vi xử lý – “không gian địa chỉ”. Nó được hiểu là số lượng địa chỉ mà CPU có thể phân biệt được. Trong một bộ nhớ có rất nhiều ô nhớ và CPU thường phải truy nhập (ghi hoặc đọc) đến từng ô nhớ cụ thể, do đó CPU tất nhiên phải phân biệt được các ô nhớ riêng rẽ với nhau. Mỗi ô nhớ cần phải có một địa chỉ gắn với nó. Địa chỉ này chỉ dành riêng cho ô nhớ đó, không trùng với địa chỉ của một ô nhớ nào khác, khi truy nhập tới địa chỉ đó tức là truy nhập đến ô nhớ đó. Ngoài ô nhớ, trong vi xử lý còn có một số phần cứng khác cũng cần có một địa chỉ dành riêng cho nó như các thanh ghi điều khiển, các thanh ghi dữ liệu… Thường thì hầu như tất cả những phần cứng cần được truy nhập hay tác động đến đều phải được gắn với một hay nhiều địa chỉ. Lấy ví dụ, để có thể giao tiếp và điều khiển một bộ đếm (timer/counter), CPU cần phải tác động đến các thanh ghi quy định chế độ hoạt động, thanh ghi chứa số đếm của bộ đếm đó. Các thanh ghi này đều có địa chỉ gán riêng cho chúng và nhờ các địa chỉ đó mà CPU có thể ghi/đọc giá trị của các thanh ghi, qua đó tác động lên bộ đếm.


Vi xử lý hoạt động theo một số nguyên tắc cơ bản sau:

        Các thao tác tính toán xử lý sẽ được vi xử lý, hay nói đúng hơn là CPU, thực hiện theo các chỉ dẫn (chính là các lệnh) đặt trong bộ nhớ chương trình. Đương nhiên trong bộ nhớ chương trình không có những chỉ dẫn kiểu như “hãy đưa điện áp +5VDC ra chân cổng A!” hay “dừng cái bộ đếm đó lại, đừng cho nó đếm thêm một xung nhịp nào nữa!” hay “hãy tạm thời chờ ở đây cho đến khi nào điện áp tại chân B có giá trị lôgic bằng 0!”. Đó là ngôn ngữ của con người, các vi xử lý không nghe được và đương nhiên không hiểu được những câu đó, chúng chỉ có thể nhận biết được hai và chỉ hai giá trị lôgic trái ngược nhau mà thôi. Hai giá trị lôgic trái ngược nhau có thể là đen-trắng, không-có, cao-thấp… Điều đó không quan trọng, cái quan trọng là về mặt vật lý (điện học), nhờ một cơ chế nào đó mà khi đọc nội dung của bộ nhớ hay đọc giá trị lôgic của một cổng vào ra, vi xử lý có thể phân biệt được khi nào giá trị đọc được là giá trị lôgic thứ nhất và khi nào thì không phải thế. Theo truyền thống người ta quy định chung rằng các giá trị lôgic đó là 0 và 1. Biểu thị các giá trị lôgic đó theo quy ước lôgic dương là điện áp cao (xấp xỉ +5VDC) cho giá trị 1 và điện áp thấp (xấp xỉ 0VDC) cho giá trị 0. Như vậy, thay vì nói với vi xử lý rằng “hãy đưa ra giá trị lôgic 1 tại chân cổng A!”, người ta mã hoá câu nói đó thành một chuỗi các bit lôgic 0-1 (ví dụ 00001010 chẳng hạn) rồi đặt trong bộ nhớ chương trình của IC. CPU khi cấp nguồn nuôi sẽ đọc và tất nhiên nó hiểu cái chuỗi 0-1 đó có nghĩa là gì và nó sẽ thực hiện theo ý nghĩa của lệnh nó dịch ra từ chuỗi 0-1 đó. Vậy tại sao nó hiểu được? Xin trả lời là bạn lại lan man rồi đấy! Nó hiểu được đơn giản vì người ta chế tạo ra đã như thế rồi. Hãy biết chấp nhận như vậy vào lúc này!

        Việc thực hiện các lệnh sẽ diễn ra tuần tự (lệnh ở địa chỉ thấp hơn được thực hiện trước) bắt đầu từ địa chỉ reset. Địa chỉ reset là địa chỉ của bộ nhớ chương trình mà tại đó, sau khi được cấp nguồn nuôi, CPU sẽ bắt đầu đọc và thực hiện theo chỉ dẫn được mã hóa đặt tại đó. Mỗi loại vi xử lý có một địa chỉ reset riêng (thường là từ 0000H) do nhà sản xuất quy định.

        Các lệnh được thực hiện tuần tự là nhờ có thanh ghi “bộ đếm chương trình”(PC). Thanh ghi này chứa địa chỉ của ô nhớ chứa mã của lệnh tiếp theo sẽ được thực hiện. Khi CPU tìm nạp được mã của lệnh n, thanh ghi PC sẽ tự độngtăng lên 1 đơn vị để trỏ vào ô nhớ chứa mã của lệnh (n+1).

        CPU thực hiện một lệnh theo các bước nhỏ. Thường thì các bước đó bao gồm: tìm nạp mã lệnh (fetch-tức là truy cập bộ nhớ chương trình, đọc lấy giá trị tại ô nhớ có địa chỉ trỏ bởi thanh ghi PC, lưu vào một thanh ghi chuyên dùng chứa mã lệnh trong CPU), giải mã lệnh (decode-giải mã giá trị đã lấy được và đang đặt trong thanh ghi chứa mã lệnh trong CPU), cuối cùng là thực hiện lệnh (execute-thực hiện chỉ dẫn được giải mã ra từ mã lệnh đọc được). Những vi xử lý đầu tiên được thiết kế với phương thức thực hiện lệnh một cách thuần “tuần tự”, nghĩa là thực hiện tuần tự 3 bước đối với lệnh thứ n rồi mới thực hiện 3 bước tiếp theo của lệnh thứ (n+1). 
        Sau này, các vi xử lý được thiết kế với CPU được module hóa thành từng phần riêng biệt có hoạt động khá độc lập với nhau, do đó mà cấu trúc xử lý đường ống (pipeline) ra đời. Với cấu trúc này, các bước nhỏ trong việc thực hiện các lệnh sẽ được gối lên nhau, trong khi một phần cứng của CPU thực hiện bước 3 (thực hiện lệnh) của lệnh n thì một phần cứng khác của CPU thực hiện việc giải mã lệnh tiếp theo (lệnh thứ n+1), và đồng thời một phần cứng khác nữa trong CPU tìm nạp mã của lệnh thứ (n+2).
        Với cấu trúc xử lý đường ống, tốc độ xử lý của CPU đã được nâng cao rõ rệt và tất cả những vi xử lý ngày nay đều được thiết kế với CPU theo cấu trúc xử lý này.


        Ngăn xếp(Stack)
        Là một đoạn bộ nhớ (thường đặt trong RAM) dùng để chứa địa chỉ trở về của trong các trường hợp chương trình con hoặc chương trình phục vụ ngắt được gọi. Ngoài ra ngăn xếp còn dùng để lưu các dữ liệu tạm thời. Ngăn xếp hoạt động theo cơ chế “vào sau ra trước” (LIFO-Last In First Out). Thanh ghi con trỏ ngăn xếp (SP-Stack Pointer) là thanh ghi có nội dung là địa chỉ của ô nhớ trên cùng của ngăn xếp. Giá trị của SP được tăng giảm một cách tự động. Ngăn xếp là phần cứng vô cùng quan trọng trong vi xử lý, nó tham gia vào các thao tác rẽ nhánh (trừ thao tác nhảy) của chương trình. Người lập trình phải hết sức cẩn thận khi gán giá trị khởi tạo cho SP để tránh sự cố tràn ngăn xếp hoặc ngăn xếp trùng với các vùng nhớ lưu dữ liệu khác. Khi xảy ra một trong các sự cố trên, sẽ không có cách nào kiểm soát được hoạt động của vi xử lý và có thể gây thiệt hại lớn đối với hệ thống. Giống như một trò chơi, khi bạn tham gia và vì một lý do nào đó phạm vào một trong hai lỗi đó, tất cả những gì bạn sẽ nhận được trên màn hình là dòng chữ “GAME OVER”!

        Vậy thế nào là địa chỉ trở về? Như đã nói ở trên, vi xử lý thực hiện các lệnh một cách tuần tự: lệnh 1, lệnh 2,…, lệnh n, lệnh n+1…Tuy nhiên đôi khi nó gặp phải một lệnh gọi chương trình con và do đó phải chuyển sang thực hiện chương trình con đó. Đoạn mã lệnh của chương trình con thường nằm ở một nơi khác trong bộ nhớ chương trình, tức là có địa chỉ không liên tiếp với lệnh gọi chương trình con. Nhắc lại rằng thanh ghi PC lúc này đang chứa địa chỉ của lệnh tiếp sau lệnh gọi chương trình con. CPU chỉ biết thực hiện những gì có tại địa chỉ chứa trong PC, do vậy mà PC cần phải được nạp giá trị mới là địa chỉ của mã lệnh đầu tiên của chương trình con. Việc nạp giá trị mới cho PC được thực hiện một cách tự động khi bạn gọi một chương trình con, ngoài ra địa chỉ của lệnh tiếp sau lệnh gọi chương trình con trong chương trình chính cũng được tự động lưu lại để sau khi thực hiện xong chương trình con, CPU sẽ có thể quay lại thực hiện tiếp chương trình chính một cách đúng chỗ, tuần tự như không có chuyện gì xảy ra. Nơi lưu giữ một cách tự động địa chỉ trở về (địa chỉ của lệnh tiếp sau lệnh gọi chương trình con) ấy chính là ngăn xếp. Người ta thực hiện việc chia chương trình chính thành các chương trình con (là các đoạn chương trình thực hiện một nhiệm vụ cụ thể) để dễ dàng cho việc lập trình và dò lỗi. Bạn sẽ dần có được kỹ năng chia nhỏ chương trình chính thành các chương trình con một cách hợp lý trong quá trình lập trình cho vi xử lý.

        Ngăn xếp cũng có vai trò tương tự như đối với ngắt. Vậy ngắt là gì? Đó là những yêu cầu do các ngoại vi (là các phần cứng tích hợp trên IC hoặc các tác động từ bên ngoài) gửi tới CPU nhằm đòi hỏi những đáp ứng nhất định. Mục đích của việc thiết kế cơ chế ngắt trong vi xử lý là nhằm tiết kiệm thời gian cho CPU. Trong hầu hết các trường hợp, vi xử lý cần phải thực hiện nhiều nhiệm vụ trong thời gian rất ngắn và liên tục. Để có thể đáp ứng kịp thời với các sự kiện cần xử lý, CPU có thể tiến hành thăm dò polling) liên tục các sự kiện để xem khi nào chúng xảy ra thì xử lý, đáp ứng lại. Tuy nhiên nếu làm vậy thì lãng phí rất nhiều thời gian của CPU trong khi còn có rất nhiều nhiệm vụ khác đang chờ được thực hiện, ngoài ra CPU không thể thăm dò nhiều sự kiện cùng một lúc được. Người ta tạo ra ngắt để CPU không phải thăm dò liên tục một hay nhiều sự kiện đó. Bằng cách ghép các sự kiện cần đáp ứng với các cơ chế ngắt khác nhau, khi một sự kiện nào đó xảy ra, phần cứng phụ trách ngắt tích hợp trên CPU sẽ tự động báo cho CPU biết rằng sự kiện đã xảy ra. CPU sẽ dừng công việc đang làm lại (nhưng phải thực hiện xong lệnh đang được thực hiện, dù mới chỉ ở giai đoạn tìm nạp mã lệnh), và chuyển sang đáp ứng bằng cách thực hiện chương trình phục vụ ngắt tương ứng. Đáp ứng xong, tức là xử lý xong sự kiện gây ra ngắt, CPU sẽ tiếp tục quay lại làm tiếp công việc đang dang dở (đương nhiên là nhờ hoạt động của ngăn xếp). Nói đến ngắt không thể không nói đến mức ưu tiên của các loại ngắt khác nhau. Có 02 loại mức ưu tiên ngắt cơ bản là ưu tiên giữa các ngắt xảy ra đồng thời (ngắt A và ngắt B xảy ra đồng thời cùng một lúc) và ưu tiên giữa các ngắt xảy ra khác thời điểm (đang thực hiện chương trình phục vụ ngắt A thì lại xảy ra ngắt B). Trong cả hai trường hợp, ngắt có mức ưu tiên cao hơn sẽ luôn được phục vụ ngay lập tức. Tùy loại vi xử lý mà mức ưu tiên có thể thay đổi được linh hoạt hoặc cố định.

        Khác với chương trình con, thời điểm thực hiện chương trình phục vụ ngắt trong hầu hết các trường hợp là nằm ngoài sự kiểm soát của người lập trình do ngắt có thể xảy ra bất kỳ thời điểm nào, khi CPU đang thực hiện bất kỳ một lệnh nào trong chương trình chính. Vì thế cơ chế hoạt động một cách tự động của ngăn xếp là không thể thiếu trong một vi xử lý. Cũng vì thế mà cần phải xem xét kỹ lưỡng việc sử dụng các tài nguyên (thanh ghi, ô nhớ, biến, thậm chí là các ngoại vi) của các chương trình phục vụ ngắt để tránh tranh chấp với chương trình chính. Thông thường thì khi vào đầu chương trình phục vụ ngắt, người ta lưu lại những tài nguyên dùng chung đó trước khi thay đổi chúng. Kết thúc chương trình phục vụ ngắt, các tài nguyên sẽ được khôi phục lại giá trị của chúng trước khi trở về chương trình chính. Thực hiện các thao tác lưu trữ và khôi phục này đương nhiên liên quan đến ngăn xếp, chỉ có điều không phải thực hiện một cách tự động bởi CPU mà phải do người lập trình chủ động thực hiện bằng các lệnh. Người lập trình phải quyết định cất những gì và lấy ra những gì! Cũng phải chú ý đến cơ chế hoạt động “vào sau ra trước” của ngăn xếp và cất đi bao nhiêu thì phải lấy ra bấy nhiêu. Nếu không bạn sẽ phạm phải một lỗi tương tự như tràn ngăn xếp và chỉ có Chúa mới biết được chuyện gì sẽ xảy ra khi địa chỉ trở về không được nạp đúng vào thanh ghi PC. Một trong những tài nguyên hay bị thay đổi khi thực hiện chương trình phục vụ ngắt là các cờ trạng thái của CPU. Đó là các bit thể hiện trạng thái hiện thời của CPU và của kết quả thực hiện các lệnh. Các cờ này thường được ghép với nhau thành một thanh ghi và được gọi là thanh ghi trạng thái


III. LẬP TRÌNH CHO MỘT VI XỬ LÝ


        Sau khi thiết kế xong phần cứng, bạn phải tiến hành lập trình cho vi xử lý để hoàn thiện sản phẩm của mình. Vi xử lý có thể được lập trình bằng ngôn ngữ bậc cao hay ngôn ngữ bậc thấp. Ngôn ngữ bậc thấp là ngôn ngữ được thiết kế riêng cho từng loại vi xử lý và thường được gọi là hợp ngữ (Assembly). Ngôn ngữ bậc cao là các ngôn ngữ gần với ngôn ngữ của con người và giống nhau cho nhiều loại vi xử lý. Mỗi loại ngôn ngữ đều có ưu và nhược điểm riêng. Với những người mới bắt đầu nghiên cứu về kỹ thuật vi xử lý, theo kinh nghiệm của riêng bản thân, tôi cho rằng nên bắt đầu với ngôn ngữ bậc thấp. Có một số điểm đáng lưu ý khi bạn lập trình cho một vi xử lý. Đó là:

        - Trước tiên bạn phải hiểu rõ được các chế độ địa chỉ của vi xử lý đó. Chế độ địa chỉ chính là cách chỉ ra toán hạng nằm ở đâu. Toán hạng là các tham số, các hằng số, các ô nhớ, các thanh ghi, các bit, các cờ…hay nói chung là các đối tượng tham gia vào việc thực hiện lệnh. Thông thường thì một toán hạng (ví dụ như một thanh ghi) có thể được trỏ đến bằng một vài chế độ địa chỉ khác nhau. Mỗi chế độ địa chỉ có thế mạnh riêng của nó và tùy từng trường hợp mà ta nên chọn chế độ thích hợp khi lập trình.

        - Sau đó bạn phải nắm bắt được tập lệnh (Instruction Set) của vi xử lý đó. Tập lệnh là tất cả những lệnh mà vi xử lý có thể hiểu được, có thể thực hiện được. Mỗi lệnh đều được mã hóa (hay được quy ước) bởi một chuỗi các bit 0 và 1. Các vi xử lý khác nhau thì có tập lệnh khác nhau do nhà sản xuất chip cung cấp.

        - Trước khi bắt đầu viết các lệnh cụ thể, bạn nên viết lưu đồ thuật toán thực hiện các nhiệm vụ cụ thể. Lưu đồ thuật toán là sơ đồ diễn giải trình tự thực hiện các nhiệm vụ một cách lôgic và liền mạch. Viết lưu đồ thuật toán ngay cả cho các chương trình hết sức đơn giản là một thói quen rất tốt ngay cả khi bạn đã là một cao thủ trong lập trình vi xử lý. Chỉ cần mất chút thời gian thực hiện công việc này, bạn sẽ có được cái nhìn vừa bao quát vừa chi tiết đối với chương trình mình định viết, nhờ đó mà bạn lập trình nhanh hơn, hiệu quả hơn và dễ dàng phát hiện ra lỗi về thuật toán xử lý nếu chương trình chạy không như ý muốn. Đối với bản thân tôi mà nói, tôi cho rằng viết các dòng lệnh cho một vi xử lý không phải là khó, ngược lại nó rất dễ, cái khó là bạn phải biết được mình phải viết những gì hay nói đúng hơn là phải tìm ra một lưu đồ thuật toán đúng đắn. Khi đã tìm ra con đường đi đúng và hiệu quả, tất cả những gì còn lại phải làm là thể hiện các thao tác xử lý đó bằng cách lệnh của vi xử lý - một công việc mà bất cứ ai nắm rõ tập lệnh của vi xử lý đó đều có thể làm tốt. Khi lưu đồ thuật toán bạn lập ra là đúng, nếu sau khi lập trình mà vi xử lý hoạt động không như mong muốn thì lỗi chỉ có thể là do bạn chưa thể hiện bằng các dòng lệnh một cách đúng đắn những gì đã lập ra mà thôi. Dần dần, kinh nghiệm tích lũy được sẽ chỉ cho bạn cách thể hiện đúng một lưu đồ bất kỳ thậm chí ngay ở lần đầu tiên và theo như cách chúng tôi vẫn nói đùa trong chuyên môn, trình độ lập trình của bạn đã đạt đến cấp độ “plug and play”! 
        - Chương trình sẽ được viết trong một file mã nguồn (thường có đuôi là ASM). 
        - Phần mềm trên máy tính có tên là “Trình biên dịch” (Compiler) sẽ dịch file mã nguồn sang một file có đuôi là OBJ. File này chứa thông tin cần thiết để có thể chuyển đổi sang file có đuôi HEX hay file có đuôi BIN (là các file chứa mã chương trình đã được chuyển sang dạng Hexa hay Binary) để có thể nạp vào trong bộ nhớ chương trình của vi xử lý.

        - Trong khi lập trình, hãy đặc biệt lưu ý đến các tình huống rẽ nhánh của chương trình. Các tình huống đó bao gồm các lệnh nhảy vô điều kiện, các lệnh nhảy có điều kiện, các lệnh gọi chương trình con, các tình huống xảy ra ngắt và đương nhiên phải chú ý đến các phần cứng liên quan như ngăn xếp hay các cờ trạng thái. 
        - Với mỗi loại vi xử lý/vi điều khiển lại có nhiều hãng cung cấp các phần mềm trên máy tính dùng để soạn thảo và biên dịch. Các phần mềm này có các từ khóa khác nhau mà người lập trình phải tuân thủ khi sử dụng. Từ khóa là các ký hiệu được thể hiện bằng các ký tự, được viết trong file mã nguồn nhưng nó không phải là lệnh của vi xử lý, đương nhiên không được dịch ra mã máy, đó chỉ là các chỉ dẫn cho phần mềm trên máy tính thực hiện biên dịch các file mã nguồn sang mã máy một cách chính xác.

Giới thiệu

Sự phát triển mạnh mẽ của vi điều khiển như ngày hôm nay là nhờ công nghệ mạch tích hợp. Công nghệ này đã cho phép chúng ta lưu trữ hàng trăm nghìn bóng bán dẫn vào một con chip, mở đầu cho việc sản xuất các bộ vi xử lý. Các máy tính đầu tiên được tạo ra bằng cách kết hợp các thiết bị ngoại vi bên ngoài vào bộ vi xử lý chính như bộ nhớ, các bus vào ra, các bộ định thời … Theo thời gian, việc tăng thêm mật độ tích hợp đã tạo ra các loại chip đầu tiên, có chứa cả bộ xử lý, các thiết bị ngoại vi, mà chúng ta quen gọi là vi điều khiển. Vậy mọi thứ đã bắt đầu phát triển từ đâu?

Trở về quá khứ…

Tại Châu Á, vào năm 1969, một nhóm các kỹ sư Nhật Bản từ BUSICOM đãđến Mỹ để đặt hàng một vài vi mạch tích hợp cần thiết cho các máy tính được thiết kế theo dự án của họ. Yêu cầu này được gửi đến INTEL, và Marcian Hoff là người phụ trách của dự án đó. Là người có kinh nghiệm trong lĩnh vực điện tử máy tính, ông đề xuất một ý tưởng mới, thay vì ý tưởng thiết kế được đưa ra trước đó. Giải pháp này là thiết kế các vi mạch hoạt động đúng theo chương trình được lưu trữ trong chính bản thân nóĐiều này có nghĩa là cấu hình vi mạch sẽ đơn giản hơn, nhưng nó sẽ đòi hỏi nhiều không gian bộ nhớ hơn so với giải pháp được đề xuất bởi các kỹ sư Nhật Bản. Sau một thời gian, trong khi các kỹ sư Nhật Bản vẫn cố gắng tìm một giải pháp dễ dàng hơn, thì ý tưởng của Marcian đã được hiện thực và bộ vi xử lý đầu tiên đã ra đời. Một cộng sự lớn của Marcian, góp phần biến ý tưởng trở thành sản phẩm đó là Federico Faggin. Chín tháng sau khi thuê anh ta, Intel đã thành công trong việc phát triển một sản phẩm từ ý tưởng ban đầu đó. Năm 1971, Intel có được quyền bán mạch tích hợp này. Trước đó, Intel đã mua lại bản quyền từ BUSICOM, trở thành kho báu của Intel. Trong năm đó, một bộ vi xử lý được gọi là 4004 xuất hiện trên thị trường. Đó là bộ vi xử lý 4-bit đầu tiên với tốc độ 108KHz, số lượng bóng bán dẫn là 2.300.

Không lâu sau đó, một công ty Mỹ là CTC yêu cầu Intel và Texas Instruments sản xuất một bộ vi xử lý 8-bit đ sử dụng trong các thiết bị đầu cuối. Mặc dù CTC đã từ bỏ dự án này, nhưng Intel và Texas Instruments vẫn tiếp tục nghiên cứu bộ vi xử lýmới và vào tháng  năm 1972, các bộ vi xử lý 8-bit đầu tiên được gọi là 8008 xuất hiện trên thị trường. Nó sở hữu 16kb bộ nhớ, với tốc độ 200KHz, số lượng bóng bán dẫn là 3.500. Bộ vi xử lý này là tiền thân của tất cả các bộ vi xử lý ngày nay. Intel tiếp tục phát triển nó và trong tháng 4 năm 1974 tiếp tục tung ra một bộ xử lý 8-bit được gọi là 8080. Nó sở hữu 64Kb bộ nhớ, với tốc độ 2MHz, và số lượng bóng bán dẫn là6.000.
Một công ty khác của Mỹ có tên là Motorola, nhanh chóng nhận ra thị trường tiềm năng này, do đó họ tung ra bộ vi xử lý 8-bit 6800. Phụ trách chính của họ là Chuck Peddle. Ngoài bộ vi xử lý riêng của mình, Motorola là công ty đầu tiên sản xuất thiết bị ngoại vi khác như 6820 và 6850. Vào thời điểm đó, nhiều công ty nhận ra tầm quan trọng của bộ vi xử lý và bắt đầu phát triển . Chuck Peddle lúc này rời Motorolađể làm việc cho MOS Technology và tiếp tục tập trung phát triển các bộ vi xử lý.
Tại triển lãm WESCON ở Mỹ vào năm 1975, một sự kiện quan trọng trong lịch sử của các bộ vi xử lý đã diễn ra. Tập đoàn MOS Technology công bố rằng vi xử lý 6501 và 6502 đã được bán ở mức $25 một bộ, mọi khách hàng quan tâm có thể mua ngay lập tức. Thông tin này thậm chí khiến cho người ta nghĩ rằng đây là một kiểu lừa đảovì mức giá của các công ty cạnh tranh đã bán 8080 và 6800 là ở mức $179 mỗibộ. Vào ngày đầu tiên của triển lãm, để đáp trả lại với đối thủ cạnh tranh, cả Motorola và Intel cắt giảm giá của các bộ vi xử lý của họ đến $69,95. Motorola cáo buộc MOS Technology và Chuck Peddle vi phạm bản quyền đã được bảo vệ cho bộ vi xử lý 6800. Do đó, MOS Technology ngừng việc sản xuất 6501, nhưng vẫn duy trì sản xuất 6502. Đó là các bộ vi xử lý 8-bit với 56 tập lệnh và khả năng truy cập trực tiếp 64Kb bộ nhớ. Do giá thấp, 6502 đã trở thành rất phổ biến, do đó nó đã được cài đặt vào máy tính như KIM-1, Apple I, Apple II, Atari, Commodore, Acorn, Oric, Galeb, Orao, Ultra và nhiềuthiết bị khác. Rất nhanh sau đó, nhiều công ty đã bắt đầu sản xuất 6502 (Rockwell, Sznertek, GTE, NCR, Ricoh, Commodore, vượt qua cả MOS Technology). Trong năm thịnh vượng 1982, bộ vi xử lý này đã được bán với tốc độ khủng khiếp, 15 triệu bộ xử lý một năm!
Các công ty khác không muốn từ bỏ thị trường này. Frederico Faggin đã rời Intel và bắt đầu tại công ty Zilog Inc. Năm 1976 Zilog công bố Z80. Khi thiết kế bộ vi xử lý này Faggin đã có một quyết định rất quan trọng. Đó là nhận thấy 8080 đã rấtphát triển và ông nhận ra rằng nhiều người sẽ vẫn trung thành với bộ xử lý đó vì chi phí cho việc thay thế, viết lại toàn bộ các chương trình sẽ rất lớn ông quyết định rằng một bộ xử lý mới sẽ có thể tương thích với 8080, tức là nó có để có thể thực hiệnđược tất cả các chương trình đã viết cho 8080. Bên cạnh đó, nhiều tính năng khác đã được thêm vào, để cho Z80 là bộ vi xử lý mạnh mẽ nhất tại thời điểm đó. Nó đã có thểtruy cập trực tiếp đến 64Kb địa chỉ bộ nhớ, đã có 176 tập lệnh, một số lượng lớn thanh ghi, bộ nhớ RAM mới, một nguồn cung cấp điện duy nhất, tốc độ hoạt động lớn hơnvv. Các bộ vi xử lý Z80 là một thành công lớn và tất cả mọi người đã thay thế 8080 thành Z80. Chắc chắn là Z80 là bộ vi xử lý 8-bit thương mại thành công nhất tại thời điểm đó. Bên cạnh Zilog, các nhà sản xuất mới khác như Mostek, NEC, SHARP và SGS xuất hiện sớm. Z80 là trung tâm của nhiều máy tính như: Spectrum, Partner, TRS703, Z-3 và Galaxy.
Năm 1976, Intel đã đưa ra một phiên bản nâng cấp của bộ vi xử lý 8-bit được gọi là 8085. Tuy nhiên, Z80 vẫn tốt hơn rất nhiều và Intel thất bại với bộ vi xử lý mới. Mặc dù một vài bộ vi xử lý khác tiếp tục xuất hiện trên thị trường (6809, 2650, SC / MP), nhưng Z80 đã chấm dứt mọi cơ hội. Không có những cải tiến lớn, các bộ vi xử lý khác đã không thể làm thay đổi lựa chọn của các nhà sản xuất, do đó cuối cùng 6502 và Z80 cùng với 6800 vẫn là đại diện chính của các bộ vi xử lý 8-bit thời điểm đó.
Phạm Văn Ngọc Anh-01644326695
Nguồn: dientumaytinh.com

Author Name

{picture https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN0PUWA2genMqX3Sm26mBTX_30OJgDenoIi4K6BR-E1vl3nI7LALp0X759QZgzqrMcGBB7jEbdZnubJbp4n2ZZ22KT196CWCg9DLs3MfEivocdmkjZEPEn-A42hyphenhyphen9dmsca0VIDQr_LjqM/s512-Ic42/pham-van-ngoc-anh.jpg}

Tôi là Ngọc Anh. Tôi đến từ Nghệ An. Tôi tốt nghiệp một trường đại học tại Sài Gòn. Hiện tôi đang phát triển công ty riêng. Liên lạc với tôi qua:

{facebook https://www.facebook.com/phamvanngocanh}
{twitter https://twitter.com/nghiphong1993}
{google https://plus.google.com/+dientuchiase/posts}
{youtube https://www.youtube.com/channel/UCeJKhA_goBNFmDw6RKNtmYQ}

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.