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)
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:
bai_tap_vi_dieu_khien_avr.pdf

