mình mới làm quen mong được giúp đở!!!
Thông báo
Collapse
No announcement yet.
Cùng Duyphi bắt đầu học lập trình AVR
Collapse
X
-
Ngày mai là bắt đầu nghĩ 2/9, anh em nên nghĩ ngơi vài hôm, sau đó hãy làm việc. Sau 2/9 chúng ta sẽ tiếp tục diễn giải cấu trúc chương trình và cách thức hoạt động của từng câu lệnh trong chương trình trên.
Đồng thời chúng ta sẽ mở rộng vấn đề lên qua nhiều ví dụ cụ thể khác.
Chúc anh em có ngày lễ vui vẻ!
Comment
-
GIẢI THÍC CHƯƠNG TRÌNH:Nguyên văn bởi MicroDuyphi Xem bài viết
CODE CHƯƠNG TRÌNH CHO VI ĐIỀU KHIỂN:
Code:.org $000 Batdau: ldi r16,low(RAMEND) out SPL,r16 ;init Stack Pointer ldi r16,high(RAMEND) out SPH,r16 LDI R16, 255 out DDRB,R16 main: ldi r16,255 out PORTB,r16 rcall delay ldi r16,0 out PORTB,r16 rcall delay rjmp main ;------------------------------------------------------- ;Delay 500ms voi thach anh su dung: 8mhz ;------------------------------------------------------- delay500ms: ldi R23,0x6B _wg500loop0: ldi R24,0x46 _wg500loop1: ldi R25,0xB1 _wg500loop2: dec R25 brne _wg500loop2 dec R24 brne _wg500loop1 dec R23 brne _wg500loop0 pop R25 pop R24 pop R23 ret ;end
Chúng ta phân tích đoạn chương trình đầu tiên:
.org $000
Batdau:
ldi r16,low(RAMEND)
out SPL,r16 ;init Stack Pointer
ldi r16,high(RAMEND)
out SPH,r16
Dòng ORG $000 khai báo cho chương trình dịch biết điểm địa chỉ bắt đầu của chương trình, ở đây là $000.
Dấu $ là biểu diễn con số sau nó là dạng số HEX.
Nhãn: "batdau" là do lập trình viên tự định nghĩa, hay tự đặt,không liên quan đến cấu trúc lệnh của chương trình. Việc đặt tên 1 nhãn như vậy sẽ làm cho chtrinh của chúng ta thêm trong sáng và dễ hiểu. Dĩ nhiên anh chị em có thể thay thế nhãn "batdau" này bằng 1 cái tên khác như: Begin, reset....
Tiếp theo, câu lệnh:
ldi r16,low(RAMEND)
ldi là lệnh của chương trình, có nghĩa là load data input, nạp dữ liệu vào.
ldi r16,low(RAMEND) có nghĩ là nạp dữ liệu địa chỉ byte thấp của RAMEND cho thanh ghi R16.
RAMEND???? nó là tên đã được định nghĩa sẵn trong file header. Nó được gắn tại địa chỉ cuối cùng của vùng ram của vi điều khiển.
Tại sao chúng ta phải gõ mấy dòng lệnh này??? các bạn hãy đợi 1 chút, sau khi phân tích vài dòng nữa tôi sẽ quay lại trả lời câu hỏi này.
Câu lệnh KếTiếp theo:
out SPL,r16 ;
OUT là 1 lệnh trong chtinh, nó có nghĩa là nạp dữ liệu từ R16 vào cho thanh ghi SPL
SPL và SPH là 2 thanh ghi của stack pointer. Việc đầu tiên mà chúng ta bắt đầu trước khi lập trình là thiết lập lại stack pointer.
Khác hơn 8051, chúng ta chỉ cần thiết lập Stack point ở định dưới của vùng ram và nó chỉ có độ lớn là 8bit, tức 1 byte.
Trong khi đó, AVR có nhiều dòng từ trung bình trở lên mạnh đều có 2 byte cho stack poiter do đó SP của AVR có thêm SPH và SPL tức là độ lớn của nó lên đến 16bit.
Về cách thức hoạt động của 8051 và AVR cũng có nhiều sự khác nhau:
1- Với 8051 thì mỗi khi đẩy vào SP thì địa chỉ của nó sẽ tăng lên 1 và mỗi khi lấy ra khỏi SP thì địa chỉ của nó giảm đi 1.
2- Với AVR thì ngược lại các bạn ah, mỗi khi đẩy vào SP thì địa chỉ của nó sẽ giảm 1 và mỗi khi lấy ra khỏi SP thì địa chỉ của nó tăng thên 1.
3- 8051 thì SP của nó chỉ có 8bit, AVR có 16bit-2 byte
Comment
-
2 Câu lệnh tiếp theo:
ldi r16,high(RAMEND)
out SPH,r16
2 câu này cũng như đã nói ở trên, lấy byte cao của RAMEND nạp vào r16 rồi đẩy vào SPH.
Tới đây chúng ta đã kết việc thai lập SP cho vi điều khiển.
Kết luận:
Trước khi viết chương trình cho vi điều khiển, cho dù là AVR hay 8051 đi nữa thì chúng ta cũng phải thiết lập lại trước SP rồi mới tiến hành lập trình tiếp.
Mở rộng vấn đề:1- hãy cho biết địa chỉ RAMEND của các AVR sau; atmega2313, atmega8, atmega128.
2- Thiết lập SP cho AVR ở tại các địa chỉ khác mà không dùng như cách trên.
Comment
-
Đây là đoạn code thiết lập cổng cho AVR, việc ghi giá trị vào cho thanh ghi DDRB sẽ thiết lập cho PORTB là nhập hoặc xuất. Ví dụ, 1 bit nào của DDR=1 thì bit tương ứng của PORTB sẽ là bit xuất, còn =0 là nhậpCode:LDI R16, 255 out DDRB,R16
Lưu ý: Điều này trái ngược với vi điều khiển PIC, với PIC thì việc cho thanh ghi TRISB=0 thì bit tương ứng trên PORTB sẽ là xuất, và =1 thì lại là nhập. Còn với 8051 thì việc này hoàn toàn được làm tự động hết, nên không có khái niệm thiết lập PORT trong 8051.
Ở đây MAIN cũng là nhãn như nhãn ở ""batdau" ở trên.Code:main: ldi r16,255 out PORTB,r16 rcall delay ldi r16,0 out PORTB,r16 rcall delay rjmp main
Ở đoạn này chỉ có thêm 1 lệnh khác là : rjmp. Đây là lệnh nhãy cũng giống như ở 8051 có lện LJMP hay JMP cũng vậy.
Kết luận:
Trong đoạn này đa số là giống ở 8051, một số còn lại thì giống PIC như hơi trái ngược với PIC 1 chút về quy định cách thức nhập xuất của PORT.
Comment
-
Trong chương trình này chúng ta dùng Xtal 8Mhz, nên chu kỳ lệnh Ti=1/fosc=1/8Mhz=0.125us.Code:;------------------------------------------------------- ;Delay 500ms voi thach anh su dung: 8mhz ;------------------------------------------------------- delay500ms: ldi R23,0x6B _wg500loop0: ldi R24,0x46 _wg500loop1: ldi R25,0xB1 _wg500loop2: dec R25 brne _wg500loop2 dec R24 brne _wg500loop1 dec R23 brne _wg500loop0 pop R25 pop R24 pop R23 ret ;end
Và đoạn chương trình này chúng ta sẽ có 1 vòng lặp là 500ms, cách tính toán thời gian đáp ứng của đoạn code trên như sau:
(((3*0XB1)+3)*0x46+3)*0x6B)*Ti=500ms.
Comment
-
Hoan hô bác Duy Phi, em thấy rất dễ hiểu.
Em trả lời thế này:Mở rộng vấn đề:1- hãy cho biết địa chỉ RAMEND của các AVR sau; atmega2313, atmega8, atmega128.
2- Thiết lập SP cho AVR ở tại các địa chỉ khác mà không dùng như cách trên.
1- Địa chỉ RAMEND là điạ chỉ cuối cùng của bộ nhớ RAM của AVR, như vậy, đối với ATMEGA8 thì nó có giá trị là 45Fh (1Kbyte internal Ram +32 R +60 I/O), với Atyny90s2313 là DFh (128 byte internal RAM), với ATmega128 là 10FFh( 4Kbyte RAM).
2- Thiết lập cách khác : vd cho ATmega128
LDI R16,0x10
OUT SPH,R16
LDI R16,0xFF
OUT SPL,R16
Thế có đúng không ạ?
Comment
-
Vâng!Rất chính xác. Anh em có thể tham khảo cách này của mrcuongcon thì dễ hiểu hơn nữa.Nguyên văn bởi mrcuongcon Xem bài viếtHoan hô bác Duy Phi, em thấy rất dễ hiểu.
Em trả lời thế này:
1- Địa chỉ RAMEND là điạ chỉ cuối cùng của bộ nhớ RAM của AVR, như vậy, đối với ATMEGA8 thì nó có giá trị là 45Fh (1Kbyte internal Ram +32 R +60 I/O), với Atyny90s2313 là DFh (128 byte internal RAM), với ATmega128 là 10FFh( 4Kbyte RAM).
2- Thiết lập cách khác : vd cho ATmega128
LDI R16,0x10
OUT SPH,R16
LDI R16,0xFF
OUT SPL,R16
Thế có đúng không ạ?
chúc bạn có ngày lễ vui vẻ!
Comment
-
Bác Duy Phi ơi, bây giờ em muốn lấy các kí tự từ trong một bảng .db nhưng không lấy lần lượt
mà lấy bất kỳ, thì làm thế nào. Trong 8051 thì đại để nó thế này: movc a,@a+dptr.
Trong avrstudio thì nó chỉ có lệnh LDD Rd,Z+q với q là một hằng số và q mang giá trị 0-63. Ý của em là là sao thế chỗ của q bằng một biến (vd như biến .def count R2) Em muốn làm về led 7 thanh mà mắc chố này.
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi vi van phamSuno hát sai toàn bộ nốt nhạc và điệu valse cháu ạ . Khi chép lới nó toàn bộ hát như thế, viết vào style không sửa nốt nhạc và lời khi chưa cho phép thì nó không hát hiện thông báo chưa được cho phép hát.
-
Channel: Tâm tình dân kỹ thuật
29-04-2026, 20:35 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Cháu không vào được để nghe thử. Mời bác nghe thử bản phối điệu Techno này xem thế nào nhé! Chúc bác vui.
( Cháu nhìn lyrics và cứ thế một mmạch hát demo rồi đưa vào suno. nó hát đạt 80% melody!)...-
Channel: Tâm tình dân kỹ thuật
27-04-2026, 17:00 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi vi van phamĐây là sheet nhạc và video bản nhạc tôi viết tán bà xã 50 năm trước, nay viết lại.
-
Channel: Tâm tình dân kỹ thuật
26-04-2026, 19:54 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi vi van pham
...-
Channel: Tâm tình dân kỹ thuật
26-04-2026, 19:49 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Bài này cháu phải "Creat" trên 30 lần rồi cắt ghép mới tạm có hồn tí đó bác. Quá nản luôn!!!
HẸN ƯỚC XUÂN SANG
Sáng tác: Hoàng Đình Thường
Hòa âm & hát: Suno AI
---25/04/2026----
[Verse 1]
Gió...-
Channel: Tâm tình dân kỹ thuật
25-04-2026, 11:05 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi vi van phamSuno là phần mềm dành cho người không biết nhạc lý, chỉ cần viết lời là nó tự biên tự diễn.Khi cháu sáng tác 1 bản nhạc với chủ âm, phụ âm điệu nhạc cháu gởi lên SUNO nó chỉ chơi đúng vài dòng đầu của nhạc, nhiều người dạy...
-
Channel: Tâm tình dân kỹ thuật
22-04-2026, 13:45 -
-
bởi dinhthuong92Vậy là Mạch PPT không cần dùng tới cuộn cảm luôn nhỉ!...
-
Channel: Nguồn!
22-04-2026, 11:19 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Hiện nó còn chưa phân biệt được giọng nam giọng nữ trong song ca nữa. Hát mono một giọng thì ok.
Ở bài MỎI CÁNH CHIM BẰNG nó hát lệch: khúc bi ca, từng ngày, mịt mù, địa chỉ, cát bụi, mỏi mòn, hoàng hôn, nơi ấy, dại khờ.-
Channel: Tâm tình dân kỹ thuật
22-04-2026, 11:07 -
-
Trả lời cho Công nghệ TSMC cho thiết kế Digital ICbởi gfasdfa234ai còn cái này không nhỉ , upload lại cho mọi người đi , vì một cộng đồng điện tử việt nam...
-
Channel: Công nghệ ASIC & Advance Techno
22-04-2026, 11:06 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Vâng bác, hiện tại mình phải chấp nhận SUNO như vậy thôi, vì ít ra nó hát đa phần đúng hay hơn mình, đỡ tốn tiền thuê ca sĩ thể hiện.
Cháu nghĩ, có thể nhà phát triển cố tình bảo vệ giới ca sĩ đấy, chứ mà mình nói sao...-
Channel: Tâm tình dân kỹ thuật
22-04-2026, 11:05 -

Comment