Bài giảng lớp VĐK nâng cao Bài 1,2Giới thiệu chung : 1.Kiến trúc vi điều khiển: AVR họ vi điều khiển mới, với tính mạnh đ ược tích hợp chip hãng Atmel theo cơng nghệ RISC, ngang hang với họ vi điều khiển khác thời PIC, Pisoc, sử dụng phổ biến Do đời muộn nên họ vi điều khiển AVR có nhiều tính đáp ứng tối đa nhu cầu ng ười sử dụng, sử dụng qua dòng vi điều khiển trước họ 89xx có so sánh tồn diện độ ổn định, khả tích hợp v mềm dẻo việc lập tr ình AVR, đặc biệt có phần mềm lập trình vơ tiện dụng Một số tính họ AVR: - Giao diện SPI đồng - Các đường dẫn vào/ra (I/O) lập trình - Giao tiếp I2C - Bộ biến đổi ADC 10 bit - Các kênh băm xung PWM - Các chế độ tiết kiệm lượng sleep, stand by vv - định thời Watchdog - timer/Counter bit - timer/Counter 16 bit - so sánh analog - nhớ EEPROM - Giao tiếp USART vv Giới thiệu vi điều khiển Atmega16L: Lựa chọn vi điều khiển Atmelga16L tính có đầy đủ tính họ AVR, giá thành so với loại khác giá thành vừa phải nghiên cứu làm công việc ứng dụng tới vi điều khiển Tính năng: - Bộ nhớ 16K(flash) - 512 byte (EEPROM) - K (SRAM) - Đóng vỏ 40 chân , có 32 chân v liệu chia làm PORT A,B,C,D Các chân đ ều có chế độ pull_up reitors - Giao tiếp SPI - Giao diện I2C - Có kênh ADC 10 bit - so sánh analog - Có kênh băm xung PWM - timer/counter , timer/counter 0,2 chế độ bit, timer/counter1 16 bit - định thời Watchdog - truyền nhận UART lập trình 24VCC Cách sử dụng tính chân thiết kế mạch: - Vcc GND chân cấp nguồn cho vi điều khiển hoạt động - Reset chân reset cứng khởi động lại hoạt động hệ thống - chân XTAL1, XTAL2 chân t ạo dao động cho vi điều khiển, chân nối với thạch anh (hay sử dụng loại 4M), tụ gốm (22p) - Chân Vref thường nối lên 5v(Vcc), sử dụng ADC chân sử dụng làm điện so sánh, chân n ày phải cấp cho điện áp cố định, sử dụng diod zener: 10K R Vref 5V GND DIODE BREAKDOWN Hình 3.7 Cách nối chân Vref - Chân Avcc thường nối lên Vcc sử dụng ADC chân nối qua cuộn cảm lên Vcc với mục đích ổn định điện áp cho biến đổi Phần mềm lập trình codevision: Lựa chọn phần mềm : phần mềm sử dụng rộng dải xây dựng ngơn ngữ lập trình C, phần mềm viết chuyên nghiệp hướng tới người sử dụng đơn giản, mềm dẻo, hổ trợ cao thư viện có sẳn 4.Thiết lập cổng vào ra: Sơ đ bố trí chân AVR ATMEGA16 Khi xem xét đến cổng I/O AVR ta phải xét tới ghi bit DDxn,PORTxn,PINxn Thực việc trao đổi VĐK AVR với b ên ngồi cần phải biết thực xuất/nhập Thanh ghi DDRx đảm nhận việc xuất/nhập chip AVR -Các bit DDxn để truy cập cho địa xuất nhập DDRx -Các bit PORTxn để truy cập địa xuất nhập PORTx -Các bit PINxn để truy cập địa xuất nhập PINx -Bit DDxn ghi DDRx dùng để điều khiển hướng liệu chân cổng này.Khi ghi giá trị logic ‘0’ vào bit ghi trở thành lối vào,còn ghi ‘1’ vào bit trở thành lối -PINx cổng để đọc,các cổng đọc trạng thái logic PORTx.PINx ghi,việc đọc PINx cho phép ta đọc giá trị logic chân PORTx.chú ý PINx ghi,việc đọc PINx cho phép ta đọc giá trị logic chân PORTx -Khi PORTx ghi giá trị chân có cấu tạo nh cổng điện trở kéo chủ động(được nối với cổng).Ngắt điện trở kéo ra, PORTx ghi giá trị chân có dạng nh cổng ra.Các chân cổng l trạng thái điều kiện reset tích cực chí xung đồng hồ khơng hoạt động -Nếu PORTxn ghi giá trị logic ‘1’ chân cổng có dạn g chân ,các chân có giá trị ‘1’.Nếu PORTxn ghi giá trị ‘0’ chân cổng có dạng chân chân có giá trị ‘0’ Các cổng AVR đọc,ghi Để thiết lập cổng cổng vào ,ra ta tác động tới bit DDxn, PORTxn,PINxn.ta thiết lập để bit làm cổng vào,ra khơng với cổng,như ta sử lí tới bit,đây l điểm mạnh dòng Vi điều khiển bit Ta sử dụng CodeWizardAVR để thiết lập cho cá c PORTx Pinx Ví dụ hình:các bit 0,1,2,4,7 PORTA làm chân có trở kéo,còn bit lại làm chân vào Khi thiết lập xong bit 0,1,2,4,7 xuất liệu bit lại nhận liệu vào Ví dụ : Ta muốn ghi liệu giá trị logic ’0’ PORTA.0 để bật tắt Led th ì: PORTA.0=1; Ta muốn đọc liệu bit từ chân PORTA: Bit x; x=PINA.3; Cũng ta thiết lập PORTA l àm cổng ta xuất liệu từ PORTA: PORTA=0xAA; PORTA Còn ta thiết lập PORTA làm cổng vào giá trị thời PORTA: PORTA Thì sau câu lệnh đọc giá trị từ PORTA: x=PINA;th ì x=0x55; Khi thiết lập PORTA làm cổng reset giá trị PORTA PORTA=0xFF; PORTA Khi thiết lập PORTA làm cổng vào reset giá trị PORTA PORTA=0x00; PORTA Việc thiết lập cổng vào việc quan trọng tùy theo mục đích sử dụng cổng làm cổng vào ra,thì ta phải thiết lập sử dụng được,ta so sánh vấn đề n ày với dòng vi điều khiển AT8951 Nếu AT8951,ta thiết lập PORTx làm cổng vào ta lại sử dụng với mục đích cổng ra,thì PORTx bị hỏng qua vài lần cho kết đúng,và ta quên không thiết lập PORTx cổng ra,câu lệnh không khác n ên ta không phát ra.Khi ta thiết lập PORTx làm cổng vào lai sử dụng với mục đích cổng câu lệnh không khác nên ta không phát Ví dụ: PORT0=0xFF;(PORT0 cổng vào)sau ta lại xuất liệu PORT0=0xAA;có thể ban đầu cho kết nh ưng chắn PORT0 bị hỏng PORT0=0x00;(PORT0 cổng ra)sau ta lại nhập liệu v x=PORT0;thì ta khơng đọc Còn AVR,khi muốn nhập liệu vào phải thiết lập PORTx cổng vào dùng câu lệnh: X=PINx;//không dùng x=PORTx Thực hành lập trình: Chúng ta tiếp tục chương trình với thực hành: Thiết lập chương trình nháy LED D3 R_470 chan VDK 5VCC LED Thiết lập chương trình sau: Theo sơ đồ nguyên lý hình vẽ chân vi điều khiển nối với đèn LED qua trở kéo lên 5v thiết lập chương trình cho đèn LED nháy liên tục tần số khác { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTA=0xff; DDRA=0xFF; // Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTB=0xff; DDRB=0xFF; // Port C initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0= Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTC=0xff; //su dung tro keo DDRC=0xFF; // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTD=0xff; DDRD=0xFF; } while (1) { // Place your code here // cho tat ca cac LED deu sang PORTA=0x00; PORTB=0x00; PORTC=0x00; PORTD=0x00; delay_ms(300);// delay 300ms, thoi gian de lay co the thay doi // tat toan bo cac LED PORTA=0xff; PORTB=0xff; PORTC=0xff; PORTD=0xff; delay_ms(300);// delay 300ms }; Như đoạn chương trình dưa thời gian delay dạng biến số thay đổi tg , ta thấy thời gian đóng ngắt LED thay đổi delay_ms(tg) Trước hết ta khai báo biến tg sau: unsigned char tg; khai báo biến tg dạng nguyên từ 0->255 /***************************************************** This program was produced by the CodeWizardAVR V1.24.6 Professional Automatic Program Generator © Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l http://www.hpinfotech.com e-mail:office@hpinfotech.com Project : Version : Date : 12/7/2006 Author : F4CG Company : F4CG Comments: Chip type : ATmega16L Program type : Application Clock frequency : 8.000000 MHz Memory model : Small External SRAM size : Data Stack size : 256 *****************************************************/ //************* bai tap giao tiep voi phim bam******************* //*************************************************************** /* noi dung bai tap la thet lap phim bam o PINA kiem tra cac phim bam de lua chon chuong trinh */ #include #include unsigned char tg; // bien thoi gian la tg co the thay doi // Declare your global variables here // Phan main thiet lap cac ghi sau khoi tao chuong trinh void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // thiet lap PORTA lam dau vao // Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTB=0x00; DDRB=0xFF; // Port C initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 Stat e1=0 State0=0 PORTC=0x00; DDRC=0xFF; // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTD=0x00; DDRD=0xFF; // Timer/Counter initialization // Clock source: System Clock // Clock value: Timer Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter initialization // Clock source: System Clock // Clock value: Timer Stopped // Mode: Normal top=FFFFh // OC1A output: Discon // OC1B output: Discon // Noise Canceler: Off // Input Capture on Falling Edge // Timer Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter initialization // Clock source: System Clock // Clock value: Timer Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; tg=50; // gan bien tg=50 ban dau 10 Và truyền nhận giá trị sau nạp chương trình - Cách xây dựng giao diện giao tiếp với máy tính thơng qua cổng RS232 sử dụng thư viện MSComm sau: Giao diện chương trình: 26 Trên cơng cụ ta xây dựng giao diện : Sau xây dựng thuộc tính: 27 Viết chương trình cho thuộc tính sau: Private Sub Form_Load() MSComm1.CommPort = MSComm1.Settings = "9600,n,8,1" MSComm1.PortOpen = True End Sub Private Sub Ket_Thuc_Click() MSComm1.PortOpen = False End End Sub Private Sub nhan_Click() Timer1.Interval = 10 ' Text1.Text = 12 ' val_nhan.Text = MSComm1.Input End Sub Private Sub Timer1_Timer() val_nhan = Chr$(Val(MSComm1.Input)) End Sub Private Sub Truyen_Click() MSComm1.Output = Chr$(Val(Text)) x = Val(Val_Truyen.Text) If x