Chip avr là gì

  • Phần 1 và phần 2:
    .CSEG

         Chỉ thị .CSEG: Code Segment báo cho trình biên dịch rằng phần code theo sau là phần chương trình thực thi, phần này sẽ được download vào bộ nhớ chương trình của chip.

    .INCLUDE "M8DEF.INC"

         Chỉ thị .INCLUDE báo cho trình biên dịch bắt đầu đọc 1 file đính kèm, trong trường hợp trên là file “M8DEF.INC”, đây là file chứa các khai báo cho chip Atmega8 như thanh ghi, ngắt…cho việc truy xuất trong chương trình của bạn, đây là dòng bắt buộc, nếu bạn lập trình cho chip khác bạn hãy đổi tên file đính kèm, ví dụ “m32def.inc” cho chip ATmega32… bạn có thể tìm thấy các file này trong thư mục “C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes”.

    .ORG 0x000

         Chỉ thị .ORG: Set Program Origin, set vị trí trong bộ nhớ sẽ được tác động đến, trong trường hợp trên, .ORG 0x000 xác định phần code theo ngay sau sẽ nằm ở địa chỉ 000, vị trí đầu tiên, trong bộ nhớ chương trình. Và dòng lênh trong vị trí đầu tiên đó là:

    RJMP BATDAU

         RJMP: Relative Jump là lệnh nhảy không điều kiện đến 1 vị trí trong bộ nhớ, trong trường hợp trên là nhảy đến nhãn BATDAU, và nhãn BATDAU nằm ở vị trí 0x020 [số hexadecimal, 0x020 =32 decimal] vì nó được khai báo ngay sau DIRECTIVE .ORG 0x020.

    .ORG 0x020
    BATDAU

         Như thế phần bộ nhớ chương trình nằm giữa 0 và 0x020 không được sử dụng trong đoạn code của chúng ta, phần này được sử dụng cho mục đích khác, đó là các vectơ ngắt [ không được đề cập ở đây]. Tiếp theo:

    ; KHOI TAO CÁC DIEU KIEN DAULDI R16, HIGH[RAMEND]LDI R17, LOW[RAMEND]OUT SPH, R16

    OUT SPL, R17


    Bốn dòng code trên khởi tạo cho Stack Pointer, chúng ta sẽ tìm hiểu phần này trong các bài về Stack và chương trình con.

    Lời khuyên: các bạn nên khởi động 1 chương trình theo cách trên và chúng ta sẽ hiểu chúng rõ hơn sau này !

    LDI R16, 0xFF
    OUT DDRB, R16

         Bạn chú ý 2 dòng trên và những gì tôi giải thích sau đây, 2 dòng này có tác dụng khởi động PORTB của chip ATmega8 tác dụng như các ngõ xuất tín hiệu [OUTPUT]. Trước hết hãy quan sát chip ATmega8 trong hình sau

    Hình 1: chip ATmega8.

         Bạn có thể thấy chip này gồm 28 chân, trông đó có các chân được ghi là PB0[chân 14], PB1[chân 15],…,PB7[chân 10], đó là các chân của PORTB. PORT là khái niệm chỉ các ngõ xuất nhập. Trong AVR, PORT có thể giao tiếp theo 2 hướng [bi – directional], có thể dùng để xuất hoặc nhận thông tin, mỗi PORT có 8 chân. Chip Atmega8 có 3 PORT có tên tương ứng là PORTB, PORTC và PORTD [một số chip AVR khác có 4 hoặc 6 PORT]. PORT được coi là “cửa ngõ” then chốt của vi điều khiển.

         Trong AVR, mỗi PORT liên quan đến 3 thanh ghi [8 bits] có tên tương ứng là DDRx, PINx, và PORTx với “x” là tên của PORT, mỗi bit trong thanh ghi tương ứng với mỗi chân của PORT. Trong trường hợp của Atmega8 “x” là B, C hoặc D. Ví dụ chúng ta quan tâm đến PORTB thì 3 thanh ghi tương ứng có tên là DDRB, PINB và PORTB, trong đó 2 thanh ghi PORTB và PINB được nối trực tiếp với các chân của PORTB, DDRB là thanh ghi điều khiển hướng [ Input hoặc Output]. Viết giá trị 1 vào một bit trong thanh ghi DDRB thì chân tương ứng của PORTB sẽ là chân xuất [Output], ngược lại giá trị 0 xác lập chân tương ứng  là ngõ nhập. Sau khi viết giá trị điều khiển vào DDRB, việc truy xuất PORTB được thực hiện thông qua 2 thanh ghi PINB và PORTB.

         Quay lại với 2 dòng code của chúng ta, dòng đầu: “LDI R16, 0xFF”, với LDI – LoaD Immediately, dòng lệnh có ý nghĩa là load giá trị 0xFF vào thanh ghi R16, R16 là tên 1 thanh ghi trong bộ nhớ của AVR, 0xFF là 1 hằng số có dạng thập lục phân, ký hiệu “0x” nói lên điều đó, bạn cũng có thể dùng ký hiệu khác là “$” để chỉ 1 số thập lục phân, ví dụ &FF, và 0xFF=255[thập phân]=0B11111111 [nhị phân]. Như thế sau dòng đầu thanh ghi R16 có giá trị là 11111111 [nhị phân]. Dòng thứ 2: “OUT DDRB, R16” nghĩa là xuất giá trị từ thanh ghi R16 ra thanh ghi DDRB, tóm lại sau 2 dòng trên giá trị DDRB như sau:

         Có thể bạn sẽ hỏi tải sao chúng không sử dụng 1 dòng duy nhất là “LDI DDRB, 0xFF” hay “OUT DDRB, 0xFF”, chúng ta không thể vì lệnh LDI chỉ cho phép thực hiện trên các thanh ghi R16,…R31 và lệnh OUT không thực hiện được với các hằng số.

         Và vì DDRB=11111111 nên trong trường hợp này tất cả các chân của PORTB đã sẵn sàng cho việc xuất dữ liệu. Lúc này thanh ghi PINB không có tác dụng, thanh ghi PORTB sẽ là thanh ghi xuất, ghi giá trị vào thanh ghi này sẽ tác động đến các chân của PORTB.1

  • Phần 3: Chương trình chính

    MAIN:LDI R16, 0B00000001OUT PORTB, R16RCALL DELAY

         Bạn chỉ cần chú ý 4 dòng trên trong toàn bộ phần chương trình chính, trước hết  “MAIN:” chỉ là 1 nhãn do chúng ta tự đặt tên, giống như 1 “cột mốc” trong chương trình thôi. Dòng “LDI R16, 0B00000001” thì bạn đã hiểu, chỉ có 1 khác biệt nhỏ là tôi sử dụng hằng số dạng nhị phân cho bạn dễ hiểu hơn. Và dòng “OUT PORTB, R16” để xuất giá trị 0B00000001 có sẵn trong R16 ra thanh ghi PORTB, lúc này chân PB0 của chip sẽ lên 1 [5V] và các chân còn lại sẽ ở mức 0 [0V]. Dòng thứ 3: “RCALL DELAY” là lệnh gọi chương trình con DELAY, tạm hoãn  trước khi thực hiện các dòng lệnh tiếp theo:

    LDI R16, 0B00000010OUT PORTB, R16

    RCALL DELAY


         Ba dòng lệnh này cũng giống ba dòng trên, nhưng giá trị xuất ra lúc này là 0B00000010, chân PB1 sẽ lên 5V và các chân khác xuống mức 0V. Và cứ như thế đến đoạn cuối:

    LDI R16, 0B10000000OUT PORTB, R16

    RCALL DELAY


    RJMP MAIN
  • Bây giờ chắc bạn đã đoán được chương trình của chúng ta thực hiện việc gì, đó là quét xoay vòng các chân của PORTB, nếu chúng ta kết nối các chân của PORTB với các LED, chúng ta sẽ có 1 hiệu ứng quét LED xoay vòng, chúng ta thực hiện điều này bằng phần mềm Proteus.

  • Phần 4:  chương trinh con DELAY: đoạn chương trình này không làm gì cả ngoài việc trì hoãn 1 khoảng thời gian, tuy nhiên bạn chưa thể hiểu nó ngay được.

    Đây chỉ là 1 ví dụ đơn giản, tôi cố gắng thực hiện nó theo cách dễ hiểu nhất cho bạn, vì thế đoạn code có vẻ hơi dài dòng, bạn hãy thực hiện lại đoạn chương trình chính bằng đoạn code của bạn.

    Phần cuối cùng là biên dịch đoạn code thành file intel hex để đổ vào chip, nhấn phím F7 để biên dịch.

    Sau khi biên dịch bạn sẽ có 1 file tên “avr1.hex”  trong thưc mục project, chúng ta sẽ dùng file này đổ vào chip sau này.

  • Ngày nay, thay vì sử dụng các mạch logic người ta thường sử dụng vi điều khiển bởi chúng có thiết kế linh hoạt và tiết kiệm không gian. Có nhiều bộ vi điều khiển khác nhau, mỗi loại có một đặc điểm riêng. Bài viết này, cmcdistribution.com.vn sẽ giới thiệu về vi điều khiển ARM và sự khác biệt của ARM với  AVR, 8051 và PIC.

    Vi điều khiển ARM là gì?

    Một bộ vi điều khiển là một thiết bị cực kỳ mạnh mẽ, có khả năng thực hiện một loạt các tác vụ được lập trình sẵn và tương tác với các thiết bị phần cứng bổ sung.

    Được đóng gói trong một mạch tích hợp nhỏ [IC] có kích thước và trọng lượng thường không đáng kể. Vi điều khiển đang trở thành bộ điều khiển tốt nhất cho robot hoặc bất kỳ máy nào cần một số loại tự động hóa thông minh. 

    Một bộ vi điều khiển duy nhất có thể đủ để quản lý một robot di động nhỏ, máy giặt tự động hoặc hệ thống bảo mật.

    Một số bộ vi điều khiển chứa bộ nhớ để lưu chương trình sẽ được thực thi và rất nhiều dòng vào/ra có thể được sử dụng để hoạt động chung với các thiết bị khác, như đọc trạng thái của cảm biến hoặc điều khiển động cơ.

    Vi điều khiển ARM tạo ra bộ xử lý đa lõi RISC 32 bit và 64 bit. Bộ xử lý RISC được thiết kế để thực hiện một số lượng nhỏ hơn các loại hướng dẫn máy tính để chúng có thể hoạt động ở tốc độ cao hơn, thực hiện thêm hàng triệu phép tính mỗi giây [MIPS].

    Bằng cách loại bỏ các phép tính không cần thiết và tối ưu hóa các lộ trình, bộ xử lý RISC mang lại hiệu suất vượt trội tại một phần nhu cầu năng lượng của quy trình CISC [tính toán tập lệnh phức tạp].

    Vi điều khiển AVR, 8051, PIC

    AVR là bộ vi điều khiển được phát triển vào năm 1996 bởi Tập đoàn Atmel. Thiết kế cấu trúc của AVR được phát triển bởi Alf-Egil Bogen và Vegard Wollan. AVR có ba loại là TinyAVR, MegaAVR và XmegaAVR.

    Hữu ích cho bạn:  Giới thiệu về Encoder, cấu tạo và nguyên lý hoạt động

    8051 là một họ vi điều khiển 8 bit được Intel phát triển vào năm 1981. Đây là một trong những họ vi điều khiển phổ biến đang được sử dụng trên toàn thế giới. Bộ vi điều khiển này còn được gọi là hệ thống trên một chip vì nó có 128 byte RAM, 4Kbyte ROM, 2 Timers, 1 cổng nối tiếp và 4 cổng trên một chip.

    CPU cũng có thể hoạt động cho 8 bit dữ liệu tại một thời điểm vì 8051 là bộ xử lý 8 bit. Trong trường hợp dữ liệu lớn hơn 8 bit, thì nó phải được chia thành các phần để CPU có thể xử lý dễ dàng. Hầu hết các nhà sản xuất có chứa 4Kbyte ROM mặc dù số lượng ROM có thể vượt quá 64 Kbyte.

    PIC là bộ vi điều khiển được phát triển bởi Microchip. PIC thực hiện chương trình nhanh và đơn giản. Lập trình và giao tiếp với các thiết bị ngoại vi khác dễ dàng.

    Sự khác biệt giữa ARM, AVR, 8051 và PIC

    ARM AVR 8051 PIC
    Băng thông 32 bit 8/32 bit 8 bit 8/16/32 bit
    Giao thức truyền thông UART, USART, SPI, I2C, LIN, CAN, USB, Ethernet, DSP, SAI, IrDA SPI, I2C, CAN, USB, UART, USART, Ethernet UART, USART, SPI, I2C  UART, USART, SPI, I2C, LIN, CAN, Ethernet
    Tốc độ 1 chu kỳ/giờ 1 chu kỳ/giờ 12 chu kỳ/giờ 4 chu kỳ/giờ
    Bộ nhớ  SDRAM, FLASH, EEPROM SRAM, FLASH, EEPROM ROM, SRAM, FLASH SRAM, FLASH
    ISA RISC RISC CLSC RISC
    Kiến trúc bộ nhớ
    Kiến trúc Harvard được sửa đổi Đã sửa đổi Kiến trúc Von Neumann Kiến trúc Harvard
    Điện năng tiêu thụ
    Thấp Thấp Trung bình Thấp
      ARM v4, 5, 6, 7 Tiny, Atmega, Xmega, mục đích đặc biệt AVR 8051 PIC16, PIC17, PIC18, PIC24, PIC32
    Kết nối Lớn Rất tốt Lớn Rất tốt
    Nhà cung cấp Apple, Nvidia, Qualcomm, 

    Samsung Electronics và TI,…

    Atmel NXP, Atmel, Silicon Labs, Dallas, Cyprus, Infineon,… Microchip Average
    Giá Thấp Trung bình Rất thấp Trung bình
    Vi điều khiển phổ biến LPC2148, ARM Cortex – M0 tới ARM Cortex-M7… Atmega8, 16, 32, Cộng đồng Arduino,… AT89C51, P89v51,… PIC18fXX8, PIC16f88X, PIC32MXX

    Sức mạnh chi tiết

    Không nói rõ ràng về tiến độ xung clock tại đây. điều tạo ra sự khác lạ to hơn là lõi 32 bit có khả năng nhân hai số 10 chữ số chỉ trong một chu kì xung nhịp. Sống cùng vận tốc xung nhịp, kiến trúc 32 bit có khả năng nhanh hơn 8 lần đối chiếu với kiến trúc 8 bit bình thường.

    Còn được hiểu là hữu hiệu năng lượng tốt hơn [ mức tiêu thụ điện năng tăng tuyến tính với vận tốc xung nhịp ]. Một vi mạch được đưa bởi lõi arm có khả năng làm vài ba cử chỉ khó và có khả năng chạy các thuật toán để khiến cho sử dụng của bạn khôn ngoan hơn, tốt hơn và nhanh hơn.

    Tốc độ đáp ứng

    Đây là địa điểm có các lõi và máy móc ngoại vi cao tốc nảy sinh. Với vận tốc xung nhịp lớn nhất trên 50 mhz, cho đến hết rất nhiều mhz, lõi và các máy móc ngoại vi phản ứng khá nhanh. đối với những sử dụng thời kỳ thực như khai triển máy chủ /máy khách , web và sử dụng internet of things , chuyện này tạo nên sự khác lạ.

    Hơn nữa, nền tảng giải pháp xử lí ngắt tốt hơn nhiều đối chiếu với kiến trúc 8 bit. Chuyện này sẽ được lưu tâm lại trong một thông tin trong thời gian tới về arm vic [ thiết bị kiểm soát ngắt vectơ ]. Tiêu thụ năng lượng thấp và với vận tốc lớn và phản ứng nhanh khiến arm tạo nên lựa chọn tối ưu cho các trang thiết bị có công suất thấp , công suất cao.

    Thiết bị ngoại vi

    Dù cho arm có vẻ xa xỉ chính từ cái nhìn thứ nhất, chúng được xây dựng cho các xây dựng giá bèo. Chip thường chứa phần lớn nhiều điều mà một vài ứng dụng bình thường, ví dụ như bộ định thời , adc và dac. Các kết nối thông tin như uart, i2c, spi, sdio, jtag, usb, can, i2s, v. V. đều được xây dựng dưới dạng máy móc ngoại vi.

    Bình thường có hơn 6-8 kết nối thông tin sự khác nhau trên một arm. Bạn sẽ chả khi nào phải ngẫm ngợi về việc dùng chip/phần cứng bề mặt của bạn nữa. Thêm vào cao đồng nghĩa với pcb bé hơn và xây dựng dễ dàng hơn – nhiều khả năng khiến bạn không lãng phí rất đông tiền.

    Bộ nhớ tăng

    Không nên chờ đợi trông thấy bộ nhớ flash là 16 mb ! nhiều dung lượng bộ nhớ hơn thường flash khoảng 512kb hoặc 1 mb. Tuy nhiên thêm một lần nữa, tập lệnh cấy ghép cho mật độ mã máy cực kỳ cao. Bạn có khả năng mã hóa trình phát mp3 toàn bộ chức năng với dung lượng bộ nhớ flash là 400kb.

    Hơn thế nữa, bộ đệm và nền tảng giải pháp đường ống giúp bứt tốc truy cập flash để một lệnh được thi hành cho mỗi chu kì xung clock. Dường như thiếu hẳn trạng thức chờ trong bộ vi xử lí arm nếu bạn thiết kế giải pháp đúng cách. Bên cạnh đó, ram được kết nối trực tiếp với bus chuỗi nội bộ [ thường được biết với tên ahb ] với vận tốc cực cao.

    Bạn thường nhận được hơn 16-23kb ram trên chip arm7 bình thường. Lúc bạn chuyển hướng sang các trang thiết bị arm có flash / ram ngoài , bạn có khả năng đạt đến 64 hoặc 128 mb cho các phiên bản dung lượng bộ nhớ ram và flash.

    Cấu hình đầy đủ

    Đây là một trong những tính năng hấp dẫn nhất bạn sẽ tìm thấy trên chip ARM. Mỗi thiết bị ngoại vi đều có cấu hình đầy đủ – chi tiết đến từng phút. Ví dụ, trên phần cứng giao diện nối tiếp, bạn thậm chí có thể quyết định thời gian cao và thời gian thấp cho tín hiệu xung.

    Đối với UART, tốc độ baud không lỗi và hỗ trợ phần cứng để kiểm tra tính chẵn lẻ và nhiều tính năng khác giúp nhận ra ứng dụng của bạn đẹp mắt và chuyên nghiệp.

    Trên đây là bài viết giới thiệu tổng quan về vi điều khiển ARM. Mong rằng qua bài viết này của cmcdistribution.com.vn đã giúp các bạn hiểu rõ hơn về ARM.

    Video liên quan

    Chủ Đề