Cái này có nghĩ là gì tccr0 1 cs01 năm 2024

  1. Ilồl t`lỉu

JU_ kä mỜt `ọ vl ĚlỊu c`lềg fh `ági Jtmbk sạg xuẢt (Jtmbk aŬgi kä g`ä sạgxuẢt fÿgi vl ĚlỊu c`lềg 0<A2: mä añ t`ề oẪg Ěá tợgi gi`b ĚẸg). JU_ kä a`lp vlĚlỊu c`lềg 0 olts vồl aẢu trþa tập kỉg` Ěƪg ilạg `ñj-_LQA(_bfuabf Lgstruatlhg Qbt Ahmputbr), mỜt clều aẢu trþa Ějgi t`ề `lỉg ƴu t`Ẹ trhgi aêa oỜ xử kí.

VẪl sjh JU_>

sh vồl aêa a`lp vl ĚlỊu c`lềg 0 olts c`êa, JU_ añ g`lỊu Ěẹa tíg` `ƪg `ằg, `ƪg aạ trhgi tíg` Ửgi fỢgi (fỂ sử fỢgi) vä Ěẹa olỉt kä vỊ a`Ửa gāgi>

Iẩg g`ƴ a`þgi tj c`ögi aẩg mẨa t`îm oẢt cự klg` clỉg p`Ợ gäh c`l sử fỢgi JU_, t`ậm a`í c`ögi aẩg giuốg tẪh xugi akhac a`h a`lp (t`ƴờgi kä aêa c`Ớl t`Ẫa` jg`).

V`lẸt oể kập trëg` (mẪa` gẪp) a`h JU_ rẢt Ěƪg ilạg, añ khẪl mẪa` gẪp a`Ọ aẩg väl Ělỉg trỘ kä añ t`ề käm Ěƴỡa. mỜt sỚ JU_ aÿg `ộ trỡ kập trëg` hg ‑ a`lp oẺgi ohhtkhjfbr c`ögi aẩg mẪa` gẪp…

Oîg aẪg` kập trëg` oẺgi JQM, aẢu trþa JU_ Ěƴỡa t`lẸt cẸ tƴƪgi t`ía` A.

Giuốg täl giuyîg vỊ shurab ahfb, täl klỉu, jppklajtlhg ghtb…rẢt kồg trîg lgtbrgbt.

@ẩu `Ẹt aêa a`lp JU_ añ g`Ứgi tíg` gāgi (ebjturbs) sju>Añ t`ề sử fỢgi xugi akhac kîg ĚẸg :5M@z, `hẹa sử fỢgi xugi akhac gỜlkîg ĚẸg 0 M@z (sjl sỚ 1%)OỜ g`ồ a`ƴƪgi trëg` Ekjs` añ t`ề kập trëg` kẪl rẢt g`lỊu kẩg vä fugi kƴỡgikồg, añ Q_JM (_jm tĬg`) kồg, vä Ěẹa olỉt añ oỜ g`ồ kƴu trỨ kập trëg` ĚƴỡaBBT_HM.OỜ g`ồ a`ƴƪgi trëg` Ekjs` añ t`ề kập trëg` kẪl rẢt g`lỊu kẩg vä fugi kƴỡgikồg, añ Q_JM (_jm tĬg`) kồg, vä Ěẹa olỉt añ oỜ g`ồ kƴu trỨ kập trëg` ĚƴỡaBBT_HM. G`lỊu giò väh rj (L/H TH_V) ? `ƴồgi (ol-flrbatlhgjk).0 olts, :5 olts tlmbr/ahugtbr tía` `ỡp TYM.Aêa oỜ a`uyềg ĚỚl Jgjkhi ‑ Fliltjk p`ïg ilạl :4 olts, g`lỊu cîg`.

1

Cái này có nghĩ là gì tccr0 1 cs01 năm 2024

Bài 1. Lập trình C trong CodeVisionAVR Hôm nay chúng ta sẽ tìm hiểu về C cho AVR, bài viết này sẽ liệt kê tất cả cách khai báo C trong CodeVisionAVR. 1. Khai báo thư viện Ta sử dụng khai báo

include , VD:

include Khai báo này báo cho trình biên dịch biết lấy file thư viện trong thư mục mặc định của CAVR Cách 2 là

include “adc.h” Khai báo này trình biên dịch sẽ tìm file trong thư mục Project của ta. 2. Khai báo tên thay thế Ta sử dụng khai báo

define BUT PINC.5 Từ BUT sẽ thay cho PINC.5, tương tự ta có thể khai báo bất kỳ dữ liệu nào bạn muốn

define Time 400 ............. 3. Khai báo kiểu dữ liệu biến Kiểu Char Unsigned char Int Unsigned int Long Unsigned long Float

Số Byte 1 1 2 2 4 4 4

Khoảng giá trị -128 – +127 0 – 255 -32768 - +32767 0 - 65535 -2147483648 - +2147483647 0 – 4294967295

VD: unsigned char time; hoặc unsigned int dem=1000; (Gán giá trị ban đầu cho biến, mặc định = 0) Khai báo nhiều biến chung một kiểu dữ liệu unsigned char x=10, y=1, z, t; Lưu ý: Khi sử dụng biến nếu giá trị vượt quá cho phép sẽ bị tràn và không lưu dc ví dụ như ta khai báo kiểu 8bit unsigned char mà ta muốn lưu giá trị 257 là bị tràn, ta phải dùng kiểu 16bit để chứa giá trị trên 4. Khai dữ liệu mảng - Mảng 1 chiều: unsigned char led[10];

- Mảng 2 chiều:unsigned char led[2][10]; Công thức dữ liệu: 2x10 dữ liệu - Mảng 3 chiều: unsigned char led[5][2][10]; Công thức dữ liệu: 5x2x10 dữ liệu Phức tạp ít sử dụng trong lập trình ................... Chọn bộ nhớ lưu mảng, mặc định trong trình biên dịch luôn luôn là RAM nếu bạn không khai báo gì cho nó, để tiết kiệm tài nguyên RAM cho các biến khác ta sẽ cho các mảng cố định vào trong ROM, lưu ý chỉ mảng cố định mà ta không thay đổi dữ liệu trong quá trình sử dụng. Rất đơn giản ta thêm chữ flash vào trước khai báo ta sẽ được như sau: flash unsigned char led[10]; Truy suất mảng trong code khá là đơn giản, dữ liệu đầu tiên mang giá trị 0 vì 0 là bắt đầu chứ không phải là 1 đâu nha, VD: PORTD=led[0]; xuat gia tri đầu tiên của mảng Với mảng 2 chiều cũng tương tự ta xuất theo công thức (trục x,y) PORTD=led[1][2]; xuat gia tri thứ 13 của mảng theo khai báo led[2][10] Nghe có vẻ hơi khó hiểu chỗ này đúng k, ta hiểu đơn giản như sau nhóm 10 dữ liệu lại thành một nhóm lớn ở đây có 2 nhóm lớn, mỗi nhóm lớn sẽ có 10 dữ liệu bên trong như vậy ta sẽ truy suât led[1][2] tức lấy nhóm lớn thứ 2 và dữ liệu trong nhóm nằm ở vị trí thứ 3 trong mảng. 5. Khai báo bộ nhớ EEPROM Đây là khai báo đặc biệt chỉ có trong CodeVisionAVR các phần mềm khác không hỗ trợ, với các viết sau các bạn không cần phải viết hàm lưu dữ liệu vào EEPROM nội của AVR nữa mà trình biên dịch sẽ tự động làm việc này. Đơn giản nó chỉ là một biến, tức ta cho thể đọc và ghi vào biến này như các biến bình thường. Khai báo như sau: eeprom unsigned char abc; Thật là đơn giản đúng không, lúc này ta chỉ cần viết abc = 123; lưu giá trị 123 vào eeprom nội, vậy đọc ra thì sẽ như thế nào. Quá đơn giản: data = abc; data là biến lưu trong RAM và data sẽ mang giá trị 123

Còn bạn muốn chỉ định địa chỉ thì thêm @địa_chỉ VD eeprom unsigned char abc@0x02; 6. Khai báo chân giao tiếp xuất nhập Trong AVR mỗi PORT của nó có tới 3 thanh ghi điều khiển: DDRx, PINx, PORTx Trong khi 8051 chỉ có 1, PIC có 2 phụ trách điều hướng và xuất nhập dữ liệu. - Trong đó DDRx là thanh ghi điều hướng, set lên 1 cho bit nào là chân đó làm OUTPUT và set 0 là INPUT - Thanh ghi PINx là thanh ghi lấy dữ liệu về dùng cho INPUT, ta sẽ đọc dữ liệu từ thanh ghi này - Thanh ghi PORTx là thanh ghi xuất dữ liệu ra chân vi điều khiển, ta sẽ ghi mức logic vào đây VD: DDRD = 0xff; PORT D làm OUTPUT PORTD = 0xff; Xuất mức 1 ra 8 chân của PORT D abc = PIND; Đọc trạng thái logic trên PORT D lưu vào biến abc Ta có thể sử dụng trở câu nội của AVR trong trường hợp làm INPUT bằng cách khai báo set: DDRD = 0x00; PORTD = 0xff; Nếu không sử dụng trở câu toàn bộ chân AVR sẽ ở trạng thái hở. Khác hẳn với 8051 chỉ P0 là hở CodeVisionAVR cho phép bạn set bit cho từng chân của PORT VD: PIND.6 , PORTD.2, DDRC.3 Các bạn có thể tìm hiểu thêm một số cách set bit trong thanh ghi cũng như kiểm tra bit nào đó trong một thanh ghi VD: while(!(UCSRA & (1 OK > Yes > OK

Chọn chip và chọn tần số dao động cho chip Ở đây các bạn có thể chọn bất kỳ thư viện code sẵn nào mà bạn muốn CAVR sẽ tự động tạo mã và chèn vào cho bạn. Như trên ta có thể sử dụng LCD (LCD16x2...), ADC, Timer, PWM, WDT, I2C (DS1307), 1wire (DS18B20), SPI, UART, Analog Comparator.... Cuối cùng ta tick vào biểu tượng hình bánh răng để lưu các file trong project lại, lưu tất cả chung vào một thư mục:

Các bạn cần phải đặt tên cho 3 file quan trọng khi tạo project: C, PRJ, CWP

B3. Dịch code sang file HEX, ta bấm vào biểu tượng Build trên thanh công cụ

Trình biên dịch sẽ hiện ra một bảng thông báo, nếu code không vấn đề gì thì như sau:

Nếu báo Errors thì sẽ ko tạo được file Hex, còn Warnings thì vẫn tạo file hex. Nếu có lỗi ta chỉ cần click đúp vào tên lỗi là nó tự trỏ tới dòng bị lỗi:

B4. Cài đặt lại một số thông số cho project như chân giao tiếp LCD, thạch anh.... ta làm như sau: Tick vào biểu tượng hình cái cờ lê

Hiện ra hội thoại và các bạn chọn các Tab tương ứng để thay đổi:

Bài 3. Thiết lập Fuse bit cho AVR Chào các bạn hôm nay chúng ta sẽ tìm hiểu về cách thiết lập fuse bits cho vi điều khiển AVR. Trong AVR được thiết kế sẵn một số mạch điện và các thiết bị hỗ trợ bên trong,chúng có tác dụng điều khiển, debug, cấp xung clock, lưu trữ.... Để điều khiển các mạch điện này khi nạp chip chúng ta phải cấu hình Fuse bit cho chúng, hiểu nôm na là đóng cầu dao điện hoặc mở cầu dao điện. VD như ta thiết lập nguồn xung clock cho AVR: Vì trong AVR có tích hợp một mạch điện tạo dao động cho chip lên đến 8Mhz khi sử dụng mạch này các bạn không cần phải mắc thạch anh cho chip. Mỗi loại chip avr đều có một cấu hình fuse khác nhau, ở đây ta sẽ lấy ví dụ cho một số chip hay dùng: ATmega8, ATmega16, ATmega32, .... Phần mềm nạp Progisp:

Chú ý: Khi cấu hình Fuse bit là bit 0 sẽ là kích hoạt, còn 1 là không kích hoạt Ta sẽ set một số Fuse của các chip trên: 1. BODLEVER là bit chọn mức điện áp tham chiếu sụt áp nguồn, khi ta cấu hình kích hoạt BODEN.BODLEVER=0 tức chọn mức điện áp 4.0V, còn nếu BODLEVER=1 là chọn mức điện áp 2.7V Khi điện áp nguồn VCC mà bị sụt xuống mức giới hạn trên CHIP sẽ tự động được RESET không như 8051 treo luôn :) 2. BODEN là bit cho phép mạch phát hiện sụt áp nguồn hoạt động. 3. JTAGEN là bit cho phép module JTAG hoạt động, có tác dụng kiểm tra hoạt động trên chip và gỡ lỗi... Lưu ý fuse này với chip ATmega32 khi mới mua về các PIN: TCK, TMS, TDO và TDI lần lượt PC2, PC3, PC4 và PC5 không thể sử dụng được, nếu ta không có việc gì cần đến cái này thì hãy vô hiệu hóa bằng cách set JTAGEN=1 để có thể sử dụng các chân trên như các PIN khác vì nếu ta để cấu hình JTAGEN=0 sẽ không sử dụng được các chân trên. 4. OCDEN là bit cho phép Debug, nếu ta không khai báo fuse này thì JTAGEN vô nghĩa khi JTAGEN=0. Không dùng Debug thì ta set OCDEN=1, nếu set OCDEN=0 thì chip sẽ chạy ở chế độ sleep mode (ngủ đông) và quá trình debug bắt đầu, ta không thể làm gì với chip

Tốt nhất ko sờ vào cái này không lại cứ tưởng con chip của mình vừa mới mua về sao đã tèo rồi thì mệt. 5. EESAVE là bit cho phép để lại (lưu lại) dữ liệu EEPROM trong mỗi lần nạp lại chip hay không, nếu EESAVE=0 thì toàn bộ dữ liệu trong EEPROM sẽ không bị xóa khi nap chip hoặc ngược lại. 6. BOOT LOADER là chương trình cho phép nạp chip không cần mạch nạp, VD như nạp qua UART.... cho phép khách hàng của mình có thể tự cập nhật phần mềm. Để làm được việc này ta phải cấu hình fuse cho 3 bit sau: - BOOTRST là fuse cho phép chạy chương trình bootloader trong vùng lưu trữ bootloader. BOOTRST=1 thì địa chỉ của chương trình sẽ bắt đầu từ địa chỉ 0x0000, còn BOOTRST=0 thì ô nhớ bắt đầu là vị trí đầu tiên của bootloader tức ctr bootloader được thực thi. - BOOTSZ1 và BOOTSZ0 là 2 bit chọn phân vùng bộ nhớ cho bootloader ta xem bảng sau: BOOTSZ1 1 1 0 0

BOOTSZ0 1 0 1 0

Boot Size (words) 256 512 1024 2048

Page 4 8 16 32

Địa chỉ 0x3F00 - 0x3FFF 0x3E00 - 0x3FFF 0x3C00 - 0x3FFF 0x3800 - 0x3FFF

Trong các ứng dụng không đòi hỏi phải cập nhật phần mềm thì ta để mặc định, để dành bộ nhớ cho code. 7. RSTDISBL là bit cho phép sử dụng chân reset hay không trên một số chip như ATmega8 có tích hợp chung với PINC.6. Để sử dụng chân này làm chân RESET ta thiết lập fuse RSTDISBL=1 và ngược lại nếu ta muốn sử dụng chân này làm port xuất nhập. 8. WTDON cho phép WTD 9. SPIEN cho phép giao tiếp SPI 10. Set xung nhip cho chip, gồm 7 fuse: CKSEL3:0 (chọn xung nhịp), CKOPT (chọn chế độ khuêch đại) và SUT1:0 (thời gian khởi động- ko dùng, mặc định như nào để đó SUT1:0=10 )

CKSEL3:0 0001 0010 0011 0100 1010 1111 1010 1111

Xung nhịp 1Mhz 2Mhz 4Mhz 8Mhz 1-16Mhz 1-16Mhz 1-8Mhz 1-8Mhz

Nguồn xung nhịp Onchip Onchip Onchip Onchip Thạch anh ngoài Thạch anh ngoài Thạch anh ngoài Thạch anh ngoài

CKOPT

0 0 1 1

Hướng dẫn set fuse dùng xung nhịp RC onchip và thạch anh ngoài

Cuối cùng sau khi cấu hình xong nhớ nhấn nút Write để ghi cấu hình vào chip nha! Qua bài viết này các bạn có thể yên tâm khi nạp chương trình cho AVR không sợ bị set nhầm fuse.

Bài 4. Xuất nhập Port đơn giản cho AVR Chào các bạn, hôm nay chúng ta sẽ tìm hiểu về lập trình xuất nhập port cho vi điều khiển AVR. Việc xuất nhập port rất đơn giản các bạn tham khảo đoạn code sau: Các bạn đọc ghi chú để hiểu các câu lệnh có tác dụng ntn nha. (Ghi chú sau dấu // ) 1. Điều khiển xuất dữ liệu ra PORTD.0

include

include //Thu vien Ham delay chuan, Set clock CPU 8Mhz

define LED PORTD.0 //Chan PD0 gan LED /**************Ctr tao xung 1Hz dieu khien LED********************/ void main(){ //Chuong trinh chinh DDRD.0=1; //Chan PD0 la chan xuat du lieu LED=0; //Cho LED tat delay_ms(2000); //Tao tre 2 giay while(1){ //Vong lap ctr - Vong lap vo tan LED=1; //LED sang delay_ms(500); //Tre 0.5 giay LED=0; //LED tat delay_ms(500); } } Mạch nguyên lý:

2. Điều khiển LED thông qua nút nhấn:

include

include //Thu vien Ham delay chuan, Set clock CPU 8Mhz

define LED PORTD.0 //Chan PD0 gan LED

define BUT PINC.0 //Chan PC0 lam nut nhan /**************Ctr nhan nut dieu khien LED********************/ void main(){ //Chuong trinh chinh DDRD.0=1; //Chan PD0 la chan xuat du lieu DDRC.0=0; //Chan PC0 la chan nhap du lieu PORTC.0=1; //Su dung tro cau chan PC0 LED=0; //Cho LED tat while(1){ //Vong lap ctr - Vong lap vo tan if(!BUT){ //Nhan nut thi LED chop 2 lan roi tat LED=1; //LED sang lan 1 delay_ms(200); LED=0; //LED tat delay_ms(500); LED=1; //LED sang lan 2 delay_ms(200); LED=0; //LED tat while(!BUT); //Neu nut van nhan thi ko lam gi ca } } } Mạch nguyên lý:

Qua bài viết này các bạn sẽ biết cấu trúc của một chương trình trong C như thế nào và cách điều khiển port xuất nhập vào ra ntn trước khi vào lập trình nâng cao.

Bài 5. Tổng quan các bộ Timer/Counter trên chip AVR Vi điều khiển AVR được thiết kế với 3 bộ Timer/Counter theo thứ tự Timer 0, Timer 1, Timer 2: Có chức năng định thời, đếm sự kiện, tạo xung điều rộng PWM, căn chỉnh thời gian như một bộ RTC - Thời gian thực (chỉ có ở Timer 2)... Ta sẽ xét từng bộ timer một xem sự khác nhau và giống nhau của chúng để các bạn có thể chọn bộ timer tương thích với ứng dụng của bạn: Ta sẽ thay định nghĩa Timer/Counter gọi chung là Timer. 1. Timer 0: Đây là một bộ định thời có độ dài 8bit, nó hoạt động tương tự như chế độ timer 8bit của 8051 tức đếm từ 0-255 và tràn khi đạt 256 lúc này bộ đếm trở về 00H và cờ tràn TOV0 được set lên 1, có thể xảy ra 1 ngắt nếu có khai báo ngắt timer này. Các thanh ghi phụ trách điều khiển Timer0: Khi set bit ta chỉ set những bit nào có giá trị bằng 1 và chỉ set bằng 0 khi bit đang ở mức 1 . TCCR0 (Timer/Counter Control Register): Là thanh ghi điều khiển quá trình hoạt động của bộ timer0 7 -

6 -

5 -

4 -

3 -

2 CS02

1 CS01

0 CS00

Mặc dù là thanh ghi 8bit nhưng chỉ có 3bit được sử dụng, có tác dụng chọn xung clock cho bộ timer0, cứ mỗi xung clock là bộ đếm được tăng lên 1 đơn vị Ta có bảng Set bit như sau CS02 0 0 0 0

CS01 0 0 1 1

CS00 0 1 0 1

Miêu tả chức năng Không có xung clock - Timer0 Stop Fosc/1 - Bằng xung nhịp đưa vào chip Fosc/8 - Tần số thạch anh chia 8 Fosc/64 - Tần số thạch anh chia 64

1 1 1 1

0 0 1 1

0 1 0 1

Fosc/256 - Tần số thạch anh chia 256 Fosc/1024 - Tần số thạch anh chia 1024 Đếm sự kiện bên ngoài ở chân T0 cạnh xuống Đếm sự kiện bên ngoài ở chân T0 cạnh lên

TIMSK (Timer/Counter Interrupt Mask Register): Là thanh ghi mặt nạ ngắt ta chỉ quan tâm tới bit TOIE0, nếu set bit này lên 1 thì sẽ có ngắt tràn xảy ra khi bộ đếm tràn 7 OCIE2

6 TOIE2

5 TICIE1

4 OCIE1A

3 OCIE1B

2 TOIE1

1 -

0 TOIE0

TIFR (Timer/Counter Interrupt Flag Register): Là thanh ghi lưu trạng thái cờ tràn của tất cả các timer, ở timer 0 chỉ có bit TOV0 là cờ tràn và cũng là cờ chỉ thị ngắt TCNT0: Là thanh ghi chứa giá trị đếm của timer0, ta sẽ ghi dữ liệu khởi tạo timer vào đây, mặc định là 00H. Cách tính giá trị dựa vào giá trị tràn trừ đi giá trị cần đặt. thời gian trễ phụ thuộc vào nguồn xung clock đưa vào timer cài đặt ở thanh ghi TCCR0 Code mẫu cách khởi tạo timer0: TCCR0=(1