Kết nối với AVR

Chia sẻ: Hoang Van Te | Ngày: | Loại File: PDF | Số trang:25

0
518
lượt xem
267
download

Kết nối với AVR

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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.

Chủ đề:
Lưu

Nội dung Text: Kết nối với AVR

  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 .
  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 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) delay.h có 2 cách gọi là trễ theo ms và us delay_ms(time); delay_us(time); 1. 2. /***************************************************** 3. This program was produced by the 4. CodeWizardAVR V1.24.8d Professional 5. Automatic Program Generator 6. © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
  3. 7. http://www.hpinfotech.com 8. 9. Project : 10. Version : 11. Date : 12/27/2007 12. Author : LENGOCTUAN 13. Company : VAGAM 14. Comments: 15. 16. 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 23. *****************************************************/ 24. 25. #include 26. #include 27. 28. // Declare your global variables here 29. 30. #define den_xanh PORTB.5 31. #define den_do PORTB.6 32. #define nut_bam PINB.7 33. 34. void main(void) 35. { 36. 37. // Port B initialization 38. // Func7=In Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In 39. // State7=T State6=0 State5=0 State4=T State3=T State2=T State1=T State0=T 40. PORTB=0x80; 41. DDRB=0x30; 42. 43. 44. 45. while (1) 46. { 47. // Place your code here 48. //khi nut bam chua duoc bam logic nut_bam=1 49. if(nut_bam) 50. { 51. den_xanh=1;den_do=0; 52. delay_ms(500); 53. den_xanh=0;den_do=1; 54. delay_ms(500); 55. } 56. //khi nut bam duoc an nut_bam=0 chi den do sang 57. else 58. {den_xanh=1;den_do=0;} 59. }; 60. } 61. 62. 63.
  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) - Có chế độ PWM - Tạo ra tần số - Đếm các dự kiện ngắt ngoài - Tạo ra các ngắt tràn và ngắt so sánh .... Introduction Các chế độ hoạt động của timer: Chế Độ Thông Thường: Đây là chế độ hoạt động đơn giản nhất của Timer .Bộ đếm sẽ liên tục đếm tăng lên cho đến khi vượt quá giá trị lớn nhất TOP và sau đó sẽ được khởi động lại tại giá trị Bottom.Trong các hoạt động thông thường thì cờ tràn sẽ được thiết lập khi giá trị trong Timer đạt giá trị không và không bị xoá đi.Tuy nhiên nếu mà ngắt tràn được chấp nhận thì cờ ngắt sẽ tự động bị xoá khi ngắt được thực hiện.Giá trị trong Timer có thể được viết vào bất cứ lúc nào 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.
  5. Sơ đồ thời gian của chế độ CTC Chế Độ Fast PWM: Cho phép tạo ra sóng với tần số cao.Sự khác biệt cơ bản giữa Fast PWM với các loại PWM khác là nó chỉ sử dụng 1 sườn dốc.Bộ đếm sẽ đếm từ Bottom đến Max sau đó khởi động lại từ bottom. Trong chế độ không đảo đầu ra của chân so sánh OCx sẽ bi xoá khi có phép toán so sánh giữa TCNTx và thanh ghi ORC là bằng nhau. Và sẽ được sét lên 1 khi giá trị đạt Bottom. Trong chế độ đảo ,đầu ra đảo sẽ được set lên 1 khi sự so sánh giữa thanh ghi ORC và giá trị trong Timer bằng nhau và sẽ bị xoá khi giá trị đạt Bottom.Trong cả hai trường hơp này tần số của chế đô Fast PWM đều gấp đôi so với chế độ phase correct PWM sử dụng hai sườn dốc 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:
  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:
  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ộ
  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. 1. #include 2. 3. unsigned char count=0; 4. 5. interrupt [TIM1_OVF] void timer1_ovf_isr(void) //ngat xay ra sau 20ms 6. { 7. TCNT1H=0xF6; //giá trị nạp lại TCNT1L=0x3B; 8. // goi ham can xu li sau 20mscount++; 9. if (count>10) 10. { 11. count=0; 12. //goi ham can xu li sau 2s } 13. } 14. 15. void main(void) 16. { 17. // Timer/Counter 1 initialization 18. // Clock source: System Clock 19. // Clock value: 125.000 kHz 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; 29. TCCR1B=0x03; 30. TCNT1H=0xF6; 31. TCNT1L=0x3B; 32. ICR1H=0x00; 33. ICR1L=0x00; 34. OCR1AH=0x00; 35. OCR1AL=0x00; 36. OCR1BH=0x00; 37. OCR1BL=0x00; 38. #asm("sei") //bat co cho phep ngat toan cuc neu khong thi khong co ngat xay ra 39. while (1) 40. { 41. .......................... 42. }; 43. }
  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 đỏ để
  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; DDRD=0x00; Chọn ngắt INT1 chế độ Low level (khi nào chân PD3 có mức logic 0V là xảy ra ngắt ) GICR|=0x80; MCUCR=0x00; MCUCSR=0x00; GIFR=0x80; 1. 2. /***************************************************** 3. This program was produced by the 4. CodeWizardAVR V1.24.8d Professional 5. Automatic Program Generator 6. © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l. 7. http://www.hpinfotech.com 8. 9. Project : 10. Version : 11. Date : 12/29/2007 12. Author : le ngoc tuan 13. Company : vagam 14. Comments: 15. 16. 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 23. *****************************************************/ 24. 25. #include 26. #include 27. 28. // Declare your global variables here 29. 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=1;den_do=0;//bat den do ,tat den xanh 40. } 41. 42. 43. 44. void main(void) 45. {
  11. 46. // Declare your local variables here 47. 48. // Input/Output Ports initialization 49. // Port A initialization 50. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 51. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 52. PORTA=0x00; 53. DDRA=0x00; 54. 55. // Port B initialization 56. // Func7=In Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In 57. // State7=T State6=0 State5=0 State4=T State3=T State2=T State1=T State0=T 58. PORTB=0x80; 59. DDRB=0x30; 60. 61. // Port C initialization 62. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 63. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 64. PORTC=0x00; 65. DDRC=0x00; 66. 67. // Port D initialization 68. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 69. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 70. PORTD=0x08; 71. DDRD=0x00; 72. 73. 74. 75. // External Interrupt(s) initialization 76. // INT0: Off 77. // INT1: On 78. // INT1 Mode: Low level 79. // INT2: Off 80. GICR|=0x80; 81. MCUCR=0x00; 82. MCUCSR=0x00; 83. GIFR=0x80; 84. 85. 86. // Global enable interrupts 87. #asm("sei") 88. while (1) 89. { 90. den_xanh=0;den_do=1; 91. }; 92. } 93.
  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
  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 PortC0 - RS PortC1 - RD PortC2 - EN PortC4 - D4 PortC5 - D5 PortC6 - D6 PortC7 - D7 port có thể thay đổi(PORT A,B hay C) nhưng các thứ tự chân phải đúng như trên .(do cách lập trình trong thư viện lcd.h) Nếu bạn lập trình bộ thư viện riêng , cách chân phần cứng có thể bố trí thoải mái theo ý người lập trình. 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. 6. http://www.hpinfotech.com 7. 8. Project : 9. Version : 10. Date : 1/1/2008 11. Author : LENGOCTUAN 12. Company : VAGAM 13. Comments: 14. 15.
  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 22. *****************************************************/ 23. 24. #include 25. #include 26. // Alphanumeric LCD Module functions 27. #asm 28. .equ __lcd_port=0x15 ;PORTC 29. #endasm 30. #include 31. 32. // Declare your global variables here 33. unsigned char i; //bien dem de chay chu 34. char flash *str="
  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 - >255) Chú ý : trong chương trình có sử dụng hàm lcd_putnum(value); hiển thị chữ số 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. 6. http://www.hpinfotech.com 7.
  16. 8. Project : 9. Version : 10. Date : 1/9/2008 11. Author : LENGOCTUAN 12. Company : VAGAM 13. Comments: 14. 15. Comments: 16. 17. 18. 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 25. *****************************************************/ 26. 27. #include 28. 29. // Alphanumeric LCD Module functions 30. #asm 31. .equ __lcd_port=0x15 ;PORTC 32. #endasm 33. #include 34. 35. #define FIRST_ADC_INPUT 0 36. #define LAST_ADC_INPUT 7 37. unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1]; 38. #define ADC_VREF_TYPE 0x20 39. 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=0; 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 > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) 50. input_index=0; 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) 59. { 60. unsigned char donvi, chuc, tram; 61. donvi=d%10; 62. d=d/10; 63. chuc=d%10; 64. d=d/10; 65. tram=d%10; 66. d=d/10; 67.
  17. 68. if(tram>0) 69. { 70. lcd_putchar(48+tram); 71. lcd_putchar(48+chuc); 72. lcd_putchar(48+donvi); 73. 74. } 75. else if(chuc>0) 76. { 77. lcd_putchar(48+chuc); 78. lcd_putchar(48+donvi); 79. lcd_putsf(" "); 80. 81. } 82. else { 83. lcd_putchar(48+donvi); 84. lcd_putsf(" "); 85. lcd_putsf(" "); 86. 87. } 88. } 89. 90. void main(void) 91. { 92. // Declare your local variables here 93. 94. // Input/Output Ports initialization 95. // Port A initialization 96. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 97. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 98. PORTA=0x00; 99. DDRA=0x00; 100. 101. // Port B initialization 102. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 103. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 104. PORTB=0x00; 105. DDRB=0x00; 106. 107. // Port C initialization 108. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 109. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 110. PORTC=0x00; 111. DDRC=0x00; 112. 113. // Port D initialization 114. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 115. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 116. PORTD=0x00; 117. DDRD=0x00; 118. 119. // Timer/Counter 0 initialization
  18. 120. // Clock source: System Clock 121. // Clock value: Timer 0 Stopped 122. // Mode: Normal top=FFh 123. // OC0 output: Disconnected 124. TCCR0=0x00; 125. TCNT0=0x00; 126. OCR0=0x00; 127. 128. // Timer/Counter 1 initialization 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 140. TCCR1A=0x00; 141. TCCR1B=0x00; 142. TCNT1H=0x00; 143. TCNT1L=0x00; 144. ICR1H=0x00; 145. ICR1L=0x00; 146. OCR1AH=0x00; 147. OCR1AL=0x00; 148. OCR1BH=0x00; 149. OCR1BL=0x00; 150. 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
  19. 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.
  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ó :
Đồng bộ tài khoản