Thứ Sáu, 10 tháng 8, 2012

[dientu686.com]Bài 1 - Làm quen AVR


I. Giới thiệu
      AVR là một họ vi điều khiển do hãng Atmel sản xuất (Atmel cũng là nhà sản xuất dòng vi điều khiển 89C51 mà có thể bạn đã từng nghe đến). AVR là chip vi điều khiển 8 bits với cấu trúc tập lệnh đơn giản hóa-RISC(Reduced Instruction Set Computer), một kiểu cấu trúc đang thể hiện ưu thế trong các bộ xử lí.  
      Tại sao AVR: so với các chip vi điều khiển 8 bits khác, AVR có nhiều đặc tính hơn hẳn, hơn cả trong tính ứng dụng (dễ sử dụng) và đặc biệt là về chức năng:
  • Gần như chúng ta không cần mắc thêm bất kỳ linh kiện phụ nào khi sử dụng AVR, thậm chí không cần nguồn tạo xung clock cho chip (thường là các khối thạch anh).
  • Thiết bị lập trình (mạch nạp) cho AVR rất đơn giản, có loại mạch nạp chỉ cần vài điện trở là có thể làm được. một số AVR còn hỗ trợ lập trình on – chip bằng bootloader không cần mạch nạp… 
  • Bên cạnh lập trình bằng ASM, cấu trúc AVR được thiết kế tương thích C. 
  • Nguồn tài nguyên về source code, tài liệu, application note…rất lớn trên internet. 
  • Hầu hết các chip AVR có những tính năng (features) sau:
  • Có thể sử dụng xung clock lên đến 16MHz, hoặc sử dụng xung clock nội lên đến 8 MHz (sai số 3%)
  • Bộ nhớ chương trình Flash có thể lập trình lại rất nhiều lần và dung lượng lớn, có SRAM (Ram tĩnh) lớn, và đặc biệt có bộ nhớ lưu trữ lập trình được EEPROM.
  • Nhiều ngõ vào ra (I/O PORT) 2 hướng (bi-directional).
  • 8 bits, 16 bits timer/counter tích hợp PWM.
  • Các bộ chuyển đối Analog – Digital phân giải 10 bits, nhiều kênh.
  • Chức năng Analog comparator.
  • Giao diện nối tiếp USART (tương thích chuẩn nối tiếp RS-232).
  • Giao diện nối tiếp Two –Wire –Serial (tương thích chuẩn I2C) Master và Slaver.
  • Giao diện nối tiếp Serial Peripheral Interface (SPI)
  • ...
Một số chip AVR thông dụng:
  • AT90S1200
  • AT90S2313
  • AT90S2323 and AT90S2343
  • AT90S2333 and AT90S4433
  • AT90S4414 and AT90S8515
  • AT90S4434 and AT90S8535
  • AT90C8534
  • ATtiny10, ATtiny11 and ATtiny12
  • ATtiny15
  • ATtiny22
  • ATtiny26
  • ATtiny28
  • ATmega8/8515/8535
  • ATmega16
  • ATmega161
  • ATmega162
  • ATmega163
  • ATmega169
  • ATmega32
  • ATmega323
  • ATmega103
  • ATmega64/128/2560/2561
  • AT86RF401.
  • ....
     Trong bài viết này tôi sử dụng chip ATmega8 để làm ví dụ, tôi chọn ATmega8 vì đây là loại chip thuộc dòng AVR mới nhất, nó có đầy đủ các tính năng của AVR nhưng lại nhỏ gọn (gói PDIP có 28 chân) và low cost nên các bạn có thể mua để tự mình tạo ứng dụng.
     Tại sao Assembly (ASM): bạn có thể không cần biết về cấu trúc của AVR vẫn có thể lập trình cho AVR bằng các phần mềm hỗ trợ ngôn ngữ cấp cao như BascomAVR (Basic) hay CodevisionAVR (C), tuy nhiên đó không phải là mục đích của bài viết này. Để hiểu thấu đáo về AVR bạn phải lập trình bằng chính ngôn ngữ của nó, ASM. Như vậy lập trình bằng ASM  giúp bạn hiểu tường tận về AVR, và tất nhiên để lập trình được bằng ASM bạn phải hiểu về cấu trúc AVR….Một lý do khác bạn mà tôi khuyên bạn nên lập trình bằng ASM là các trình dịch (compiler) ASM cho AVR là hoàn toàn miễn phí, và nguồn source code cho AVR viết bằng ASM là rất lớn. Tuy nhiên một khi bạn đã thành thạo AVR và ASM bạn có thể sử dụng các ngôn ngữ cấp cao như C để viết ứng dụng vì ưu điểm của ngôn ngữ cấp cao là giúp bạn dễ dàng thực hiện các phép toán đại số 16 hay 32 bit (vốn là vấn đề khó khăn khi lập trình bằng ASM).
 II. Công cụ.
     Trình biên dịch: có rất nhiều trình biên dịch bạn có thể sử dụng đế biên dịch code của bạn thành file intel hex để nạp vào chip, một số trình dịch quen thuộc có thể kể đến như sau:
  • AvrStudio: là trình biên dịch ASM chính thức cung cấp bởi Atmel, đây là trình biên dịch hoàn toàn miễn phí và tất nhiên là tốt nhất cho lập trình AVR bằng ASM. Phiên bản hiện tại là 4.18 SP1, bạn có thể download phần mềm AvrStudio tại trang web chính thức của Atmel hoặc bản 4.623 tại đây.
  • Wavrasm: cũng được cung cấp bởi Atmel, nó chính là tiền thân của AvrStudio. Hiện tại wavrasm không còn được sử dụng nhiều vì so với AvrStudio trình biên dịch này có nhiều hạng chế, nếu bạn quan tâm có thể download tại đây.
  • WinAVR hay avr-gcc: là bộ trình dịch được phát triển bởi gnu, ngôn ngữ sử dụng là C và có thể được dùng tích  hợp với AvrStudio (dùng Avrstudio làm trình biên tập – editor). Đặc biệt bộ biên dịch này cũng miễn phí và đa số nguồn source code C được viết bằng bộ này, vì vậy nó rất lí tưởng cho bạn khi viết các ứng dụng chuyên nghiệp. Việc lập trình bằng avrgcc tôi sẽ đề cập trong những phần sau.
  • CodeVisionAvr: một chương trình bằng ngôn ngữ C rất hay cho AVR, hỗ trợ nhiều thư viện lập trình. Tuy nhiên là chương trình thương mại. Bạn  có thể download bản demo (đầy đủ chức năng nhưng nhưng giới hạn dung lượng bộ nhớ chương trình 2KB) tại Website hpinfotech
  • ICCAVR: lập trình C cho avr, download bản demo.
  • BascomAVR: lập trình cho AVR bằng basic, đây là trình biên dịch khá hay và dễ sử dụng, hỗ trợ rất nhiều thư viện. Tuy nhiên rất khó debug lỗi và không thích hợp cho việc tìm hiểu AVR. Vì vậy tôi không bạn khuyến khích bạn sử dụng trình dịch này. Bạn có thể download bản demo (4K limit).
  • Và còn rất nhiều trình biên dịch khác cho AVR mà tôi không kể ra đây, nhìn chung tất cả các trình biên dịch này hỗ trợ C hoặc Basic hoặc thậm chí Pascal. Việc chọn 1 trình biên dịch tùy thuộc vào mục đích, vào mức độ ứng dụng, vào kinh nghiệm sử dụng và nhiều lý do khác nữa. Ví dụ tôi thường dùng Avrstudio và avrgcc khi học sử dụng AVR và khi viết thư viện. Nhưng khi cần viết chương trình ứng dụng tôi thường chọn avrgcc và CodeVisionAVR.
     Trong bài viết này tôi hướng dẫn bạn sử dụng AvrStudio để viết chương trình cho AVR bằng ASM.
     Chương trình nạp (Chip Programmer): đa số các trình biên dịch (AvrStudio, CodeVisionAVR, Bascom…) đều tích hợp sẵn 1 chương trình nạp chip hỗ trợ nhiều loại mạch nạp nên bạn không quá lo lắng. Trong trường hợp khác, bạn có thể sử dụng các chương trình nạp như Icprog hay Ponyprog…là các chương trình nạp miễn phí cho AVR. Việc chọn và sử dụng chương trình nạp sẽ được giới thiệu trong các bài sau.
      Mạch nạp: tham khảo bài viết giới thiệu mạch nạp AVR.
     Chương trình mô phỏng: avr simulator là trình mô phỏng và debbug được tích hợp sẵn trong Avrstudio, avr simulator cho phép bạn quan sát trạng thái các thanh ghi bên trong AVR nên rất phù hợp để bạn debug chương trình. Proteus là chương trình thứ hai tôi muốn nói đến, Proteus không những mô phỏng hoạt động bên trong chip mà còn mô phỏng mạch điện tử. Proteus mô phỏng rất trực quan, nó là 1 công cụ hữu ích khi các bạn chưa có điều kiện làm các mạch điện tử.
III. Ví dụ đầu tiên của bạn.
     Sau khi download AvrStudio, bạn hãy cài đăt phần mềm trên máy của bạn, quá trình cài đặt rất đơn giản, bạn hãy theo các mặc định và nhấn “next” để cài đặt. Trong bài đầu tiên này chúng ta sẽ viết thử 1 chương trình đơn giản cho AVR sau đó chạy mô phỏng bằng Proteus. Có thể có một số câu lệnh các bạn sẽ không hiểu, nhưng đừng lo lắng quá, trong bài thứ 2 chúng ta sẽ học về cấu trúc AVR các bạn sẽ được giải thich rõ hơn.
     Để thực hiện ví dụ này, bạn hãy tạo một Project bằng AVRStudio, phần hướng dẫn chi tiết cho việc tạo Project trong AVRStudio bạn hãy tham khảo ở bài hướng dẫn AVRStudio.Đoạn code ví dụ trong bài đầu tiên này được trình bày trong List1.
List 1. Đoạn code đầu tiên của bạn.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 61
.CSEG
.INCLUDE "M8DEF.INC"
.ORG 0x000
    RJMP BATDAU

.ORG 0x020
BATDAU:
; KHOI TAO CAC DIEU KIEN DAU
    LDI   R16, HIGH(RAMEND)
    LDI   R17, LOW(RAMEND)
    OUT SPH, R16
    OUT SPL, R17
    LDI   R16, 0xFF;
    OUT DDRB, R16  

; CHUONG TRINH CHINH
MAIN:
    LDI R16, 0B00000001
    OUT PORTB, R16
    RCALL DELAY

    LDI R16, 0B00000010
    OUT PORTB, R16
    RCALL DELAY

    LDI R16, 0B00000100
    OUT PORTB, R16
    RCALL DELAY

    LDI R16, 0B00001000
    OUT PORTB, R16
    RCALL DELAY

    LDI R16, 0B00010000
    OUT PORTB, R16
    RCALL DELAY

    LDI R16, 0B00100000
    OUT PORTB, R16
    RCALL DELAY

    LDI R16, 0B01000000
    OUT PORTB, R16
    RCALL DELAY

    LDI R16, 0B10000000
    OUT PORTB, R16
    RCALL DELAY
  
    RJMP MAIN
; CHUONG TRING CON DELAY 65535 chu ky (khoang 65535us neu  xung ;clock cho chip la 1M)
DELAY:
    LDI R20, 0xFF
    DELAY0:
        LDI R21, 0xFF
        DELAY1:
            DEC R21
            BRNE  DELAY1
        DEC R20
        BRNE DELAY0
RET 
     Trước khi tìm hiểu ý nghĩa đoạn code, hãy nhìn 1 lượt qua đoạn code. Trước hết việc viết HOA hay viết thường là không quan trọng, bạn có thể viết đoạn code với bất cứ hình thức nào miễn đúng cú pháp, từ khóa là được. Trong đoạn code:
  • Bạn thấy 1 số từ có màu BLUE (ví dụ LDI, OUT, RJMP, RCALL, RET…)đó là các INSTRUCTiON, tức là các câu lệnh của ngôn ngữ ASM, bạn có thể đọc tài liệu “AVR INSTRUCTION” để tìm hiểu tất cả các INSTRUCTION. Các INSTRUCTION sau đó sẽ được trình dịch dịch thành các mã tương ứng.
  • Một số từ bắt đầu bằng bằng dấu chấm “.” là các DIRECTIVE (ví dụ .INCLUDE hay .ORG )đó cũng là những từ khóa mặc định của ASM AVR, các DIRECTIVE không phải là mã lệnh mà chỉ là các chỉ dẫn về địa chỉ bộ nhớ, khởi động bộ nhớ, định nghĩa macro…và không được trình dịch dịch thành mã. Chi tiết về DIRECTIVE có thể tìm thấy trong  các tài liệu về ASM AVR, dưới đây tôi tóm tắt các DIRECTIVE và chức năng của chúng như sau:
DIRECTIVE
  • Thông thường 1 INSTRUCTION được theo sau bởi 2 toán hạng – operand (tuy nhiên có nhiều trường hợp chỉ có 1 toán hạng hoặc không có toán hạng), khi đó toán hạng thứ nhất sẽ là các THANH GHI. của AVR (như đã đề cập, chúng ta sẽ khảo sát thanh ghi AVR trong các bài sau), ví dụ : “LDI R16, 0xFF;” trong đó toán hạng “R16” là tên 1 thanh ghi trong AVR, và “0xFF” là 1 hằng số dạng hexadecimal có giá trị tương ứng là 255 dạng thập phân hay 11111111 nhị phân.
  • Các từ theo sau bởi dấu “:” là các nhãn – label (ví dụ MAIN, DELAY…), đó là từ do chúng ta tự đặt, nó thực chất là 1 vị trí trong bộ nhớ chương trình, có thể sử dụng nhãn như 1 chương trình con.
  • Phần đi sau dấu “;” gọi là giải thích – comment, phần này không được biên dịch, bạn có thể ghi comment ở bất cứ đâu trong chương trình với yêu cầu phải sử dụng dấu “;” trước nó.
     Giải thích đoạn code:có thể chia đoạn code trên thành 4 phần: phần đầu chứa các DIRECTIVE và lệnh RJMP dùng để xác định các địa chỉ bộ nhớ chương trình, phần 2 là khởi tạo một số điều kiện đầu cho Stack Pointer và PORT, phần 3 là chương trình chính, và phần 4 là chương trình con ( chú ý đây chỉ là cách bố trí của riêng tôi, một khi đã quen thuộc, bạn có thể bố trí chương trình theo cách riêng của bạn).
  • 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 DAU
    LDI 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
    Atmega8
    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:
    11111111
         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, 0B00000001
    OUT PORTB, R16
    RCALL 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, 0B00000010
    OUT 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, 0B10000000
    OUT PORTB, R16
    RCALL DELAY

    RJMP MAIN
  • Sau khi kết thức 3 dòng trên chân PB7 sẽ lên 5V, kết thúc 1 vòng xoay. Cuối cùng là quay vế đầu chương trình chính bằng dòng “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.
IV. Mô phỏng bằng Proteus.
     Chúng ta hãy thử nghiệm đoạn chương trình của chúng ta bằng Proteus. Nếu bạn thực hiện đúng kết quả sẽ như minh họa trong hình 2 Hướng  dẫn cụ thể cách vẽ mạch điện và mô phỏng bằng phần mềm Proteus bạn hãy xem bài "Mô phỏng Proteus".
Quet LED
Hình 2. Mô phỏng.
  
Nguồn:hocavr.com
http://dientu686.com/

[dientu686.com]Tổng hợp về AVR: trình biên dịch, trình soạn thảo, mạch nạp, ...


Tổng hợp về AVR: trình biên dịch, trình soạn thảo, mạch nạp, ...

Tổng hợp về AVR: trình biên dịch, trình soạn thảo, mạch nạp, ...
Về AVR:

- Họ vi điều khiển AVR là dòng sản phẩm được phát triển bởi hảng Atmel (1996), nó được chế tạo dựa trên cấu trúc AVR RISC (Reduced Instruction Set Computer) đồng thời AVR là một trong những họ vi điều khiển đầu tiên sử dụng bộ nhớ Flash để lưu trữ chương trình. Có thể thấy rằng trong những năm gần đây Atmel đã trở thành nhà tiên phong trên thế giới về phát triển kỹ thuật bộ nhớ Flash (không biến đổi, có thể xóa bằng điện và lập trình lại bộ nhớ, Họ AVR thường được sử dụng trong các sản phẩm như Camera số, board chủ PC…)

- Vi điều khiển Atmega AVR có công suất cao, tiêu thụ năng lượng thấp, cấu trúc RISC tiến với 130 lệnh với chu kỳ thực hiện đơn xung lớn nhất, 32 thanh ghi đa mục đích 8 bít, 16 MIPS tại tần số đặt 16 MHz, bộ nhân 2 chu kỳ On-chip, Power-on Reset và Brown-out Detection có thể lập trình, bộ dao động RC bên trong có thể lập trình các mức, 5 Mode ngủ (Idle, ADC Noise Reduction, Power-save, Power-down và Standby), có khả năng Reset khi bật nguồn, khả năng dò lỗi Brown out lập trình được, có nguồn ngắt trong và ngắt ngoài.

- Cốt lõi của AVR là sự kết hợp các câu lệnh phong phú với 32 thanh ghi đa mục đích. Tất cả 32 thanh ghi đều trực tiếp kết nối tới bộ xử lý logíc số học - Arithmetic Logic Unit (ALU), cho phép truy nhập 2 thanh ghi độc lập trong một câu lệnh đơn được thực hiện trong một chu kỳ xung. Kết quả của cấu trúc trở nên gọn nhẹ, hiệu quả hơn, trong khi vẫn đạt được thời gian xử lý nhanh hơn gấp 10 lần các vi điều khiển CISC thông thường khác.

- 8K byte Flash trên chíp có thể lập trình với các khả năng đọc trong khi ghi (Read-While-Write), 512 byte EEPROM, 1K byte SRAM, 23 đường vào ra đa mục đích, 32 thanh ghi đa mục đích, 3 Timer/Counter rất linh hoạt với các compare mode, các ngắt trong và ngắt ngoài, một bộ USART nối tiếp có thể lập trình được, ghép nối nối tiếp 2 dây định hướng byte, 6 kênh ADC (8 kênh với loại TQFP và MLF packages) trong đó 4 (hoặc 6) kênh có độ chính xác 10-bit và 2 kênh có độ chính xác 8-bit, Watchdog Timer có thể lập trình được với bộ dao động bên trong, một cổng nối tiếp SPI và 5 mode tiết kiệm năng lượng có thể lựa chọn mềm.

- Idle mode dừng CPU trong khi vẫn cho phép SRAM, Timer/Counters, cổng SPI, và hệ thống ngắt tiếp tục chức năng của chúng.

- Power-down mode tiết kiệm nội dung thanh ghi, nhưng hạn định bộ dao động, không cho phép tất cả các chức năng khác của chíp được hoạt động cho đến khi ngắt tiếp theo hoặc Reset phần cứng xuất hiện.

- Trong Power-save mode, timer không đồng bộ tiếp tục chạy, cho phép sử dụng để duy trì thời gian nền, trong khi các phần còn lại của thiết bị được ngủ.

- ADC Noise Reduction mode dừng CPU và tất các module I/O ngoại trừ timer không đồng bộ và ADC để tối thiểu hóa nhiễu mạch trong suốt quá trình ADC trong chuyển đổi.

- Trong Standby mode, bộ dao động thạch anh/ resonator được phép chạy trong khi các phần còn lại của thiết bị được ngủ. Điều này cho phép start-up rất nhanh cùng với hiệu quả tiêu thụ ít năng lượng.

- Thiết bị được sản suất áp dụng công nghệ tích hợp bộ nhớ non-volatile cao của Atmel. Bộ nhớ chương trình Flash này có thể lập trình thông qua ghép nối tiếp SPI bằng chương trình lập trình bộ nhớ non-volatile riêng, hoặc bằng một chương trình boot on – chip, chạy trong AVR core. Chương trình boot có thể sử dụng bất kỳ một ghép nối nào để download chương trình ứng dụng trong bộ nhớ Flash. Phần mềm trong Boot Flash sẽ tiếp tục chạy trong khi các phần sử dụng Flash vẫn được update, hỗ trợ cho hoạt động đọc trong khi ghi (Read-While-Write).

- Bằng việc kết hợp với một CPU 8-bit RISC với bộ nhớ Flash tự lập trình trong hệ thống trên một chíp, Atmel ATmega8 là một vi điều khiển cực mạnh, thỏa mãn yêu cầu về một bộ vi điều khiển với độ linh hoạt cao và đem lại lợi nhuận lớn với rất nhiều các ứng dụng điều khiển tác động nhanh.

- ATmega8 AVR cũng hỗ trợ đầy đủ về lập trình và phát triển các tool hệ thống, bao gồm bộ dịch C, macro assemblers, bộ mô phỏng/gỡ rối chương trình, In-Circuit Emulators, và evaluation kits.

Nguồn: http://www.tapchicongnghiep.vn/socuo...7/5/21710.ttvn

Tham khảo đầy đủ hơn:

http://en.wikipedia.org/wiki/Atmel_AVR
http://www.atmel.com/products/AVR/

1 - Các loại AVR:

Cơ bản họ AVR có thể chia làm 4 nhóm sau:

• tinyAVR — the ATtiny series

o 1–8 kB program memory
o 6–32-pin package
o Limited peripheral set

• megaAVR — the ATmega series

o 4–256 kB program memory
o 28–100-pin package
o Extended instruction set (Multiply instructions and instructions for handling larger program memories)
o Extensive peripheral

• XMEGA — the ATxmega series

o 16–384 kB program memory
o 44–64–100-pin package (A4, A3, A1)
o Extended performance features, such as DMA, "Event System", and cryptography support.
o Extensive peripheral set with DACs

• Atmel At94k FPSLIC (Field Programmable System Level Integrated Circuit), an AVR core on-die with an FPGA. The FPSLIC uses SRAM for the AVR program code, unlike all other AVRs. Partly due to the relative speed difference between SRAM and flash, the AVR core in the FPSLIC can run at up to 50MHz.
AVR32 AP7000 Sram 32KB 1.8 - 3.3V

ATUC3A0xxxx (giá trị xxxx thể hiện dung lượng flash của VĐK)
ATUC3A0512 Flash 512kB sram64B 3.0-3.6V

Ngoài ra còn có:

AT32UC3A0256
AT32UC3A0128
AT32UC3A1512
AT32UC3A1256
AT32UC3A1128

ATUC3A0xxxx

Các dòng AVR32 hiện tại chưa thấy bán trên thị trường tuy nhiên đây là dòng vđk 32bit khá mạch với nhiều tính năng mới :

Tích hợp USB , công nghệ xử lý tiếng nói (AC97) , tích hợp bộ RTC -thời gian thực , thêm giao thức ethernet ...

Chi tiết hơn dòng vi điều khiển 8bit

MEGA AVR

ATmega8 8kB 512B 1024B 0 - 16MHz 4.5 - 5.5V
ATmega8L 8kB 512B 1024B 0 - 8MHz 2.7 - 5.5V
ATmega16 16kB 512B 1024B 0 - 16MHz 4.5 - 5.5V
ATmega16L 16kB 512B 1024B 0 - 8MHz 2.7 - 5.5V
ATmega32 32kB 1024B 2048B 0 - 16MHz 4.5 - 5.5V
ATmega32L 32kB 1024B 2048B 0 - 8MHz 2.7 - 5.5V
ATmega48 4kB 256B 512B 0 - 20MHz 2.7 - 5.5V
ATmega48V 4kB 256B 512B 0 - 10MHz 1.8 - 5.5V
ATmega64 64kB 2048B 4096B 0 - 16MHz 4.5 - 5.5V
ATmega64L 64kB 2048B 4096B 0 - 8MHz 2.7 - 5.5V
ATmega88 8kB 512B 1024B 0 - 20MHz 2.7 - 5.5V
ATmega88V 8kB 512B 1024B 0 - 10MHz 1.8 - 5.5V
ATmega128 128kB 4096B 4096B 0 - 16MHz 4.5 - 5.5V
ATmega128L 128kB 4096B 4096B 0 - 8MHz 2.7 - 5.5V
ATmega162 16kB 512B 1024B 0 - 16MHz 2.7 - 5.5V
ATmega162V 16kB 512B 1024B 0 - 8MHz 1.8 - 5.5V
ATmega164 16kB 512B 1024B 0 - 20MHz 2.7 - 5.5V
ATmega164V 16kB 512B 1024B 0 - 10MHz 1.8 - 5.5V
ATmega165 16kB 512B 1024B 0 - 16MHz 2.7 - 5.5V
ATmega165V 16kB 512B 1024B 0 - 8MHz 1.8 - 5.5V
ATmega168 16kB 512B 1024B 0 - 20MHz 2.7 - 5.5V
ATmega168V 16kB 512B 1024B 0 - 10MHz 1.8 - 5.5V
ATmega324 32kB 1024B 2048B 0 - 20MHz 2.7 - 5.5V
ATmega324V 32kB 1024B 2048B 0 - 10MHz 1.8 - 5.5V
ATmega325 32kB 1024B 2048B 0 - 16MHz 2.7 - 5.5V
ATmega325V 32kB 1024B 2048B 0 - 8MHz 1.8 - 5.5V
ATmega640 64kB 4096B 8192B 0 - 16MHz 2.7 - 5.5V
ATmega640V 64kB 4096B 8192B 0 - 8MHz 1.8 - 5.5V
ATmega644 64kB 2048B 4096B 0 - 20MHz 2.7 - 5.5V
ATmega644V 64kB 2048B 4096B 0 - 10MHz 1.8 - 5.5V
ATmega645 64kB 2048B 4096B 0 - 16MHz 2.7 - 5.5V
ATmega645V 64kB 2048B 4096B 0 - 8MHz 1.8 - 5.5V
ATmega1280 128kB 4096B 8192B 0 - 16MHz 2.7 - 5.5V
ATmega1280V 128kB 4096B 8192B 0 - 8MHz 1.8 - 5.5V
ATmega1281 128kB 4096B 8192B 0 - 16MHz 2.7 - 5.5V
ATmega1281V 128kB 4096B 8192B 0 - 8MHz 1.8 - 5.5V
ATmega2560 256kB 4096B 8192B 0 - 16MHz 2.7 - 5.5V
ATmega2560V 256kB 4096B 8192B 0 - 8MHz 1.8 - 5.5V
ATmega2561 256kB 4096B 8192B 0 - 16MHz 2.7 - 5.5V
ATmega2561V 256kB 4096B 8192B 0 - 8MHz 1.8 - 5.5V
ATmega3250 32kB 1024B 2048B 0 - 16MHz 2.7 - 5.5V
ATmega3250V 32kB 1024B 2048B 0 - 8MHz 1.8 - 5.5V
ATmega6450 64kB 2048B 4096B 0 - 16MHz 2.7 - 5.5V
ATmega6450V 64kB 2048B 4096B 0 - 8MHz 1.8 - 5.5V
ATmega8515 8kB 512B 512B 0 - 16MHz 4.5 - 5.5V
ATmega8515L 8kB 512B 512B 0 - 8MHz 2.7 - 5.5V
ATmega8535 8kB 512B 512B 0 - 16MHz 4.5 - 5.5V
ATmega8535L 8kB 512B 512B 0 - 8MHz 2.7 - 5.5V

TINY AVR

device Flash EEPROM SRAM Speed Volts
ATtiny11 1kB 0 - 6MHz 4 - 5.5V
ATtiny11L 1kB 0 - 2MHz 2.7 - 5.5V
ATtiny12 1kB 64B 0 - 8MHz 4 - 5.5V
ATtiny12L 1kB 64B 0 - 4MHz 2.7 - 5.5V
ATtiny12V 1kB 64B 0 - 1MHz 1.8 - 5.5V
ATtiny13 1kB 64B 64B 0 - 20MHz 2.7 - 5.5V
ATtiny13V 1kB 64B 64B 0 - 10MHz 1.8 - 5.5V
ATtiny15L 1kB 64B 1.6MHz 2.7 - 5.5V
ATtiny24 2kB 128B 128B 0 - 20MHz 2.7 - 5.5V
ATtiny25 2kB 128B 128B 0 - 20MHz 2.7 - 5.5V
ATtiny25V 2kB 128B 128B 0 - 10MHz 1.8 - 5.5V
ATtiny26 2kB 128B 128B 0 - 16MHz 4.5 - 5.5V
ATtiny26L 2kB 128B 128B 0 - 8MHz 2.7 - 5.5V
ATtiny28L 2kB 0 - 4MHz 2.7 - 5.5V
ATtiny28V 2kB 0 - 1MHz 1.8 - 5.5V
ATtiny44 4kB 256B 256B 0 - 20MHz 2.7 - 5.5V
ATtiny45 4kB 256B 256B 0 - 20MHz 2.7 - 5.5V
ATtiny45V 4kB 256B 256B 0 - 10MHz 1.8 - 5.5V
ATtiny84 8kB 512B 512B 0 - 20MHz 2.7 - 5.5V
ATtiny85 8kB 512B 512B 0 - 20MHz 2.7 - 5.5V
ATtiny85V 8kB 512B 512B 0 - 10MHz 1.8 - 5.5V
ATtiny261 2kB 128B 128B 0 - 20MHz 2.7 - 5.5V
ATtiny461 4kB 256B 256B 0 - 20MHz 2.7 - 5.5V
ATtiny861 8kB 512B 512B 0 - 20MHz 2.7 - 5.5V
ATtiny2313 2kB 128B 128B 0 - 20MHz 2.7 - 5.5V
ATtiny2313V 2kB 128B 128B 0 - 10MHz 1.8 - 5.5V

LCD AVR

Device Flash EEPROM SRAM Speed Volts
ATmega169 16kB 512B 1024B 0 - 16MHz 2.7 - 5.5V
ATmega169V 16kB 512B 1024B 0 - 8MHz 1.8 - 5.5V
ATmega329 32kB 1024B 2048B 0 - 16MHz 2.7 - 5.5V
ATmega329V 32kB 1024B 2048B 0 - 8MHz 1.8 - 5.5V
ATmega649 64kB 2048B 4096B 0 - 16MHz 2.7 - 5.5V
ATmega649V 64kB 2048B 4096B 0 - 8MHz 1.8 - 5.5V
ATmega3290 32kB 1024B 2048B 0 - 16MHz 2.7 - 5.5V
ATmega3290V 32kB 1024B 2048B 0 - 8MHz 1.8 - 5.5V
ATmega6490 64kB 2048B 4096B 0 - 16MHz 2.7 - 5.5V
ATmega6490V 64kB 2048B 4096B 0 - 8MHz 1.8 - 5.5V

CAN AVR

AT90CAN128 128kB 4096B 4096B 0 - 16MHz 2.7 - 5.5V
AT90CAN64 64kB 4096B 4096B 0 - 16MHz 2.7 - 5.5V
AT90CAN32 32kB 4096B 4096B 0 - 16MHz 2.7 - 5.5V

Phần trên trích từ luồng AVR trên VAGAM (Tác giả: gioidang1985)

2 - Ứng dụng của AVR bây giờ như thế nào ? (Được dùng chủ yếu ở lĩnh vực nào ?)

- LCD controller, Motor control, USB controller, advanced PWM, CAN etc.

- Application Notes Atmel (http://www.atmel.com/dyn/products/ap...?family_id=607)

- Motor Control (http://www.atmel.com/products/AVR/mc/?family_id=607)

- USB Connectivity (http://www.atmel.com/products/AVR/usb/?family_id=607)

- Automotive Applications (http://www.atmel.com/products/AVR/usb/?family_id=607)

- Remote Access Control (http://www.atmel.com/products/AVR/rac/?family_id=607)

Học AVR để làm gì ?

Hồi đó bọn mình học môn Vi xử lý - Vi đều khiển, thầy dạy họ 8051, nhưng thầy bảo họ AVR mạnh hơn và khuyên lớp tìm hiểu về họ AVR để ứng dụng trước hết vào các project môn học và các đồ án môn học và tương lai là phục vụ cho nghề nghiệp.

3 - Khi cần học về 1 loại AVR cụ thể, thì nên bắt đầu từ nguồn tài liệu nào ? Các trang help, manual, datasheet như thế nào thì hiệu quả ?

Atmel nhà của nàng AVR: thường xuyên ghé nhà nàng nhé

http://www.atmel.com/products/AVR/

- Tại trang chủ các bạn sẽ tìm được rất nhiều thứ: từ datasheet, trình biên dịch và trình soạn thảo (có Help đính kèm), manual, Application Notes …

- Nghe ngóng xem thiên hạ thỏa luận về nàng như thế nào:
Tìm trên các Forum về AVR.

- Từ 2 luồng thông tin trên có thể có thể chọn cho mình 1 con trong họ AVR và các công cụ, tài liệu liên quan để làm việc rùi.

Các bạn bổ sung thêm giúp mình nhé.

Trình biên dịch và soạn thảo

• Hiện nay có nhiều loại trình biên dịch cho AVR trên các nền tảng Windows cũng như Linux.

Một số trình biên dịch trên nền tảng Windows:

http://www.atmel.com/dyn/products/to...ily_id=607#798

AVRStudio4 (http://www.atmel.com/dyn/products/to...p?tool_id=2725)

Ưu điểm: free, update thường xuyên bởi Atmel, viết được code ASM và C (cài thêm WinAVR), tài liệu, thư viện hổ trợ nhiều, có thể tìm tại trang của Atmel hoặc các forum AVR.

CodeVisionAVR (http://www.hpinfotech.ro/index.html)

Ưu điểm: dễ dùng (tự sinh code khi chọn CodeWizardAVR) và dễ học (nền tảng là ngôn ngữ C), tài liệu cũng nhiều. Ở Việt Nam số người dùng món này khá nhiều nên khi gặp khó khăn dễ tìm được sự giúp đở.

Nhược điểm: Có phí.

BascomAVR (http://www.mcselec.com/)

mikroBasic PRO for AVR (http://www.mikroe.com/en/compilers/mikrobasic/avr/)

mikroC PRO for AVR (http://www.mikroe.com/en/compilers/mikroc/avr/)

Ưu điểm: món này nền tảng cũng là ngôn ngữ C (chuẩn ANSI) nghe nói hổ trợ mạnh lắm, help, manual đọc rất hay, tài liệu và thư viện trên trangwww.mikroe.com rất đầy đủ và rất hay.

Nhược điểm: có phí, do nó hổ trợ thư viện mạnh nên không cần hiểu sâu phần cứng cũng viết được.

WinAVR (http://winavr.sourceforge.net/)

Trình biên dịch và soạn thảo trên nền tảng Linux: Sẽ cập nhật sau.

Mạch nạp

• Hiện tại mình biết một số mạch nạp:

- AVR ISP Programmer Cable (mạch nạp các chíp AVR của Atmel qua cổng COM).

- STK500 HV-Adapter Mini (hỗ trợ nạp các chíp AVR thông dụng với chế độ Parallel (PP/HVSP mode).

- AVR 910 USB Programmer Cable, AVR STK500 USB Programmer (mạch nạp qua cổng USB).

Nhờ các bạn bổ sung thêm nhé.

• Giá cả:

- AVR ISP Programmer Cable (100K)
- STK500 HV-Adapter Mini (50K)
- AVR 910 USB Programmer Cable (100K)
- AVR STK500 USB Programmer (270K)

• Ưu nhược điểm của từng loại mạch nạp:

Dùng mạch nạp cổng USB là tiện lợi nhất, tốc độ cao nữa, và máy nào cũng có cổng USB hết, máy Laptop bây giờ không còn cổng COM và LPT nữa rùi.

CodevisionAVR v.s AVRstudio

Bài viết của BOW tại diển đàn khongtenmien

Theo tình hình BOW tui thấy các bạn làm quen với avr thường xài chương trình codevision để lập trình. hầu hết ở việt nam phần mềm codevison rất phổ biến, rất hiếm ai lập trình avr bằng AVRstudio (winavr). Sau đây là một vài ưu khuyết điểm khi xài 2 chương trình này

Codevision:

- Đây là chương trình do hãng hpinfortech viết, hỗ trợ lập trình vi điều khiển avr bằng ngôn ngữ C. đây là chương trình rất phổ biến ở việt nam (nhà nhà codevison người người codevision)

- Chương trình này có 2 phiên bản, một phiên bản standard và một phiên bản light, giá của 2 phiên bản này rất khác nhau. Phiên bản light có giá 60EUR còn phiên bản standard có giá 150UER. đối với những nước phát triển, có bảo vệ bản quyền và người dùng cuối có ý thức về vấn đề sở hữu trí tuệ cao thì đây là giá khá cao. còn khi tới việt nam thì .... nó đã trở thành "vô giá"

- BOW tui hồi mới tiếp cận với AVR cũng đã xài chương trình này (và tất nhiên là xài Cr*** ).

- Nó hỗ trợ cho người dùng cuối rất nhiều, giúp chung ta dễ dàng tiếp xúc với avr trong "thời kỳ đồ đá". nhưng bù lại, chung ta phải phụ thuộc vào nó rất nhiều và nếu sa đà vô chức năng codeWizard của nó thì sẽ khó có thể hiểu cụ thể được sức mạnh của avr

- Codevision cũng hỗ trợ xuất ra files COF để debug tren avrstudio. cũng cho phép tao chèn những dòng lệnh ASM trong môi trường C

- Sử dụng chương trình nạp AVRbaster của chính chương trình codevision, tương thíc với mạch nạp AVR910 free mà anh chị em nhà ta hay sử dụng

- Về tài liệu tiếng việt thì chương trình này chiếm đại đa số
tóm lại, đây là một chương trình khá hay và tiện lợi cho những ai bước đầu làm quen với AVR

AVRStudio (WinAVR)

- Đây là chương trình do chính hãng Atmel viết và phân phối, dành cho riêng dòng sản phẩm AVR của atmel

- Sản phẩm chính hãng luôn được cập nhật bản vá lỗi và các dòng avr mới

- Đây lại là sản phẩm được phân phối Free nên rất được phổ biến trên thế giới (trừ việt nam - có lẽ người việt chúng ta xài hàng cra** quen rồi nên khi gặp hàng chính hãng vừa rẻ vừa free lại chê )

- Nói cho vui vậy thôi, nhưng bow tui cũng ko biết lý do tại sao ở việt nam ko phổ biến chương trình này cho lắm (cũng có thể do atmel chê thị trường việt nam nhỏ quá nên ko tấn công vô chăng - điều này thì khác hoàn toàn so với PIC của microchip hén ).

- Đây cũng chính là chương trình dùng để debug cho avr luôn (nếu bạn sử dụng codevison nếu muốn debug thì vẫn phải dùng thằng avrstudio này)

- Chạy được trên nền linux (điều này là bow tui khoái nhất đóa)

- Chương trình hỗ trợ 2 ngôn ngữ chính để lập trình cho avr, asm và c. điểm khác biệt cơ bản là thằng codevision sử dụng C standard làm nền còn thằng avrstudio có sử dụng thêm một vài đặc tính của C++ để mềm dẻo hơn (thực ra C và C++ cũng gân giống nhau)

- Nếu mua những Kit học avr của chính atmel phân phối (STK500, STK600 ...) nữa thì thằng avrstudio này ko thể chê vô đâu được. (đôi khi cũng có lỗi, nhưng được fix và update rất nhanh)

- Mới đầu làm quen sẽ hơi khó khăn, nhưng sau này sẽ giúp ta hiểu rất rõ về cấu trúc của AVR cũng như tập lệnh của nó

- Rất nhiều tài liệu, code cũng như thư viện được liệng đầy trên mạng

- Tương thíc với mạch avr910 Free mà anh em ưa sử dụng luôn

- Nạp chương trình bằng Avrprog của chính hãng atmel (mặc định cài đặt avrstudio là có). chương trình nạp này nhanh gấp mấy trăm lần chương trình nạp của codevison

- Khi viết code xong nhấn ctrl+F7 là debug luôn, khỏi phải lằng nhằng chuyển đôi

- Điều quan trọng nhất là nó FREE và BOW tui rất khoái thằng này

Trên đây là một vài chính kiến của Bow tui về codevision và avrstudio, ngoài 2 phần mềm này ra còn rất nhiều phần mềm khác sử dụng ngôn ngữ C để lập trình cho vi điều khiển avr, có soft thì free, cũng có soft tính phí.

Thực ra thì thằng avrstudio nó chỉ hỗ trợ asm thôi, nếu ko cài thêm bộ Winavr. Nhưng để cho dễ hiểu đối với các bạn mới biết avr Bow tui nói đơn giản, (nếu pro nào đọc bài viết này cũng xin mạn phép bỏ qua cho) còn đối với các bạn newbie thì chỉ cần hiểu là avarstudio là được, chúng ta sẽ đi sâu hơn vào trong phần sau.

Bài viết của phucthinhtdt tại diển đàn khongtenmien

Theo quan điểm của mình, mỗi trình soạn thảo điều có ưu và khuyết, chính vì thế việc đưa ra 1 nhận định chính xác là ko đơn giản! Tuy nhiên luôn có 1 quy luật tất yếu, đó là
"cái bạn phải trả tiền để có nó tất nhiên sẽ khác cái bạn ko trả tiền"
Ngoài ra, việc sử dụng công cụ nào còn do thói quen của mỗi người.

- CodeVisionAVR có ưu điểm là đơn giản, dễ quản lý, và trên tất cả đó là dễ đào tạo hướng dẫn người khác làm theo, nhưng mà khuyết điểm lớn nhất là phải trả tiền.
- WinAVR, AVRStudio có ưu điểm lớn nhất đó là Free. Mặt khác AVRStudio là của cha đẻ ra AVR làm ra, nên nó luôn được cập nhật 1 cách liên tục đảm bảo sử dụng tốt các tính năng mới của AVR.

Trong thời buổi đòi hỏi về tốc độ như ngày nay, ta nên chọn công cụ nào giúp ta hoàn thành nhanh chóng công việc đề ra.

Nói tóm lại, mỗi công cụ có ưu-khuyết riêng, và chúng ta chọn cái nào tùy vào cách đánh giá của mổi người. Nhưng nên nhớ: cho dù dùng công cụ nào đi nữa, thì cái quan trọng vẫn là "tư duy để giải quyết vấn đề" của mỗi người sẽ là cái cuối cùng giúp bạn đưa ra kết quả cho bài toán của bạn! Công cụ chỉ là cái để hỗ trợ !

http://dientu686.com/ 

[dientu686.com]Tài liệu và Giáo trình môn AVR nâng cao



Tài liệu và Giáo trình môn AVR nâng cao

- Giáo trình liên quan đến C Embedded - Review (Cập nhật 02/04/2011):
http://www.mediafire.com/file/hzu35x..._GiaoTrinh.pdf
- Giáo trình liên quan đến ATMEGA32 Basic Peripheral Review (Cập nhật 02/04/2011):
+ AVR Core.
+ Ext. Interrupt.
+ I/O Port.
+ Timer 0/1/2.
http://www.mediafire.com/file/tjbius..._GiaoTrinh.pdf
- Giáo trình liên quan đến ATMEGA32 ADC (Cập nhật 02/04/2011):
http://www.mediafire.com/file/6hqg37..._GiaoTrinh.pdf
- Giáo trình TWI/I2C trên ATMEGA32 (Cập nhật 06/01/2010):
+ I2C/TWI on ATMEGA32.
+ I2C/TWI EEPROM AT24Cxx.
+ I2C/TWI RTC DS1307.
http://www.mediafire.com/file/fqyzfn..._GiaoTrinh.pdf
- Giáo trình SPI trên ATMEGA32 (Cập nhật 09/01/2010):
+ SPI on ATMEGA32.
+ 74HC595.
+ Serial Flash AT25F4096
http://www.mediafire.com/file/2mymdj..._GiaoTrinh.pdf
- Tài liệu Visual Studio 2005 Express Edition (Cập nhật 02/04/2011):
http://www.mediafire.com/file/tmctw6...ual_Studio.pdf


---------------------------------------------------------------------------------------------------------
Phần Sample SourceCode (CodeVision Ver. 1.24.6) và Proteus Simulation (Ver. 7.2 SP6):

Ext. Interrupt:
- Bài tập Review - 8LEDS + 4Button sử dụng Ext. INT0 (Cập nhật 19/12/2009):
http://www.mediafire.com/file/ztmdvm...s_4Buttons.rar
- Bài tập Review - 8LEDS + 1 Button sử dụng Ext. INT0 (Cập nhật 19/12/2009):
http://www.mediafire.com/file/ykty0m...ds_1Button.rar
- Bài tập ngắt trùm (Nested Interrupt) - Ext. INT0 & INT1 (Cập nhật 19/12/2009):
http://www.mediafire.com/file/ngdjjd...INT_Nested.rar

Timer 0:
- LED Blinky 1Hz sử dụng Timer Over Flow Interrupt (Cập nhật 25/12/2009):
http://www.mediafire.com/file/3gjwml...ER_OVF_Int.rar
- Counter mode (Cập nhật 25/12/2009):
http://www.mediafire.com/file/dzjml2...unter_Mode.rar
- Tạo sóng vuông 5KHz với Match Output Compare (Cập nhật 25/12/2009):
http://www.mediafire.com/file/nm3n2m...utput_Comp.rar
- Fast PWM mode (Cập nhật 22/12/2009):
http://www.mediafire.com/file/inwzdu...R_Fast_PWM.rar

Timer1:
- Đo chu kì xung vuông với Input Capture (Updated 29/12/2009):
http://www.mediafire.com/file/uyyimy...putCapture.rar

ADC:
- Đọc giá trị ADC với VR (Updated 25/12/2005)
http://www.mediafire.com/file/ymij4y...C_Using_VR.rar
- Ngắt hoàn tất chuyển đổi ADC (Updated 28/12/2009):
http://www.mediafire.com/file/zduzyx...mplete_Int.rar
- ADC với LED bar (Updated 28/12/2009):
http://www.mediafire.com/file/dylymn..._VR_LedBar.rar
- ADC với LM35 (Updated 28/12/2009):
http://www.mediafire.com/file/zoty0m...Using_LM35.rar
- Kích hoạt chuyển đổi ADC bằng nguồn ngắt (Updated 28/12/2009):
http://www.mediafire.com/file/juyjdy...ger_By_Int.rar
- ADC chế độ vi sai (Updated 28/12/2009):
http://www.mediafire.com/file/jm2qdn...fferential.rar

TWI/I2C:
- Interface with I2C EEPROM AT24C1024 (Proteus Simulation) (Updated 05/01/2010):
+ Complete TWI/I2C driver on ATMEGA32 supporting for Master in polling mode.
+ TWI/I2C driver Organized in separate source and header files.
+ EEPROM AT24C1024 data accessing demo.
+ Using I2C/TWI debugger tool to monitor all messages transferring on I2C/TWI bus.
http://www.mediafire.com/file/lmjnzm..._AT24C1024.rar
- Interface with I2C RTC DS1307 (Proteus Simulation) (Updated 02/04/2011):
+ Complete driver for DS1307 access layer based on I2C/TWI driver and demo.
+ Driver for DS1307 access layer organized in separate source and header files.
+ Using I2C/TWI debugger tool to monitor all messages transferring on I2C/TWI bus.
http://www.mediafire.com/file/wll02x...I2C_DS1307.rar
- Master (ATMEGA32 - polling mode) and Slave (ATMEGA32 - interrupt mode) example (Updated 06/01/2010):
http://www.mediafire.com/file/l4zmdt...rSlaveMode.rar

SPI:
- Interface with Serial to Parallel IC - 74HC595 (Proteus Simulation) (Updated 10/01/2010):
http://www.mediafire.com/file/jtmf2413voy/SPI_HC595.rar
- Master (ATMEGA32 - polling mode) and Slave (ATMEGA32 - interrupt mode) example (Updated 10/01/2010):
+ Using SPI debugger tool to monitor all in/out data transferring on SPI bus.
http://www.mediafire.com/file/zivydi...ster_Slave.rar
- Interface with SPI Serial Flash AT25F4096 (Proteus Simulation) (Updated 10/01/2010):
+ Complete driver for AT25F4096 access layer based on SPI driver and demo.
+ Driver for AT25F4096 access layer organized in separate source and header files.
http://www.mediafire.com/file/fymlt2..._AT25F4096.rar

Giao tiếp máy tính qua RS232 trong Visual C++ 2005:
- Simple - LED Control (Updated 14/01/2010):
http://www.mediafire.com/file/n5mejy...COM_Simple.rar
- With LCD Control (Updated 14/01/2010):
http://www.mediafire.com/file/gn1qkz...PC_COM_LCD.rar
- Monitor - Control App [On Lab P1 - 16/01/2010] (Updated 16/01/2010):
http://www.mediafire.com/file/hmu1nm...or_Control.rar
- Monitor - Control App [On Lab P2 - 20/01/2010] (Updated 24/01/2010):
http://www.mediafire.com/file/cygmga..._Control_2.rar
- Monitor - Control App [Full demo] (Updated 02/04/2011):
http://www.mediafire.com/file/qloqe2...MonCtrlApp.rar
- Monitor Voltage on VR with TeeChart (Updated 24/01/2010):
http://www.mediafire.com/file/mew54w...COM_VRVolt.rar
- Monitor Motor Speed with TeeChart (Updated 24/01/2010):
http://www.mediafire.com/file/kjjyem...torEncoder.rar


---------------------------------------------------------------------------------------------------------
Một số bí kíp nho nhỏ:

- Trọn bộ Simulation Debugging for AVR on Proteus VSM and AVR Studio (Cập nhật 29/12/2009):
+ Tài liệu:
http://www.mediafire.com/file/jmgjmotzkzw/AVR Simulation Debugging.pdf
+ Sample:
http://www.mediafire.com/file/jzm2zn...bug_On_AVR.rar

- Một số ví dụ và vấn đề đã biết với các hàm xuất nhập tiêu chuẩn (Standard I/O Functions) trong stdio lib của CodeVision (Updated 29/12/2009):
http://www.mediafire.com/file/ny4tdo...TEST_STDIO.rar

- Completed Driver for TEXT LCD 16x2 using HD44780U (Compatible with KHT ATMEGA32 KIT Ver 1.0) (Updated 05/01/2009):
http://www.mediafire.com/file/muvky4odidg/LCD_16x2.rar

- LED7SEG example (Compatible with KHT ATMEGA32 KIT Ver 1.0) (Updated 05/01/2009):
http://www.mediafire.com/file/htimdt1izjm/LED7SEG.rar

- Một số lưu ý với kí tự LineFeed và Carriage Return khi lập trình đọc/ghi/xử lý chuỗi (Updated 14/01/2010):
http://www.mediafire.com/file/1zmtzy...KhownIssue.pdf

Nguồn:Tổng hợp

http://dientu686.com/ 

[dientu686.com]Tài liệu về công nghệ xử lý ảnh


Tài liệu về công nghệ xử lý ảnh

Giới thiệu về hệ thống Computer Vision

Đây là chương mở đầu trong luận văn tốt nghiệp của duy_pham, duy_pham post lên diễn đàn với 2 mục đích. Thứ nhất là nhờ bà con góp ý dùm về nội dung bài viết, thứ hai là cũng muốn share với mọi người về hướng phát triển hệ thống nhúng trên NSLU2 và bài toán thị giác máy Computer Vision. Có gì mọi người tận tình góp ý nhe.

I. Giới Thiệu Về Thị Giác Máy – Computer Vision

Thị giác máy là một lĩnh vực đa và đang rất phát triển. Khái niệm thị giác máy – Computer vision có liên quan tới nhiều ngành học và hướng nghiên cứu khác nhau. Từ những năm 1970 khi mà năng lực tính toán của máy tính ngày càng trở nên mạnh mẽ hơn, các máy tính lúc này có thể xử lý được những tập dữ liệu lớn như các hình ảnh, các đoạn phim thì khái niệm và kỹ thuật về thị giác máy ngày càng được nhắc đến và nghiên cứu nhiều hơn cho tới ngày nay. Hiện tại lĩnh vực được các chuyên gia đánh giá là vẫn còn “non nớt” và có rất nhiều sự thay đổi trong thời gian tới.

A. Thế nào là thị giác máy

Thị giác máy bao gồm lý thuyết và các kỹ thuật liên quan nhằm mục đích tạo ra một hệ thống nhân tạo có thể tiếp nhận thông tin từ các hình ảnh thu được hoặc các tập dữ liệu đa chiều. Đối với mỗi con người chúng ta, quá trình nhận thức thế giới bên ngoài là một điều dễ dàng. Quá trình nhận thức đó được “học” thông qua quá trình sống của mỗi người. Tuy nhiên với các vật vô tri vô giác như như các máy tính, robot v..v thì điều đó quả thực là một bước tiến rất gian nan. Các thiết bị ngày nay không chỉ nhận thông tin ở dạng tín hiệu đơn lẻ mà nay còn có thể có cái “nhìn” thật với thế giới bên ngoài. Cái “nhìn” này qua quá trình phân tích, kết hợp với các mô hình như máy học, mạng nơron v..v sẽ giúp cho thiết bị tiến dần tới một hệ thống nhân tạo có khả năng ra quyết định linh hoạt và đúng đắn hơn rất nhiều.

Lĩnh vực nghiên cứu của thị giác máy rất rộng, và đặc điểm chung là các bài toán về thị giác máy tính đều không có một đề bài chung và cách giải duy nhất. Mỗi giải pháp giải quyết vấn đều được một kết quả nhất định cho những trường hợp cụ thể. Ta có thể thấy sự tương quan giữa Computer vision với các lĩnh

B. Ứng dụng:

Một vài lĩnh vực mà Computer Vision được ứng dụng có thể kể tới như sau:

- Điều khiển tiến trình (ví dụ: trong các robot công nghiệp, hay các thiết bị, xe tự hành)

- Phát hiện sự thay đổi (ví dụ: các thiết bị giám sát)

- Tổ chức thông tin (ví dụ: chỉ số kho dữ liệu các ảnh hoặc chuỗi ảnh liên tục)

- Mô hình hoá đối tượng (ví dụ: quá trình kiểm tra trong môi trường công nghiệp, xử lý ảnh trong y học)

- Tương tác (đóng vai trò làm đầu vào cho thiết bị trong quá trình tương tác giữa người và máy)

1. Các thao tác chính của CV

a. Nhận dạng (recognition):

Nhận dạng ảnh là một trong những vấn đề kinh điển trong lĩnh vực thị giác máy và xử lý ảnh. Mục đích của nhận dạng ảnh tức là xác định xem liệu một bức ảnh có tồn tại những đối tượng, đặc điểm đặc biệt hay không. Chức năng này có thể thực hiện tự động, không cần sự tác động của con người; tuy nhiên nó không đảm bảo trong các trường hợp chung, với những đối tượng tuỳ ý và trong tình huống tuỳ ý.

Các phương pháp hiện nay để giải quyết vấn đề này chỉ được ứng dụng với những đối tượng đặc biệt( những đối tượng hình học cơ bản, nhận dạng mặt người, nhận dạng chữ in và chữ viết tay, ...) và trong những tình huống đặc biệt (trong điều kiện chiếu sáng được xác định trước, ...)
b. Phân tích chuyển động:
Nhận dạng chuyển động được áp dụng để sử lý một chuỗi các ảnh liên tiếp để ước lượng tốc độ chuyển động của từng điểm ảnh.

- Egomotion: Xác định chuyển động trong khung cảnh 3D từ camera. Áp dụng cho các camera theo dõi tự động.
- Tracking: Theo dõi chuyển động của một đối tượng nào đó, ví dụ như người hay xe cộ
c. Xây dựng cảnh (scene reconstruction)
Đây là chức năng cho phép xây dựng và mô phỏng lại một khung cảnh 3D từ những bức ảnh hoặc một đọan phim cho trước.
d. Khôi phục hình ảnh (image restoration)
Lọai bỏ tác động của nhiễu trong ảnh, khôi phục lại hình ảnh ban đầu

2. Hệ thống CV cho bài tóan robot di chuyển:
Việc áp dụng thị giác máy vào bài toán robot di chuyển là một việc phức tạp. Tuy nhiên, trong giới hạn của đề tài, duy_pham giả định ta đã biết trước được điều kiện môi trường robot chuyển động (màu sàn, các vật cản cố định) và hình dạng cũng như màu của mục tiêu biệt lập với môi trường. Sau đây mình xin trình bày từng bước các chức năng có thể ứng dụng vào bài toán này:
Các chức năng chính trong hầu hết các hệ thống CV:
a. Lấy hình ảnh
Chụp ảnh từ webcam. Chất lượng của ảnh thu được từ bước này phụ thuộc nhiều vào chất lượng webcam, tốc độ di chuyển khi chụp, góc nhìn và độ sáng.
b. Tiền xử lí (lấy mẫu, lọc nhiễu, tương phản, ...)
Trước khi áp dụng các chức năng của thị giác ảnh, chúng ta cần xử lý ảnh để đảm bảo rằng ảnh sẽ thoả mãn một vài giả thiết nào đó. Ví dụ như sau:
Lấy mẫu lại để đảm bảo hệ thống toạ độ làü đúng. Nếu 2 ảnh lấy liên tiếp nhau có sự sai khác quá nhiều thì chúng ta có thể loại bỏ ảnh đó vì tư thế của robot lúc chụp không được ổn định.
Loại bỏü nhiễu để giảm thiểu khả năng xuất hiện các thông tin sai
Tăng độ tươngü phản để đảm bảo sẽ xác định được các thông tin cần thiết.
c. Phân tích hình ảnh (xác định đường, góc, cạnh, khối, ...)
Đặc trưng của ảnh ở những mức phức tạp khác nhau sẽ được trích rút từ ảnh, như là các đường, cạnh, góc.

d. Nhận dạng, phân mảnh
Tại một vài điểm ảnh chúng ta chọn ra một tập các điểm ảnh hoặc các vùng ảnh phù hợp với các thao tác xứ lý. Ví dụ:
Chọn các điểm ảnh có màu trùng với màu của mục tiêu.ü
Phân ra các vùng ảnh có khả năng chứa mục tiêu.ü
Phân ngưỡng và địnhü vị các vật cản có thể có

e. Xử lí mức cao
Đến bước này thì dữ liệu đầu vào chỉ là một phần của dữ liệu ban đầu, đó có thể là tập các điểm ảnh hoặc một vùng ảnh có khả năng chứa một đối tượng đặc biệt nào đó. Quá trình xử lý sẽ qua các bước sau:
Thẩm định lại dữü liệu có phù hợp với các yêu cầu cơ bản và đặc biệt
Ước lượng các tham sốü đặc biệt
Phân lớp đối tượng xác định được.ü



II. Single Board Computer(SBC) sử dụng System on Chip (SoC)

SBC (Single board computer) có sử dụng các SoC là buớc tiến lớn trong việc xây dựng thiết bị với khả năng tính toán và xử lý như một máy tính thông thường.Với nhiều ưu điểm hơn hẳn so với các thiết bị khác như :

Kích cỡü
Giá thành.ü
Sửü dụng các SoC làm bộ xử lý trung tâm có khả năng chuyên biệt về xử lý hình ảnh hay xử lý trên môi trường mạng rất hữu hiệu.

Do vậy tuỳ và bài toán đặt ra mà ta có thể chọn các SBC cho các SoC phù hợp với yêu cầu cụ thể. Hiện nay đa có nhiều SoC có khả năng tích hợp các DSP Processor vào trong nhân nhằm tăng khả năng xử lý

Việc sử dụng mạch SBC sẽ có những ưu/ nhược điểm sau:
• Ưu điểm
o Kích thước rất nhỏ
o Giá thành rẻ (~<100$)
o Hỗ trợ SPI, I2C, I2S, MMC, SDCard, UART, USB2.0/1.1 v..v
o Có tốc độ xử lý cao
o Sử dụng hệ điều hành Linux
o Được sự hỗ trợ rất lớn của cộng đồng mã nguồn mở. Từ HĐH, kernel hay rất nhiều các ứng dụng
o Các công cụ biên dịch phổ biến gcc
o Các công cụ hỗ trợ lập trình rất nhiều. Eclipse, Vim, Emacs v..v

• Nhược điểm
o Việc chạy/kiểm thử phải thực hiện giả lập trên máy tính trước khi đưa vào mạch
o Am hiểu kiến thức về các giao tiếp ngoại vi, kiến trúc về SBC

Cách tiếp cận nhanh nhất

Theo quan điểm của mình, cách tiếp cận nhanh chóng nhất với sinh viên đó là tận dụng môi trường mã nguồn mở hiện nay. Với mã nguồn mở chúng ta có thể sử dụng lại những thành quả của cộng đồng mã nguồn mở và phát triển, sáng tạo những cái riêng cho mình một cách dễ dàng và nhanh chóng nhất.

Chúng ta có thể sử dụng HĐH Linux làm môi trường chính cho thiết bị, với mã nguồn mở ta có thể chủ động đuợc cấu hình của hệ thống, tăng hiệu năng hay xử lý thô với các giao tiếp ngoại vi bên ngoài một cách nhanh chóng và thuận tiện nhất. Điều đáng quan tâm nữa là ta có thể có được sự trợ giúp (miễn phí) rất lớn cộng đồng mã nguồn mở. Đây là điều mà môi trường mã nguồn đóng như Window chưa thể có được.

Phần cứng (Hardware)

Ta có thể tận dụng lợi thế của các SBC có sử dụng SoC để làm phần cứng cho các thiết bị trong bài toán thị giác máy. Lợi thế của sự chọn lựa này là các mạch SBC giá rẻ và rất linh hoạt giúp cho nguời thiết kế tập trung hơn vào các module phần mềm.


[align=center]Mạch NSLU2[/align]

Mạch NSLU2 Linksys là một thiết bị lưu trữ mạng (network storage device) giá thành thấp của hãng Linksys. Chức năng chính của NSLU2 là 1 file server. Các ổ cứng hoặc USB kết nối với NSLU2 sẽ được chia sẻ trên mạng nội bộ qua cổng Ethernet.

Tuy nhiên, bằng việc nạp lại Flash của NSLU2 chúng ta có thể biến thiết bị trên thành một trạm làm việc hay một máy vi tính thu nhỏ sử dụng hđh Linux. Cộng đồng Linux phát triển cho NSLU2 rất rộng rãi và các ứng dụng cực kỳ phong phú.


Các thông số kỹ thuật

• Hãng sản xuất Linksys
• Kiến trúc ARM
• Sử dụng bộ VĐK SoC, Intel IXP420. Tốc độ 266Mhz
• 32MB Bộ nhớ SDRAM , 8MB Flash
• Hai cổng USB 2.0 Host
• Hai cổng Ethernet
• I2C, JTAG Port
• Giao tiếp UART với tốc độ 900Kb/s
• 16 cổng lập trình được (GPIO)
• Giá 125$

Ứng dụng mạch NSLU2 vào hệ thống xử lý ảnh cho robot

Mục đích sử dụng thiết bị NSLU2 là tận dụng các thong số kỹ thuật của mạch để làm bộ xử lý trung tâm cho robot. Một webcam được kết nối vào cổng usb để thu nhận ảnh. Kết quả sau khi xử lý sẽ được truyền qua board mạch vi điều khiển thông qua serial port.

Tiếc rằng có một số hình ảnh về hệ thống duy_pham đã chụp lại nhưng ko thể up lên vì nhiều và khá nặng. Có dịp sẽ share với mọi người.



Để giải quyết bài tóan xử lý ảnh bằng NSLU2, ta phải giải quyết theo trình tự các quá trình sau:

1. Cấu hình NSLU2 thành một platform Linux nhúng, có thể truy cập thông qua Ethernet với một PC sử dụng Window hoặc Linux, bằng cách nạp firmware vào Flash của NSLU2.

2. Biên dịch kernel của firmware đang sử dụng, cho phép truy xuất dữ liệu ảnh từ webcam có hỗ trợ video4linux (v4l).

3. Cài đặt môi trường lập trình GNU C trên hđh Linux nhúng đang sử dụng, bao gồm các trình biên dịch (gcc, g++,python…) và các thư viện chuẩn (glibc, libc6, ncurses…), thư viện hỗ trợ xử lý ảnh (libjpeg, libpng, openCV…)

4. Xây dựng các thuật tóan lập trình xử lý ảnh và gửi kết quả xử lý thông qua serial port cho vi điều khiển điều khiển robot.

5. Lập trình vi điều khiển thực thi các thao tác của robot dựa trên kết quả xử lý nhận được.


Rùi, hôm nay là tutorial đầu tiên để xây dựng 1 hệ thống xử lý ảnh bằng NSLU2.

Đầu tiên hãy điểm qua những thiết bị và phần mềm mà chúng ta cần phải có:

Phần cứng và thiết bị:

. Một PC có cài đặt hđh Linux song song với Window.
. NSLU2 (bạn có thể đặt mua tại công ty phân phối của Linksys tại TP HCM hoặc qua mạng)
. 1 ổ cứng USB dung lượng tối thiểu 512Mb (recommended), nhưng nếu chừng 1Gb trở lên sẽ tốt hơn
. 1 webcam có hỗ trợ linux (v4l), tham khảo tại website http://webcam-osx.sourceforge.net/camer ... controller. Chú ý dòng chip điều khiển OV5XX, pwc và SPCAX là đã được thử nghiệm thành công.
. 1 cáp mạng Ethernet nếu bạn dùng switch để kết nối, nếu không bạn có thể kết nối trực tiếp vào cổng Ethernet của PC, với điều kiện dùng cáp chéo (crossover cable)

Software: Cài những soft này trên PC của bạn

- Linksys Network Disk Utility download here
- SercommFirmwareUpdater (for Window user)download here
- or Upslug2 (for Linux user) ie: Ubuntu, đánh dòng lệnh sau vào command line để install upslug2:
sudo apt-get install upslug2
- WinSCP và Putty download here

Rùi, giờ bắt tay vào vọc NSLU2:
[align=center]
Bài 1: Làm thế nào để upgrade phần cứng mới cho NSLU2 và xây dựng giao diện command line cho NSLU2[/align]

B1: Tải phiên bản firmware mà bạn muốn nâng cấp vào PC. Cộng đồng NSLU2-linux đã phát triển rất nhiều phiên bản firmware cho nhiều cấp độ người dùng khác nhau. Duy_pham sẽ tóm tắt 1 chút về các bản phân phối này.

Unslung: Là phiên bản dành cho người mới bắt đầu làm quen với platform NSLU2. Được xây dựng dựa trên nền của phiên bản default nên Unslung khá thân thuộc với người mới sử dụng NSLU2 khi giữ lại giao diện web-interface. Unslung sử dụng kernel 2.4.22 khá cũ kỹ nên khả năng hỗ trợ phần cứng của Unslung là khá hạn chế. Các gói phần mềm cho Unslung bao gồm hơn 1000 soft và thư viện được đóng gói dưới dạng optware (.ipk)

SlugOS: Phiên bản dành cho người dùng cao cấp và cả developer. Sử dụng kernel 2.6.21 và phiên bản cập nhật của glibc, slugos hỗ trợ các công cụ phát triển khá tốt. SlugOS tương thích với khoảng 5000 gói phần mềm (1000 optware như Unslung và 4000 OpenEmbedded packages). SlugOS không có giao diện web nhưng hỗ trợ SSH để giao tiếp với PC qua Putty.SlugOS có thể chạy trên Flash cũng như trên thiết bị lưu trữ ngoài (usb). Nếu hệ thống trục trặc trên usb, flash sẽ là giải pháp backup

Note: Unslung và OpenSlug đều nằm trong dự án OpenEmbedded do đó chúng ta có thể biên dịch kernel cho hai firmware trên bằng hai công cụ của OpenEmbedded là bitbake và monotone. Tham khảo quá trình biên dịch kernel trên website http://www.openembedded.org

Debian/NSLU2: Phiên bản duy nhất được hỗ trợ bởi 1 nhà phân phối Linux uy tín. Debian/NSLU2 hỗ trợ hơn 10000 packages, với kernel Debian Etch và được cấu hình như đối với 1 desktop. Vì lý do đó, Debian/NSLU2 cồng kềnh ko thể chạy trên flash như Unslung và SlugOS, mà yêu cầu phải có thiết bị lưu trữ ngoài. Support sẵn module cho webcam dùng pwc và spcaX nên khá thuận tiện. Tuy nhiên, nếu hệ thống treo, bạn chỉ có 1 cách là ... reflash lại tự đầu.

website download các phiên bản trên: http://www.slug-firmware.net/

riêng Debian/NSLU2, tham khảo hướng dẫn cài đặt tại website http://www.cyrius.com/debian/nslu2/

Hệ thống của Duy_pham dùng Debian/NSLU2, tuy nhiên theo duy_pham thì chúng ta nên bắt đầu từ Unslung để làm quen với NSLU2.

B2: Khởi động NSLU2 vào chế độ upgrade mode:
- Bật NSLU2 lên
- Giữ phím reset cho tới khi thấy đèn ready chuyển sang màu đỏ
- Lập tức thả phím reset (nếu làm đúng thì đèn ready sẽ nhấp nháy giữa xanh và đỏ, nếu nhấp nháy vàng và đỏ tức là bạn thả tay ra chậm wé, tắt nguồn và làm lại đi)
- Chạy Sercomm Updater.
- Open file binary của Unslung mà bạn vừa tải xuống xong và bắt đầu nạp.
Hướng dẫn chi tiết cài đặt Unslung có thể xem tại đây

Chú ý, nếu hướng dẫn nói bạn format ổ đĩa của mình thành dạng EXT3 bằng web-interface của bản default thì khoan làm. Vì bản stock firmware của NSLU2 chỉ format những ổ có dung lượng trên 10Gb. Cứ bỏ qua và tiếp tục đến khi bạn đã boot được Unslung bằng web-interface thì format sau.

B3: Sau khi làm theo các bước trong cái íntallation guide thì có lẽ bạn đã có thể telnet vào được unslung rồi. Để telnet vào NSLU2 bạn cần biết các điều sau:
1. địa chỉ IP của NSLU2 (chạy Disk setupUltility và cấu hình lại IP của NSLU2 tùy theo bạn dùng DHCP hay fix IP)
2. mở IE hay firefox lên, gõ vào địa chỉ: http://192.168.1.x là địa chỉ IP của NSLU2
3. nhấn vào tab telnet, chọn enable
4. ở Window, chọn Start->Run, gõ cmd
5. Trong giao diện cmd, gõ telnet <IP>
---> Chúc mừng, bạn đã telnet đc với platform NSLU2

Hãy dành thời gian làm quen với các lệnh Linux và cài đặt trình biên dịch C bằng cách gõ dòng lệnh sau trong command line của NSLU2:

ipkg update
ipkg install optware-devel

tham khảo chi tiết về cách soạn thảo và lập trình C trên NSLU2 tại đây

vậy là chúng ta đã cấu hình xong NSLU2 trở thành 1 platform Linux. Để cài đặt các phần mềm chúng ta dùng lệnh ipkg, và các gói phần mềm có thể đc download tại website www.nslu2-linux.org hoặc search bằng google với từ khóa NSLU2 optware.

Bài kế tiếp: Rebuild kernel và chạy module videodev cho webcam trên Unslung

Bài 2: Rebuild kernel và chạy module video trên Unslung

1. Nhân Linux (Linux kernel) và việc biên dịch nhân (rebuild kernel)

Như duy_pham đã có lần viết một bài giới thiệu về Linux trong box Hệ điều hành, Linux là 1 hđh có tính module rất cao, cho phép người dùng có thể chỉnh sửa các module, driver cần thiết tương ứng với thiết bị đang sử dụng. Vì tinh thần "biên dịch nhân", một yếu tố chính và quan trọng nhất cần ghi nhận đ*ó là tính phân bộ (modularity) của nhân Linux.

‑Đối với ng dùng bình thường, modularity cho phép chọn lựa cách biên dịch các drivers của nhân theo dạng modules hay theo dạng biên dịch trực tiếp vào nhân.

Có những "driver" không thể biên dịch như một module vì nó phải được load and link trực tiếp ngay khi nhân khởi động . Cũng có những "driver" cho phép chọn như một module và *được tải trong khi và sau khi nhân *được khởi động. Điểm chính yếu cần nắm là khi nào nên chọn M (cho module), Y (cho biên dịch trực tiếp) và N (không dùng) các drivers này.

Biên dịch trực tiếp nghĩa là các driver có dùng hay không cũng đều được load ngày từ khi hđh khởi động, tất nhiên nó sẽ chiếm 1 phần memory. Lợi điểm là "tính trung thực" của nhân và driver. Các hệ thống bảo mật cao thường biên dịch trực tiếp để tránh các module "lạ" bị cài vào nhân trong quá trình hoạt động của máy.

Biên dịch module nghĩa là biên dịch các driver như những module, chỉ khi cần sử dụng mới được tải vào nhân. Lợi điểm của phương pháp này là hiệu quả sử dụng tài nguyên. Bạn có thể tạo ra 1 nhân rất nhỏ gọn và thuận tiện trong việc biên dịch lại 1 số module nào đó (thay vì phải biên dịch lại toàn bộ nhân).

Các bạn nào muốn biết thêm về biên dịch nhân và cách viết driver và biên dịch driver cho Linux (cơ bản là cho máy vi tính nhé) thì tham khảo các tài liệu sau:

Biên dịch nhân linux - Hoàng Ngọc Diệu
Linux device driver - Third Edition - Jonathan Corbet

Hoặc vào website http://kernelnewbies.org/ để làm quen với kernel.

2. NSLU2 và OpenEmbedded:

Dự án Open Embedded (OE) là một dự án phát triển các công cụ hỗ trợ cho việc phát triển những bản phân phối Linux cho các hệ thống nhúng. Căn bản mà nói, OpenEmbedded duy trì và phát triển kho lưu trữ các BitBake recipes. Các BitBake file này chứa đựng địa chỉ mã nguồn của các gói (package), những yếu cầu (dependencies) và thông số biên dịch hay cài đặt một bẻn phân phối.

Bit bake là một hệ thống biên dịch trên nền ngôn ngữ python được dùng để đọc các file *.bb chứa đừng các thông số cần thiết để build một phiên bản image cho NSLU2 (Hay các hệ thống nhúng khác mà chúng ta muốn. ). Bit bake được duy trì như là một subversion độc lập với các thành phần khác của OE. Các *bb files được duy trì trong 1 hệ thống dữ liệu monotone (monotone repository system). Ở đây chúng ta không cần quan tâm đến montone, trừ khi có bạn nào có ý định gia nhập nhóm phát triển OE và cập nhật ,chỉnh sửa, phát triển các *bb files. (Lúc đó nhớ cho duy_pham biết để gọi 1 tiếng sí phò)

Bây giờ không đi quá sâu vào OE kẻo có người tẩu hỏa nhập ma, duy_pham sẽ trình bày các bước để xây dựng công cụ biên dịch kernel cho NSLU2 trên 1 máy tính sử dụng hđh Linux (cụ thể là cái máy ở nhà duy_pham xài Ubuntu7.04)

1. Dùng apt-get để cài các tool cần thiết của OE

- Gõ những dòng lệnh sau vào command line của Ubuntu
sudo apt-get install build-essential
sudo apt-get install libz-dev diffstat texi2html cvs subversion texinfo gawk git
sudo apt-get install libboost-date-time-dev libboost-filesystem-dev libboost-regex-dev libboost-serialization-dev libboost-test-dev libboost-dev g+

Tham khảo thêm về các phần mềm bắt buộc phải có cho OE và công dụng của chúng tại đây

2. Setup các công cụ và thư mục download cho OE:

- Tải, dịch và cài đặt montone phiên bản 0.28 từ source. Đây không phải bản mới nhất nhưng nó là bản được dùng cho dự án NSLU2 nên cứ dùng nó cho chắc ăn

o Nếu bạn xài bản mới nhất của monotone, bạn sẽ bị tra tấn trong suốt quá trình convert datbase từ 0.28 lên phiên bản mới nhất khi build image cho NSLU2. Với cấu hình máy duy_pham là Dual Core 1.8G, 1GB DDRAM2 quá trình migration này mất khoảng ... 6 -> 7 tiếng đồng hồ.

- Thiết lập thư viện download cho OE để lưu trữ các đoạn mã nguồn (tar balls) và bản vá (patch) mà OE sử dụng. duy_pham đặt nó trong $HOME/oe_downloads và dẫn đường dẫn symbol (symbolic link) chỉ tới nó từ NSLU2 và các cây thư mục OE khác.

- Download các file BXD cho IXP425 về từ website của INTEL (Dò NSLU2 dùng con IXP42X mà).

o Đăng ký 1 tài khoản ở website Intel

o Tải các bản mà chúng ta cần về từ kho soft của INTEL

Cái mà mình cần là NPE Access Library và NPE micro code libraries ( ).

+ BSD_ixp400AccessLibrary-2_3.zip, IPL_ixp400NpeLibrary-2_3.zip
+ BSD_ixp400AccessLibrary-2_1.zip, IPL_ixp400NpeLibrary-2_1.zip

o Rename BSD* files thành IPL*
o Kiểm tra checksum bằng các md5 files

Gõ vào command line:

md5sum -b IPL_ixp400AccessLibrary-2_1.zip | awk '{print $1}' > IPL_ixp400AccessLibrary-2_1.zip.md5
md5sum -b IPL_ixp400AccessLibrary-2_3.zip | awk '{print $1}' > IPL_ixp400AccessLibrary-2_3.zip.md5
md5sum -b IPL_ixp400NpeLibrary-2_1.zip | awk '{print $1}' > IPL_ixp400NpeLibrary-2_1.zip.md5
md5sum -b IPL_ixp400NpeLibrary-2_3.zip | awk '{print $1}' > IPL_ixp400NpeLibrary-2_3.zip.md5


o Chép mấy thằng đó vô thư mục download vừa tạo hồi nãy.

Rùi, bây giờ bắt tay vào "Open Embedded" được rùi. Tham khảo hướng dẫn về nó tại website http://www.openembedded.org/wiki/MainPage nhé

3. Compile module videodev cho Unslung bằng Open Embedded.

Tùy vào loại webcam mà bạn sử dụng là dòng vi điều khiển nào mà chúng ta phải build kernel cho nó bằng những cách khác nhau. Ở đây duy_pham giới thiệu 2 tutorial để build module cho webcam dùng chip OV511 và PWC.

OV511 UNSLUNG 5.X

- Tải Master Makefile của NSLU2 xuống (trừ khi bạn đủ khả năng viết 1 Makefile cho nó)

mkdir nslug
cd nslug
ln -s $HOME/oe_downloads downloads
wget --cache=off http://www.nslu2-linux.org/Makefile

- Biên dịch image lại cho Unslung

gõ : make unslung ( rùi, đi pha 1 ly cafe đá, mở HBO lên coi phim hay ESPN để coi ManUtd đá banh đi. Có thể bạn sẽ mất khoảng 3-4h nếu máy mạnh, không thì tốt nhất nên treo máy đó mà ngủ 1 giấc, sáng ra nó chạy xong )

- Sau khi biên dịch xong, vào thư mục ${OEBUILD}/tmp/work/unslung-able-kernel-2.3r63-r7 và hiệu chỉnh các thông số trong file defconfig như sau:
1. CONFIG_VIDEO_DEV=m
2. CONFIG_USB_OV511=m
3. CONFIG_DEVFS_FS=y
4. (Còn lại những thông số khác thì để default hết, khỏi sửa gì cả)

- Xóa cái file ${OEBUILD}/tmp/stamps/unslung-able-kernel-2.3r63-r7.do_compile đi

- Biên dịch lại lần nữa (lại ngủ thêm 1 giấc dài nữa ...)

- Sau khi biên dịch xong, dùng dòng lệnh sau để tìm hai file videodev.o và ov511.o
find / -name videodev.o
find / -name ov511.o

- Chép hai file trên vào thư mục /opt/lib/modules trong NSLU2 (dùng WinSCP để chép)
- Cắm webcam vào NSLU2
- gõ lệnh insmod videodev.o và insmod ov511.o từ thư mục /opt/lib/modules
- kiểm tra file /var/log/messages để chắc rằng webcam đang họat động, nó sẽ có dạng như sau

Mã:
Nov 13 20:29:21 klogd: Linux video capture interface: v1.00
Nov 13 20:29:25 klogd: usb.c: registered new driver ov511
Nov 13 20:29:25 klogd: ov511.c: USB OV511 video device found
Nov 13 20:29:25 klogd: ov511.c: model: AverMedia InterCam Elite
Nov 13 20:29:25 klogd: ov511.c: Sensor is an OV7610
Nov 13 20:29:25 klogd: ov511.c: Device at usb-00:01.1-2 registered to minor 0
Nov 13 20:29:25 klogd: ov511.c: v1.63 for Linux 2.4 : ov511 USB Camera Driver


- tải trình lấy ảnh vidcat về : ipkg install vidcat
- dùng vidcat để capture ảnh, có thể tham khảo cách dùng vidcat bằng lệnh vidcat --help

Vậy là xong, bi giờ cắm webcam vô NSLU2 thỏai mái rùi đó. Có một chút vấn đề ở đây, và đó cũng là lý do tại sao duy_pham không sử dụng Unslung cho bài tóan OpenCV. Đó là kernel 2.4.22 của Unslung hỗ trợ độ phân giải của ảnh rất kém, maximum chỉ được 160x240 (too small). Nếu chỉ dùng cho các bài tóan CV nhỏ như tracking theo sự thay đổi trong ảnh (chống trộm) hay dùng NSLU2 làm server quan sát từ xa mà không cần kích thước file lớn (để dễ truyền đi) thì Unslung làm dễ nhất. Một vấn đề khác là tìm 1 webcam dùng chip ov511 ở VN là khá hiếm, mà chủ yếu là PWC. Việc biên dịch PWC cho Unslung tương đối phức tạp vì kernel thiếu hỗ trợ, thường thì duy_pham dùng SlugOS (cũng biên dịch bằng OE) hoặc Debian/NSLU. [/i]
Quên, chi tiết về cách setup 1 pwc webcam có thể tham khảo tại website http://www.nslu2-linux.org/wiki/HowTo/AddUsbWebcam.

Còn riêng về Debian/NSLU2 thì lý do để duy_pham xài nó là vì nó tích hợp sẵn module pwc.o và videodev.o rùi, chỉ việc insmod và sử dụng. Và kernel Debian Etch của nó hỗ trợ v4l2 (video for linux 2) nên cho chất lượng hình ảnh tốt. tuy nhiên bạn cũng có thể đạt được kết quả tương tự với 1 gói image nhỏ hơn bằng cách dùng OE để build kernel cho SlugOS.

Xong 2 bài rùi, hẹn vài tuần sau sẽ tiếp bài 3: Thư viện mã nguồn mở OpenCV và bài tóan điều khiển robot. (Lý do chậm trễ là tại vì đây là phần mới nảy sinh ra trong đề tài của duy_pham và robin_vh, cả hai đang nghiên cứu mong sẽ có kết quả sớm nhất).

@Zanghe, zxc, nattan: Liên lạc với anh ngay khi em đọc messages này, có việc cần mấy em giúp đây. Sorry, điện thọai hít tiền gòi...Chịu khó gọi cho an

Hây, hôm nay giới thiệu với bà con một thư viện các hàm xử lý ảnh cực kỳ pro, mà duy_pham và robinvh mới "đào" được trên mạng. Đó là thư viện Intel OpenCV.

Bài 4: Thư viện mã nguồn mở Intel OpenCV và bài tóan xử lý ảnh.

Thư viện OpenCV là gì: OpenCV là viết tắt của Open Source Computer Vision, là một thư viện mở gồm các hàm được xây dựng phục vụ cho việc xử lý thị giác máy thời gian thực (Real time computer vision). Các thuật tóan xử lý ảnh thông thường lẫn cao cấp đều được tối ưu hóa bởi các nhà phát triển thư viện thành các hàm đơn giản và rất dễ sử dụng. OpenCV hỗ trợ hai ngôn ngữ chính: C/C++ và python

Cài đặt thư viện OpenCV:

+ Đối với Window và Visual C++ 6.0:

1. Download file binary của OpenCV về tại đây
2. Chạy file binary để install
3. Mở 1 project trong Visual C++ lên. Tiếp theo, từ Project->Settings, hộp thoại Project Settings xuất hiện, chọn tab C/C++. Trên tab này, từ Catergory trổ xuống, bạn chọn Preprocessor. Sau đó, bạn thêm các đường dẫn sau vào hộp hộp text: Additional Include Directories
- C:\Program Files\OpenCV\cv\include
- C:\Program Files\OpenCV\cxcore\include
- C:\Program Files\OpenCV\cvaux\include
- C:\Program Files\OpenCV\otherlibs\cvcam\include
- C:\Program Files\OpenCV\otherlibs\highgui
Chú ý: Các đường dẫn trên phụ thuộc vào việc OpenCV được cài ở đâu, ở đây OpenCV được cài ở C:\Program Files\

4.Tiếp theo, cũng trong hộp thoại Project Settings, chúng ta chuyển sang chọn tab Link. Trên tab này, trog Category trổ xuống, chọn General. Trong hộp text Object/Library modules, ta nhập các thu viện sau vào đó và nhấn Enter để kết thúc:
- cv.lib
- cxcore.lib
- highgui.lib
- cvcam.lib
- cxts.lib

5. Từ Tools->Options, hộp thoại Options xuất hiện, chọn tab Directories, giữ nguyên mặc định cho Platform, trong Show directories for trổ xuống, chọn Include files. Tương ứng với Include files thì ở Directories bên dưới, chúng ta thêm các đường dẫn sau(nếu bạn đã biết các cài đặt cần thêm nằm ở đâu _ nếu không biết, bạn có thể nhấn chuột vào tận cùng của hàng đó để tìm đường giẫn tới đó).

- C:\PROGRAM FILES\OPENCV\CV\INCLUDE
- C:\PROGRAM FILES\OPENCV\CVAUX\INCLUDE
- C:\PROGRAM FILES\OPENCV\CXCORE\INCLUDE
- C:\PROGRAM FILES\OPENCV\FILTERS\PROXYTRANS
- C:\PROGRAM FILES\OPENCV\OTHERLIBS\CVCAM\INCLUDE
- C:\PROGRAM FILES\OPENCV\OTHERLIBS\HIGHGUI

6.Cũng từ tab Directories đổ xuống, chọn Library Files, ở Directories bên dưới, thêm các đường dẫn sau như đối với Include files.

- C:\PROGRAM FILES\OPENCV\LIB

Xong, bây giờ bạn đã có thể sử dụng các hàm của openCV trong Visual C++
Rùi, hôm nay là cách setup OpenCV trên Linux platform.

- Nếu bạn đang sử dụng Debian hoặc Ubuntu, rất đơn giản vì thư viện OpenCV đã được support trong cvs của các bản phân phối trên. Bạn chỉ cần gõ trong command line:

apt-get install libcv*

Là toàn bộ các package cần thiết sẽ được chọn để setup OpenCV cho bạn.

- Trường hợp bạn sử dụng các bản phân phối Linux không hỗ trợ opencv, ta phải build từ source. Quá trình này hơi phê 1 chút à nhe.

1. Download tar balls của openCV về từ website http://sourceforge.net/projects/opencvlibrary/
2. Kiểm tra xem hệ thống của bạn đã cài đặt tất cả các package cần thiết cho OpenCV chưa. Những package cần phải cài trước là:

- GTK+ 2.x or higher.

- libpng, libjpeg, libtiff with development files.

- libavcodec from ffmpeg 0.4.9-pre1 + headers.

Chú ý là các package trên cũng đòi hỏi một số package khác tương tự nên khá phức tạp. Nếu chúng ta dùng firmware SlugOS cho NSLU2 thì hãy tham khảo các package và dependencies của chúng tại website http://ipkgfind.nslu2-linux.org/. Bạn gõ tên các package vào và tìm kiếm sẽ thấy những dependencies của chúng. download các package (đóng gói dưới dạng .ipk) về nslu2 bằng lệnh sau:

wget <link> hoặc down về PC và dùng WinSCP để copy qua NSLU2.

- vào thư mục chứa các gói .ipk và nhập lệnh:
ipkg install <"tên gói">

3. Sau khi cài xong các dependencies của OpenCV, bạn giải nén file tar balls của OpenCV ra:

- tar -xvzf <"tên file nén openCV">
- cd <"thư mục giải nén">
- ./configure
Nếu chạy configure ko báo lỗi gì, bạn gõ tiếp:

- make
- make install

Rùi, vậy là cài xong OpenCV trong Linux. Đây là 1 thư viện xử lý hình ảnh rất mạnh, áp dụng cực kỳ tốt trong bài toán xử lý ảnh robot

Như đã hứa, hôm nay duy_pham xin post 1 sample về sử dụng openCV để xử lý ảnh. Hàm này sẽ load lên 1 file ảnh và chuyển file ảnh đó thành dạng các đường biên (edge detecting). Đây là một ví dụ điển hình về một bài toán Computer Vision với các bước thực hiện như duy_pham đã nêu ở những bài đầu tiên

MA
#include "cv.h"
#include "highgui.h"


char wndname[] = "Edge";
char tbarname[] = "Threshold";
int edge_thresh = 1;

IplImage *image = 0, *cedge = 0, *gray = 0, *edge = 0;

// define a trackbar callback
void on_trackbar(int h)
{
cvSmooth( gray, edge, CV_BLUR, 3, 3, 0, 0 );
cvNot( gray, edge );

// Run the edge detector on grayscale
cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 3);

cvZero( cedge );
// copy edge points
cvCopy( image, cedge, edge );

cvShowImage(wndname, cedge);
}

int main( int argc, char** argv )
{
char* filename = argc == 2 ? argv[1] : (char*)"fruits.jpg";

if( (image = cvLoadImage( filename, 1)) == 0 )
return -1;

// Create the output image
cedge = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 3);

// Convert to grayscale
gray = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1);
edge = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1);
cvCvtColor(image, gray, CV_BGR2GRAY);

// Create a window
cvNamedWindow(wndname, 1);

// create a toolbar
cvCreateTrackbar(tbarname, wndname, &edge_thresh, 100, on_trackbar);

// Show the image
on_trackbar(0);

// Wait for a key stroke; the same function arranges events processing
cvWaitKey(0);
cvReleaseImage(&image);
cvReleaseImage(&gray);
cvReleaseImage(&edge);
cvDestroyWindow(wndname);

return 0;
}


Rùi, bây giờ phân tích 1 chút về các hàm của openCV dùng trong bài toán này nhe.

Mã:
#include "cv.h"
#include "highgui.h"

Khai báo các thư viện của openCV được sử dụng trong chương trình. Nếu dùng Visual C 6 thì phải set up các thư viện trước cho project của bạn nhé.

Mã:
IplImage *image = 0, *cedge = 0, *gray = 0, *edge = 0;

Khai báo header cho các file ảnh, các header này sẽ quy định những thông số của ảnh như kích cỡ, định dạng ảnh, độ phân giải, v.v... Đây là một biến con trỏ kiểu struct được định nghĩa trong thư viện OpenCV. Code của struct này như sau:

Mã:
typedef struct _IplImage
{
int nSize; /* sizeof(IplImage) */
int ID; /* version (=0)*/
int nChannels; /* Most of OpenCV functions support 1,2,3 or 4 channels */
int alphaChannel; /* ignored by OpenCV */
int depth; /* pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported */
char colorModel[4]; /* ignored by OpenCV */
char channelSeq[4]; /* ditto */
int dataOrder; /* 0 - interleaved color channels, 1 - separate color channels.
cvCreateImage can only create interleaved images */
int origin; /* 0 - top-left origin,
1 - bottom-left origin (Windows bitmaps style) */
int align; /* Alignment of image rows (4 or 8).
OpenCV ignores it and uses widthStep instead */
int width; /* image width in pixels */
int height; /* image height in pixels */
struct _IplROI *roi;/* image ROI. when it is not NULL, this specifies image region to process */
struct _IplImage *maskROI; /* must be NULL in OpenCV */
void *imageId; /* ditto */
struct _IplTileInfo *tileInfo; /* ditto */
int imageSize; /* image data size in bytes
(=image->height*image->widthStep
in case of interleaved data)*/
char *imageData; /* pointer to aligned image data */
int widthStep; /* size of aligned image row in bytes */
int BorderMode[4]; /* border completion mode, ignored by OpenCV */
int BorderConst[4]; /* ditto */
char *imageDataOrigin; /* pointer to a very origin of image data
(not necessarily aligned) -
it is needed for correct image deallocation */
}
IplImage;


Đầu tiên chúng ta sẽ mở một file ảnh chứa sẵn trong máy lên để xử lý bằng hàm cvLoadImage()

Mã:
if( (image = cvLoadImage( filename, 1)) == 0 )
return -1;
// Mo mot file anh, neu thanh cong tra ve 1, khong tra ve -1


Hàm này có hai đối số, cái thứ nhất là 1 string chỉ đường dẫn và tên file ta cần load, các định dạng ảnh được hỗ trợ gồm có :

Windows bitmaps - BMP, DIB
JPEG files - JPEG, JPG, JPE
Portable Network Graphics - PNG
Portable image format - PBM, PGM, PPM
Sun rasters - SR, RAS
TIFF files - TIFF, TIF

Đối số thứ hai là định dạng ảnh được đưa vào biến image. nếu đối số này là 1, ảnh là dạng RGB,2 là Grayscale còn -1 là không thay đổi so với nguyên mẫu. Sau khi thực hiện hàm,con trỏ header *image đã trỏ tới vùng nhớ chứa ảnh cần xử lý.

Bây giờ chúng ta sẽ tạo các file image rỗng để chứa các kết quả xử lý, để ý rằng các khai báo IplImage ban đầu chỉ là các header, ko phải file ảnh. Sau khi tạo file ảnh bằng hàm cvCreateImage(), chúng mới trỏ tới vùng nhớ chứa ảnh.

Mã:
// Create the output image
cedge = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 3);
gray = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1);
edge = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1);

Khai báo như trên nghĩa là ảnh cedge là ảnh màu 8 bit, 3 kênh (RGB), gray và edge là ảnh grayscale, chỉ có 1 kênh.

Để có thể thực hiện các thuật toán dò cạnh như dò cạnh sobel hay dò cạnh cranny ảnh cần phải được chuyển thành grayscale. Lý thuyết về convert grayscale có thể theo dõi ở đây. Trong OpenCV, hàm cvCvtColor() sẽ giúp ta thực hiện việc này.

Mã:
cvCvtColor(image, gray, CV_BGR2GRAY);

Hàm này sẽ chuyển ảnh image màu thành ảnh gray là dạng grayscale.

Sau đó ảnh sẽ được lọc nhiễu, phân ngưỡng và xuất ra màn hình. Ở đây các thuật toán đó được viết trong hàm con on_trackbar.

Mã:
void on_trackbar(int h)
{
cvSmooth( gray, edge, CV_BLUR, 3, 3, 0, 0 );
cvNot( gray, edge );

// Run the edge detector on grayscale
cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 3);

cvZero( cedge );
// copy edge points
cvCopy( image, cedge, edge );

cvShowImage(wndname, cedge);
}


Dưới đây là hai file chạy chương trình và file ảnh mẫu, các bạn có thể thấy hiệu quả của openCV

À wên, phải cài openCV vào nó mới chạy được. File cài nè

Tập tin đính kèm:
Chú thích tập tin: Thư viện OpenCV
OpenCV_1.0.rar [17.12 MiB]
Đã tải về 28 lần.


bác duy_pham ui!
chương trình bác viết là sử dụng phần mềm visual c++ hả
thực ra em thấy code là c đó ngưng chẳng biết c gì (c,c++,visual c++)
em muốn biết anh sài chương trình gì để em nghiên cứu lun cho tiện (không biết cũng còn có người hỏi)

Rất hoan nghênh tinh thần học hỏi của bạn phuong_vt. duy_pham sẵn sàng giải đáp tất cả thắc mắc của bạn liên quan đến công nghệ xử lí ảnh, dĩ nhiên là trong tầm hiểu biết giới hạn của duy_pham mà thôi.

Q: chương trình bác viết là sử dụng phần mềm visual c++ hả?
A: đúng vậy, đó là chương trình mình viết trên visual C++ của window và sử dụng thư viện Intel OpenCV. Bạn có thể tìm hiểu về thư viện này ]ở đây

Q: MÁy tính không cài win XP mà Linux ?
A: cũng không nhất thiết phải cài Linux trên PC cho lắm, dùng WinXP cũng kết nối được với thiết bị NSLU2. Tuy nhiên ta sẽ cần Linux cho quá trình biên dịch kernel cho NSLU2 bằng Open Embedded. duy_pham dùng phần mêm VMware để chạy giả lập 1 hđh Linux song song với Window trên máy. Ngòai ra, việc làm quen với một máy tính dùng Linux cũng giúp ta thuận lợi hơn khi làm việc với NSLU2.

Q: chẳng biết máy tính nhúng nối với PC theo dây mạng hay theo USB hỉ!!!
A: Máy tính nhúng NSLU2 và PC kết nối với nhau qua cáp Ethernet. Nếu bạn dùng 1 cái switch để cắm thì bấm cáp kiểu bình thường thui, còn nếu kết nối trực tiếp vào PC thì phải bấm cáp chéo (crossover cable). NSLU2 giao tiếp với PC bằng telnet hoặc SSH, với địa chỉ mạng của NSLU2 là 192.168.1.77. Nếu mạng nhà bạn là mạng DHCP thì NSLU2 sẽ được cấp 1 địa chỉ IP động, thay đổi tùy theo số lượng thiết bị trong mạng lúc NSLU2 khởi động. ví dụ nhà bạn có 3 máy tính nốii mạng với nhau, và khi cắm vào NSLU2 thì nó sẽ có IP là 192.168.1.4. Cách telnet vào NSLU2 duy_pham có hướng dẫn ở trên.

Q: Máy tính nhúng đó oh mình có bán không nhỉ giá cở bao nhiêu SV có thể mua "chơi" đc kô nhỉ!!!!
A: Lúc duy_pham mua thì giá của nó là 125 US$, có bán ở TPHCM. Công ty bán thiết bị này là công ty Tân Niềm Tin (TNT), nhà phân phối của Linksys ở TPHCM. NSLU2 có rất nhiều ứng dụng cực hay, ko chỉ dùng để sử lí ảnh, mà còn dùng làm file server, web server v.v... Kể ra thì cũng đáng đồng tiền bát gạo

Q: Hình như mình phải cài hệ diều hành cho nó nữa hả. Cài kiểu gì đây???? Hu hu
A: Không phải hình như mà là chính xác như vậy. Bạn có thể tìm thông tin về cách hack NSLU2 và cài hđh khác vào tại website http://www.nslu2-linux.org

Q: rồi mình có một phần mềm lập trình trên PC. viết một chương trình xử lý ảnh dịch ra file exe rồi nạp file đó vào kit đó phải không
A: Cái này thì sai gòi. Linux có một phần mềm biên dịch là gcc, cũng tương tự như visual C của Window vậy. Chúng ta lập trình trên PC để thử các kết quả, do PC thì nó có giao diện đồ họa, dễ kiểm tra hơn. Sau khi làm chạy trên PC rồi thì cứ copy paste cái file .c đó vào NSLU2 rồi dùng gcc dịch và chạy ngay trên đó luôn. Có điều phải chú ý các khai báo thư viện chuẩn trong VisualC và gcc khác nhau, chẳng hạn gcc Linux ko có conio.h mà thay bằng ncurse.h và stdlib.h v.v...

TÀI LIỆU VỀ CÔNG NGHỆ XỬ LÝ ẢNH NÓI TRÊN ĐƯỢC EITVIET SƯU TẦM TRÊN TRANG WEB WWW.DIENTUVIENTHONG.NET CỦA TÁC GIẢ PHẠM NGUYỄN ANH DUY, CỰU SINH VIÊN CỦA TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TPHCM

http://dientu686.com/