Bài tập Vi điều khiển AVR

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

DDRB=0b00110000 =0x30

Khởi tạo chân PB7 cần được treo lên 5V , khi ấn nút bấm sẽ thông GND(0V) nên

ta có PORTB=0b10000000=0x80;

Sau khi định nghĩa , nếu bạn den_do=1; đèn led đỏ sẽ tắt

den_do=0; đèn sẽ sáng .

( 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)

pdf25 trang | Chuyên mục: Vi Xử Lý – Vi Điều Khiển | Chia sẻ: tuando | Lượt xem: 422 | Lượt tải: 0download
Tóm tắt nội dung Bài tập Vi điều khiển AVR, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
151. // Timer/Counter 2 initialization 
152. // Clock source: System Clock 
153. // Clock value: Timer 2 Stopped 
154. // Mode: Normal top=FFh 
155. // OC2 output: Disconnected 
156. ASSR=0x00; 
157. TCCR2=0x00; 
158. TCNT2=0x00; 
159. OCR2=0x00; 
160. 
161. // External Interrupt(s) initialization 
162. // INT0: Off 
163. // INT1: Off 
164. // INT2: Off 
165. MCUCR=0x00; 
166. MCUCSR=0x00; 
167. 
168. // Timer(s)/Counter(s) Interrupt(s) initialization 
169. TIMSK=0x00; 
170. 
171. // Analog Comparator initialization 
172. // Analog Comparator: Off 
173. // Analog Comparator Input Capture by Timer/Counter 1: Off 
174. ACSR=0x80; 
175. SFIOR=0x00; 
176. 
177. // ADC initialization 
178. // ADC Clock frequency: 1000.000 kHz 
179. // ADC Voltage Reference: AREF pin 
180. // ADC Auto Trigger Source: None 
181. // Only the 8 most significant bits of 
182. // the AD conversion result are used 
183. ADMUX=FIRST_ADC_INPUT|ADC_VREF_TYPE; 
184. ADCSRA=0xCB; 
185. 
186. // LCD module initialization 
187. lcd_init(16); 
188. 
189. // Global enable interrupts 
190. #asm("sei") 
191. lcd_gotoxy(0,0); 
192. lcd_putsf("ADC"); 
193. 
194. while (1) 
195. { 
196. // Place your code here 
197. lcd_gotoxy(4,1); 
198. lcd_putnum(adc_data[0]); 
199. }; 
200. } 
201. 
202. 
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ó : 
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 : 
Xét chế độ cho VĐK : 
// CHE DO KO DONG BO ,8 BIT , 1 BIT STOP ,U2X=0,ko dung parity 
UCSRA=0x00; 
UCSRB=0x90; //E ngat nhan va E cho nhan 
UCSRC=0x86; // che do 
UBRRH=0x00; 
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ộ 
(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 
1. 
2. 
3. 
4. /***************************************************** 
5. This program was produced by the 
6. CodeWizardAVR V1.24.8d Professional 
7. Automatic Program Generator 
8. © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l. 
9.  
10. 
11. Project : 
12. Version : 
13. Date : 1/10/2008 
14. Author :Tuan Le ngoc 
15. Company : BIA++ 
16. Comments: 
17. 
18. 
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 
25. *****************************************************/ 
26. 
27. #include 
28. #include 
29. #include 
30. 
31. // Alphanumeric LCD Module functions 
32. #asm 
33. .equ __lcd_port=0x15 ;PORTC 
34. #endasm 
35. #include 
36. 
37. 
38. #define RXB8 1 
39. #define TXB8 0 
40. #define UPE 2 
41. #define OVR 3 
42. #define FE 4 
43. #define UDRE 5 
44. #define RXC 7 
45. 
46. #define FRAMING_ERROR (1<<FE) 
47. #define PARITY_ERROR (1<<UPE) 
48. #define DATA_OVERRUN (1<<OVR) 
49. #define DATA_REGISTER_EMPTY (1<<UDRE) 
50. #define RX_COMPLETE (1<<RXC) 
51. 
52. 
53. 
54. 
55. unsigned char test; 
56. 
57. 
58. 
59. 
60. 
61. 
62. 
63. void init_comm(void ) 
64. { 
65. // init che do cong I/O 
66. DDRD.0=0;PORTD.0=1; 
67. DDRD.1=1; 
68. 
69. // CHE DO KO DONG BO ,8 BIT , 1 BIT STOP ,U2X=0,ko dung parity 
70. 
71. UCSRA=0x00; 
72. UCSRB=0x90; //E ngat nhan va E cho nhan 
73. UCSRC=0x86; 
74. UBRRH=0x00; 
75. UBRRL=0x33; // baud =9600 of 8Mhz 
76. 
77. } 
78. //////////// 
79. 
80. 
81. 
82. void main(void) 
83. { 
84. s1=1;s2=s3=s4=0; 
85. // Input/Output Ports initialization 
86. // Port A initialization 
87. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In 
88. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T 
89. 
90. PORTA=0x00; 
91. DDRA=0x01; 
92. 
93. // Port B initialization 
94. // Func7=Out Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In 
Func0=In 
95. // State7=1 State6=1 State5=1 State4=P State3=P State2=P State1=P 
State0=P 
96. PORTB=0x00; 
97. DDRB=0xFF; 
98. 
99. // Port C initialization 
100. // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In 
Func0=In 
101. // State7=T State6=T State5=T State4=T State3=1 State2=T State1=T 
State0=T 
102. PORTC=0xFF; 
103. DDRC=0xFF; 
104. 
105. // Port D initialization 
106. // Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In 
Func1=Out Func0=Out 
107. // State7=1 State6=1 State5=1 State4=1 State3=P State2=P State1=1 
State0=1 
108. PORTD=0xF3; 
109. DDRD=0xF3; 
110. 
111. 
112. // Timer/Counter 0 initialization 
113. // Clock source: System Clock 
114. // Clock value: 3.906 kHz 
115. // Mode: Normal top=FFh 
116. // OC0 output: Disconnected 
117. TCCR0=0x00; 
118. TCNT0=0x00; 
119. OCR0=0x00; 
120. 
121. // Timer/Counter 1 initialization 
122. // Clock source: System Clock 
123. // Clock value: 3.906 kHz 
124. // Mode: Ph. correct PWM top=00FFh 
125. // OC1A output: Inverted 
126. // OC1B output: Inverted 
127. // Noise Canceler: Off 
128. // Input Capture on Falling Edge 
129. //TCCR1A=0xF1; 
130. //TCCR1B=0x05; 
131. TCCR1A=0x00; 
132. TCCR1B=0x04; 
133. TCNT1H=0x00; 
134. TCNT1L=0x00; 
135. ICR1H=0x00; 
136. ICR1L=0x00; 
137. OCR1AH=0x00; 
138. OCR1AL=0x00; 
139. OCR1BH=0x00; 
140. OCR1BL=0x00; 
141. 
142. // Timer/Counter 2 initialization 
143. // Clock source: System Clock 
144. // Clock value: 15.625 kHz 
145. // Mode: Normal top=FFh 
146. // OC2 output: Disconnected 
147. ASSR=0x00; 
148. TCCR2=0x00; 
149. TCNT2=0x00; 
150. OCR2=0x00; 
151. 
152. 
153. 
154. // External Interrupt(s) initialization 
155. // INT0: Off 
156. // INT1: Off 
157. // INT2: Off 
158. MCUCR=0x00; 
159. MCUCSR=0x00; 
160. 
161. // Timer(s)/Counter(s) Interrupt(s) initialization 
162. TIMSK=0x04; 
163. 
164. // Analog Comparator initialization 
165. // Analog Comparator: Off 
166. // Analog Comparator Input Capture by Timer/Counter 1: Off 
167. ACSR=0x80; 
168. SFIOR=0x00; 
169. 
170. 
171. 
172. //SFIOR&=0x1F; 
173. 
174. // LCD module initialization 
175. 
176. // Global enable interrupts 
177. //#asm("sei") 
178. // LCD module initialization 
179. lcd_init(16); 
180. init_comm(); 
181. while (1) 
182. { 
183. // Place your code here 
184. lcd_gotoxy(0,0); 
185. lcd_putsf("Giao tiep :"); 
186. //test=getchar(); 
187. //putchar(test); 
188. 
189. 
190. lcd_gotoxy(12,1); 
191. 
192. test=getchar(); 
193. lcd_putchar(test); 
194. 
195. 
196. 
197. } 
198. 
199. } 
200. 
201. 
202. 

File đính kèm:

  • pdfbai_tap_vi_dieu_khien_avr.pdf