HƯỚNG DẪN LẬP TRÌNH ROBOT (Mạch ROBOCON BKIT 2009)

37 189 0
HƯỚNG DẪN LẬP TRÌNH ROBOT (Mạch ROBOCON BKIT 2009)

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BKIT Hướng dẫn lập trình Robocon HƯỚNG DẪN LẬP TRÌNH ROBOT (Mạch ROBOCON BKIT 2009) Tp Hồ Chí Minh, tháng năm 2009 Trang BKIT Hướng dẫn lập trình Robocon MỤC LỤC Chương GIỚI THIỆU 1.1 Sơ lược 1.2 Yêu cầu Chương TÌM HIỂU VI ðIỀU KHIỂN ATMEGA64 2.1 Giới thiệu 2.2 Các chức 2.2.1 Các port I/O 2.2.2 Ngắt Ngoài - External Interrupt 2.2.3 Timer/Counter 2.2.4 Chế ñộ PWM 2.2.5 Bộ chuyển ñổi ADC 2.2.6 Các tính khác 10 Chương TÌM HIỂU MỘT SỐ LINH KIỆN & THIẾT BỊ ROBOT 11 3.1 ðộng 11 3.1.1 ðộng DC 11 3.1.2 ðộng Servo 11 3.2 Cảm biến 12 3.2.1 Dò đường 12 3.2.2 Encoder 12 3.3 Mạch ñiện 13 3.3.1 Mạch “ROBOCON BKIT 2009” 13 3.3.2 Mạch cơng suất điều khiển động 19 Chương THỰC HÀNH LẬP TRÌNH 20 4.1 Chương trình soạn thảo biên dịch CodeVisionAVR 20 4.1.1 Giới thiệu 20 4.1.2 Các thao tác 20 4.1.3 Sử dụng chương trình tự sinh mã CodeWizardAVR 24 4.2 Mạch nạp AVR910 USB chương trình nạp AvrProg 25 4.2.1 Mạch nạp AVR910 USB 25 4.2.2 Cách cài ñặt Driver 26 4.2.3 Chương trình nạp AVRProg 28 4.3 Lập trình mạch “ROBOCON BKIT 2009” 31 4.3.1 Yêu cầu 31 4.3.2 Hướng dẫn 31 Chương TỔNG KẾT 36 TÀI LIỆU THAM KHẢO 37 Trang BKIT Hướng dẫn lập trình Robocon Chương GIỚI THIỆU 1.1 Sơ lược 1.2 Yêu cầu Trang BKIT Hướng dẫn lập trình Robocon Chương TÌM HIỂU VI ðIỀU KHIỂN ATMEGA64 2.1 Giới thiệu Atmega64 vi ñiều khiển AVR bit tiêu thụ ñiện thấp (low-power) dựa kiến trúc RISC (Reduced Intruction Set Computer) Vào Analog – Digital ngược lại Với công nghệ cho phép lệnh thực thi chu kì xung nhịp, tốc độ xử lý liệu đạt đến 16 triệu lệnh giây tần số 16 Mhz Vi ñiều khiển cho phép người thiết kế tối ưu hố chế ñộ ñộ tiêu thụ lượng mà ñảm bảo tốc độ xử lí ðặc tả: • Thuộc dòng vi ñiều khiển AVR bit, hiệu cao, tiêu thụ lượng thấp • Kiến trúc RISC tiên tiến − Tập 130 lệnh máy – Hầu hết thực chu kỳ xung nhịp − 32 ghi x bit làm việc đa mục đích, điều khiển ngoại vi − Hoạt ñộng tĩnh − ðạt ñến 16MIPS với xung nhịp 16MHz − Tích hợp nhân chu kỳ • Bộ nhớ với ổn định cao − 64 K Bytes nhớ chương trình In-System Reprogrammable Flash − K Bytes nhớ EEPROM − K Bytes SRAM nội − Chu kỳ ghi/xóa: 10,000 Flash/100,000 EEPROM − ðộ bền liệu 20 năm 85°C 100 năm 25°C − Có thể nâng lên 64 K Bytes khơng gian nhớ ngồi − Khóa chương trình cho bảo mật phần mềm − Giao diện SPI cho lập trình hệ thống • Giao diện JTAG • ðặc tả ngoại vi − Hai Timer/Counters bit với chế ñộ so sánh ñếm chia trước riêng rẽ − Hai Timer/Counters mở rộng 16 bit với chế ñộ so sánh, ñếm chia trước, chế ñộ bắt mẫu − Bộ Timer/Counter thời gian thực với giao ñộng tách biệt − kênh ñiều xung PWM bit − kênh ñiều xung PWM lập trình từ đến 16 bit − kênh ADC 10 bit − Byte-oriented Two-wire Serial Interface − Bộ truyền nối tiếp bất ñồng UART Trang BKIT Hướng dẫn lập trình Robocon − Giao diện Master/Slave SPI Serial − Bộ lập trình Watch dog timer − Bộ so sánh Analog • Tính khác − Tự ñộng Reset bật nguồn − Bộ tạo xung bên − Ngắt − chế ñộ ngủ : Idle, ADC Noise Reduction, Power-save, Power-down, Standby Extended Standby − Có thể chọn tần số clock phần mềm − 53 ngõ I/O lập trình − ðiện hoạt ñộng từ 2.7V ñến 5.5V ñối với Atmega64L từ 4.5V ñến 5.5V ñối với Atmega64 − Tốc ñộ làm việc tối ña: MHz ñối với Atmega64L 16MHz ñối với Atmega64 2.2 Các chức Phần trình bày số chức vi ñiều khiển Atmega64 phục vụ cho việc lập trình robot 2.2.1 Các port I/O ATmega64 có ports I/O đánh ký hiệu từ A đến G Các port có pin, trừ port G có pin, cách khởi tạo sử dụng giống Ở ñây ta xem xét port A, port khác tương tự Các ghi ñặc tả port A bao gồm: Trong đó: PORTA : ghi liệu port, thực chức ñọc ghi DDRA : thiết lập port làm input hay output, tác động lên pin PINA : port ñược thiết lập làm input, PINx thể giá trị port, có chức đọc Trước sử dụng port, ta cần thiết lập port làm input hay output tùy nhu cầu Bit DDxn=1 thiết lập pin “n” port “x” làm output ngược lại Khi ñược thiết lập làm Trang BKIT Hướng dẫn lập trình Robocon output, ta mặc định pin giá trị hay cách ghi giá trị tương ứng vào ghi PORTx 2.2.2 Ngắt Ngoài - External Interrupt Atmega64 có chân ngắt ngồi, ký hiệu INTn (n = 7), theo thứ tự ñược nối với pin PD0, PD1, PD2, PD3 (của port D, từ 25 ñến 28) PE4, PE5, PE6, PE7 (của port E, từ ñến 9) Khi ñược thiết lập làm ngắt ngồi chân phải đặt chế ñộ input ghi DDRx Các ghi chức ngắt ngoài: Hai ghi EICRA & EICRB có tổng cộng 16 bit, cặp bit ISCn1:0 dùng ñể quy ñịnh mode cho ngắt “n” Các mode ñược quy ñịnh theo bảng sau: Mode quy ñịnh cách thức gây ngắt, bao gồm mức logic thấp (ngắt mức), cạnh xuống cạnh lên (ngắt cạnh) Thanh ghi cho phép ngắt EIMSK: Mặc ñịnh EIMSK = 0x00, tức ngắt ngồi bị cấm Khi muốn cho phép ngắt ta đặt giá trị bit tương ứng ngắt EIMSK lên Thanh ghi cờ ngắt EIFR: Mặc ñịnh cờ (các bit EIFR) mang giá trị Khi có ngắt xảy chân INTn bit tương ứng đặt lên 1, cờ ñược bật Khi hàm phục vụ ngắt ñược MCU thực hiện, cờ tự ñộng bị xóa Người sử dụng xóa cờ cách ghi giá trị vào bit tương ứng cờ Lưu ý, khơng cần thiết, người sử dụng khơng cần quan tâm đến EIFR lập trình ngắt ngồi Trang BKIT Hướng dẫn lập trình Robocon Sau ñã thiết lập ghi EICRA, EICRB EIMSK, ta cần viết hàm phục vụ ngắt tương ứng theo mẫu sau (dùng CodeVision: Lưu ý, chương trình, ta thiết lập ngắt đó, khơng có hàm phục vụ ngắt tương ứng chương trình bị treo 2.2.3 Timer/Counter ATmega64 có timer, ñược ñánh số từ ñến Trong ñó, Timer0 Timer2 timer bit (giá trị ñếm cao 28 - 1= 255), Timer1 Timer3 timer 16 bit (giá trị ñếm cao 216 - = 65535) Ta xét ghi hoạt động Timer/Counter 0, Timer/Counter lại tương tự (các ghi Timer/Counter 16 bit có byte cao byte thấp) Thanh ghi ñiều khiển Timer/Counter TCCR0 (Timer/Counter Control Register): Trong đó: − Bit – FOC0: Force Output Compare Bit FOC0 hoạt ñộng bit WGM00 định rõ chế độ khơng PWM Khi ghi logic tới bit FOC0, so sánh trực tiếp bắt buộc Waveform phát ñơn vị − Bit 6, – WGM01:0: Waveform Generation Mode Các bit ñiều khiển chuỗi ñếm Counter nguồn cực ñại cho giá trị Counter kiểu Waveform phát ñược sử dụng − Bit 5:4 – COM01:0: Compare Match Output Mode Các bit ñiều khiển so sánh trạng thái chân ngõ (OC0) − Bit 2:0 – CS02:0: Clock Select Có bit chọn xung nguồn dùng cho Timer/Counter Khi bit ghi mức timer khơng hoạt động Trang BKIT Hướng dẫn lập trình Robocon Thanh ghi TCNT0 – Timer/Counter Register: Thanh ghi giá trị Timer/Counter, có hoạt động đọc ghi Thanh ghi so sánh ngõ OCR0 – Output Compare Register: Thanh ghi so sánh ngõ chứa bit giá trị mà liên tục ñược so sánh với giá trị Counter (TCNT0) Một so trùng sử dụng phát ngắt so sánh ñầu hay tới Waveform phát ngõ chân OC0 Thanh ghi TIMSK - Timer/Counter Interrupt Mask Register − Bit – OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable: Khi bit ñược ghi lên 1, cờ I-flag ghi trạng thái ñược lập, Timer/Counter ngắt ngõ so sánh trùng OC0 ñược enable Vector ngắt ñược thực thi cờ OCF0 ñược lập − Bit – TOIE0: Timer/Counter0 Overflow Interrupt Enable: Khi bit ñược ghi lên 1, cờ I-flag ghi trạng thái ñược lập, Timer/Counter ngắt tràn ñược enable Vector ngắt ñược thực thi cờ TOV0 ñược lập Thanh ghi TIFR – Timer/Counter Interrupt Flag Register − Bit – OCF0: Output Compare Flag 0: Cờ ñược lập chu kỳ xung Timer sau giá trị Counter (TCNT0) ghi ngõ compare (OCR0) OCF0 tự ñộng xóa vector ngắt ngõ nhập Capture thực thi Hoặc ghi logic cho bit cục − Bit – TOV0: Timer/Counter0 Overflow Flag: Lập cờ phụ thuộc bit WGM13:0 ñược lập Trong chế ñộ thông thường CTC, cờ TOV1 ñược lập Timer tràn.TOV1 tự động xóa vector ngắt Timer/Counter thực thi TOV1 OCF1B bị xóa ghi logic cho bit cục 2.2.4 Chế ñộ PWM Chức PWM ATmega64 ñược thực nhờ vào timer 0, 1, 2, dĩ nhiên, ứng với timer PWM bits, ứng với timer 1, PWM 16 bits ðầu PWM chân OC0, OC1A/B/C, OC2, OC3/A/B/C (8 kênh PWM) Trước hết ta xét PWM bits với timer Ngoài số khác biệt ñược liệt kê ñây, cách lập trình PWM tương tự lập trình timer Khởi tạo TCCR0: − Waveform Generation Mode (bit 6,3) : chọn Phase Correct (dạng dual-slope PWM) − Compare Match Output Mode (bit 5:4) : chọn giá trị 01 10 tùy ý (tương ñương Code Wizard chọn output inverted hay non-inverted Sau khởi tạo, ta cần quan tâm ñến ghi OCR0 ñể sử dụng PWM0 Giá trị ñiều xung mong muốn ñược nạp vào OCR0, dạng sóng tương ứng xuất chân OC0 (chân PB4, pin 14) Trang BKIT Hướng dẫn lập trình Robocon Lưu ý, chọn chức PWM, chân tương ứng với ngõ xuất PWM phải ñược chọn làm output Với timer 16 bits, độ phân giải PWM đạt đến 16 bits, khơng có nhu cầu cao, ta thiết lập Waveform Genaration Mode chế ñộ Phase Correct bits (TOP = 0x00FF) Mỗi PWM 16 bits gồm kênh - ngõ ñược ký hiệu A, B C Thiết lập Compare Match Output cho kênh tương tự Khi sử dụng, ghi cần quan tâm OCR[1/3][A/B/C][H/L] (12 ghi) tương ứng với timer 1/3, kênh A/B/C cho timer mức H/L cho kênh (do độ phân giải đến 16 bits nên cần ghi riêng biệt ñể lưu giá trị) 2.2.5 Bộ chuyển đổi ADC ATmega64 có kênh ADC 10 bits, ñược ñánh số thứ tự từ ñến Các ngõ vào ñược ký hiệu ADC0:7, ñều thuộc port F (chân 54 ñến 61) Các ghi ñặc tả ADC: Trong ñó: − REFS1:0 : chọn giá trị 01, ứng với AVCC − ADLAR : thứ tự lưu giữ 10 bits giá trị ADC ñọc ñược ghi ADCH/L, ñọc thêm bên − MUX4:0 : phân kênh cho kênh ADC, ñược sử dụng đọc giá trị ADC Trong đó: − bit ADEN - ADC Enable: cho phép (mang giá trị 1) hay cấm chức ADC (mang giá trị 0) − bit ADSC - ADC Start Conversion: bật bit ADC bắt đầu hoạt động − bit ADIF - ADC Interrupt Flag: báo hiệu ADC ñã ñọc xong giá trị − bit ADIE - ADC Interrupt Enable: cho phép ngắt ñã ñọc xong giá trị − ADPS2:0 : chọn hệ số chia cho xung clock ADC Trang BKIT Hướng dẫn lập trình Robocon Các kênh ADC có chung cặp ghi lưu giá trị ñọc ñược ATmega64 dùng chức phân kênh, ñược thiết lập bit MUX ghi ADMUX Chọn giá trị “n” (thập phân) cho MUX ADCH/L giữ giá trị kênh ADC “n” Hàm mẫu ñọc ADC bits sau: 2.2.6 Các tính khác Ngồi chức Atmega64 nhiều tính hỗ trợ khác như: giao diện SPI, I2C, UART,… Trang 10 BKIT Hướng dẫn lập trình Robocon Hình 15 Cửa sổ Messages − Bằng cách kích đơi lên thơng báo lỗi cảnh báo, dòng mà có vấn đề bật lên • Biên dịch project − ðể biên dịch project bạn phải sử dụng trình đơn Project|Compile,nhấn phím F9 nhấn nút Compiler Toolbar CodeVisionAVR C Compiler ñược thực thi,ñưa mã assembler mở rộng File ñược xem xét sửa đổi mở với trình soạn thảo − Q trình biên dịch dừng cách sử dụng trình đơn Project|Stop Compilation nhấn nút Stop Compilation Toolbar − Sau biên dịch ñã hoàn thành, cửa sổ Information mở hiển thị kết trình biên dịch Hình 16 Cửa sổ Information sau biên dịch • Making Project − ðể make file project bạn phải sử dụng trình đơn Project|Make,nhấn phím Shift+F9 nhấn nút Make Toolbar CodeVisionAVR C Compiler ñược thực thi,đưa mã assembler mở rộng − Q trình biên dịch dừng cách sử dụng trình ñơn Project|Stop Compilation nhấn nút Stop Compilation Toolbar − Sau biên dịch hồn thành, cửa sổ Information mở hiển thị kết trình biên dịch Nhấn nhãn Compiler để thị kết trình biên dịch: Trang 23 BKIT Hướng dẫn lập trình Robocon Hình 17 Cửa sổ Information sau make project − Nhấn nút Execute User’s Program cho phép tự động lập chương trình cho chip AVR sau biên dịch thành công − Nhấn Cancel tự động tắt lập trình đến chip 4.1.3 Sử dụng chương trình tự sinh mã CodeWizardAVR Trước tiên để tạo Project mới,vào menu New,chọn Project → OK Tiếp theo muốn sử dụng CodeWizardAVR nhấn Yes Hình 18 Giao diện chương trình AvrProg Trang 24 BKIT Hướng dẫn lập trình Robocon Các table thường dùng: • Chip: − Chip: chọn loại AVR − Clock: chọn xung nhịp hoạt động AVR • Ports: chọn chiều liệu vào cho chân cổng I/O • External IRQ: chọn interrupt muốn sử dụng • Timers: chọn timer muốn sử dụng (tất AVR sử dụng thơng thường có Timers ) − Clock Source: ñể nguyên system clock − Clock value: muốn timer chạy phải set (vd: dùng AVR atmega16 sử dụng xung nhịp 16MHz chọn 16000kHz,2000kHz ) − Mode: chọn chế ñộ.Các chế ñộ timer • Table LCD: Nếu bạn sử dụng LCD chọn cổng kết nối LCD Sau chọn cấu mong muốn bấm vào menu File → Generate, Save and Exit ñể lưu file, project Hoặc File → Progam Preview ñể xem code 4.2 Mạch nạp AVR910 USB chương trình nạp AvrProg AVR 910 USB Programmer Cable (gọi tắc AVR910) loại mạch nạp sử dụng cho chip AVR hãng ATMEL Với phần cứng tối ưu hóa, kích thước nhỏ gọn 4.2.1 Mạch nạp AVR910 USB • ðặc tả: − Nguồn cung cấp: 5V từ cổng USB − Giao tiếp Virtual COM qua USB − Tốc ñộ truyền tối ña: 115200bps, bit, no parity, stop, no flow control − ðịnh dạng file: Intel 8-bit HEX − Nạp ñược hầu hết dòng AVR số chip 89S Atmel − Hỗ trợ ñầy ñủ tác vụ nạp chip thơng thường như: Ghi/xóa/đọc nội dung chip, kiểm tra lỗi sau nạp Hỗ trợ khóa chip lập trình fuse bit − Tốc độ nạp cao, sử dụng ñược với hầu hết trình biên dịch: Code Vision, AVR Studio − ðơn giản kết nối, cài ñặt sử dụng Hình 19 Mạch nạp AVR910 USB Trang 25 BKIT Hướng dẫn lập trình Robocon • Danh sách chip ñược hỗ trợ: AT89S53, AT89S8252, AT90S2313, AT90S8515 ATtiny26, ATtiny45, Attiny2313, ATmega48, ATmega8, ATmega8515 ATmega8535, ATmega16, ATmega32, ATmega64, ATmega128, AT90CAN128 • Mạch nạp USB AVR 910 sử dụng tốt hệ ñiều hành Windows XP Professional Vista 4.2.2 Cách cài đặt Driver ðể q trình cài ñặt driver cho mạch nạp AVR 910 diễn suôn sẻ cần lưu ý: không nên kết nối mạch nạp với KIT chứa chip cần nạp trước hoàn tất q trình cài đặt driver • Trình tự cài đặt sau: − ðưa đĩa CD có chứa driver Download Driver mạng − Cắm mạch nạp AVR910 USB vào cổng USB PC Trên hình thơng báo tìm thấy phần cứng góc phải hộp thoại yêu cầu người dùng driver tương ứng cho phần cứng Hình 20 Thơng báo có phần cứng − Chỉ định cụ thể ñường dẫn ñến thư mục chứa driver nằm ñĩa CD máy − Hộp thoại sau thơng báo q trinh cài đặt thành cơng Hình 21 Cài ñặt Driver − Sau cài ñặt xong driver, thiết bị PC xác nhận hình thức cổng COM ảo, cần tinh chỉnh thơng số cổng COM tối ưu − Vào Start → Control Panel → System Trang 26 BKIT Hướng dẫn lập trình Robocon Hình 22 Mở Device Manager − Nhấp chọn để vào chương trình quản lý thiết bị PC (Device Manager) Hình 23 Cổng COM ảo AVR910 Trang 27 BKIT Hướng dẫn lập trình Robocon − Hiệu chỉnh thơng số hình bên dưới: Hình 24 Cấu hình cổng COM − Một số trường hợp mạch nạp chưa hoạt ñộng, nhấp chọn Advanced hình Hình 25 Cấu hình cổng COM − Chọn COM Port Number khác, lưu ý danh sách cổng COM, cổng ñang bị chiếm dụng (in use) khơng chọn cổng COM Như hồn tất bước cài đặt driver cho mạch nạp AVR 910 USB 4.2.3 Chương trình nạp AVRProg ðây chương trình nạp Atmel dùng nạp chương trình từ máy tính cho vi điều khiển họ AVR Atmel Chương trình AVRProg giao diện đơn giản có ưu điểm nạp nhanh Sau hướng dẫn Các bước nạp chip sử dụng chương trình AVR Prog AVR Studio Trang 28 BKIT Hướng dẫn lập trình Robocon 4.2.3.1 Cách nạp chương trình Hình 26 Chức nút AVRProg − Cắm mạch nạp vào cổng USB − Khởi động chương trình AVR Prog − Cắm cable nạp mạch nạp với KIT chứa chip cần nạp tương ứng − Chọn loại chip tương ứng tab Device, nhấp chọn Advanced ñể test xem mạch nạp nhận chip chưa Nếu không xuất thơng báo lỗi mà lên cửa sổ Advanced, khung ñánh dấu bên hiển thị rõ ràng thông số chip (không có dấu “?”) có nghĩa mạch nạp hoạt động tốt nhận chip Hình 27 Chức nâng cao AVRProg Như bắt ñầu sử dụng mạch ñể nạp chip Các mode, tùy chọn cửa sổ Advanced cần tìm hiểu kĩ datasheet nhà sản xuất để có thiết đặt ñúng Trang 29 BKIT Hướng dẫn lập trình Robocon 4.2.3.2 Các lỗi thường gặp: Lỗi “No supported board found!” Hình 28 Lỗi “No supported board found!” • Các bước khắc phục: − Tắt chương trình nạp rút mạch nạp khỏi PC Lặp lại thao tác “Các bước nạp chip sử dụng chương trình AVR Prog AVR Studio” lần − Nếu chưa ñược, kiểm tra driver ñã cài ñặt chưa Nếu ñã cài ñặt thành công, vào chương trình quản lý thiết bị, xem cổng COM ñang sử dụng cho mạch nạp có bị chiếm dụng khơng thử đổi sang cổng COM khác tiến hành thử lại Lỗi “Can’t enter programming mode!” Chương trình nhận phần cứng tương ứng ñã vào ñược chương trình nạp, nhấp Advanced khơng nhận chip, thay vào bảng thơng báo: Hình 29 Lỗi “Can’t enter programming mode!” • Các bước khắc phục: − Hãy rút mạch nạp khỏi máy tính, tắt chương trình nạp, refresh lặp lại thao tác “Các bước nạp chip sử dụng chương trình AVR Prog AVR Studio” lần Nếu khơng được, kiểm tra chuẩn kết nối phần cứng mạch chứa chip cần nạp − Khi cắm mạch nạp vào cổng USB khác máy, PC yêu cầu cài lại driver cho thiết bị − Thơng thường, việc cài driver có tác dụng ñối với mạch nạp cắm ứng với cổng USB định PC Vì vậy, bạn cắm mạch nạp cổng USB khác máy, bạn phải cài driver ñể sử dụng mạch nạp cổng USB • Các lưu ý: − Bạn cần nạp chương trình cho master, chương trình có tác dụng giúp VDK board nạp giao tiếp với chương trình nạp máy tính qua cổng USB, để làm ñược ñiều : bạn set jumper J2 vị trí 2-3, sau dùng mạch nạp có chuẩn ICE 5x2 nạp filmware cho chíp − Sau nạp xong bạn set cầu chì cho chíp chay từ thach anh ngoai với chế ñộ high frequency Trang 30 BKIT Hướng dẫn lập trình Robocon − Cuối bạn set jumper J2 vị trí 1-2, bạn sử dụng mạch nạp 4.3 Lập trình mạch “ROBOCON BKIT 2009” Phần trình bày việc thực hành lập trình mạch, số ñoạn code mẫu ñơn giản test chức mạch 4.3.1 Yêu cầu Sử dụng VðK ATmega64 lập trình chức sau mạch AVR Robocon 2009: − Phần cứng: mạch nút nhấn (gồm nút) ñược nối vào cổng INPUT0 mạch led ngoài, gồm 10 led giả lập động để lập trình PWM nối vào port động − Chương trình có chế ñộ chạy, Light River led PWM, thay ñổi cách nhấn nút MODE − Chế ñộ 1: Light River led, tăng giảm tốc ñộ nhờ nút nhấn INC DEC − Chế độ 2: PWM bits, xuất led ngồi, tăng giảm giá trị ñiều xung nhờ nút nhấn INC DEC 4.3.2 Hướng dẫn Trước hết, ta khởi tạo ghi cho ATmega64 CodeWizard Các thiết lập ñược liệt kê ñây: − Chip : chọn ATmega64, clock 16 MHz − Ports : chọn PORTA7:0 PORTG2:0 làm output, giá trị xuất 1, port khác ñể mặc ñịnh − Timers : Timer0 chọn clock 2MHz, mode Phase Correct, output Inverted; Timer1 chọn clock 62,5 kHz, mode Normal Top = FFFFh, Interrupt on Timer1 Overflow, Value ñặt giá trị FD8Eh − LCD : nối với port C Giải thích: − PORTA PORTG ñược thiết lập dựa thiết kế mạch AVR Robocon 2009 − Timer0 dùng làm ñiều xung bit − Timer1 dùng làm ñếm thời gian hệ thống cho chương trình − LCD dùng để tiện cho việc debug Ta xây dựng chương trình theo hướng định thời, nghĩa xây dựng module riêng ñể thực chức Timer1 làm nhiệm vụ gọi chức có ngắt Ở ñây ta cho phép Timer1 ngắt 10ms Các module ñược xây dựng trước tiên Ở ñây ta cần hàm phục vụ I/O ngắt Timer1 Tác vụ I/O bao gồm ghi ñọc Trang 31 BKIT Hướng dẫn lập trình Robocon void writeIO(unsigned char ID, unsigned char val) { PORTG &= ID; DDRA = 0xFF; //set output PORTA = val; PORTG = ID; PORTG |= 0x07; PORTG |= 0x07; } unsigned char readIO(unsigned char ID){ unsigned char temp; PORTG &= ID; DDRA = 0x00; //set input temp = PINA; PORTG |= 0x07; PORTG |= 0x07; return temp; } Trong ID thứ tự ngõ phân kênh, với dàn led mạch ID=6 Trong chương trình, để dễ sử dụng, ta define OUTLED = ñể thay cho ID led Tham số val giá trị bit muốn xuất Với led, ta khai báo biến tồn cục unsigned char led_buffer để lưu giữ giá trị led liên tục ñược cập nhật ñến led Hàm phục vụ ngắt Timer1 ñược viết sau: // Timer overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { // Reinitialize Timer value TCNT1H=0xFD; //thoi gian ngat la 10 ms TCNT1L=0x8E; // Place your code here // Goi cac module… } Các module cần xây dựng bao gồm: − hàm cập nhật input output − hàm timer ảo dùng ñể ñếm thời gian − hàm xử lý nút nhấn Hàm cập nhật input output: unsigned char input0 = 0xFF; unsigned char input0_0 = 0xFF; unsigned char input0_1 = 0xFF; void update_input(){ input0_1 = input0_0; input0_0 = readIO(INPUT0); if(input0_0 == input0_1) input0 = input0_0; } unsigned char led_buffer = 0xFF; void update_output(){ writeIO(OUTLED, ~led_buffer); } Trong input0 mang giá trị mạch phím nhấn ñược nối vào cổng INPUT0 Việc ñọc input lần so sánh giúp chống nhiễu phím nhấn Trang 32 BKIT Hướng dẫn lập trình Robocon Hàm timer ảo dùng ñể ñếm thời gian: unsigned int timer1_cnt = 0; unsigned char timer1_flag = 0; void timer1(unsigned int counter_in_ms){ timer1_cnt = counter_in_ms/10;//thoi gian he thong la 10ms timer1_flag = 1; } Lưu ý, timer1_flag = nghĩa ñã ñếm xong đếm khơng hoạt động, ngược lại timer1_flag = nghĩa đếm q trình hoạt ñộng ðoạn code xử lý timer ảo ñược ñặt hàm phục vụ ngắt Timer1: if(timer1_cnt > 0){ timer1_cnt ; if(timer1_cnt == 0) timer1_flag = 0; } Hàm xử lý nút nhấn: void button_process(){ //run mode if((input0 & BUTTON_MODE) == 0){ if(button_mode_flag == 0){ if(mode == MODE_0) mode = MODE_1; else if(mode == MODE_1) mode = MODE_0; init_mode(); button_mode_flag = 1; } } else { button_mode_flag = 0; } //speed if((input0 & BUTTON_INC) == 0){ if(timer_button_flag == 0){ if(mode == MODE_0){ if(time_delay > 100) time_delay -= 50; } else { if(pwm < 260) pwm += 10; } timer_button(TIME_BUTTON); } } else if((input0 & BUTTON_DEC) == 0){ if(timer_button_flag == 0){ if(mode == MODE_0){ if(time_delay < 1000) time_delay += 50; } else { if(pwm > 0) pwm -= 10; } timer_button(TIME_BUTTON); } } else { timer_button_flag = 0; } } Trang 33 BKIT Hướng dẫn lập trình Robocon Giải thích: − Ta quy ñịnh nút MODE, INC, DEC ứng với bit 2:0 input0, theo đó, ta define BUTTON_MODE = 0x01, BUTTON_INC = 0x02, BUTTON_DEC = 0x04 ñể kiểm tra bit tương ứng input0 − Xử lý phím nhấn cần thiết kế chống rung, nhiễu q trình nhấn Ở đây, với nút MODE, ta quy ñịnh lần nhấn nhấn-và-thả, cờ button_mode_flag làm báo hiệu nút có nhấn hay khơng Với nút INC DEC, ta cho phép nhấn-và-giữ ñược hiểu nhiều lần nhấn, phải delay lần nhấn Việc thực chức hàm timer_button() timer ảo (tương tự hàm timer1()) Giá trị TIME_BUTTON ñược define 300, tương ứng với thời gian delay 300 ms − Chức nút MODE thay ñổi giá trị biến mode, biến cho biết chương trình hoạt ñộng chế ñộ nào, MODE_0 hay MODE_1 (các giá trị ñã ñược define trước) Hàm init_mode() dùng ñể khởi tạo biến mode tương ứng giá trị mặc ñịnh − Chức nút INC DEC ñược quy ñịnh tùy theo mode Chi tiết ñề cập sau Hàm thực mode: void run(){ int i; switch(mode){ case MODE_0: //light river if(flag == 0){ led_buffer = 0; for(i = 0; i < led_num; i++){//khoi tao led buffer voi "led_num" led sang led_buffer |= (1 1; if(led_buffer == (old_led_buffer 8) led_num = 1; flag = 0; } timer1(time_delay); } Trang 34 BKIT Hướng dẫn lập trình Robocon } break; case MODE_1: //PWM if(pwm < 0) PWM = 0; else if(pwm > 255) PWM = 255; else PWM = pwm; break; default: break; } } Giải thích: − mode MODE_0: light river ñược thiết kế sau: trước tiên, khởi tạo led sáng, led dịch bước sang trái cho ñến hết dịch ngược lại vị trí ban ñầu, led sáng dịch tương tự,… led sáng quay trở lại thực từ ñầu Cờ flag cho biết ñang giai ñoạn khởi tạo led hay ñang dịch led Biến old_led_buffer lưu giá trị ban ñầu sau khởi tạo, dùng ñể so sánh Giữa lần dịch led, hàm timer1() ñược gọi việc dịch led lần sau ñược thực sau ñã hết khoảng thời gian time_delay ms; biến ñược khởi tạo mặc ñịnh 500 thay đổi nút INC, DEC − mode MODE_1: PWM ñược define OCR0, tác ñộng lên PWM làm thay ñổi dạng sóng ñiều xung chân OC0 PWM0 Biến int pwm ñược khởi tạo mặc ñịnh 120, thay ñổi nút INC, DEC Việc kiểm tra pwm trước ñưa vào PWM nhằm ñồng tầm giá trị int unsigned char (OCR0) Tổng kết, chương trình nhỏ bao gồm số kiến thức quan trọng với người làm quen với lập trình VðK: lập trình I/O, Timer, xử lý nút nhấn, light river, điều xung… Hơn nữa, qua giúp làm quen với việc tổ chức chương trình chuẩn, linh hoạt tương tác tốt với người sử dụng Trang 35 BKIT Hướng dẫn lập trình Robocon Chương TỔNG KẾT Trang 36 BKIT Hướng dẫn lập trình Robocon TÀI LIỆU THAM KHẢO [1] [2] [3] [4] [5] Datasheet Atmega64 – www.atmel.com AVRProg User Guide – www.atmel.com BKIT Hardware Club – www.bkit4u.com/forum Alldatasheet – www.alldatasheet.com Wikipedia – www.wikipedia.org Trang 37

Ngày đăng: 07/11/2017, 13:03

Tài liệu cùng người dùng

Tài liệu liên quan