Mình mới bắt đầu học AVR thôi,tuy nhiên cũng xin đóng góp một chút cho diễn đàn.Mong các bạn góp ý!
Thông báo
Collapse
No announcement yet.
Lập trình AVR bằng CodeVisionAVR C Compiler cho người mới bắt đầu
Collapse
X
-
Tạo project mới và sử dụng CodeWizardAVR
Trước tiên để tạo 1 Project mới,vào menu New,chọn Project ->Ok
Tiếp theo nếu muốn sử dụng CodeWizardAVR thì nhấn Yes (tất nhiên!).Các bạn mới bắt đầu thì nên sử dụng cái này vì với CodeWizardAVR bạn không cần hiểu rõ về các thanh ghi vẫn có thể sử dụng các interrupt và các timer rất dễ dàng.
Các table hay dùng:
Chip: chip: chọn loại AVR,clock: chọn xung nhịp hoạt động của AVR
Ports: chọn chiều dữ liệu vào ra cho các chân của các cổng,in là vào out rà ra
External IRQ: chọn interrupt muốn sử dụng
Timers: chọn timer muốn sử dụng.Ví dụ mình thường sử dụng timer 1.
Clock Source: để nguyên system clock
Clock value: nếu muốn timer chạy thì phải set cái này (vd: mình dùng AVR atmega16 sử dụng xung nhịp 16MHz thì có thể chọn 16000kHz,2000kHz...)
Mode: chọn chế độ.Các chế độ 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.
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.
Bạn có thể chọn các chế độ ở đây.VD: mình chọn chế độ Ph. & fr. cor. PWM top=ICR1.
Interrupt on: cho phép ngắt so sánh hay ngắt tràn.Vd: timer 1overflow là cho phép ngắt tràn,khi đó bạn cần set giá trị để ngắt xảy ra tại Inp. Capture
Table LCD: Nếu bạn sử dụng LCD thì chọn cổng kết nối LCD tại đây
Project information: thông tin về project của bạn
...(còn nhiều table nhưng hiện tại mình chưa dùng đến nên chưa biết)
Xong rùi chọn File -> Generate,Save and exit.Chọn file name C, project,và cwp
Ok!Giờ thì xem nó cho bạn file C như thế nào nha:
/************************************************** ***
http://PHPCodeVn.com
Project : Test
Version : 1.0
Date : 3/19/2008
Author : Anhxtanh3087
Company : BKA
Comments: KSCLC-K50
Chip type : ATmega16
Program type : Application
Clock frequency : 16.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
************************************************** ***/
#include <mega16.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000.000 kHz
// Mode: Ph. & fr. cor. PWM top=ICR1
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x11;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x50;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
-
Hehe,vậy là dù không biết j về các thanh ghi bạn vẫn có thể lập trình với AVR rùi,dĩ nhiên là biết thì vẫn hơn!!!
Tuy nhiên nó cho bạn rất nhiều dòng lệnh thừa,bạn có thể xóa chúng đi để chương trình của mình gọn hơn.VD: mình xóa đoạn sau cũng k ảnh hưởng j đến chương trình,vì đó là mặc định của AVR
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
Comment
-
Thử viết 1 chương trình hiển thị LCD
Xem hướng dẫn trên,sử dụng table LCD,chọn cổng ra D,và nối cổng với các chân LCD như nó bảo nha.
Ở đây mình sử dụng AVR: Atmega16, LCD: LM016L,phần mềm mô phỏng: proteus
(ISIS)
Thư viện xử lý với LCD nó đã cho rồi nên chúng ta chỉ cần làm 1 việc đơn giản như sau:
lcd_gotoxy(0,0);
lcd_putsf("Chao Anhxtanh3087!");Attached Files
Comment
-
Bài viết của bạn khá đấy, nhưng mình có một chút rắc rối trong chương trình C Complies mình muốn bạn chỉ mình vài chiêu! you đồng ý chứ? chỉ là cách soạn thảo chương trình nạp cho AVR bằng C và nạp bằng phần mềm gì? mail của mình là: lamvantruongthdt06d - phone: 0907 853445Nhận làm mạch in, thiết kế board theo yêu cầu, cung cấp các loại linh kiện sĩ và lẽ ....
Comment
-
Nếu bạn dùng codevisionAvr thì sử dụng nó nạp cũng được, build chuong trình sang file hex (shift+F9), sau đó mở mục program on chip len, chon các thông số trong fulse bit cho phù hợp rồi nap thôi. Nên nhớ trước khi nạp bạn chon chế độ nạp là loại nào, tùy theo bo nạp của bạn (stk500, stk200-300,...) rồi nạp là xong.
Nếu không muốn dùng thì sử dụng thằng avr studio để nạp cũng được, chỉ cần load thang file .hẽ đã built sẵn rồi chọn chip nap là xong ( chú ý dạng nạp theo chuẩn nào nữa nhé)
Comment
-
bác nào quan tâm giúp em với, em cũng là lính mới tò te
Đang thử dịch chương trình của các bác viết. Nó báo lỗi như sau khi mình tạo file hex:
L1107:fA: unknow instruction or marco
Lỗi trên trỏ đến dòng lệnh sau:
fA-6;*OS>
đấy là lỗi ở file asm. Các bac xem giúp hộ em
Comment
-
cụ thể là như thế này các bác ạ:
Em copy nguyên cả đoạn code của bác anhxtanh3087, làm thành file mã nguồn *.c trong project của mình. Lúc compile=> ko có lỗi , cũng không có cảnh báo(warning) nào. But lúc vào make thì nó báo lỗi, chỉ một lỗi duy nhất ở dòng nào. sau đây là đoạn mã (khi nó chuyển sang file *.asm) nó báo lỗi:
......
.DSEG
__base_y_G2:
fA-6;*OS> =>Lỗi nó báo ở dòng này bác ạ
.CSEG
_delay_ms:
.......
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Xin hỏi về màn hình laptopbởi mèomướpDạ ý chú là màn oled ấy ạ. Cùng chuẩn lvds cùng độ phân giải thì cắm được ạ. Còn nó mà khác thì hơi khó vì oled các điểm ảnh nó tự phát sáng chứ ko dùng đèn nền như lcd. Cháu chỉ biết đến vậy thôi ạ. Chú muốn nghịch phải tự tìm hiểu kỹ trước khi mua thôi, khó mà ông thợ nào tư vấn vụ này...
-
Channel: Thiết bị điện tử cá nhân
hôm nay, 22:14 -
-
Trả lời cho Tự làm máy đo Cuộn cảmbởi bacthoHay đấy bạn ạ. Đây có thể hiểu là máy đo cuộn dây. Tiện đây xin cho hỏi bạn có hiểu rõ về máy nạp rôm pcb 45 của hãng thiên minh không giúp mình cách cài fw của nó với vì mình vừa được anh bạn cho nhưng lại không biết cài fw nên chưa dùng được. Nếu có thể thì bạn giúp mình với...
-
Channel: Điện tử dành cho người mới bắt đầu
hôm nay, 21:48 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi yname11màn của mình là LCD , giờ m muốn mua màn LED để thay thế (ko muốn dùng màn LCD nữa) , lên muốn hỏi xem có cáp chuyển đổi nào có thể cắm đc màn LED vào ko , tất nhiên phải có cùng số chân pin với màn cũ rồi . VD: màn cũ là lcd mỏng , 40 pin...
-
Channel: Thiết bị điện tử cá nhân
hôm nay, 21:43 -
-
Trả lời cho các bạn giúp mình về file HEX với!!!bởi bacthoBạn vào trang phuclanshop.com ,tìm đến góc kỹ thuật. Tác giả vương khánh hưng nói rất rõ về điều bạn tìm...
-
Channel: Vi điều khiển họ 8051
hôm nay, 21:21 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi mèomướpDạ màn hình lcd đều có thể lai cấy cho nhau được hết ạ. Các loại cáp, bo mạch chuyển đổi lvds rất nhìu, với dòng sony còn phải nhổ cả chip nhớ của main cũ đưa lên gỗ thì mới lắp sang máy khác đc, chưa kể các bệnh về màu... ngay cả...
-
Channel: Thiết bị điện tử cá nhân
hôm nay, 20:43 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi yname11Màn của e là LCD , e muốn thay thế bằng màn led thì có cáp chuyển đổi nào thực hiện đc việc đó ko nhỉ, nếu có bác mách e với....
-
Channel: Thiết bị điện tử cá nhân
hôm nay, 16:34 -
-
bởi bqvietServo cuối cùng vẫn chỉ là điều chỉnh tốc độ và đọc phản hồi vị trí
Qua cổng song song LPT cổ
https://www.electronicsforu.com/elec...eed-controller
Qua cổng USB - xem thêm đám FT232RL-
Channel: Điện tử công nghiệp
22-11-2024, 15:56 -
-
bởi thiennam0703Em đang tìm hiểu cách xây dựng chương trình điều khiển động cơ Servo Yaskawa bằng máy tính tuy nhiên khi tìm kiếm trên mạng các hướng dẫn thì thường là điều khiển bằng vi điều khiển hoặc điều khiển bằng PLC hay điều khiển động cơ...
-
Channel: Điện tử công nghiệp
22-11-2024, 15:32 -
-
Trả lời cho Tổng hợp các thông tin về mạch nạp cho AVRbởi bacthoMình cũng bị như vậy mà chưa biết ở đâu
-
Channel: Vi điều khiển AVR
21-11-2024, 21:00 -
Comment