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