1. Trang chủ
  2. » Công Nghệ Thông Tin

Lập trình vi điều khiển avr căn bản

25 1,1K 3
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Tiêu đề Lập trình vi điều khiển AVR căn bản
Tác giả Lengoctuan
Chuyên ngành Lập trình vi điều khiển AVR
Thể loại Bài giảng
Năm xuất bản 2007
Định dạng
Số trang 25
Dung lượng 916,59 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

lap trinh vi dieu khien avr vip

Trang 1

Bài 1 - Lập trình cho led -nút bấm

Đây là bài đầu tiên của loạt bài về AVR Sau khi kết thúc bài đầu tiên bạn dễ dàng lập trinh input và output cho AVR

Tóm tắt : Lập trình điều khiển led bật tắt ,sử dụng cách định nghĩa PIN và

PORT ,cách dùng thư viện delay.h của codevision

Giới thiệu:

Cấu trúc chân của AVR có thể phân biệt rõ chức năng (vào ra) trạng thái (0 1) từ

đó ta có 4 kiểu vào ra cho một chân của avr.Khác với 89 là chỉ có 2 trạng thái duy nhất (0 1) Đặc biệt nguồn từ chân của AVR đủ khoẻ để điều khiển Led trực tiếp (mA) còn 89 chỉ là vài uA

Để điều khiển các chân này chúng ta có 2 thanh ghi

->PORTx :giá trị tại từng chân (0 – 1) có thể truy cập tới từng bit PORTx.n

->DDRx : thanh ghi chỉ trạng thái của từng chân , vào hoặc là ra Giá trị 1 là ra và

0 là vào

Trang 2

Ví dụ 1 : Nhấp nháy lần lượt đèn xanh và đèn đỏ , khi ấn nút bấm chỉ có đèn đỏ sáng

Phần cứng : đèn xanh PORTB.4 , đèn đỏ PORTB.5 , nút bấm PINB.7

Chú ý :

định nghĩa 1 chân là chân vào PIN x.x

#define nut_bam PINB.7

định nghĩa 1 chân là chân vào PORT x.x

#define den_do PORTB.5

Trong bài này PORT B có 2 biến đầu ra là PB5 và PB6

( do cách thiết kế mạch đầu dương led nối 5V còn đầu âm nối vào VĐK)

delay.h có 2 cách gọi là trễ theo ms và us

5 Automatic Program Generator

6 © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l

Trang 3

17 Chip type : ATmega16

18 Program type : Application

19 Clock frequency : 8.000000 MHz

20 Memory model : Small

21 External SRAM size : 0

22 Data Stack size : 256

30 #define den_xanh PORTB.5

31 #define den_do PORTB.6

32 #define nut_bam PINB.7

47 // Place your code here

48 //khi nut bam chua duoc bam logic nut_bam=1

Trang 4

Bài 2 - AVR – Timer

Đặc tính:

- Bao gồm các bộ timer 8bit 16 bit, thường có từ 3 – 4 bộ Timer

- Có các kênh PWM (từ 4 đến 8 kênh tuỳ loại )

- Bao gồm nhiều chế độ ngắt và PWM …

- Có thể là một kênh đếm riêng biệt

- Tự động xoá Timer trong chế độ so sánh(tự động nạp lại)

Chế Độ So Sánh (CTC):

Đấy là chế độ mà giá trị trong Timer luôn được so sánh với giá trị trong thanh ghi ORC Khi giá trị trong Timer bằng giá trị trong thanh ghi ORC thì giá trị trong Timer sẽ bị xoá đi.Giá trị trong ORC đóng vai trò là giá trị TOP cho bộ đếm.Chế độ này cũng cho phép tạo ra tần số so sánh ở đầu ra.Tuy nhiên trong chế độ này nếu giá trị mới ghi vào thanh ghi ORC mà nhỏ hơn giá trị tức thời của bộ đếm thì thì 1 so sánh sẽ bị lỡ, khi đó bộ đếm sẽ đếm đến giá trị lớn nhất sau đó rơi xuống giá trị 0 trước khi

so sánh tiếp theo xuất hiện

Trang 5

Sơ đồ thời gian của chế độ CTC

Với tần số cao này chế độ độ Fast PWM rất tốt cho các ứng dụng như ADC hay chỉnh lưu.Ngoài ra với tần số cao giúp làm giảm kích thước của thiết bị ngoài như cuộn dây tụ từ đó giúp làm giảm toàn

bộ chi phí cho hệ thống

Sơ đồ dưới đây mô tả chu kỳ thời gian của chế độ:

Biều đồ thời gian chế độ Fast PWM

Chế độ Phase correct PWM:

Chế độ này hoạt động dựa trên hai sườn lên xuống.Bộ đếm sẽ đếm liên tục từ giá trị BOTTOM đến giá trị MAX và sau đó từ giá trị MAX đến giá trị BOTTOM.Trong chế độ so sánh không đảo chân so sánh (OCx) sẽ bị xóa khi giá trị TCNTx bằng giá trị OCRx trong quá trình đếm lên và sẽ được set bằng 1 khi giá trị so sánh xuất hiện trong quá trình đếm xuống.Chế độ so sánh đảo thì các giá trị là ngược lại.Với hoạt động hai sườn xung này thì chế độ này không tạo ra được tần số nhỏ như chế độ một sườn xung Nhưng do tính cân đối của hai sườn xung thì nó tốt hơn cho điều khiển động cơ Chế độ phase correct PWM hoạt động cố định là 8 bít.Trong chế độ này bộ đếm sẽ tăng cho đến khi đạt giá trị MAX ,khi đó nó sẽ đổi chiều đếm.Biểu đồ thời gian đây mô tả hoạt động của toàn bộ quá trình:

Trang 6

Từ biểu đồ thời gian ta nhận thấy việc thay đổi tần số trong hoạt động của phase correct PWM có thể

thay thế bằng hai giá trị là MAX và BOTTOM Nó linh hoạt hơn so với chế độ Fast PWM

Tần số có thể tính theo công thức như sau:

f=fc/N*510

Trong đó N tạo ra bởi bộ chia nó có các giá trị là:1,8,64,256 hoặc 1024

Các thanh ghi trong bộ Timer/ Counter:

Thanh ghi điều khiển - TCCRx:

Bít 3,6 –WG00-WG01: Đây là các bít chọn chế độ trong Timer.Các giá trị được mô tả trong bảng sau

Bảng chọn chế độ Timer:

Trang 7

Bít 5-4 : COM00-COM01: Quy định giá trị đầu ra trong các phép so sánh

Bít 2: 0 – CS2:0 :Đây là các bít quy định xung cấp cho hoạt động của Timer.Bảng dưới đây mô tả toàn

bộ các giá trị

Chọn chế độ cho xung Clock

Thanh ghi cờ ngắt-TIFR:

Bít 1-OCFx : Khi hai giá trị bằng nhau bít này được set lên bằng 1

Bít 1-TVOx : Khi bộ đếm vượt quá giá trị Top thì bít này được set bằng 1

Thanh ghi mặt nạ ngắt-TIMSK:

Bít 1 – OCIEx: khi bít này được set lên bằng 1 thì cho phép ngắt so sánh

Bít 0 –TOIEX : Khi bít này được set lên bằng 1 thì cho phép ngắt tràn

đoạn chương trình trên dùng timer1 Timer này là bộ đếm 16bit nên giá trị đếm được tối đa là FFFF Trong phần khởi tạo Timer ta khởi tạo xung clock cho bộ đếm là 125Khz = 125000 có nghĩa là bộ

Trang 8

đếm sẽ đếm được 125000 giá trị trong 1 giây Ta làm phép tính như sau:

125000 số 1 giây

? số - 0,02 giây (20ms)

ta tính được trong 20ms bộ timer sẽ đếm được là: 125000x0.02= 2500 số

Ta cần là làm sao cho timer1 đếm được 2500 số sẽ tràn có nghĩa là cần phải nạp vô nó một giá trị xác định trước (mặc định nó sẽ đếm từ 0000>FFFF và bị tràn) giá trị này sẽ nhỏ hơn

65535(FFFF) là 2500 (9C4 Hexa) vậy ta tính được giá trị cần nạp lại sau mỗi lần tràn là FFFF- 9C4 = F63B

20 // Mode: Normal top=FFFFh

21 // OC1A output: Discon

22 // OC1B output: Discon

23 // Noise Canceler: Off

24 // Input Capture on Falling Edge

25 // Timer 1 Overflow Interrupt: On

26 // Input Capture Interrupt: Off

27 // Compare A Match Interrupt: Off

28 // Compare B Match Interrupt: OffTCCR1A=0x00;

Trang 9

Bài 3 : Tạo cảnh báo sử dụng ngắt ngoài

Tóm tắt : Qua bài học này bạn sẽ biết được thế nào là ngắt ngoài Cách sử dụng ngắt ngoài của AVR

Giới thiệu :

Atmega16 có 3 ngắt ngoài INT0(PORTD.2) INT1(PORTD.3) và INT2(PORTB.2)

Khi xảy ra một trong các sự kiện đối với các chân này :

Low level - Điện áp ở chân ngắt xuống mức logic 0 V

Any change - Bất kì sự thay đổi điện áp từ chân ngắt

Falling Edge - Khi có 1 sườn điện áp xuống (5V->0V)

Rising Edge -Khi có 1 sườn điện áp lên (0V->5V)

Sau đó 1 cờ ngắt sẽ dựng lên 1 và báo cho biết có ngắt , nhảy đến chương trình con thực hiện ngắt

Ví dụ : Dùng ngắt để báo động khi xảy ra sự cố của hệ thống

Khi hệ thống xảy ra sự cố , chân PORTD3(INT1 ) sẽ có giá trị là 0V chương trình sẽ bật đèn đỏ để

Trang 10

cảnh báo Khi kết thúc sự cố bật trở lại đèn xanh

Ban đầu khởi tạo ta sẽ để đèn xanh bật đỏ tắt , PORTD.3 treo lên 5V , là port vào PORTD=0x08;

5 Automatic Program Generator

6 © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l

17 Chip type : ATmega16

18 Program type : Application

19 Clock frequency : 8.000000 MHz

20 Memory model : Small

21 External SRAM size : 0

22 Data Stack size : 256

30 #define den_xanh PORTB.4

31 #define den_do PORTB.5

32

33

34

35 // External Interrupt 1 service routine

36 interrupt [ EXT_INT1 ] void ext_int1_isr ( void )

37 {

38 // Place your code here

39 den_xanh = ;den_do = ;//bat den do ,tat den xanh

Trang 11

46 // Declare your local variables here

Trang 12

Bài 4 : Lập trình hiển thị LCD (Chữ chạy)

Tóm tắt : Qua bài viết này bạn sẽ sử dụng thành thạo thư viện lcd.h của codevision Sử dụng linh hoạt , tạo ra dòng chữ chạy trên lcd

Giới thiệu :

Phần cứng : bạn nối lcd như sơ đồ dưới đây

Trang 13

LCD giao tiếp theo chuẩn logic TTL thông thường (5V cho logic 1 và 0V cho logic 0) cho nên có thể kết nối trực tiếp với VĐK

+ Chân dữ liệu (những chân dùng để "ra lệnh") của LCD từ chân 7 đến chân 14 (được nhà sản xuất đặt tên là DB0-DB7)

+ Chân tín hiệu là các chân 4(RS), 5(RW), 6(E)

Giả sử bạn lập trình với port C

Hai nữa khi lập trình LCD các bạn chú ý ở chân VEE (chân số 3 lcd) phải có mức điện áp gần bằng 0V, thường các mạch có 1 con điện trở để chỉnh cường độ sáng tối cho LCD.Để đơn giản bạn có thể nối chân đó với GND(0V) lcd sẽ luôn hiển thị rõ tối đa

Để tìm hiểu thêm về LCD bạn có thể tham khảo bài viết của trietnguyen : Giới thiệu về LCD

(http://www.vagam.dieukhien.net/attachment.php?attid=32&d=1179760345)

Khi sử dụng codevision bạn sẽ có một bộ thư viện viết sắn bao gồm các hàm cơ bản sau đây :

void lcd_clear(void)

Xóa hết màn hình

void lcd_gotoxy(unsigned char x, unsigned char y)

Nhảy tới vị trí x và dòng thứ y (0 là dòng 1 và 1 là dòng thứ 2 với lcd 2 dòng )

void lcd_putchar(char c)

Hiển thị 1 kí tự

void Lcd_puts(char *str)

Hiển thị 1 chuỗi kí tự trên RAM

void lcd_putsf(char flash *str)

Hiển thị 1 chuỗi kí tự trên FLASH(thường dùng lệnh này để tiết kiệm ram

1 /*****************************************************

2 This program was produced by the

3 CodeWizardAVR V1.24.8d Professional

4 Automatic Program Generator

5 © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l

Trang 14

16 Chip type : ATmega16

17 Program type : Application

18 Clock frequency : 8.000000 MHz

19 Memory model : Small

20 External SRAM size : 0

21 Data Stack size : 256

32 // Declare your global variables here

33 unsigned char i; //bien dem de chay chu

34 char flash * str = "<- " ; //chuoi ki tu viet tren Flash

Trang 15

Bài 5 : Dùng ADC nhận tín hiệu từ biến trở

Tóm tắt : Qua bài này các bạn có thể sử dụng được ADC của AVR

Giới thiệu :

Phần cứng các bạn cần 1 con biến trở nối vào portA.0

Mạch ATmega16 như bài đầu

Các chế độ sẽ chọn :

sử dụng chế độ ngắt ADC, tự động scan giá trị analog của port A

Ví dụ : Dùng PORTA.0 nhận giá trị từ biến trở hiển thị lên LCD theo ADC 8bit (từ 0>5V thành 0

4 Automatic Program Generator

5 © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l

6 http://www.hpinfotech.com

7

Trang 16

19 Chip type : ATmega16

20 Program type : Application

21 Clock frequency : 8.000000 MHz

22 Memory model : Small

23 External SRAM size : 0

24 Data Stack size : 256

40 // ADC interrupt service routine

41 // with auto input scanning

42 interrupt [ ADC_INT ] void adc_isr ( void )

43 {

44 register static unsigned char input_index = ;

45 // Read the 8 most significant bits

46 // of the AD conversion result

47 adc_data [ input_index ]= ADCH;

48 // Select next ADC input

49 if (++ input_index & gt; ( LAST_ADC_INPUT - FIRST_ADC_INPUT ))

50 input_index = ;

51 ADMUX =( FIRST_ADC_INPUT|ADC_VREF_TYPE )+ input_index;

52 // Start the AD conversion

53 ADCSRA| = 0x40;

54 }

55

56

57 // Declare your global variables here

58 void lcd_putnum ( unsigned int d )

Trang 17

68 if( tram & gt; 0

Trang 18

120 // Clock source: System Clock

121 // Clock value: Timer 0 Stopped

122 // Mode: Normal top=FFh

123 // OC0 output: Disconnected

129 // Clock source: System Clock

130 // Clock value: Timer 1 Stopped

131 // Mode: Normal top=FFFFh

132 // OC1A output: Discon

133 // OC1B output: Discon

134 // Noise Canceler: Off

135 // Input Capture on Falling Edge

136 // Timer 1 Overflow Interrupt: Off

137 // Input Capture Interrupt: Off

138 // Compare A Match Interrupt: Off

139 // Compare B Match Interrupt: Off

152 // Clock source: System Clock

153 // Clock value: Timer 2 Stopped

154 // Mode: Normal top=FFh

155 // OC2 output: Disconnected

171 // Analog Comparator initialization

172 // Analog Comparator: Off

173 // Analog Comparator Input Capture by Timer/Counter 1: Off

174 ACSR = 0x80;

175 SFIOR = 0x00;

177 // ADC initialization

178 // ADC Clock frequency: 1000.000 kHz

179 // ADC Voltage Reference: AREF pin

Trang 19

180 // ADC Auto Trigger Source: None

181 // Only the 8 most significant bits of

182 // the AD conversion result are used

Trang 20

Bài 6 : Lâp trình giao tiếp máy tính RS232

Tóm tắt:Qua bài này các bạn có thể gửi và nhận các kí tự lên máy tính từ avr Sử dụng phần Terminal của codevision

Giới thiệu :

Chuẩn giao tiếp RS232

Ghép nối qua cổng nối tiếp RS-232 là một trong những kỹ thuật được sử dụng rộng rãi nhất để ghép nối các thiết bị ngoại vi với máy tính Qua cổng nối tiếp có thể ghép nối chuột, modem, thậm chí cả máy in, bộ biến đổi AD, các thiết bị đo lường

Việc truyền dữ liệu xẩy ra trên 2 đường dẫn qua chân cắm ra TxD, gửi dữ liệu của nó đến thiết bị khác trong khi đó dữ liệu mà máy tính nhận được dẫn đến chân RxD các tín hiệu khác đóng vai trò như tín hiệu hỗ trợ khi trao đổi thông tin và vì thế không phải trong mọi ứng dụng đều dùng đến

Mức tín hiệu trên chân ra RxD tùy thuộc vào đường dẫn TxD và thông tin thường nằm trong khoảng – 12V + 12V các bit dữ liệu được đảo ngược lại Mức điện áp ở mức cao nằm trong khoảng – 3V và – 12V và mức thấp nằm trong khoảng từ + 3Vvà +12V Trạng thái tĩnh trên đường dẫn có mức điện áp – 12V

Lập trình truyền thông nối tiếp trên Atmega16

Atmega16 hỗ trợ rất tốt cho truyền thông nối tiếp USART Các đặc điểm nổi bật là:

- Hoạt động toàn phần Full-duplex

- Hỗ trợ cả hoạt động đồng bộ và không đồng bộ

- Định dạng khung có thể lập trình (với 5,6,7,8 hoặc 9 Data bits và 1 hoặc 2 Stop Bits), tự dò lỗi định dạng khung và lỗi Data Over Run

- Hỗ trợ truyền thông điều khiển ngắt

- Hỗ trợ truyền thông đa xử lý

Các đặc điểm của Bộ thu (Receiver):

- Dò trạng thái rỗi của đường truyền

- Dò lỗi khung, nhiễu, và lỗi overrun

- Báo trạng thái thanh ghi dữ liệu của bộ thu đầy

Các đặc điểm của bộ phát (Transmitter) :

- Báo trạng thái thanh ghi dữ liệu bộ phát rỗng

- Báo hoàn thành quá trình truyền

- Ngắt quá trình truyền

- Phát trạng thái rỗi lên đường truyền

Cách thiết lập Terminal trên codevision

vào Tool/Terminal ta có :

Trang 21

Sau khi thiết lập như trên vđk và PC giống nhau về tốc độ và khung truyền

khi giao tiếp ta click vào biểu tượng hình máy tính :

UBRRL=0x33; // baud =9600 of 8Mhz tan so thach anh

Thanh ghi điều khiển và trạng thái A (UCSRA)

- Bit 7 – RXC: USART Receive Complete Bit này được set khi có dữ liệu không đọc được vào bộ đệm nhận, hay bộ đệm nhận đã đầy và nó bị xoá khi bộ đệm nhận là rỗng Cờ RXC có thể sử dụng để phát ra một ngắt báo Receive Complete

- Bit 6 – TXC: USART Transmit Complete: Bit này được set nếu quá trình truyền hoàn thành, đó là tại lúc kết thúc một khung gửi đi Cờ TXC có thể dùng phát ra một ngắt Transmit Complete

- Bit 5 – UDRE: USART Data Register Empty Bit này được set nếu thanh ghi dữ liệu phát (bộ đệm truyền) là rỗng và sẵn sàng nhận dữ liệu mới Cờ này cũng có thể dùng đẻ phát ra một ngắt

Thanh ghi điều khiển và trạng thái B (UCSRB)

- Cho phép ngắt

Thanh ghi điều khiển và trạng thái C (UCSRC)

- Bit 7 – URSEL: Register Select Bit này chọn việc truy nhập vào UCSRC hoặc UBRRH Nếu URSEL = 1 thì sẽ chọn làm việc với UCSRC, URSEL phải được viết là 1 khi thực hiện viết UCSRC

- Bit 6 – UMSEL: USART Mode Select Bít này dùng để chọn giữa chế độ hoạt động đồng bộ

Trang 22

(UMSEL = 1) hay không đồng bộ (UMSEL= 0)

- Thanh ghi tốc độ Baud (UBRRL và UBLLH)

- Bit 15 – URSEL: Register Select URSEL = 0 ( làm việc với UBRRH

- Bit 14:12 – Reserved Bits Các bit này dành cho các ứng dụng tương lai

- Bit 11:0 – UBRR11:0: USART Baud Rate Register Đây là thanh ghi 12 bit chứa tốc độ baud của USART, UBRRH chứa 4 bit cao nhất và UBBRRL chứa 8 bit thấp còn lại

VD: Gửi tín hiệu gõ ở terminal , vđk nhận và hiển thị lên LCD

Chú ý :

getchar(); là lệnh nhận giá trị từ chân RX từ PC

putchar(var); gửi var ra chân TX lên PC

7 Automatic Program Generator

8 © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l

19 Chip type : ATmega16L

20 Program type : Application

21 Clock frequency : 4.000000 MHz

22 Memory model : Small

23 External SRAM size : 0

24 Data Stack size : 256

Ngày đăng: 02/12/2013, 09:36

HÌNH ẢNH LIÊN QUAN

Sơ đồ thời gian của chế độ CTC - Lập trình vi điều khiển avr căn bản
Sơ đồ th ời gian của chế độ CTC (Trang 5)
Bảng chọn chế độ Timer: - Lập trình vi điều khiển avr căn bản
Bảng ch ọn chế độ Timer: (Trang 6)

TỪ KHÓA LIÊN QUAN

w