Download pdf - Học PIC trong 1 ngày

Transcript
Page 1: Học PIC trong 1 ngày

Text-only version

This is Google's cache of http://www.picvietnam.com/forum/archive/index.php/t-5.html. It is a snapshot of thepage as it appeared on 16 Mar 2013 20:45:27 GMT. The current page could have changed in the meantime.Learn moreTip: To quickly find your search term on this page, press Ctrl+F or ⌘-F (Mac) and use the find bar.

PDA

falleaf

PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC > Học PIC trong 1 ngày (Upd. 01/01/2006)

View Full Version : Học PIC trong 1 ngày (Upd. 01/01/2006)

24-05-2005, 01:21 AM

Cơ bản về PIC

Dưới đây là hình mạch chạy của PIC16F84A, PIC16F628A và PIC16F88. Tất cả các PIC này đều có vị trí chântương ứng nhau, và thậm chí có thể nói PIC16F628A tương thích PIC16F84A và PIC16F88 tương thích với hailoại còn lại. Có nghĩa là trong các ứng dụng của PIC16F84A, khi thay đổi bằng PIC16F88, hay PIC16F628Ađều được.

http://i3.photobucket.com/albums/y64/falleafd/MachchayPIC16F628A.gif

Tất nhiên, 3 loại vi dòng PIC trên đây có thể tương thích với nhiều dòng PIC cũ hơn, nhưng vì thị trường PICViệt Nam phổ biến với 3 loại PIC này, cho nên chúng tôi chỉ đề cập đến 3 loại PIC này mà thôi.

Sau khi các bạn có mạch nạp, chương trình nạp, MPLAB IDE, CCS C hoặc HT PIC, các bạn làm mạch chạy này.Kể từ đây khi thiết kế cách mạch test, hoặc các thiết bị ngoại vi khác, cần thử nghiệm, các bạn chỉ việc thiếtkế mạch ngoài, sau đó cắm vào các chân ra và chạy thử.

Khi mạch chạy tốt, các bạn muốn thiết kế được hoàn chỉnh, các bạn chỉ việc copy mạch chạy từ Orcad và dánvào mạch nguyên lý của thiết bị của bạn. Xoá các chân header đi, và nối dây vào trong mạch chạy PIC. Nhưvậy, chúng ta không phải tốn thời gian thiết kế cho PIC nữa.

Một vài điểm lưu ý về mạch như sau:

- Nguồn chỉ dùng cho PIC, tuyệt đối không dùng bộ nguồn này cho thiết bị ngoại vi. Nếu thiết bị ngoại vi cầnnguồn, các bạn thiết kế bộ nguồn riêng. Một số thiết bị ngoại vi quá đơn giản, và tốn ít dòng, các bạn có thểdùng nguồn chung (khoảng 100mA)

- Tôi không khuyến khích dùng dao động nội của PIC, bởi vì dao động nội chỉ chạy được ở 4MHz, và không ổnđịnh như dùng thạch anh ngoài. Một số đề tài công nghiệp, họ dùng thạch anh chuẩn công nghiệp 4 chân, nênchúng ta cũng tạo thói quen dùng thạch anh ngoài, không cần quá tận dụng 2 chân của PIC.

- Mạch reset này là mạch reset đơn giản nhất của PIC, và tạo chế độ reset power on. Một số ứng dụng của PICyêu cần mạch brownout reset, các bạn có thể tham khảo trong datasheet. Nhưng tôi thiết nghĩ, những đề tàithông thường, không cần dùng mạch brownout reset này.

- Chúng ta thống nhất chuẩn thiết kế cho các header là nối vào các chân của PIC theo thứ tự hai chân ngoàicùng là Rx0 và GND. Mục đích là để khi chạy mạch in, chân GND có thể được xếp ra phía ngoài, chân Rx0 đểquy định cho tất cả các port khác nhau, vì có port chỉ có 3 chân, có port 5 chân, 8 chân... Nếu lấy chân RB7làm chuẩn chẳng hạn, thì sẽ rất khó giải thích khi lấy chân RA4 đặt ra phía ngoài. Vì vậy RA0 và RB0 chúng talấy làm chuẩn. Điều này cũng đã được thực hiện trong một số tutorial, và gần như là quy ước bất thành vănkhi thực hiện các mạch phát triển cho vi điều khiển. Chân VDD (5V) được nối vào, nhằm sử dụng cho các ứngdụng cần có điện áp ngõ vào, nhưng không cao lắm như ở trên đã nói (100mA). Tuyệt đối không thiết kế chânVSS (GND) và chân VDD (5V) ở hai đầu của header, tránh tình trạng đôi khi chúng ta không để ý cắm nhầm,có thể làm hỏng PIC, hoặc hỏng luôn cả thiết bị ngoại vi.

- Các nút bấm và công tắc, tôi thiết kế là các nút bấm 4 chân, vì hiện nay trên thị trường hầu như chỉ bán loạinút bấm này, và loại nút bấm này chắc chắn hơn loại 2 chân trước đây. Các bạn cũng lưu ý sau này khi thiếtkế nút bấm cũng nên thiết kế nút bấm 4 chân.

- Con ổn áp 78L05 khác với con 7805. Nó là dạng TO92, tức là nó giống như con transistor thông thường, nênrất nhỏ, chứ không phải dạng 3 chân và có tấm tản nhiệt phía sau như con 7805. Do vậy, mạch thiết kế sẽnhỏ đi khá nhiều.

- Ở đây, tôi không chạy ra mạch in, vì rằng tôi muốn dành công việc này cho các bạn sinh viên mới học. Saukhi các bạn làm xong mạch in, nếu các bạn có thể chia sẻ với chúng tôi thì thật là tuyệt vời. Chỉ có một điềulưu ý là, chúng ta thường không cắm trực tiếp vi điều khiển vào mạch để hàn, mà chúng ta cắm qua mộtsocket để có thể gỡ ra lập trình lại, và để đảm bảo không bị cháy PIC khi hàn. Do vậy, khi cắm socket, các bạnsẽ có thể nhét hai tụ nối ở thạch anh vào bên trong socket, khi cắm PIC lên, nó sẽ che hai cái tụ đó đi, và

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

1 of 53 29/03/2013 11:54 CH

Page 2: Học PIC trong 1 ngày

falleaf

mạch của các bạn sẽ gọn gàng hơn. Socket loại 18 chân không thể nhét thạch anh và điện trở nối từ chânMCLR đến VDD vào bên trong được, nhưng sau này khi dùng PIC 28 hoặc 40 chân, các bạn nên nhét tất cảvào bên dưới socket để cho mạch gọn gàng hơn.

- Một điểm cuối cùng, chúng tôi không thiết kế phần nạp bằng ICSP, bởi vì chúng tôi không muốn làm cho cácbạn mới học PIC cảm thấy bối rối. Chúng ta sẽ thực hiện mạch chạy PIC với các chân ICSP và bootloader sau.

24-05-2005, 04:10 AM

Học vi điều khiển PIC trong 1 ngày

Bài tập 1: Bật tắt đèn LED

http://i3.photobucket.com/albums/y64/falleafd/LED_1.gif

Cực dương của LED được nối với điện trở, điện trở được nối với các chân vi điều khiển. Cực âm của LED đượcnối với GND của vi điều khiển. Như vậy, khi chân vi điều khiển ở mức cao, tức là 5V, đèn LED sẽ sáng. Khichân vi điều khiển ở mức thấp (0V) đèn LED sẽ tắt.

Lưu ý trong hình: Giá trị của điện trở được xác định dựa vào dòng tối đa của vi điều khiển, điện áp và dòngđiện tối đa của đèn LED. Như vậy, giá trị nhỏ nhất của điện trở được dùng được tính toán như trong hình. R =125 Ohm.

Tuy nhiên, để đảm bảo hoạt động của đèn LED, chúng ta nâng giá trị điện trở lên thành 200 Ohm. Đèn LEDkhi sáng quá, chỉ cần sờ tay vào nó, hoặc các va chạm mạnh, hoặc trường hợp bị tĩnh điện, đèn LED có thể bịhư ngay. Hiện tượng này dễ thấy nhất là ở các LED cực sáng dùng trong các bảng hiệu hoặc biển báo giaothông, các đèn LED cực sáng chỉ cần chạm tay vào, sẽ có hiện tượng tĩnh điện và nổ ngay. Với các LED thườngvà dùng trong thí nghiệm, khó xảy ra hiện tượng này, tuy nhiên chất lượng sản xuất của các đèn LED cũngkhông đảm bảo, do vậy chúng ta chọn giải pháp an toàn là trên hết. Hơn nữa, chúng ta cũng không cần đènLED quá sáng.

Để bắt đầu bài tập 1, chúng ta tìm hiểu sơ qua về cấu trúc một chương trình viết bằng MPASM như sau:

Bất cứ một chương trình ASM nào, cũng được bắt đầu bằng việc giới thiệu về chương trình, tên chương trình,người thực hiện chương trình, ngày thực hiện chương trình, ngày hoàn tất, người kiểm tra lại chương trình,ngày kiểm tra chương trình, phiên bản của chương trình, mô tả phần cứng của mạch giao tiếp và một số chúthích. Vì vậy, tôi đưa ra đây một form mà tôi cho rằng hợp lý, từ đây về sau, các bạn chỉ cần cắt dán form này,thay đổi nội dung từng mục để làm phần mở đầu.

Chúng ta quy định một số quy ước sau:

;========== dùng để phân cách các phần chính của chương trình;---------------- dùng để phân cách các chương trình con của chương trình

;================================================= =======; Ten chuong trinh : Mach test den LED_1; Nguoi thuc hien : Falleaf; Ngay thuc hien : 23/05/2005; Phien ban : 1.0; Mo ta phan cung : Dung PIC16F628A - thach anh 10MHz; : LED giao tiep voi PORTB; : Cuc am cua LED noi voi GND; : RB0 - RB7 la cac chan output;----------------------------------------------------------------; Ngay hoan thanh : 23/05/2005; Ngay kiem tra : 23/05/2005; Nguoi kiem tra : Doan Hiep;----------------------------------------------------------------; Chu thich : Mo ta cac diem khac nhau cua cac phien ban khac nhau; : hoac cac chu thich khac; : vd, dung che do Power On Reset, PORTB = 00000000; : hoac, chuong trinh viet cho PIC Tutorial; : hoac, chuong trinh nay hoan toan mien phi va co the dung cho; : moi muc dich khac nhau;================================================= =======

Mặc dù chưa chắc rằng đoạn chú thích này có thể ngắn hơn chương trình các bạn viết, và như vậy việc viếtchú thích dài hơn việc viết chương trình? Không, thực sự các chú thích này rất quan trọng, vì sau 1, 2, 3 năm,các bạn nhìn lại, các bạn sẽ vẫn còn hiểu được mình đã làm gì. Có thể khi mới bắt đầu, các bạn thấy công việcghi chú này là nhàm chán, chính vì vậy, tôi đã cung cấp form của ghi chú này, các bạn sau đó chỉ cần cắt và

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

2 of 53 29/03/2013 11:54 CH

Page 3: Học PIC trong 1 ngày

falleaf

falleaf

dán. Tôi hy vọng rằng các bạn nên tạo thói quen đưa đoạn chú thích này vào chương trình để các bạn trở nênchuyên nghiệp hơn khi làm việc với vi điều khiển, cụ thể ở đây là PIC.

Tất nhiên, đây là bài học đầu tiên, do vậy các chú thích sẽ được ghi rất chi tiết, nhất là khi mô tả phần cứng.Sau này, với các mạch phức tạp hơn, các bạn không thể ghi chú quá chi tiết như thế này được, các bạn chỉ ghichú những điểm chính thôi. Cũng tất nhiên, khi lập trình với CCS C hay HT PIC, các bạn cũng nên ghi chú nhưvậy trong chương trình chính, nhưng chúng ta chưa bàn đến CCS C và HT PIC ở đây.

24-05-2005, 04:13 AM

Phần thứ hai các bạn cần học, đó là khởi tạo PIC. Phần này là phần bắt buộc theo sau phần ghi chú, bởi vìchương trình dịch cần phải hiểu bạn đang làm việc với con PIC nào, làm việc với nó như thế nào?

;================================================= ======TITLE "Mach test LED_1"PROCESSOR P16F628AINCLUDE <P16F628A.inc>__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC

;================================================= ======

Các bạn sẽ thấy rằng có một số từ khoá như sau:

TITLE: dùng để các bạn ghi chú thích tên chương trình. TITLE là ten chương trình chính. Cú pháp ghi TITLEnhư trên. Nhớ phải có dấu nháy kép khi viết tên chương trình.

PROCESSOR: dùng để khai báo dòng vi điều khiển mà các bạn sử dụng. Các bạn lưu ý, trong MPLAB quy định,không viết đầy đủ tên PIC16F628A mà chỉ viết P16F628A, vì trong chương trình dịch đã quy định như vậy.

INCLUDE: dùng để đưa thêm vào các file mà bạn viết trong chương trình. Mặc định, trong MPLAB đường dẫnđến thư mục chứa file P16F628A.inc đã có sẵn. Nếu bạn đặt file ở nơi khác không phải trong thư mục bạnđang làm việc, hoặc các file include khong phải là file .inc có sẵn của MPLAB, thì các bạn phải chỉ đường dẫnrõ ràng. Lưu ý rằng, để MPASM dịch được, các bạn phải đặt đường dẫn từ thư mục gốc đến hết tên file (kể cảphần mở rộng của file) không được quá 60 ký tự.

__CONFIG: dùng để thiết lập các chế độ hoạt động của PIC. Các bạn có thể xem để hiểu thêm về các chế độhoạt động này trong tài liệu

PICmicroMid Range MCU FamilyReference Manual

Section 27. Device Configuration BitsTable 27-1 page 27-7

Tài liệu này có thể download trên trang web của microchip www.microchip.com, keyword: MidRange Manual.

Mỗi directive để đặt chế độ, cách nhau một ký tự &.Nếu ghi chế độ hoạt động vào đây, các chế độ hoạt động sẽ ở trạng thái mặc định khi khởi động.Các bạn cũng có cách khác để đặt chế độ hoạt động bằng cách tác động trực tiếp vào các thanh ghi khởi tạo.Tuy nhiên, việc này là việc làm không cần thiết, khi chúng ta đã có các directive để viết tắt.

Như vậy, chúng ta đặt ở đây chế độ _CP_OFF, tức là khôngđặt chế độ bảo vệ source code khi nạp vào PIC, saukhi nạp vào sẽ có thể đọc ngược lại từ PIC ra. Chúng ta không cần bảo vệ chương trình này, để bạn có thể đọcngược bằng IC-PROG và kiểm tra lại.

Chế độ _PWRITE_ON, tức là cho timer 0 chạy khi Power On Reset. Thực ra timer0 có chạy hay không cũngkhông quan trọng, vì nó chẳng liên quan gì đến công việc của chúng ta. Nếu sau này muốn dùng timer0, thìcác bạn vẫn phải khởi tạo lại giá trị cho nó, chứ đâu thể sử dụng giá trị ngẫu nhiên của nó được, thành ra cứđể cho nó chạy, sau này cần dùng khỏi phải khởi tạo.

_WDT_OFF, tại thời điểm này, tôi tắt Watch Dog Timer vì lý do các bạn chưa nên tìm hiểu phần này vội.

_HS_OSC, chúng ta dùng thạch anh 10MHz, tức là chạy chế độ dao động HS. Tham khảo tại:

datasheet PIC16F628ASection 14. Special Features of the CPU14.2. Oscillator ConfigurationPage 95

24-05-2005, 04:16 AM

Một điểm lưu ý cuối cùng là các bạn phải sử dụng phím TAB để phân cách các cột của một chương trình viếtbằng MPASM. Các dòng khởi tạo này được viết ở cột thứ 3. Các directive __CONFIG, TITLE, PROCESSOR,INCLUDE được viết vào cột thứ 3. Còn chi tiết khởi tạo được viết vào cột thứ tư.

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

3 of 53 29/03/2013 11:54 CH

Page 4: Học PIC trong 1 ngày

Cột thứ nhất dùng để viết các [NHÃN], cột thứ hai để viết mã lệnh, cột thứ ba lại dùng để viết chi tiết cáctham số của lệnh, và cột thứ tư bỏ trống để tạo khoảng cách với cột thứ năm. Cột thứ năm dùng để viết cácchú thích.

Các chú thích bắt đầu bằng dấu chấm phẩy (;). Trên một dòng, tất cả các ký tự viết sau dấu chấm phẩy đềuvô nghĩa. Chính vì vậy, khi viết phần chú thích ban đầu, các bạn thấy rằng tất cả nội dung đó đều bắt đầubằng dấu chấm phẩy. Như vậy, một dòng lệnh được cụ thể như sau:

NHÃN LỆNH thamso1, thamso2 ; chú thích dòng lệnh

Bây giờ chúng ta dành chút thời gian cho lý thuyết, các bạn mở datasheet PIC16F628A trang 15, Section 4.Memory Organization

Chúng ta sẽ thấy rằng tổ chức bộ nhớ chương trình của PIC được chia ra làm mấy phần như sau:

- Pointer- Stack- Interrupt vector- Program memory

Chúng ta tạm thời chưa bàn đến pointer và stack.

Interrupt vector được đặt ở địa chỉ 0x0004Program memory được đặt ở địa chỉ 0x0005

Vậy từ địa chỉ 0x0000 đến địa chỉ 0x0003 chúng ta làm được gì?

Khi PIC được reset, nó lập tức nhảy về địa chỉ 0x0000. Rồi cứ sau một chu kỳ máy, nó nhảy đến địa chỉ tiếptheo, xem xem trong địa chỉ đó yêu cầu nó làm gì, nó thực hiện việc đó, xong rồi lại nhảy tiếp. Cứ làm như thếcho đến khi hết chương trình. Tất nhiên, khi chúng ta thực hiện một số lệnh điều khiển vị trí nhảy, thì nó sẽnhảy không theo thứ tự nữa, nhưng việc này chưa bàn vội. Chúng ta trước mắt chỉ cần biết rằng nó cứ nhảynhư vậy cho đến hết chương trình.

Như vậy, nếu không sử dụng ngắt, thì chúng ta viết chương trình từ địa chỉ 0x0000 luôn, vì nó cứ thế là nhảytừ 0x0000 khi khởi động, cho đến hết chương trình. Tuy nhiên, nếu làm như vậy, sau này chúng ta sử dụngchương trình ngắt, thì chúng ta sẽ gặp trục trặc vì thói quen viết từ địa chỉ 0x0000.

Chính vì vậy, chúng ta nên đặt chương trình trong phần Program Memory như ý đồ thiết kế PIC.

Vậy, chương trình của chúng ta sẽ viết như sau:

;====================================================================ORG 0x0000GOTO MAIN

ORG 0x0005MAIN.....

END.;====================================================================

Đây sẽ là cấu trúc một chương trình mà chúng ta sẽ thực hiệnDirective ORG dùng để xác định địa chỉ mà chúng ta sẽ làm việc.

Bây giờ chúng ta xem tiếp đến trang 16 của datasheet.

Chúng ta thấy rằng, bộ nhớ dữ liệu của PIC16F628A được chia ra thành 4 BANK, hay chúng ta gọi tiếng Việt là4 BĂNG.

Trong 4 băng này, chúng ta thấy rõ nó được chia làm 3 phần. Phần thứ nhất là phần các thanh ghi có địa chỉxác định (được ghi chú ở bên cạnh) và có tên tuổi rõ ràng. Những thanh ghi này được gọi là những thanh ghiđặc biệt của PIC. Tên của chúng, thực ra không có, một thanh ghi chỉ được xác định bằng địa chỉ của thanhghi mà thôi.

Tuy nhiên, chúng ta đã làm động tác include file P16F628A.inc, file này đã định nghĩa sẵn tên các thanh ghinày, và là quy ước của MPLAB, đồng thời cũng là quy ước chung cho tất cả người dùng PIC. Chúng ta có thểthay đổi, sửa chữa những định nghĩa này, tuy nhiên việc làm đó vừa không cần thiết, lại vừa gây ra rất nhiềukhó khăn khi làm việc nhóm.

Vậy các bạn phải hiểu, những tên thanh ghi này xem như là không thay đổi trong PIC, và chúng ta sử dụng nónhư nó đã tồn tại vài chục năm nay.

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

4 of 53 29/03/2013 11:54 CH

Page 5: Học PIC trong 1 ngày

falleaf

Phần thứ hai, đó là phần General Purpose Register. Chúng ta gọi nó là các Thanh Ghi Dùng Chung. Nhữngthanh ghi này chưa được định nghĩa, và vì thế nó cũng không có tên. Những thanh ghi này có giá trị như cácbiến trong chương trình mà chúng ta sẽ sử dụng.

Phần thứ ba, đó là các thanh ghi nằm ở địa chỉ 70h đến 7Fh, và vị trí tương ứng của nó ở băng 1, 2, 3. Cácthanh ghi tương ứng đó ở bank1, 2, 3 sẽ tương thích với các thanh ghi từ 70h đến 7Fh ở băng 0. Tuy nhiên,chúng ta tạm thời chưa quan tâm đến phần này.

Bây giờ chúng ta học viết chương trình

;===============================================================================ORG 0x0000GOTO MAIN

ORG 0x0005

MAINBANKSEL TRISB ; bank selectCLRF TRISB ; trisb = 00000000; portb = outputBANKSEL PORTBBSF PORTB, 0 ; rb0 = 1; RB0 = 5VGOTO $ ; dung chuong trinh tai day; vong lap tai cho^~; khong bao gio ket thucEND. ; lenh bat buoc de ket thuc;================================================================================

Rồi, như vậy, chúng ta đã thực hiện xong một chương trình viết bằng MPASM cho PIC16F628A.

Phân tích chương trình, chúng ta sẽ thấy, mới khởi động, chương trình gặp lệnh goto main, nó sẽ nhảy đếnnhãn MAIN. Ở nhãn MAIN, nó gặp lệnh banksel, tức là lệnh bank select. Có nghĩa là nó sẽ chuyển sang hoạtđộng ở băng có chứa thanh ghi TRISB.

Vì sao? Bởi vì ban đầu khởi động, PIC luôn nằm ở băng 0. Nhưng thanh ghi TRISB lại nằm ở băng 1, vì thế cầnphải chuyển sang băng 1 để làm việc. Thực ra chúng ta cũng có cách để yêu cầu PIC chuyển sang băng 1 mộtcách đích danh, chứ không phải là chuyển sang băng có thanh ghi trisb như chúng ta vừa làm. Nhưng việcnày là không cần thiết, cả hai việc làm đều giống nhau. Chính vì vậy, chúng ta chọn cách viết nào cho dễ nhớlà được.

Sau khi chuyển sang băng 1. Chúng ta dùng lệnh CLRF để xoá thanh ghi TRISB.

Tức là TRISB = 00000000

Chúng ta lưu ý một điều rằng, thanh ghi TRISB có công dụng quy định PORTB sẽ có những chân nào là chânxuất, chân nào là chân nhập. Chúng ta nhớ thêm một điều nữa, số 0 giống chứ O, và số 1 giống chữ I. Nhưvậy, khi TRISB = 00000000 tức là PORTB sẽ là OOOOOOOO, tức có nghĩa là tất cả các chân của portB đều làOutput. Nếu TRISB = 01010101 thì PORTB sẽ là OIOIOIOI. Có nghĩa là RB0 sẽ là Input, RB1 là Output, RB2 làInput, RB3 là Output.. cứ như thế cho đến RB7 là Output. Lưu ý rằng RB0 đến RB7 được tính từ phải sangtrái.

Sau đó, chúng ta lại thực hiện lệnh Banksel portb, tức là chúng ta lại nhảy về băng 0 (băng chứa thanh ghiportb).

Tất cả các lệnh làm thay đổi giá trị của thanh ghi portb, sẽ làm thay đổi tín hiệu điện ở bên ngoài chân củaPORT B.

Sau khi chuyển sang băng 0, chúng ta thực hiện lệnh BSF PORTB,0. Có nghĩa là chúng ta set bit ở vị trí 0 củaportb, tức là chúng ta cho RB0 = 1.

Có nghĩa là ở ngoài chân RB0 sẽ mang giá trị điện áp 5V. Khi đó, đèn LED nối với RB0 sẽ sáng.

24-05-2005, 04:18 AM

Các bạn sẽ thấy mach ngoài hoạt động như thế này:

Khi bật điện lên, PIC được reset. Nó lập tức bật sáng đèn LED ở RB0, rồi sau đó giữ nguyên như vậy, khônglàm gì cả.

Bây giờ các bạn lưu chương trình vừa viết thành LED_1.asm vào một thư mục nào đó.Nhấn Alt - F10, chương trình sẽ dịch LED_1.asm thành LED_1.hex

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

5 of 53 29/03/2013 11:54 CH

Page 6: Học PIC trong 1 ngày

falleaf

Các bạn dùng mạch nạp PG2C và chương trình nạp IC-PROG để nạp vào PIC (tham khảo Hướng dẫn mạch nạpFalleaf PG2C - PIC Tutorial).

Công việc của các bạn như sau:

0) Chạy thử chương trình ban đầu

1) Thay đổi lệnh BSF PORTB, 0 bằng lệnh BSF PORTB, 1. Nạp lại chương trình mới vào PIC. Bạn sẽ thấy bâygiờ đèn LED không sáng ở vị trí RB0 nữa mà sáng ở vị trí RB1.

2) Thay lệnh BSF PORTB,0 bằng đoạn lệnh

MOVLW b'11110000'MOVWF PORTB

Bạn sẽ thấy các các chân từ RB0 đến RB3 sẽ tắt đèn, và các chân từ RB4 đến RB7 đèn sẽ sáng.

3) Bạn thay lệnh CLRF TRISB bằng đoạn lệnh

CLRF TRISBBSF TRISB, 0

và giữ nguyên lệnhBSF PORTB, 0

Các bạn sẽ thấy rằng đèn LED trong trường hợp này sẽ không sáng nữa.Bởi vì các bạn đã làm cho TRISB = 00000001. Như vậy, RB0 trở thành chân Input. Khi RB0 trở thành chânInput, thì lệnh BSF PORTB, 0 sẽ không còn tác dụng nữa. RB0 lúc này không thể thay đổi giá trị bằng chươngtrình, nó chỉ có thể nhận giá trị điện áp từ bên ngoài vào.

4) Trong trường hợp mạch này, các bạn sẽ làm thế nào?

http://i3.photobucket.com/albums/y64/falleafd/LED_2.gif

Kết luận: Qua bài học này, các bạn đã học được các nội dung sau:

- Làm một mạch chạy PIC- Cấu trúc một chương trình PIC- Lập trình từ máy tính, nạp vào PIC, và cho PIC hoạt động- Hiểu được hoạt động xuất nhập của PIC, chức năng của thanh ghi TRISA, TRISB, PORTA, PORTB, hiểu đượccác lệnh CLRF (xoá thanh ghi bất kỳ), MOVLW (ghi một giá trị bất kỳ vào thanh ghi W), MOVWF (ghi giá trịcủa thanh ghi W vào một thanh ghi khác), BSF (bật một bit trong một thanh ghi bất kỳ), GOTO (nhảy đếnmột nhãn bất kỳ), GOTO $ (nhảy tại chỗ), BANKSEL (chon băng trong bộ nhớ chương trình, chứa một thanhghi bất kỳ), ORG định địa chỉ trong bộ nhớ chương trình.

Hiện nay các bạn chưa học đến làm thế nào để Input, nhưng có thể các bạn sẽ thực hiện dễ dàng bằng việcthay LED bằng một nút bấm. Hoặc giả, các bạn muốn đèn LED nhấp nháy, về nguyên tắc các bạn có thể thựchiện bật tắt liên tục đèn LED bằng lệnh BSF và BCF. Nhưng làm như thế nó nháy quá nhanh, không thể thấyđược.

Bài học sau, chúng ta sẽ học cách viết hàm Delay, và các bạn có thể thực hiện việc làm cho đèn LED nhấpnháy, làm cho dãy đèn từ RB0 đến RB7 chạy qua chạy lại...

Chúc các bạn may mắn trong bài học đầu tiên, và chúc các bạn thành công với PIC!

26-05-2005, 10:54 PM

Học vi điều khiển PIC trong 1 ngày

Qua bài học thứ nhất, chúng ta đã học về cách bật tắt một đèn LED. Bây giờ nếu muốn làm cho đèn LED nhấpnháy, có nghĩa là chúng ta bật đèn LED, sau đó chờ một khoảng thời gian, và tắt đèn led đó đi, sau đó lại chờmột khoảng thời gian nữa và lại bật đèn led lên. Muốn thực hiện việc này, chúng ta phải tìm cách làm mộthàm delay (delay - tiếng Anh có nghĩa là trễ, chậm lại)

Hàm DELAY là một hàm rất thông dụng khi lập trình thời gian thực. Nguyên lý của hàm delay là dùng thờigian thực hiện các lệnh của vi điều khiển để làm thời gian trễ. Như các bạn đã biết (nếu chưa biết thì bây giờbiết.. hihi), mỗi lệnh của vi điều khiển, khi thực hiện, cần phải tốn một khoảng thời gian nào đó. Nếu một việclàm mà không tốn thời gian thì đúng là vô lý. Vậy thời gian thực hiện một lệnh của PIC là bao lâu?

Như trong bài học đầu tiên chúng ta đã đề cập, chúng ta sử dụng thạch anh từ 4MHz đến 10MHz và đến20MHz. Thạch anh này tạo ra các dao động xung nhịp chính xác để duy trì những khoảng thời gian xác địnhcho vi điều khiển hoạt động.

Chúng ta xem hình sau để hiểu được nguyên lý tạo dao động bên trong vi điều khiển:

Hình 1:

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

6 of 53 29/03/2013 11:54 CH

Page 7: Học PIC trong 1 ngày

http://i3.photobucket.com/albums/y64/falleafd/OSC_1.gif

Thạch anh tạo dao động trên các chân OSC, đưa vào bên trong PIC. PIC sẽ đếm 4 nhịp trên dao động thạchanh, và để thực hiện một lệnh. Như vậy, thời gian thực hiện một lệnh chính là 4 nhịp dao động của thạch anh.

Chúng ta thường gọi thời gian thực hiện một lệnh của PIC là một chu kỳ máy (đoạn số 2 trên hình). Vậy mộtchu kỳ máy bằng bao nhiêu, nếu chúng ta sử dụng thạch anh 10MHz cho PIC?

Tần số dao động của thạch anh:F_osc = 10MHzChu kỳ của dao động thạch anh:T_osc = 1/10.000.000 sChu kỳ máyT_instruction = 4 * T_osc = 4/10.000.000 s = 0.0000004 s = 0.0004 ms = 0.4 us = 400 ns

Như vậy, một lệnh máy được thực hiện trong vòng 0.4 micro giây, hay 400 nano giây.

Tương tự, khi các bạn dùng thạch anh 4MHz, chu kỳ máy sẽ là 1us, và dùng thạch anh 20MHz, chu kỳ máy sẽlà 200 nano giây.

Quay trở lại với việc nếu chúng ta cần thực hiện một việc gì đó giống như nhấp nháy đèn LED, thì chúng tacần PIC phải dừng lại, không làm gì cả để chờ chúng ta. Nếu như lệnh NOP (lệnh không làm gì) sẽ giúp chúngta chờ 0.4 us, mà chúng ta cần chờ 1 giây, thì chúng ta viết bao nhiêu lệnh NOP cho đủ?

Thay vì như vậy, chúng ta viết một vòng lặp để cho vi điều khiển làm một việc vô thưởng vô phạt nào đó Nlần, và mỗi lần như vậy nó tốn T chu kỳ máy. Như vậy, sau khi kết thúc việc làm vô thưởng vô phạt đó, vi điềukhiển đã chờ chúng ta N * T chu kỳ máy.

Để viết một vòng lặp như vậy, trước tiên chúng ta học cách đặt biến.

Một biến được đặt trong PIC, thực chất là một tên gọi chung cho một hoặc nhiều thanh ghi các giá trị. Trongphần này, chúng ta chỉ đơn giản làm đặt biến có nghĩa là đặt tên cho một thanh ghi. Thực ra, chúng ta hoàntoàn không cần đặt tên, mà có thể gọi trực tiếp địa chỉ của thanh ghi, nhưng nếu làm như vậy, sau này, khichương trình phức tạp dần lên, chúng ta sẽ dễ bị lẫn lộn các biến.

Khi đặt biến, thanh ghi này nằm ở đâu? Nó sẽ nằm trong bộ nhớ chương trình và cụ thể, nó sẽ nằm trongvùng nhớ dùng chung mà chúng ta đã đề cập trong bài học trước.

Vậy làm thế nào để đặt biến? Có rất nhiều cách đặt biến, và trong phần này, tôi sẽ hướng dẫn các bạn cáchđặt biến mà tôi cho rằng rõ ràng nhất.

;================================================= =================

ORG 0x020COUNT_L RES 1COUNT_H RES 1COUNT_N RES 3

;================================================= =================

Các bạn vừa làm gì?

Directive ORG dùng để xác định địa chỉ vùng nhớ. Các bạn lưu ý rằng, khi xác định địa chỉ vùng nhớ ở đây,chính là các bạn xác định địa chỉ vùng nhớ dữ liệu, chứ không phải địa chỉ vùng nhớ lập trình. Những gì cácbạn viết phía bên dưới, sẽ giúp cho trình dịch hiểu được rằng các bạn đang làm việc trong vùng nhớ lập trình,hay vùng nhớ dữ liệu

Directive RES quy định việc đặt biến. Số 1 phía sau xác định rằng biến có tên COUNT_L chiếm 1 thanh ghi 8bit, tức là 1 byte.

Tiếp theo, các bạn lại đặt biến tên là COUNT_H. Như vậy, biến COUNT_H cũng chiếm 1 byte.

Câu hỏi đặt ra là các thanh ghi này nằm ở đâu?

Các bạn lưu ý, khi các bạn dùng directive ORG, là các bạn đã xác định nơi bắt đầu đặt biến. Như vậy, biếnCOUNT_L sẽ có độ dài 1 byte, và được đặt ở địa chỉ 0x020 tức là địa chỉ đầu tiên của vùng nhớ dữ liệu dùngchung trong băng 0 (20h)

Vì COUNT_L đã chiếm 1 byte. Do đó, biến COUNT_H sẽ chiếm byte tiếp theo, và địa chỉ đầu tiên của COUNT_Hsẽ là 21h, nhưng COUNT_H cũng chỉ có 1 byte, cho nên nó chính là thanh ghi ở địa chỉ 21h. Đến biếnCOUNT_N, tương tự, địa chỉ đầu tiên của nó sẽ là 22h. Biến COUNT_N chiếm 3 thanh ghi, như vậy, biếnCOUNT_N sẽ nằm từ 22h, 23h đến 24h. Nếu tiếp tục đặt thêm các biến khác, các biến đó sẽ bắt đầu từ địa chỉ

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

7 of 53 29/03/2013 11:54 CH

Page 8: Học PIC trong 1 ngày

25h, cứ như thế.

Vậy muốn đặt biến ở các băng khác thì làm thế nào? Các bạn cứ lấy địa chỉ đầu của vùng nhớ dữ liệu dùngchung của băng đó và viết như sau:

;=================================================ORG 0x0A0h

COUNT_X RES 10;=================================================

Tóm lại, để chuẩn hoá một chương trình, các bạn chép đoạn code này vào, và sau đó không bao giờ còn phảiviết lại nữa:

;=======================================================================

;-----------------------------------; Bien nam o Bank0;-----------------------------------ORG 0x020

COUNT_L RES 1COUNT_H RES 1

;----------------------------------; Bien nam o Bank1;----------------------------------

ORG 0x0A0

COUNT1_L RES 1

;---------------------------------; Bien nam o Bank2;---------------------------------ORG 0x120

;========================================================================

Như vậy, một chương trình tổng quát bây giờ sẽ trở thành như thế nào?

;========================================================================; Phần chú thích ban đầu;;========================================================================; Phần khởi tạo vi điều khiểnTITLEPROCESSORINCLUDE__CONFIG

;========================================================================; Phần đặt biến

;-------------------------------------; Biến ở băng 0;-------------------------------------ORG 0x020;------------------------------------; Biến ở băng 1;------------------------------------ORG 0x0A0;------------------------------------; Biến ở băng 2;------------------------------------ORG 0x120

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

8 of 53 29/03/2013 11:54 CH

Page 9: Học PIC trong 1 ngày

falleaf

;=========================================================================; Phần chương trình chínhORG 0x0000GOTO MAIN

ORG 0x0005MAIN; những dòng lệnh được viết ở đâyEND;==========================================================================

Như vậy, chúng ta đã biết cách viết một chương trình đầy đủ dành cho vi điều khiển PIC bằng ngôn ngữMPASM.

26-05-2005, 10:56 PM

Các bạn cần chú ý thêm, nếu phía trên chỗ biến ở băng 2, các bạn không đặt biến gì cả, thì các bạn cứ đểnguyên như vậy, vì ngay bên dưới, các bạn đã đặt lại địa chỉ 0x0000, nó chẳng ảnh hưởng gì đến chươngtrình.

Cũng giống như, nếu bạn không viết gì ở đoạn ORG 0x0000 và GOTO MAIN, mà bạn để ngay dòng ORG0x0005 thì chương trình vẫn chạy bình thường. Đơn giản là từ đoạn 0x0000 đến 0x0004, PIC sẽ không làm gìcả. Chúng tôi đang cố gắng từng bước hình thành cho bạn kết cấu chương trình viết bằng MPASM, mỗi ngàymột hoàn thiện hơn, để các bạn nắm rõ lý do vì sao các chương trình được viết như vậy, và chúng ta cùngthống nhất với nhau ở điểm này khi viết chương trình. Nếu các bạn tin tưởng vào việc tạo ra một chuẩn viếtchương trình MPASM cho Việt Nam, thì các bạn là người đang đặt nền móng cho nó. Tôi cũng có tham vọngnày, cho nên các quy cách ký hiệu tôi cố gắng dùng một chuẩn thống nhất, và mong rằng các bạn cùng tôilàm việc này, để sau này tất cả mọi người khi làm việc cùng với nhau có thể hiểu và truyền tải ý tưởng mộtcách nhanh nhất.

Kể từ nay, các bạn đã biết cách đặt biến, biết cách viết phần khởi tạo, chúng ta sẽ chỉ còn bàn tới việc viết ởphần chương trình chính như thế nào nữa mà thôi.

;============================================================================ORG 0x0000GOTO MAIN

ORG 0x0005MAINBANKSEL TRISBCLRF TRISB ; đặt portb là output

MOVLW D'255'MOVWF COUNT_L ; COUNT_L là 1 byte

BANKSEL PORTBLOOP BSF PORTB, 0CALL DELAYBCF PORTB, 0CALL DELAYGOTO LOOP

;=============================================================================; Các chương trình con;=============================================================================DELAY DECFSZ COUNT_L, FGOTO DELAYRETURN

;=============================================================================GOTO $END;=============================================================================

Các bạn vừa làm gì với đoạn chương trình trên?

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

9 of 53 29/03/2013 11:54 CH

Page 10: Học PIC trong 1 ngày

Điểm thứ nhất các bạn nên chú ý, đó là việc tôi thêm phần các chương trình con vào trong phần chương trìnhchính. Phần cuối chương trình tôi vẫn luôn để là GOTO $ và kết thúc với lệnh END. Tạm thời các bạn cứ viếtnhư vậy để khoá chương trình ở dòng GOTO $, khi chương trình nhảy đến đó, nó sẽ thực hiện vòng lặp vôcùng tại chỗ, còn lệnh END là lệnh bắt buộc.

Việc này giúp chúng ta phần tách rạch ròi phần chương trình con và chương trình chính để tránh nhầm lẫn.Bởi vì ở đây chúng ta mới bắt đầu các bài học cơ bản, cho nên tôi cho rằng các chương trình của các bạn viếtlà ngắn, nên chúng ta chưa đi xa hơn về việc phân bổ vị trí này. Các bạn chỉ đơn giản hiểu là chúng ta cầnphải bỏ đoạn chương trình con ở đâu đó, và chúng ta nên tách thêm một phần nữa để dành riêng cho việc viếtchương trình con. Việc làm này về sau sẽ rất có lợi, nhưng tạm thời chúng ta khoan bàn tới, và chúng ta cứviết như vậy đã.

Phân tích về đoạn chương trình con này, chúng ta thấy chương trình con luôn bao gồm như sau:

[NHÃN]các câu lệnhRETURN

Lưu ý rằng ở trên, chúng ta gọi chương trình con CALL DELAY. Như vậy, việc gọi hàm được thực hiện bằnglệnh CALL [NHÃN].

Con trỏ chương trình sẽ nhảy về [NHÃN] được gọi. Nó thực hiện các lệnh nằm từ nhãn đó trở đi. Thực hiện chođến khi gặp lệnh RETURN, nó sẽ quay trở về và thực hiện lệnh tiếp theo ngay bên dưới lệnh CALL. Ở đây,chúng ta gặp phải một vấn đề, đó là khái niệm Top of Stack. Tuy nhiên, chúng ta tạm gác nó lại cho bài họcsau, còn bây giờ các bạn chỉ cần nắm được việc thực hiện lệnh CALL bao giờ cũng đi kèm với một nhãn. Contrỏ nhảy tới nhãn và thực hiện các lệnh bên trong đó, đến khi gặp lệnh RETURN thì nó nhảy trở về vị trí nằmsau lệnh CALL đó và thực hiện tiếp công việc đang làm.

Vì bỏ qua khái niệm Top of Stack, cho nên đề nghị các bạn không đặt ra câu hỏi nếu trong các lệnh thực hiện,nó lại có một lệnh CALL gọi đi chỗ khác thì làm thế nào? Chúng ta sẽ giải quyết vấn đề này ở phần sau.

Thế bên trong hàm DELAY chúng ta làm những gì?

Lưu ý rằng, ở trên chương trình chính, sau khi đã khởi tạo PORTB là ngõ output, các bạn thấy chúng ta đã ghigiá trị d'255' vào biến COUNT_L. Cách viết giá trị như sau:

b'11001010' để xác định số nhị phând'234' để xác định số thập phân0xF3 để xác định số thập lục phân

Lưu ý:Số nhị phân chỉ có các giá trị 0 và 1, và tối đa dài 8 bit. Số thập phân chỉ có thể có giá trị từ 0 đến 255, và sốthập lục phân chỉ có giá trị từ 00 đến FF

Quay trở lại, biến COUNT_L đang mang giá trị 255.

Khi thực hiện hàm DELAY, các bạn thực hiện lệnh DECFSZ (DECrement File, Skip if Zero), có nghĩa là nó sẽgiảm giá trị của một thanh ghi nào đó một đơn vị. Nếu sau khi giảm xong, mà kết quả là 0, thì nó sẽ nhảycách ra một ô nhớ trong bộ nhớ chương trình, và thực hiện lệnh tiếp theo đó. Nếu giá trị sau khi giảm một đơnvị chưa bằng 0, thì nó sẽ thực hiện lệnh liền kề với nó.

Như vậy, vòng lặp được thực hiện như sau:

COUNT_L = 255 (ở trên đã đặt)

DELAY COUNT_L = COUNT_L - 1if COUNT_L <> 0GOTO DELAYif COUNT_L = 0RETURN

Lệnh DECFSZ [File], F/W

Nếu phía sau dấu phẩy, chúng ta để W, thì kết quả sẽ lưu vào thanh ghi W, và [File] không thay đổi giá trị gìhết. Nhưng ở đây, chúng ta muốn thực hiện như đoạn mã giả ở trên, nên chúng ta phải để là F.

COUNT_L sẽ giảm dần từ 255 đến 1, trong quá trình đó nó cứ chạy lên DELAY, rồi giảm COUNT_L một đơn vị,xong lại nhảy về DELAY, lại thực hiện việc giảm 1 đơn vị của COUNT_L

Khi COUNT_L = 1 nó lại giảm 1 đơn vị, lúc này COUNT_L = 0. Và nó không thực hiện lệnh GOTO nữa, mà thay

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

10 of 53 29/03/2013 11:54 CH

Page 11: Học PIC trong 1 ngày

falleaf

bằng lệnh NOP, sau đó nó thực hiện lệnh RETURN, có nghĩa là quay về lại lệnh CALL ở trên.

Như vậy, các bạn đã hiểu rõ hàm DELAY rồi. Nhưng quan trọng nhất là làm sao tính toán được thời gian haotốn của đoạn vòng lặp này kể từ khi bắt đầu thực hiện lệnh CALL, vì thực ra chúng ta muốn là muốn biết chínhxác thời gian thực hiện lệnh của nó.

Thời gian thực hiện của lệnh CALL DELAY là bao lâu?

Lệnh CALL khi thực hiện tốn 2 chu kỳ máy, như vậy chúng ta ghi chú là (2) ở đây.

Lệnh DECFSZ tốn 1 chu kỳ máy khi giá trị trả về khác 0. Như vậy, trong quá trình thực hiện giảm từ 255xuống 1, nó thực hiện 255 - 1 = 254 lần. Mỗi lần thế này nó tốn 1 chu kỳ máy, chúng ta ký hiệu (254) ở đây.

Khi thực hiện lệnh GOTO, lệnh GOTO tốn 2 chu kỳ máy, vậy nó cũng thực hiện 254 lần, chúng ta ký hiệu (254x 2 = 506) ở đây.

Khi COUNT_L = 1, nó vẫn thực hiện lệnh DECFSZ, vậy nó tốn thêm 1 chu kỳ máy nữa (1). Sau khi thực hiệnlệnh này, kết quả trả về là 0, vậy nó sẽ thực hiện một lệnh NOP (1), và sau đó thực hiện lệnh RETURN, lệnhRETURN tốn 2 chu kỳ máy (2)

Kết quả:

(2) + (254) + (508) + (1) + (1) + (2) = 768 chu kỳ máy

Nếu chúng ta dùng thạch anh 10MHz, mỗi chu kỳ máy tốn 0.4 us, có nghĩa là lệnh CALL DELAY tốn:

768 * 0.4 us tức là khoảng 1/3000 giây.

Chúng ta khoan bàn đến việc xa hơn, vậy thì chúng ta đã biết cách tính thời gian hao tốn của hàm DELAY rồi.Nhưng nếu tính như thế này thì quá mất công, chúng ta có thể chuyển nó thành công thức cụ thể như sau:

CALL = 2

DELAY (COUNT_L) = [COUNT_L - 1] * (DECFSZ + GOTO) + 1 + 1

RETURN = 2

Các bạn nên nhớ công thức này để sau này phát triển lên tính các công thức khác.

Có lẽ hôm nay chúng ta tạm dừng bài học ở đây

Các bạn lưu ý, tôi có tính sai một đoạn phía trên, vì quáng gà hay sao đó, tính từ 255 xuống 1 giảm chỉ có253 lần. Đúng là phải 254 lần. Như từ 2 giảm xuống 1 thì chỉ có 1 lần thôi. Xin thành thật cáo lỗi với các bạn.

26-05-2005, 10:57 PM

Tổng kết: Các bạn đã học được gì ngày hôm nay?

- Các bạn đã hiểu được khái niệm chu kỳ máy, dao động thạch anh tạo ra, PIC sẽ thực hiện 1 lệnh trong vòng4 dao động của thạch anh. Như vậy, chu kỳ máy của PIC sẽ là chu kỳ dao động của thạch anh nhân với 4, haytần số PIC sẽ bằng tần số thạch anh chia 4.

- Các bạn đã học được cách đặt biến trong một chương trình viết bằng MPASM, các bạn đã có thể đặt biến ởbất kỳ băng nào các bạn muốn

- Sau đó, các bạn bổ sung phần đặt biến này vào trong sườn chương trình lần trước đã học, các bạn hoànthiện hơn sườn một chương trình viết bằng MPASM

- Các bạn lại thêm vào sườn chương trình đó phần các chương trình con, vậy tôi thông báo với các bạn rằngcác bạn chỉ còn thiếu 2 phần nữa là ngắt (Interrupt) và bảng (Table) nữa, là các bạn đã có thể có một sườnchương trình viết bằng MPASM hoàn chỉnh. Các bạn sẽ không phải đợi lâu để hoàn tất sườn chương trình này.

- Các bạn học được cách dùng hàm CALL và RETURN, nó luôn luôn đi kèm từng cặp với nhau.

- Các bạn học thêm các lệnh: BCF, CALL, RETURN, DECFSZ

Tài liệu tham khảo:

Các bạn tham khảo datasheet PIC16F84A, PIC16F628A và PIC16F88 để biết thêm chi tiết về cấu trúc bộ nhớdữ liệu, vì có cái thì có băng 2, có cái không có, có cái lại có băng 3, băng 4.... Nhớ chú ý phần tập lệnh đểđọc hiểu thêm về các lệnh vừa học (Instruction Set)

Các bạn có thể dùng keyword: DELAY để tìm trong trang www.piclist.com những đoạn chương trình con viếtvề hàm DELAY, làm thế nào để viết hàm DELAY dài hơn?...

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

11 of 53 29/03/2013 11:54 CH

Page 12: Học PIC trong 1 ngày

falleaf

Lưu ý cuối cùng, đó là các bạn đang chuẩn bị trở thành một người viết PIC chuyên nghiệp, do đó, các bạn cầnphải nhớ các chân nào của PIC để thiết kế mạch và điều khiển, các bạn nên in hình sơ đồ chân của PIC ra đểdán lên trước bàn làm việc. Các bạn có thể download bản in tại đây (có trong datasheet, nhưng tôi muốn gửitrực tiếp cho các bạn để các bạn đỡ mất công).

Bài tập làm thêm:

1) Các bạn thấy rằng, nếu thời gian DELAY quá ngắn, trên thực tế các bạn sẽ khó thấy đèn LED nhấp nháy. Vìvậy, thay vì viết một hàm CALL DELAY, các bạn viết một dọc 20 dòng CALL DELAY liên tiếp nhau, các bạn sẽthấy sự khác biệt

2) Nhưng nếu viết 20 dòng CALL DELAY thì cũng như viết 20 dòng lệnh NOP, vậy có nghĩa là các bạn vẫn cóthể thực hiện một vòng lặp, trong đó lặp lại 20 lần, và trong vòng lặp các bạn thực hiện hàm DELAY. Như vậy,các bạn phải viết một hàm DELAY_NGOAI để bên trong thực hiện hàm DELAY_TRONG. Chính vì vậy, tôi gợi ýcho các bạn tìm trong trang web www.piclist.com để tìm các source code hàm DELAY, và các bạn sẽ biết phảilàm sao để viết hàm DELAY chờ lâu hơn. Quan trọng nhất là các bạn phải chỉ ra được công thức tính toán thờigian của hàm DELAY mà các bạn viết. (bài tập tính điểm)

3) Bây giờ các bạn có thể điều khiển một đèn LED, vậy nếu muốn 8 đèn LED nháy theo thứ tự nào đó chẳnghạn, các bạn sẽ làm thế nào? (bài tập tính điểm)

Ghi chú: (bài tập tính điểm) là những bài tập mà chúng tôi sẽ cộng đồn vào để tặng PIC cho các bạn nàotham gia giải bài như thông báo về việc bán PIC.

28-05-2005, 02:09 AM

Bài 3: Ngắt (interrupt)

Giới thiệu:

Khái niệm ngắt là một khái niệm rất phổ biến trong tất cả các hệ thống vi điều khiển, vi xử lý và máy tính.Vậy ngắt là gì?

Các bạn hình dung hình ảnh chúng ta đang đi xe máy trên bờ ruộng, con đường đi rất dài và rất thẳng, bỗngnhiên có một con bò chạy ngang, húc chúng ta xuống ruộng. Cả xe và người lao xuống ruộng. Chúng ta lồmcồm bò dậy, phủi quần áo, chửi đổng lên một cái vì chẳng biết chửi ai, thế là chúng ta đem ông trời ra chửi.Sau đó, chúng ta dắt xe máy lên bờ ruộng, tại cái chỗ mà chúng ta bị húc té xuống, rồi chúng ta lấy xe chạytiếp. Nếu lỡ có một con bò nào khác, lại húc chúng ta.. thì....

Hoạt động ngắt cũng giống như vậy, khi chúng ta đang chạy một chương trình chính nào đó, bỗng nhiên cómột sự kiện xảy ra, chúng ta phải dừng việc chúng ta đang làm lại, và giải quyết cái sự việc xảy ra đó. Cuốicùng, chúng ta lại quay trở về cái chỗ mà chúng ta đã tạm dừng lại lúc nãy và tiếp tục công việc đang làm.

Khái niệm ngắt chỉ đơn giản như vậy, tuy nhiên, đối với vi điều khiển nói chung, và PIC nói riêng, ngắt có thểdo rất nhiều nguồn xảy ra, và với mỗi nguồn ngắt khác nhau, chúng ta có thể định trước rằng trong ngắt đóchúng ta sẽ làm việc gì. Cũng như khi đi trên bờ ruộng, chúng ta có thể bị bò húc, cũng có thể bị trâu húc,cũng có thể bị vấp cục đã, cũng có thể bị lọt ổ gà... Và nếu như bị bò húc thì chúng ta chửi ông trời, bị trâuhúc chúng ta mắng ông trăng, bị vấp cục đá chúng ta tự trách mình xui xẻo, và đến khi vấp ổ gà... thì chúngta vô nhà thương...

Các nguồn ngắt trong PIC:

Số lượng và loại nguồn ngắt trong PIC rất đa dạng, và rất khác nhau ở mỗi dòng PIC. Do vậy không thể liệt kêhết ra đây tất cả các dòng PIC và tất cả các loại ngắt trong từng dòng được. Chúng ta chỉ đưa ra đây sơ đồtổng quát của các nguồn ngắt, và đi sâu vào một số loại ngắt phổ biến.

http://i3.photobucket.com/albums/y64/falleafd/cacnguonngat.gif

Hình 1: mô tả tất cả các nguồn ngắt của dòng PIC Midrange

Chúng ta chú ý đến một số điểm sau:

1) Trong hình có các ký hiệu cổng logic AND và OR

http://i3.photobucket.com/albums/y64/falleafd/and.gif

Đây là cổng AND, có nghĩa là chỉ khi đầu vào của hai cổng này đều có giá trị là 1, thì đầu ra mới có giá trị là 1.Chúng ta quan sát một góc hình bên trái phía dưới TXIF và TXIE, chúng đi qua cổng AND, chỉ khi nào bit TXIEbật lên, và bit TXIF cũng được bật lên, thì lúc đó ngõ ra nối vào cổng OR phía trên mới có giá trị.

http://i3.photobucket.com/albums/y64/falleafd/or.gif

Đây là cổng OR, có nghĩa là chỉ cần một trong các tín hiệu ngõ vào có giá trị là 1, thì ngõ ra sẽ có giá trị là 1.Như vậy, nếu cả TXIE và TXIF đều có giá trị 1, thì ngõ ra sau cổng AND của chúng sẽ có giá trị 1 và ngõ rasau cổng OR cũng có giá trị 1, bởi vì ít nhất cổng OR ở đây cũng có 1 ngõ vào có giá trị 1.

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

12 of 53 29/03/2013 11:54 CH

Page 13: Học PIC trong 1 ngày

falleaf

Chúng ta cứ tiếp tục như vậy mà suy ra.

2) Điểm thứ hai, là các chữ đuôi IE và IF:

IE ở đây là viết tắt của chữ Interrupt Enable, và IF ở đây viết tắt của Interrupt Flag.

IE có nghĩa là chúng ta cho phép kích hoạt một loại ngắt nào đó xảy ra hay không. Đây là tín hiệu mà chúngta có thể quy định ngay từ ban đầu. Mặc định, tất cả chúng đều có giá trị 0, chỉ khi nào chúng ta cho phépmột ngắt nào đó xảy ra, thì về sau nó mới xảy ra ngắt đó thôi.

Cũng giống như, ban đầu trên bờ ruộng có dãy rào chắn, thì con bò không thể nào húc bạn té được, nếu bạnbỏ hàng rào ra, thì nếu có con bò húc bạn, bạn sẽ té. Nguyên lý này đơn giản như vậy thôi.

IF ở đây là các cờ ngắt. Tức là khi bạn bị bò húc, thì có một người cầm cờ giơ lên báo là bạn đã bị bò húc, đểnhững người dưới ruộng reo hò...hihi... Và tất nhiên, khi bạn không phá rào cản thì người trên ruộng vẫn có.Và khi con bò lao vào bạn, thì người ta cũng phất cờ lên như thường, nhưng bị cái rào cản nên bạn cứ thoảimái mà đi con đường của bạn, chẳng phải quan tâm đến việc té xuống, chửi bới hay trèo lên làm gì.

Cái rào cản chính là IE và cái sự việc cuối cùng mà bạn vẫn đi hay lồm cồm bò dậy đó chính là cái cổng ANDmà chúng ta vừa nói trên kia.

30-05-2005, 10:25 PM

3) Điểm thứ ba, các lớp ngắt:

Bạn thấy rằng, trong hình, rõ ràng có 2 lớp ngắt. Lớp thứ nhất nằm bên tay trái ngoài cùng, lớp thứ hai nằm ởgiữa hình. Lớp thứ ba chỉ có một cổng AND nên chúng ta không kể tới làm gì.

Lớp thứ nhất được gọi là lớp ngắt ngoại vi.

Thực chất lớp này vì có quá nhiều nguồn ngắt, và các nguồn ngắt này đều là một số chuẩn giao tiếp, hoặcchức năng đặc biệt của PIC, cho nên người ta phân ra làm lớp ngắt ngoại vi. Để các ngắt ngoại vi hoạt động,trước tiên chúng ta phải cho phép ngắt ngoại vi, tức là bật bit PIE lên. Còn cụ thể muốn cho ngắt ngoại vi nàohoạt động, thì chúng ta bật ngắt đó lên. Trên sơ đồ các bạn cũng thấy rõ thông qua các cổng AND và OR.

Lớp thứ hai tạm gọi là lớp ngắt phổ thông.

Khi muốn dùng các nguồn ngắt phổ thông, chúng ta chỉ việc bật các bit IE của nguồn ngắt này. Tất nhiên,cuối cùng, chúng ta phải bật ngắt toàn cục GIE thì ngắt mới được phép xảy ra (kể cả ngắt ngoại vi và ngắtphổ thông. Khi đó, PIE được coi là một nguồn ngắt phổ thông.

Điều này cũng giống như khi bạn chạy xe trên bờ ruộng, một hàng rào dài chạy dọc theo con đường, chính làngắt toàn cục GIE. Lớp bên ngoài thứ hai là lớp ngắt phổ thông, bao gồm luôn cả ngắt ngoại vi PIE. Và ngoàicùng là các hàng rào thuộc lớp ngắt ngoại vi.

Nếu các bạn bật các nguồn ngắt, mà không bật ngắt toàn cục GIE thì cho dù ngắt có xảy ra, thì chương trìnhvẫn không dừng để thực hiện ngắt, giống như con bò có thể lao qua hàng rào ngoài cùng đã được mở, nhưngvẫn còn hàng rào trong cùng.

Như vậy, các bạn đã hiểu một cách tổng quan về hoạt động ngắt của PIC, những nguyên tắc phải bật hay tắtngắt.

Điểm lưu ý cuối cùng, đó là tôi muốn giới thiệu với các bạn rằng, chữ ký hiệu trong bảng, là tên các bit liênquan đến việc bật tắt ngắt. VD: bit PIE, INTE.. nằm trong thanh ghi INTCON (ngắt phổ thông), các bit quyđịnh ngắt ngoại vi nằm trong các thanh ghi PIR và PIE.

Vectơ ngắt của PIC:

Như lần trước đã giới thiệu, vectơ ngắt của PIC nằm ở vị trí 0x0004 các bạn xem lại hình sau:

Khác với khi bạn bị té ruộng, bạn té xuống ngay tại chỗ bạn bị húc, đối với vi điều khiển, khi xảy ra interrupt,nó sẽ nhảy về một địa chỉ cố định, và thực hiện công việc tại đó. Sau khi thực hiện xong, nó sẽ quay trở về vịtrí mà từ đó nó đã thoát ra. Vị trí cố định mà nó sẽ nhảy về khi xảy ra ngắt là vị trí 0x0004.

Chương trình ngắt:

Lại quay về thí dụ té ruộng, có lẽ tôi thích cái thí dụ này vì nó có thể giúp bạn hình dung mọi thứ. Bây giờ cácbạn hãy chia giai đoạn từ khi bị bò húc, té xuống ruộng, rồi bạn chửi đổng lên, rồi bạn lồm cồm bò lên. Vậycho dù bạn bị bò húc, hay bị vấp ổ gà, thì chỉ có giai đoạn bạn chửi đổng lên là khác nhau, còn lại, giai đoạnbạn té xuống ruộng là té xuống ruộng, và sau đó thì bạn cũng bò lên.

Vậy ngắt cũng giống thế, khi nhảy vào ngắt, bạn sẽ có một giai đoạn cần phải nhảy vào ngắt, và một giaiđoạn nhảy ra khỏi ngắt, còn bên trong ngắt đó các bạn làm cái gì là nội dung cần thực hiện của từng nguồnngắt.

Tôi cung cấp ra đây đoạn chương trình ngắt chuẩn, từ nay về sau, các bạn chỉ cần copy đoạn chương trình này

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

13 of 53 29/03/2013 11:54 CH

Page 14: Học PIC trong 1 ngày

và sử dụng:

;================================================= ==================ORG 0x0000GOTO MAINORG 0x0004GOTO INTERRUPTORG 0x0005MAIN; đây là phần chương trình chính của các bạn

;================================================= ==================

INTERRUPT

RETFIE;================================================= ==================; Các chương trình con được viết ở đây

;================================================= ==================GOTO $END;================================================= ==================

Như vậy, một lần nữa, chúng ta bổ sung sườn chương trình của chúng ta một cách chi tiết hơn. Chúng ta vừathêm vào một đoạn chương trình con INTERRUPT. Thực ra, gọi INTERRUPT là một chương trình con cũngkhông sai, nhưng vì nó khá đặc biệt, nên chúng ta cứ tách rời nó ra.

Khởi tạo và kết thúc ngắt:

Tôi cung cấp dưới đây đoạn chương trình khởi tạo và kết thúc ngắt đầy đủ cho PIC, từ nay về sau, khi muốnsử dụng ngắt, các bạn chỉ cần copy và paste đoạn code này lại, hoàn toàn không cần sửa chữa gì và cứ thế sửdụng.

Tôi sẽ dành cho các bạn đặt câu hỏi về phần này để từ các câu hỏi, có thể giải thích rõ hơn vì sao chúng ta lạiviết như vậy, từng điểm một. Nếu không, tôi không thể có thời gian để viết tất cả mọi vấn đề về ngắt ra đâyđược.

;============================================================================================INTERRUPT

;-------------------------------------------;Doan ma bat buoc de vao ngat;-------------------------------------------

MOVWF W_SAVE ;W_SAVE(bank unknown!) = WSWAPF STATUS, WCLRF STATUS ; force bank 0 for remainder of handlerMOVWF STAT_SV ; STAT_SV = swap_nibbles( STATUS ); STATUS = 0MOVF PCLATH, WMOVWF PCH_SV ; PCH_SV = PCLATHCLRF PCLATH ; PCLATH = 0MOVF FSR, WMOVWF FSR_SV ; FSR_SV = FSR; 10 cycles from interrupt to here!

;-----------------------------------;Doan chuong trinh ngat;-----------------------------------

; cac ban se viet chuong trinh ngat o day

;--------------------------------------------------;Doan ma bat buoc de ket thuc ngat;--------------------------------------------------

MOVF FSR_SV, WMOVWF FSR ; FSR = FSR_SVMOVF PCH_SV, WMOVWF PCLATH ; PCLATH = PCH_SVSWAPF STAT_SV, WMOVWF STATUS ; STATUS = swap_nibbles( STAT_SV )SWAPF W_SAVE, FSWAPF W_SAVE, W ; W = swap(swap( W_SAVE )) (no change Z bit)

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

14 of 53 29/03/2013 11:54 CH

Page 15: Học PIC trong 1 ngày

falleaf

BSF INTCON, GIERETFIE;=================================================================================================== =

Như vậy, chương trình ngắt được chia làm 3 phần chính.Phần thứ nhất là phần bắt đầu vào ngắt, đây là đoạn chương trình bắt buộc, tất nhiên không hoàn toànnghiêm ngặt như vậy, vì thực tế nhiều khi bạn không dùng đến tất cả các lệnh này, nhưng vì mục đích cungcấp các khái niệm cơ sở, và công cụ làm việc đầy đủ, tôi cung cấp cho bạn chương trình ngắt chi tiết. Phầnthứ hai là phần chương trình ngắt của bạn. Khi xảy ra ngắt, bạn muốn làm cái gì, thì bạn bắt đầu viết từ phầnnày trở đi. Phần thứ ba là phần kết thúc ngắt, bạn cứ viết nguyên bản như vậy không cần sửa đổi.

Tạm thời, sẽ không có các phân tích chi tiết giống như các bài học trước, các bạn có thể tự tìm hiểu thêm, nếukhông, có thể đặt câu hỏi, và chúng ta sẽ từ từ tìm hiểu rõ hơn về ngắt của PIC.

Thời gian tới đây, có lẽ tôi hơi bận, cho nên tôi không thể viết bài liên tục được, mong rằng các bạn cố gắngtìm hiểu và học tốt PIC. Đến giai đoạn này, các bạn đã có thể dùng con PIC, giống như một con 89C51 thôngthường. Và các bạn thấy đấy, thực sự PIC chỉ cần 1 ngày để học.

Chúng ta vừa học xong 3 bài học cơ bản nhất của một con vi điều khiển: Điều khiển port, viết hàm delay vàviết chương trình ngắt.

Phần thứ tư của bài viết chương trình ngắt, sẽ đi chi tiết vào các ngắt và giải thích rõ nghĩa từng ngắt. Nhưngthiết nghĩ, tôi nên kết hợp bài học này ở đây, và kết hợp phần thứ tư vào bài học sau: Nút bấm và các ngõ vàocủa PIC.

Tài liệu tham khảo:

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011006

07-06-2005, 10:43 PM

Các bạn vừa biết khái niệm ngắt, và đã biết chương trình ngắt được viết như thế nào. Vậy bây giờ chúng tachuyển đến bài tiếp theo về nút bấm.

Công dụng của nút bấm

Nút bấm là một hình thức ra lệnh phổ biến nhất trên thế giới. Bạn gọi một cái thang máy, bạn bấm nút, bạnkêu cửa thì bấm chuông, bạn bật đèn thì bấm nút công tắc, và tôi đang ngồi viết cho bạn bằng cách bấm nútbàn phím...

Như vậy, bạn đã biết công dụng của cái nút bấm. Bây giờ các bạn sẽ học cách làm một cái nút bấm!!! Điềunày có vẻ buồn cười, nhưng với vi điều khiển, và máy tính, khả năng xử lý các lệnh rất đa đạng. Bạn có thểbấm cùng một nút, nhưng lệnh sẽ khác nhau ở mỗi thời điểm, và mỗi trạng thái. Ví dụ, như bạn nhấp chuộtmáy tính, thực ra cũng là bạn nhấp nút bấm, nhưng bạn thấy rõ ràng rằng, ở những vị trí di chuyển chuộtkhác nhau, nút bấm của chuột sẽ đưa ra các mệnh lệnh khác nhau cho máy tính thực hiện.

Một số trạng thái nút bấm thông dụng

Trạng thái nút bấm ra lệnh tức thời, đó là khi bạn bấm nút, lập tức mọi trạng thái phải được kiểm tra vàchương trình dừng lại để thực hiện lệnh từ nút bấm của bạn. Có nghĩa là bạn ra lệnh tại thời điểm bấm nút, vàmáy hiểu rằng bạn đã bấm nút. Còn việc xử lý thế nào thì hồi sau phân giải.

Trạng thái chờ nút bấm, đó là chương trình bạn đang chạy, đến một giai đoạn nào đó, nó cần phải có sự ralệnh của bạn bằng nút bấm, và chương trình chờ bạn bấm nút để chạy tiếp, hoặc bắt đầu một công việc nàođó sau khi chờ.

Nhắc lại thao tác bấm nút một chút, cái nút của bạn đang ở trên cao, bạn bấm nó xuống thì nó sẽ có một giaiđoạn nút bấm đi xuống, khi chạm vào mạch điện, hiển nhiên bạn muốn hay không muốn thì cũng phải có mộtkhoảng thời gian bạn giữ cho nút bấm tiếp xúc với mạch điện, sau đó là giai đoạn bạn thả nút bấm ra.

http://i3.photobucket.com/albums/y64/falleafd/nutbam1.gif

Theo dõi hình trên, chúng ta thấy. Khi bấm nút, có quá trình đi xuống của nút bấm, và quá trình đi lên củanút bấm. Nhưng thực tế, đối với mạch điện trong nút bấm, nó chỉ có thể nhận được trạng thái tiếp xúc hoặckhông tiếp xúc, nên tín hiệu nhận được sẽ như đường màu xanh trong hình dưới. Chúng ta chỉ quan tâm đếntrạng thái của đường màu xanh trong các ứng dụng của nút bấm.

Vậy, trạng thái nút bấm lại có thêm 3 trạng thái nữa là trạng thái bấm xuống, trạng thái giữ nút bấm, vàtrạng thái nhả nút bấm lên. Kết hợp với 2 trạng thái điều khiển trên, chúng ta có 6 trạng thái phổ biến củanút bấm. Các bạn lưu ý rằng, chúng ta có 6 trạng thái chứ không phải chỉ có 4 trạng thái, vì thực ra rất nhiềungười cho rằng chỉ có 4 trạng thái khi cho rằng trạng thái chờ trong lúc giữ nút bấm không phải là trạng tháiphổ biến. Nhưng nếu các bạn đã từng dùng điện thoại di động thì các bạn thấy số người dùng trạng thái chờcủa nút bấm cũng không phải là con số nhỏ.

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

15 of 53 29/03/2013 11:54 CH

Page 16: Học PIC trong 1 ngày

falleaf

falleaf

Ở đây, tôi muốn tán dóc một chút rằng, khi các bạn làm việc về khoa học kỹ thuật, và đến một khi các bạnkhó có thể tìm ra đường hướng suy nghĩ để giải quyết một vấn đề khoa học kỹ thuật, hãy tìm mối liên hệ vớinó trong khoa học xã hội. Chính vì vậy, các bạn thường thấy tôi hay đưa ra những ví dụ xã hội để minh hoạcho vấn đề kỹ thuật cần được giải quyết.

Tôi sẽ dành việc ứng dụng từng trạng thái nút bấm phổ biến trong các ứng dụng cho các bạn, còn ở đây, tôichỉ muốn nhân bài học này để tiếp tục bài học về interrupt mà chúng ta đã bỏ dở trước đó.

Vậy chúng ta chỉ xét trạng thái khi bấm nút, lập tức lệnh sẽ được thực hiện, tức trạng thái tức thời của nútbấm.

Các bạn hãy làm bài tập thực hành, thực hiện một mạch điện tử như hình sau để chuẩn bị cho bài học củachúng ta.

http://i3.photobucket.com/albums/y64/falleafd/NUT_1.gif

Trong mạch điện này, chúng ta thấy có một vài điểm đặc biệt khi có 1 nút bấm nối giữa chân của PIC vànguồn, còn các nút bấm khác lại nối chân của PIC với đất.

Giữa nguồn và đất luôn có một điện trở 10K. Vì sao chúng ta phải nối mạch điện như vậy? Chúng ta tạm dừngbài học về nút bấm ở đây và theo dõi bài học cơ bản về điện tử tiếp theo.

07-06-2005, 10:48 PM

Điện tử cơ bản

Giới thiệu

Đây là phần rất cơ bản về điện tử, mà các bạn khi bắt đầu làm việc với vi điều khiển cần phải nắm rõ. Như đãnói, PIC tạo ra dòng điện khoảng 20mA và điện áp khoảng 5V, tương tự như vậy, nếu dòng ngõ vào quá caoso với 20mA và điện áp ngõ vào quá cao so với 5V, thì PIC sẽ bị hư.

Vì vậy, bài học này trang bị cho các bạn một số khái niệm cơ bản về điện tử, để các bạn có thể nắm vữngnguyên lý thiết kế mạch và tính toán các giá trị điện trở cần thiết. Đáng lẽ bài học này cần được thực hiệnngay từ đầu, tuy nhiên, tôi cho rằng bài tập đèn LED quá đơn giản, các bạn chưa biết gì cũng có thể hiểuđược, nhưng nay, nếu như các bạn mới học về điện tử và vi điều khiển không được trang bị kiến thức cơ bảnnày, có thể làm cho các bạn lúng túng vì một số điểm không được làm rõ trong mạch điện tử.

Hiện tượng trôi điện áp

Các bạn xem hình sau:

http://i3.photobucket.com/albums/y64/falleafd/BASIC_1.gif

Chúng ta cho rằng ngõ vào của PIC, cũng giống như ngõ vào của một linh kiện điện tử thông dụng là 74HC04.Thay vì vẽ một cái chân PIC, thì chúng tôi vẽ hình một con 74HC04 cho nó đơn giản, và để các bạn dễ hìnhdung. Nếu để một con PIC lên một hình thì quá phức tạp hình ảnh, và lại không cần thiết. Hơn nữa, bài viếtnày được tham khảo từ tài liệu Very Basic Circuits của Encoder, và trong trang web này, người ta sử dụng74HC04 để làm thí dụ, tôi tôn trọng ví dụ này nên khi viết lại bài viết cũng sử dụng 74HC04 giống như họ.

Các bạn thấy, nếu như nút bấm được nhấn xuống, thì ngõ vào của 74HC04 hay PIC được nối với Mass. Nhưvậy, lúc đó PIC có thể đọc giá trị 0. Tuy nhiên, nếu nút nhấn được thả ra, chúng ta thấy rằng ngõ vào của PICchẳng được nối với một linh kiện nào, vậy là điện áp ở chân của PIC sẽ trôi nổi không xác định được. Nếukhông may mắn, điện áp trôi nổi này rơi vào vùng logic 0, rồi lại nhảy sang vùng logic 1... thì các bạn thấy rõràng chúng ta không thể xác định được nút bấm có được bấm hay không?!!

Vì vậy, để đảm bảo, nếu khi không bấm nút, PIC phải có điện áp tham khảo là 5V, sau khi bấm nút thì điệnáp sẽ giảm xuống 0V, như vậy mức logic mới thật rõ ràng, không thể để trôi nổi như hình trên. Vậy chúng tacó hình dưới đây

http://i3.photobucket.com/albums/y64/falleafd/BASIC_2.gif

07-06-2005, 10:49 PM

Công dụng của điện trở kéo lên

Các bạn lại thấy, nếu bây giờ không bấm nút, thì điện áp ngõ vào của PIC sẽ là 5V. Nhưng nếu bấm nút mộtcái, rõ ràng chúng ta gây ra ngắn mạch khi nối trực tiếp từ nguồn xuống đất.

Chính vì vậy, chúng ta phải đưa thêm vào một điện trở giữa đất, nút bấm và nguồn.

Có hai vấn đề đặt ra, đó là điện trở sẽ đặt ở đâu, và giá trị của nó bằng bao nhiêu.

Chúng ta xem hình này:

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

16 of 53 29/03/2013 11:54 CH

Page 17: Học PIC trong 1 ngày

zero2one

http://i3.photobucket.com/albums/y64/falleafd/BASIC_5.gif

Các bạn sẽ bực mình ngay rằng, đúng là thằng ngốc mới đặt điện trở như thế này, bởi vì nếu đặt điện trở nhưvậy, dù bạn có bấm nút hay không bấm nút thì điện áp ngõ vào vẫn luôn luôn là 5V, vậy nút bấm trở nên vônghĩa.

Thế thì chỉ còn một cách đặt điện trở như hình tiếp theo đây:

http://i3.photobucket.com/albums/y64/falleafd/BASIC_3.gif

Vậy vấn đề còn lại là giá trị điện trở bẳng bao nhiêu?

Các bạn sẽ thấy, PIC hoạt động ở 20mA và 5V trên các chân. Vì vậy, khi chưa bấm nút, nguồn 5V được nối vớiđiện trở và đi vào chân của PIC. Nếu như trong một trường hợp nào đó chân của PIC chuyển từ chế độ inputsang output, thì vấn đề xảy ra là dòng trên chân phải đảm bảo nhỏ hơn hoặc bằng 20mA. Như vậy, trong thiếtkế trên, chúng ta xem dòng tại chân PIC nếu PIC đặt ở 0V là

I = U/R = 5V/ 10000 Ohm = 5mA

Như vậy, thiết kế này đảm bảo cho hoạt động của PIC được an toàn.

Khi đóng nút bấm dòng 5mA này sẽ đi xuống đất, và chân của PIC được nối với đất.

Các bạn xem tiếp hình sau:

http://i3.photobucket.com/albums/y64/falleafd/BASIC_4.gif

Trường hợp này, nút bấm được nối với nguồn 5V. Điện trở nối giữa chân của PIC với đất sẽ không làm cho PICcó hiện tượng trôi nổi điện áp, và khi đóng nút bấm thì dòng vẫn ở 5mA.

Tổng kết:

Qua bài học này, các bạn đã hiểu được cơ bản về khái niệm điện trở kéo lên (trường hợp điện trở nối vớinguồn), và điện trở kéo xuống (trường hợp điện trở nối với đất). Giá trị điện trở được đặt ở đây nhằm loại bỏhiện tượng ngắn mạch, và đảm bảo ngõ vào của PIC khoảng 20mA. Khi an toàn, cần thiết kế sao cho ngõ vàonhỏ.

20-06-2005, 02:27 AM

;============================================================================================INTERRUPT

;-------------------------------------------;Doan ma bat buoc de vao ngat;-------------------------------------------

MOVWF W_SAVE ;W_SAVE(bank unknown!) = WSWAPF STATUS, WCLRF STATUS ; force bank 0 for remainder of handlerMOVWF STAT_SV ; STAT_SV = swap_nibbles( STATUS ); STATUS = 0MOVF PCLATH, WMOVWF PCH_SV ; PCH_SV = PCLATHCLRF PCLATH ; PCLATH = 0MOVF FSR, WMOVWF FSR_SV ; FSR_SV = FSR; 10 cycles from interrupt to here!

;-----------------------------------;Doan chuong trinh ngat;-----------------------------------

; cac ban se viet chuong trinh ngat o day

;--------------------------------------------------;Doan ma bat buoc de ket thuc ngat;--------------------------------------------------

MOVF FSR_SV, WMOVWF FSR ; FSR = FSR_SVMOVF PCH_SV, WMOVWF PCLATH ; PCLATH = PCH_SVSWAPF STAT_SV, WMOVWF STATUS ; STATUS = swap_nibbles( STAT_SV )SWAPF W_SAVE, F

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

17 of 53 29/03/2013 11:54 CH

Page 18: Học PIC trong 1 ngày

tuanva

falleaf

tuanva

falleaf

zero2one

SWAPF W_SAVE, W ; W = swap(swap( W_SAVE )) (no change Z bit)

BSF INTCON, GIERETFIE;=================================================================================================== =

theo em biết thì khi vào chương trình ngắt ta phải lưu lại giá trị của hai thanh ghi : STATUS và W để sau khithực hiện trình phục vụ ngắt sẽ khôi phục lại. Còn PC thì được tự động lưu vào STACK. Vậy, các tác động vàoPCLATH... trên đoạn CODE của bác là nhằm mục đích gì vậy ?

còn nữa : CLRF STATUSthì chưa chắc STATUS = 0 ! vì trong STATUS có một số bit không chịu tác động - giá trị của chúng không đổi ?

em mới học, mong bác chỉ rõ hơn.

20-06-2005, 10:55 AM

Mình muốn biết thêm về W reg (Work register)? Chưa thấy Falleaf nói rõ về thanh ghi này.

20-06-2005, 09:26 PM

Z,

1) Ngắt có nhiều tác vụ, có thể bị tràn stack, hoặc dùng nhiều ngắt cùng lúc, làm động tác này, khóa cứng tấtcả luôn.

2) Đã có lệnh SWAPF trước đó để lưu lại giá trị thanh STATUS rồi, chú ý.

T,

Dạo này mình hơi bạn, chưa thể viết bài được, hẹn đầu tháng 7 viết tiếp.

Chúc vui.

21-06-2005, 09:48 AM

Mình hỏi thêm về không gian địa chỉ của PIC. Giới hạn mở rộng bộ nhớ của PIC (mấy loại thường dùng ấy,16F... và 18F...) là bao nhiêu? Nếu như mình cần mở rộng đến 10MB bộ nhớ có được không nhỉ?

To Falleaf:Xin lôĩ vì đã quấy rầy khi cậu đang bận. Mình sẽ đợi đến lúc cậu rảnh. Chúc cậu thành công.

23-06-2005, 09:44 PM

Chưa thể trả lời chi tiết lúc này, nhưng việc lắp thêm được bao nhiêu dung lượng nhớ, phụ thuộc vào chuẩngiao tiếp với ROM, RAM ngoài.

Để đơn giản, tôi lấy thí dụ một con ROM có 2 bit địa chỉ để enable nó. Như vậy, trên mạch, nếu bạn dùng 1đường nối, bạn chỉ có thể nối tối đa 4 con ROM ngoài. Như vậy, điều này giới hạn số lượng ROM, RAM được nốivào PIC.

Điều thứ hai, khi truy cập bằng các chuẩn giao tiếp như I2C, SPI, tùy thuộc vào bạn sử dụng giao tiếp với baonhiêu bit địa chỉ, thì bạn sẽ có số lượng giới hạn bấy nhiêu thiết bị có thể kết nối với PIC. Hiện nay, một sốPIC hỗ trợ 2 cổng I2C, và thêm mấy cổng SPI.. nếu bạn có đủ can đảm dùng hết số cổng này cho việc kết nốivào ROM, thì đúng là tôi cũng chịu thua luôn.

Con số 10MB tôi chưa bao giờ tính toán thử khả năng tối đa của nó, nhưng theo ước tính sơ bộ thì là khôngthể.

Nhưng nếu bạn làm cách này, bạn thiết lập chuẩn giao tiếp, và kết nối với các con Flash, thì bạn thích kết nốiđến bao nhiêu cũng được. Bởi vì theo tôi biết, con Flash lớn nhất hiện nay có dung lượng 1GB.

Bạn có bao giờ mở cái USB key của bạn ra chưa? Thực ra trong đó là một con Flash. Đáng tiếc, tôi chưa baogiờ thử kết nối với nó, nên không biết trả lời bạn cách nào.

Các con ROM thông dụng 512Kbit. Bạn có thể tìm trên www.microchip.com

Chúc vui.

02-07-2005, 02:09 AM

có điều này chưa hiểu, mong các bác chỉ giáo :

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

18 of 53 29/03/2013 11:54 CH

Page 19: Học PIC trong 1 ngày

falleaf

zero2one

tuanva

trong MPLAB, để khai báo biến có rất nhiều cách theo các derectives của nó : RES, EQU... với EQU có thể khaibáo hằng, biến thanh ghi nhưng với một cấu trúc như vậy thì khi nào biết được nó là thanh ghi, khi nào nó làmột hằng ?

02-07-2005, 02:44 AM

Nếu hiểu nôm na theo cách này, bạn có thể sẽ dễ hiểu nó hơn, một hằng là một giá trị. Giá trị đó có thể nằmtrong thanh ghi dữ liệu (bộ nhớ dữ liệu), nhưng cũng có thể nằm trong lệnh điều khiển (bộ nhớ chương trình).Điều này khẳng định rằng, hằng là một giá trị.

Một khi bạn đặt một tên nào đó, để đại diện cho một hằng số, có nghĩa là thay vì bạn viết cái giá trị đó, thìbạn viết cái tên đại diện đó, để dễ nhớ. Chẳng hạn, bạn viết chữ pi, đại diện cho hằng số có giá trị3.1415926....

Trong khi đó, nếu bạn đặt một biến pi, thì có nghĩa là bạn xác định địa chỉ của thanh ghi dữ liệu nào đó, màmỗi khi bạn truy xuất đến biến pi, có nghĩa là bạn đang thao tác với thanh ghi ở địa chỉ mà biến pi đại diện. Vídụ: bạn đặt biến pi ở thanh ghi 0x20 chẳng hạn. Điều đó có nghĩa là khi ban làm gì với biến pi, chính là bạnđang làm việc với thanh ghi ở địa chỉ 0x20.

Nhưng bạn sẽ thấy rằng, vậy biến pi và hằng số pi có gì khác nhau? Bây giờ biến pi và hằng pi cũng đềumang giá trị cả. Nhưng các bạn nên nhớ, trong câu lệnh lúc nào vị trí của biến (thanh ghi) F, và vị trí củahằng số k (trong cấu trúc một câu lệnh MPASM, tôi sẽ post lại bài này từ dddt). có sự phân biệt rõ ràng.

Vậy tùy theo vị trí bạn đặt nó ở đâu, nó sẽ là biến, hoặc là hằng. Nếu là biến, nó chỉ mang giá trị của dịa chỉcủa thanh ghi nằm trong bộ nhớ dữ liệu, nếu là hằng, nó nằm đâu cũng được kể cả ở bộ nhớ dữ liệu và bộ nhớchương trình.

Các bạn cần tham khảo bài viết tập lệnh MPASM và kiến trúc PIC và bài kỹ thuật bảng, đã được đăng tạiwww.diendandientu.com.

Khi có thời gian, tôi sẽ chuyển bài viết đó về đây để các bạn xem.

02-07-2005, 02:13 PM

Vậy tùy theo vị trí bạn đặt nó ở đâu, nó sẽ là biến, hoặc là hằng. Nếu là biến, nó chỉ mang giá trị của dịa chỉcủa thanh ghi nằm trong bộ nhớ dữ liệu, nếu là hằng, nó nằm đâu cũng được kể cả ở bộ nhớ dữ liệu và bộ nhớchương trình.

Em vẫn còn đôi điều khúc mắc, mong bác nhiệt tình chỉ bảo :Khi viết :LABLE1 EQU 0x20....MOVLW 0xFFMOVWF LABLE1-> lúc này em muốn LABLE1 là một biến, đặt nó ở vị trí 0x20 trong RAM -> OK.

Còn :LABLE2 EQU 0x20...MOVLW LABLE2-> em muốn LABLE2 là một hằng mang giá trị 0x20 và OK.

Nhưng nếu gộp lại :LABLE3 EQU 0x20...MOVLW 0xFFMOVWF LABLE3

MOVLW LABLE3 ;!!!!???? :confused:

thì W = ?, có gì sai không ?

Như vậy, chốt lại : cụ thể với câu lệnh "LABLE3 EQU 0x20" thì trình dịch nó có hiểu LABLE3 là hằng hay là mộtthanh ghi (biến) ? Hay là nó phải phụ thuộc vào những thao tác phía sau này, xem người dùng định nghĩa nónhư hằng hay thanh ghi ? :confused:Ý của em là vậy, vì mới học nên thắc mắc lung tung, thấy bác nhiệt tình nên em mới dám hỏi. Mong bác chỉbảo :)

02-07-2005, 02:55 PM

Tôi đã làm mạch chạy theo hướng dẫn. Tôi dùng thạch anh 10Mhz. Xin hỏi nếu tôi muốn PIC chạy tốc độ <10Mhz (8 MHz chẳng hạn) mà ko thay thạch anh có được không? Làm thế nào?

Thank.

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

19 of 53 29/03/2013 11:54 CH

Page 20: Học PIC trong 1 ngày

tuanva

falleaf

zero2one

falleaf

02-07-2005, 06:00 PM

Phần nút bấm falleaf có thể cho 1 đoạn code mẫu (dùng cho mạch trong bài này) được không?

03-07-2005, 12:08 AM

Hiện nay tôi đang khá bận, cho nên các câu hỏi của các bạn, tôi sẽ trả lời sau.

Tôi đề nghị rằng chúng ta nên tạo ra một cái luồng khác để thảo luận, và đặt các câu hỏi ngắn. Phần bài viếtnày có lẽ các bạn chỉ nên nói về những cái đúng, cái sai trong bài viết của tôi, và những đề nghị cải tiến, hoặcnhững sản phẩm minh họa mà các bạn đã thực hiện từ bài viết này.

Bởi vì những bài viết này, sau này sẽ được tổng hợp thành tutorial về PIC, và tôi không đủ khả năng một mìnhviết hết tất cả các vấn đề như các cuốn sách lớn khác, nên tôi rất cần sự bổ sung sản phẩm thực tế của cácbạn, sẽ làm cho cuốn sách có giá trị hơn.

Vì nếu không, các bạn cứ đặt câu hỏi ở đây, luồng này sẽ rất dài, và gây khó khăn cho người đọc.

Chân thành cảm ơn.

Falleaf.

03-07-2005, 12:50 AM

OK, ủng hộ bác falleaf.

11-07-2005, 10:45 PM

Thanh ghi W

Trong bài này, chúng ta nói đôi nét về thanh ghi W để các bạn nắm rõ hơn phương thức hoạt động của PIC.

Khái niệm thanh ghi W:

Thanh ghi W là thanh ghi làm việc (Working register), và hầu hết mọi lệnh của PIC đều liên quan đến thanhghi W này, lấy thí dụ như ADDLW (cộng một số vào giá trị đã có trong thanh ghi W), SUBWF (trừ giá trị củathanh ghi W cho một thanh ghi khác), XORLW (lấy XOR của một số và thanh ghi W)... Và các bạn để ý rằng,tổng số lệnh có thể tương tác với thanh ghi W là 23/35 lệnh, gần như chiếm toàn bộ tập lệnh của PIC. Vậychúng ta ghi nhận điều thứ nhất, khi PIC làm việc, gần như luôn luôn tương tác với thanh ghi W.

Điều thứ hai, các bạn nhìn trong bản đồ bộ nhớ dữ liệu của PIC, các bạn sẽ thấy là thanh ghi W là thanh ghikhông có mặt ở bất kỳ băng nào của bộ nhớ dữ liệu, trong khi đó thanh ghi STATUS có mặt ở cả 4 băng. Cácbạn lại thấy một điều rằng, thanh ghi W và thanh ghi STATUS có thể được truy nhật từ tất cả các băng, và từbất kỳ đâu trong chương trình, và vì vậy chúng trở thành những thanh ghi toàn cục nhất. Điểm khác biệt giữachúng ra sao? Đâu là sự khác biệt giữa thanh ghi W và các thanh ghi khác?

Điểm thứ ba, trong tập lệnh của PIC, không có lệnh nào cho phép tương tác trực tiếp giữa một thanh ghi trongbộ nhớ dữ liệu dùng chung với một giá trị thêm vào, mà đều phải thông qua thanh ghi W. Như vậy, thanh ghiW là cầu nối của hầu hết các phép toán được thực hiện trên các thanh ghi nằm trong bộ nhớ dữ liệu.

Như vậy, thanh ghi W vô cùng quan trọng trong hoạt động của PIC.

Nhắc lại kiến trúc Harvard và Von Newmann:

Hình sau sẽ gợi lại cho các bạn nhớ về kiến trúc Harvard và Von Newmann, trong đó các bạn luôn nhớ rằng cósự phân biệt giữa bộ nhớ dữ liệu và bộ nhớ chương trình. Các bạn thấy rằng bus bộ nhớ chương trình của PICmidrange chỉ có 14 bit.

http://i3.photobucket.com/albums/y64/falleafd/Harvard.gif

Với đặc điểm này, chúng ta sẽ phân tích vì sao cần phải có thanh ghi W, và sau đó chúng ta sẽ phân tích tấtcả các hoạt động của thanh ghi W trong một chương trình viết bằng PIC, nếu có thể. Những gì còn lại, chúngta sẽ xem trong bài tập lệnh của PIC midrange.

Vì sao cần phải có thanh ghi W?

Bạn sẽ làm thế nào để tính phép toán sau: lấy giá trị a của thanh ghi A cộng với giá trị b của thanh ghi B vàđặt vào thanh ghi A? Một giới hạn của tập lệnh PIC là không cho phép cộng hai thanh ghi và đặt vào mộtthanh ghi khác. Do đó, các bạn sẽ phải thực hiện thao tác sau:

Chuyển giá trị b từ thanh ghi B vào thanh ghi W, sau đó lấy giá trị của thanh ghi W (lúc này là b) cộng với giátrị a ở thanh ghi A, sau đó gán lại vào thanh ghi A. Đoạn code được thực hiện như sau:

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

20 of 53 29/03/2013 11:54 CH

Page 21: Học PIC trong 1 ngày

falleaf

MOVF B, W ; chuyển giá trị của thanh ghi B vào thanh ghi WADDWF A, F ; cộng giá trị của thanh ghi A với giá trị b của thanh ghi W và gán lại vào A

Khi các thanh ghi A và B không nằm trong cùng một băng, khi thao tác với từng thanh ghi, các bạn chỉ việcđổi về băng chứa các thanh ghi đó là xong. Một đoạn lệnh hoàn chỉnh có thể thực hiện cho bất kỳ 2 thanh ghinào được viết như sau:

BANKSEL BMOVF B, WBANKSEL AADDWF A, F

Đoạn chương trình này cũng minh hoạ luôn cho việc thanh ghi W là một thanh ghi toàn cục, khi chúng ta thaotác với thanh ghi B ở một băng bấ kỳ, nhưng khi chuyển giá trị b từ thanh ghi B vào thanh ghi W rồi, thìchúng ta không cần quan tâm rằng giá trị đó nằm ở đâu, chỉ cần chuyển về băng chứa thanh ghi A thì lệnhcộng sẽ được thực hiện một cách dễ dàng.

Một thí dụ khác về lệnh cộng, nhưng không phải là cộng giá trị nằm trong 2 thanh ghi, mà là cộng giá trị acủa thanh ghi A với một số k cho trước nào đó, giả sử k = 5 và lưu vào thanh ghi A.

Chúng ta thấy rằng, hoàn toàn trong tập lệnh không có lệnh cộng trực tiếp một thanh ghi với một số, mà chỉcó lệnh cộng một số với thanh ghi W. Như vậy chúng ta phải thực hiện thao tác sau: chuyển giá trị a từ thanhghi A vào thanh ghi W, cộng thanh ghi W với hằng số k = 5, sau đó chuyển giá trị mới của thanh ghi W trở lạithanh ghi A. Điều này được thực hiện như sau:

MOVF A, WADDLW d'5'MOVWF A

Trong thí dụ này, chúng ta sẽ không thấy W là một biến tạm nữa, mà trở thành một thanh ghi dùng để lưukết quả cộng với một con số. Đến bây giờ, thì chúng ta sẽ giả thích rõ hơn vì sao chúng ta phải làm như vậy.

Chúng ta thấy rõ ràng rằng, một dòng lệnh của PIC midrange, được mô tả bằng 14 bit. Điều này có nghĩa là,khi thực hiện một lệnh cộng, không thể nào dòng lệnh đó vừa lưu địa chỉ của thanh ghi A, vừa lưu giá trị 8 bitcủa hằng số k được, vì một thanh ghi trong dòng PIC midrange cần tối thiếu 7 bit để biểu diễn địa chỉ thanhghi, và một hằng số chiếm 8 bit. Nó vượt quá con số 14 bit cho phép để mã hoá lệnh. Chính vì vậy, không thểthực hiện lệnh cộng trực tiếp từ một thanh ghi với một số được. Quay lại thí dụ ở trên, chúng ta cũng thấyrằng không thể thực hiện việc cộng hai thanh ghi với nhau, nếu như cần lưu 2 địa chỉ thanh ghi, chúng ta sẽmất 14 bit, và như vậy không có các bit mã hoá mô tả lệnh cần thực hiện là gì.

Đây chính là điểm khác biệt giữa tập lệnh RISC và tập lệnh CISC. Tập lệnh CISC có thể thực hiện lệnh phức,vì nó có thể tạo ra một lệnh dài 8 bit, 16 bit, 24 bit... và là bộ số của 8 bit. Do đó, nếu cần cộng 2 thanh ghi 8bit, nó hoàn toàn có thể tạo ra một lệnh dài 24 bit, trong đó 8 bit dùng để mã hoá, 8 bit dành cho địa chỉ củathanh ghi thứ nhất, 8 bit dành cho địa chỉ cua thanh ghi thứ 2. Trong khi đó, tập lệnh CISC là tập lệnh rútgọn, cho dù nó là lệnh gì, nó cũng luôn luôn chỉ có 14 bit (đối với PIC midrange).

Thanh ghi W giống như một thanh ghi mặc định duy nhất, vì vậy, khi thực hiện, bộ xử lý trung tâm có thể giảimã được nếu lệnh đó có cần thao tác với thanh ghi W hay không, mà không cần lưu địa chỉ của thanh ghi Wbên trong đoạn mã lệnh.

Chúng ta xem hình dưới đây để biết được bộ xử lý logic hoạt động như thế nào với thanh ghi W.

http://i3.photobucket.com/albums/y64/falleafd/WREG.gif

Vậy chúng ta đã thấy rõ sự cần thiết của thanh ghi W, bởi vì chúng ta cần có một thanh ghi tạm cho các côngviệc tính toán, và chúng ta cần mã hoá thanh ghi mà không cần tốn quá nhiều bit, vậy thì thanh ghi W vừa làthanh ghi có tính toàn cục, vừa là thanh ghi tạm, vừa là thanh ghi không cần thiết nhiều bit để biểu diễn địachỉ.

Các bạn đã biết vì sao chúng ta phải cần thanh ghi W, bây giờ chúng ta cần biết thanh ghi W hoạt động nhưthế nào trong các chương trình của PIC.

25-07-2005, 03:11 AM

Các bạn có thể download bài viết Kỹ Thuật Bảng (http://picvietnam.com/download/KyThuatBang.pdf) tại đâyđể tham khảo và hiểu kỹ thuật thiết lập một bảng dữ liệu với PIC.

Kỹ thuật bảng này dùng trong một số trường hợp như: Xuất dữ liệu ra LCD, ra màn hình, sử dụng làm cácvector điều khiển vận tốc gia tốc động cơ, dùng để điều khiển động cơ bước...

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

21 of 53 29/03/2013 11:54 CH

Page 22: Học PIC trong 1 ngày

planandwork

tinhthanthep

falleaf

10-10-2005, 10:43 PM

tuyệt quá tuyệt quá .em phải mua ngay 1 mạch nạp pic mới được .

20-10-2005, 11:28 PM

Sao vẫn chưa thấy bác falleaf viết tiếp về phần nút bấm nhỉ? trong phần này còn có kỹ thuật xử lý rung củanút bấm nữa. Và cả ngắt nữa...

21-10-2005, 09:40 AM

Đây là một thí dụ về nút bấm:

Nối nút bấm với RA0, RA1, RA2, RA3 với điện trở kéo lên. Nối đèn LED vào RB0, RB1, RB2, RB3 với điện trởnối tiếp và đèn LED được nối xuống mass.

(hình vẽ sẽ post lên sau vì chưa có thời gian)

Thuật toán quét sẽ như sau:

Nếu SW0 là cao thì bật LED0Nếu SW0 là thấp thì tắt LED0Nếu SW1 là cao thì bật LED1.... cứ như thế cho các nút bấm khác.

Chương trình như sau:

;---------------------------------; Khoi tao;---------------------------------; Đặt PORTA có RA0 - RA3 là input; Đặt PORTB có RB0 - RB3 là output; Xóa PORTA, xóa PORTB

SW0 BTFSC PORTA, 0GOTO TURNON0BCF PORTB, 0

SW1 BTFSC PORTA, 1GOTO TURNON1BCF PORTB, 1

SW2 BTFSC PORTA, 2GOTO TURNON2BCF PORTB, 2

SW3 BTFSC PORTA, 3GOTO TURNON3BCF PORTB, 3

GOTO SW0 ; quay lại quét từ đầu

TURNON0 BSF PORTB, 0GOTO SW1

TURNON1 BSF PORTB, 1GOTO SW2

TURNON2 BSF PORTB, 2GOTO SW3

TURNON3 BSF PORTB, 3GOTO SW0

END.

Xong!

Các bạn làm thử chơi vui... Chúc một cuối tuần vui vẻ.

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

22 of 53 29/03/2013 11:54 CH

Page 23: Học PIC trong 1 ngày

falleaf

falleaf

sinhluc

nhh

sinhluc

31-10-2005, 08:51 PM

Các bạn download tài liệu Tập Lệnh PIC Midrange bằng link này:

www.picvietnam.com/download/taplenh.pdf

Lưu ý với các bạn rằng, vì lý do đay là tài liệu chúng tôi biên soạn cho cuốn sách sắp hoàn thành, do đó,chúng tôi không cho phép in ấn hoặc copy.

Các bạn có thể download về để tham khảo.

Một chú ý nữa, đó là tài liệu này chưa được viết xong, còn các lệnh tôi chỉ mới sửa chữa sơ sơ, chủ yếu là phầnchú thích, tôi nghĩ sau khi viết xong phần này, có thể đã giúp ích cho rất nhiều kỹ sư từng làm việc quen vớivi điều khiển khác chuyển sang học PIC. Họ có thể tra cứu nhanh và nắm bắt các nguyên tắc lập trình PIC.

Cuối cùng, nếu các bạn sử dụng tài liệu này để soạn lại, hoặc đưa vào luận văn, hoặc các tài liệu của các bạn,xin các bạn ghi rõ nhóm tác giả picvietnam.com

Kể từ nay cho đến khi chúng tôi viết xong cuốn sách, các bạn được phép sử dụng các tài liệu như thế này mộtcách hoàn toàn miễn phí, cho mục đích cá nhân, không được phép công bố, sao chép.

Lý do tôi thông báo điều này, vì có bạn đã hỏi tôi về việc sử dụng tài liệu của tôi cho lớp dạy học sắp mở củacác bạn đó, tôi rất hoan nghênh việc mở lớp của tất cả những người có nguyện vọng truyền thụ kiến thức chosinh viên. Song vì có quá nhiều lớp sẽ mở ra, và có nhiều người sử dụng tài liệu do tôi biên soạn, để đảm bảouy tín cho picvietnam, tôi mới đề nghị như trên, bởi vì tôi không tham gia chính thức vào bất kỳ lớp dạy họcnào, ngoại trừ lớp của Bình Anh ở Hà Nội và lớp của Doãn Minh Đăng tại HCMC với vai trò cố vấn.

Chúc vui.

02-01-2006, 02:10 PM

www.picvietnam.com/download/PICSoft/PicTimerCalcV4.zip

Một điều không có gì cần thiết lắm, nhưng đôi khi nó lại làm cho chúng ta bối rối, đó là tính toán các con sốdelay, timer với thời gian thực.

Chương trình trên đây giúp chúng ta đỡ mất công suy nghĩ và tính toán hơn khi thao tác với timer. Đây chỉ làmột chương trình bổ trợ nhỏ, nhưng cũng có lẽ sẽ giúp ích khi chúng ta đã làm việc quá lâu với máy tính, vàcó thể vài con số sẽ làm chúng ta bối rối.

Mong rằng nó giúp được cho các bạn.

Lưu ý, các bạn mới học PIC, khi tính toán với Timer, các bạn cố gắng tự tính bằng tay, sau đó sử dụng chươngtrình này để kiểm tra lại kết quả, để xem mình đã hiểu đúng về hoạt động của timer chưa.

Chúc vui.

11-04-2006, 04:16 PM

bai viet của bac falleaf that la tuyệt voi. rất bài bản khoa học và có tính sư phạm cao, de hiểu lắm. đọc song làem máu làm luôn. tuong là có thể làm ngay, nhung khi bắt đầu thì lại khong biết là viết trên chuong trìnhbiên dịch nào dịch, viet vào đâu... chi thấy nói là bấm alt-f10. Nên em vừa định bắt đầu lại tắc tịt luôn.Mong bác bổ xung thêm chỗ này, em chưa biết một chuong trình biên dịch nào, bác cho em cai nào ngonngon dễ sử dụng, hay bác co trình nào chuyen nghiệp thi làm một tutorial. em dang mau quá. Cam on bac !

12-04-2006, 10:28 AM

bai viet của bac falleaf that la tuyệt voi. rất bài bản khoa học và có tính sư phạm cao, de hiểu lắm. đọc song làem máu làm luôn. tuong là có thể làm ngay, nhung khi bắt đầu thì lại khong biết là viết trên chuong trìnhbiên dịch nào dịch, viet vào đâu... chi thấy nói là bấm alt-f10. Nên em vừa định bắt đầu lại tắc tịt luôn.Mong bác bổ xung thêm chỗ này, em chưa biết một chuong trình biên dịch nào, bác cho em cai nào ngonngon dễ sử dụng, hay bác co trình nào chuyen nghiệp thi làm một tutorial. em dang mau quá. Cam on bac !

Trình biên dịch là MPLAB,do microchip cung cấp miễn phíQua bên này học pic cơ bản:http://www.picvietnam.com/forum//showthread.php?t=4

12-04-2006, 11:31 AM

thank you namqn và nhh. Minh biet la rat gian nan, hy vong các ban giup do.

Mnh da cai MPLAB roi, chi nhac bac falleaf bo xung mot it thieu sot nhu da noi o tren do thoi.

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

23 of 53 29/03/2013 11:54 CH

Page 24: Học PIC trong 1 ngày

falleaf

falleaf

namqn

tuanla

12-04-2006, 02:48 PM

thank you namqn và nhh. Minh biet la rat gian nan, hy vong các ban giup do.

Mnh da cai MPLAB roi, chi nhac bac falleaf bo xung mot it thieu sot nhu da noi o tren do thoi.

Thành thật xin lỗi bạn, thời gian này mình đang rất bận, vừa phải lên lớp, vừa phải làm dự án, chuẩn bị thưviện điện tử cho picvietnam và dientuvietnam, xem xét sản xuất bộ sản phẩm thứ hai phát triển pic vàpicvietnam, và đang làm việc với anh Nam để chuẩn hóa MPASM, rồi viết cuốn sách MPASM...

Với khối lượng việc như vậy, mình không thể đảm bảo trả lời hết các bài viết của các bạn, mong các bạn thôngcảm, và rất nhiều thành viên có thể giúp đỡ các bạn thêm trong thời gian này.

Đây là một bản dịch tài liệu hướng dẫn mà mình đã cho sinh viên mình soạn từ 2 năm trước, nó đã được đăngtrên diendandientu.com. Tuy nhiên, vì mình thấy tài liệu chưa tốt, nên không phổ biến trên picvietnam. Mộtkhi đã phổ biến trên picvietnam, mình muốn nó luôn luôn là tài liệu chuẩn hóa và có giá trị cao đối với thànhviên.

Khi các bạn gặp khó khăn nhất thời, có thể tạm sử dụng tài liệu này. Tuy nhiên, mình tuyên bố, đây khôngphải là tài liệu chính thức của picvietnam. Tất cả các tài liệu chính thức của picvietnam, đều được post theoform chuẩn, và lưu trữ trong host của picvietnam với đường link www.picvietnam.com/download/.....

Chúc vui

12-04-2006, 03:44 PM

Post xong thấy bực mình quá, vì F vốn không thích kiểu làm việc như vậy. Nên đây, các bạn có thể downloadtạm tài liệu này để sử dụng có vẻ tốt hơn.

Một là tài liệu này cũng không phải là tài liệu chính thức. F chỉ viết chơi và chỉnh sửa lại một chút cho nó đúngform nhìn cho nó tốt hơn. Nhưng mà mặt khác F nghĩ nó cũng đã khá tốt rồi. Tài liệu này được viết từ cáchđây gần 2 năm rồi, nên một số chỗ F còn để là diendandientu.com (vì lúc đó chưa có www.picvietnam.com),hoặc là mã số bài viết bên trong sai với tên tập tin bên ngoài, hoặc còn một số sai sót hoặc lời viết lung tung,bởi vì F copy qua lại, mong các bạn thông cảm.

Trong bài hướng dẫn này, F sử dụng mạch nạp PIC1 để hướng dẫn.

http://www.doanhiep.com/~ulsan/Tailieuvietnam/BOOK06.01.PIC.DH.100406.pdf

Chúc vui

21-04-2006, 11:55 PM

Theo đề nghị của chú F, tôi viết tutorial ngắn này để các bạn mới bắt đầu học PIC không thắc mắc về kíchthước của tập tin .hex, cùng với cách tính số word, kword trong chương trình của PIC.

Trong thế giới số:1 k = 2^10 = 10241 mega = 2^20 = 1048576

1 kword = 1024 wordvà, 8 kword = 8x1024 = 8192 word

Các chip PIC16 với bộ nhớ 8 kword, chẳng hạn như 16F877A, có 4 trang bộ nhớ Flash, mỗi trang là 2 kword.Nếu chương trình tràn khỏi biên của một trang thì người viết chương trình phải tự đảm bảo là các lệnh nhảy cóthể thực hiện thành công, do đó trình biên dịch thường có thông báo nhắc nhở.

Đối với tập tin .hex, các byte được ghi bằng ký tự ASCII thể hiện mã hexadecimal của byte. Mỗi lệnh củaPIC16 dài 14-bit, được ghi vào tập tin .hex bằng 2 byte, và mỗi byte được ghi bằng 2 ký tự ASCII, như vậymỗi lệnh cần dùng tới 4 ký tự ASCII để ghi vào tập tin .hex. Ngoài ra còn có các thông tin định dạng và kiểmtra lỗi cho mỗi dòng trong tập tin .hex và các thông tin khác cho cấu hình của chip, nếu có dùng, và một sốthông tin khác, chẳng hạn như địa chỉ bắt đầu của vùng nhớ được điền vào. Mỗi dòng cần có thêm 11 ký tựASCII cho mục đích định dạng và kiểm tra lỗi, và mỗi dòng chỉ mã hóa cho tối đa 32 byte, tức là 16 lệnh. Cáctrình dịch PIC thường chỉ dùng 16 byte cho mỗi dòng trong tập tin .hex, do đó thường cần 1 dòng cho mỗi 8lệnh.

Lấy ví dụ một chương trình dài 2048 lệnh, với cách ghi thành tập tin .hex thông thường, sẽ cần 256 dòng, mỗidòng dùng hết 4x8 + 11 = 43 ký tự, và 256 dòng sẽ cần 11008 ký tự cho riêng phần mã lệnh, các thông tinkhác cũng sẽ dùng thêm khoảng 200 ký tự. Do đó, chương trình này khi được ghi thành tập tin .hex sẽ có kíchthước lớn hơn 11 kbyte (hơn 11 ngàn ký tự).

Thân,

23-05-2006, 04:19 PM

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

24 of 53 29/03/2013 11:54 CH

Page 25: Học PIC trong 1 ngày

falleaf

newuser

falleaf

dtnbk

Các bác ơi, Tôi thấy có 1 số chỗ trong chương trình Led_1_1 phải sửa thì mới chạy ngon được: các bác thamkhảo nhé - tui dùng PIC16F84A

1. Chỗ khai báo PROCESSOR không ghi tắt được mà phải đầy đủ là PROCESSOR PIC16F84A

2. Chỗ BSF PROTB,0 : TRƯỚC đó cần khởi tạo giá trị =0 chẳng hạn cho thanh ghi này đã, nếu không hình nhưnó có RÁC hay sao đó - hi hi. Tôi đã thêm lệnh CLRF PORTB vào trước dòng này, thì đèn LED mới hiển thị đúng- chỉ 1 đèn ở RB0.

3. Chỗ kết thúc : sau cái END không có dấu chấm .

Ngoài ra, nếu bác nào dùng ICPROG theo hướng dẫn mà Verify .... cứ báo lỗi thì các bác cứ chuyển đại sangchế độ Direct I/O ( không dùng chế độ Windows API nữa), các bác sẽ thấy nạp ngon ngay, lại còn nhanh hơnvài lần . Hê Hê.

Newbie xin đóng góp 1 tị.

23-05-2006, 04:33 PM

Các bác ơi, Tôi thấy có 1 số chỗ trong chương trình Led_1_1 phải sửa thì mới chạy ngon được: các bác thamkhảo nhé - tui dùng PIC16F84A

1. Chỗ khai báo PROCESSOR không ghi tắt được mà phải đầy đủ là PROCESSOR PIC16F84A

2. Chỗ BSF PROTB,0 : TRƯỚC đó cần khởi tạo giá trị =0 chẳng hạn cho thanh ghi này đã, nếu không hình nhưnó có RÁC hay sao đó - hi hi. Tôi đã thêm lệnh CLRF PORTB vào trước dòng này, thì đèn LED mới hiển thị đúng- chỉ 1 đèn ở RB0.

3. Chỗ kết thúc : sau cái END không có dấu chấm .

Ngoài ra, nếu bác nào dùng ICPROG theo hướng dẫn mà Verify .... cứ báo lỗi thì các bác cứ chuyển đại sangchế độ Direct I/O ( không dùng chế độ Windows API nữa), các bác sẽ thấy nạp ngon ngay, lại còn nhanh hơnvài lần . Hê Hê.

Newbie xin đóng góp 1 tị.

1) Dòng khai báo Processor có hai cách, viết đầy đủ cũng được, còn một cách viết khác (hic, dạo này khôngthể nhớ nổi những cái này nữa, các bạn xem lại có hai cách khai báo processor, một cách viết P, một cách viếtPIC).

3) END lưu ý không có dấu . là chính xác, có một cái tut F có viết sai là có dấu . (chấm), vì theo thói quen kếtthúc bài viết, qmk đã có sửa lại, các bạn chú ý.

24-05-2006, 12:27 PM

đúng thế đấy bạn, nếu bạn xuất led mà không có dòng CLRF PORTx là thấy chạy sai liền, Protues mô phỏng ychang...

30-05-2006, 04:00 PM

Từ hôm nay, F cắt các bài trong phần Học PIC trong 1 ngày ra thành Thảo luận xung quanh Học PIC trong 1ngày, lý do rằng một số bài đi lan man, và cứ nhấn tới các câu hỏi.

Trong luồng này, chỉ lưu các tutorial của picvietnam, nhưng câu hỏi và trả lời liên quan đến bài học, nhằmgiúp đỡ những người mới học tham gia và đọc một cách dễ dàng nhất.

Vì vậy, khi quyết định viết bài vào luồng này, các bạn phải thật cân nhắc, nếu không bài của các bạn sẽ bị dichuyển sang luồng khác.

http://www.picvietnam.com/forum/showthread.php?t=446

Liên quan đến bài học là thế nào? Là bạn đọc bài học ở đây, làm theo và có thắc mắc, hoặc là bạn có viết thêmcác tutorial để bổ sung vào luồng này cho người học có thêm tài liệu phong phú. Nếu không phải là một tronghai trường hợp này, đề nghị các bạn không viết bài vào luồng này, để tránh các thành viên mới rất khó kiếmbài và rất khó hệ thống tài liệu học.

Chúc vui.

05-07-2006, 12:46 AM

Sao Em Download File Tập Lệnh Về Lại Ko Thể Mở Xem Duoc Vậy Nhỉ.Nó Cứ Bảo File Damaged And Could Not Repair....

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

25 of 53 29/03/2013 11:54 CH

Page 26: Học PIC trong 1 ngày

falleaf

friends

newuser

05-07-2006, 01:42 AM

Nhiều người download thành công, và F cũng kiểm tra lại rồi, mọi thứ ok. Có thể đường truyền ở Việt Nam cóvấn đề, cho nên đôi khi download giữa chừng nó bị hỏng, và dẫn tới file down về bị hư.

Chúc vui

04-08-2006, 09:36 AM

Cac anh cho em hoi, khi dung chuong trinh ngat theo mau nhu ben duoi ,thi co can khai bao cac vung ramben duoi khong

Vi du: co can khai bao nhu the nay khong?

…………….

Org 0x20W_SAVESTAT_SVPCH_SVFSR_SVORG 0X0000…………………..

;DAY LA CHUONG TRINH NGAT THEO MAU;============================================================================================INTERRUPT

;-------------------------------------------;Doan ma bat buoc de vao ngat;-------------------------------------------

MOVWF W_SAVE ;W_SAVE(bank unknown!) = WSWAPF STATUS, WCLRF STATUS ; force bank 0 for remainder of handlerMOVWF STAT_SV ; STAT_SV = swap_nibbles( STATUS ); STATUS = 0MOVF PCLATH, WMOVWF PCH_SV ; PCH_SV = PCLATHCLRF PCLATH ; PCLATH = 0MOVF FSR, WMOVWF FSR_SV ; FSR_SV = FSR; 10 cycles from interrupt to here!

;-----------------------------------;Doan chuong trinh ngat;-----------------------------------

; cac ban se viet chuong trinh ngat o day

;--------------------------------------------------;Doan ma bat buoc de ket thuc ngat;--------------------------------------------------

MOVF FSR_SV, WMOVWF FSR ; FSR = FSR_SVMOVF PCH_SV, WMOVWF PCLATH ; PCLATH = PCH_SVSWAPF STAT_SV, WMOVWF STATUS ; STATUS = swap_nibbles( STAT_SV )SWAPF W_SAVE, FSWAPF W_SAVE, W ; W = swap(swap( W_SAVE )) (no change Z bit)

BSF INTCON, GIERETFIE;===================================================================================================

04-08-2006, 08:29 PM

chắc chắn là cần lưu giữ giá trị các thanh ghi W, STATUS và PCLATH nếu bạn muốn chương trình chạy đúngsau khi trở về từ ngắt. Cách khai báo hình như không đúng...mình thường viết như thế này:W_TEMP EQU 0X20STATUS_TEMP EQU 0X21

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

26 of 53 29/03/2013 11:54 CH

Page 27: Học PIC trong 1 ngày

namqn

newuser

namqn

vudinhlieu

namqn

PCLATH_TEMP EQU 0X22

riêng FSR có cần lưu trữ nó không nhỉ?

04-08-2006, 08:46 PM

chắc chắn là cần lưu giữ giá trị các thanh ghi W, STATUS và PCLATH nếu bạn muốn chương trình chạy đúngsau khi trở về từ ngắt. Cách khai báo hình như không đúng...mình thường viết như thế này:W_TEMP EQU 0X20STATUS_TEMP EQU 0X21PCLATH EQU 0X22

riêng FSR có cần lưu trữ nó không nhỉ?Cách khai báo địa chỉ biến của bạn friends vẫn dịch ra đúng, mặc dù cách dùng không hay lắm, nên dùngcblock ... endc thì tốt hơn.

Còn cách định nghĩa hằng của em:PCLATH EQU 0X22liệu có hợp lệ hay không?

Thân,

04-08-2006, 09:03 PM

ủa, thôi chết, em viết thiếu, đại loại phải như vầy (đúng là nhanh nhảu đoảng... hic)PCLATH_TEMP EQU 0X22

cách khai báo như bạn friend vẫn đúng? anh có thể giải thích rõ hơn không?

04-08-2006, 09:45 PM

À, anh xem lướt qua nên không phát hiện lỗi ở lần đầu.

Phần khai báo của bạn friends dịch không có lỗi, nhưng chạy chương trình sẽ bị sai (vì các địa chỉ biến đượcđặt không đúng). Toàn bộ 4 biến đó đều sẽ có địa chi 0x20. Bạn friends cần phải chỉnh lại như sau thì mới cóchương trình đúng:Org 0x20W_SAVE res 1STAT_SV res 1PCH_SV res 1FSR_SV res 1ORG 0X0000

Giải thích thêm về phần này. Directive org chỉ làm thay đổi bộ đếm địa chỉ của trình hợp dịch. Với đoạn codenhư trên, chúng ta sẽ có W_SAVE là nhãn ở địa chỉ 0x20, STAT_SV là nhãn ở địa chỉ 0x21, và cứ thế. Từ khóares và giá trị 1 sẽ làm bộ đếm địa chỉ tăng 1 đơn vị. Cách này không hay vì các địa chỉ biến thực chất là địachỉ của các nhãn được hiểu là sẽ được dùng làm đích của các lệnh chuyển điều khiển (hay nói cách khácchúng là các địa chỉ của các từ lệnh), nếu dùng chúng trong các PIC18 chẳng hạn thì sẽ bị sai (vì các từ lệnhcách nhau 2 byte, và PIC18 dùng địa chỉ byte).

Thân,

10-08-2006, 03:54 PM

Chào bang chủ ,đệ tử nhập môn thật vất vả để viết chương trình đầu tiên !thứ 1 : vì chưa biết gì về MPLAB thế nên sau khi cài đặt đọc mãi hướng dẫn sử dụng mới có thể làm đượcmong bang chủ thêm phần hướng dẫn cơ bản sử dụng MPLAB trong 1 ngày học PICthứ 2 : Ngay trong bài tập đầu tiên Bang chủ đã gài pan thêm dấu . kế lệnh END làm trình dịch báo lổi mà kobiết mò đâu mà sửa ! dù sao thì đệ cũng đã làm được bài tập đầu tiên !

10-08-2006, 06:38 PM

Chào bang chủ ,đệ tử nhập môn thật vất vả để viết chương trình đầu tiên !thứ 1 : vì chưa biết gì về MPLAB thế nên sau khi cài đặt đọc mãi hướng dẫn sử dụng mới có thể làm đượcmong bang chủ thêm phần hướng dẫn cơ bản sử dụng MPLAB trong 1 ngày học PICthứ 2 : Ngay trong bài tập đầu tiên Bang chủ đã gài pan thêm dấu . kế lệnh END làm trình dịch báo lổi mà kobiết mò đâu mà sửa ! dù sao thì đệ cũng đã làm được bài tập đầu tiên !Về thứ 1: Cá nhân tôi không nghĩ rằng mình có thể sử dụng ngay một phần mềm mới ngay sau khi cài đặt, ítnhất tôi cũng phải đọc qua các tutorial của phần mềm (nếu có), và sau đó là hướng dẫn sử dụng. Ngoài ra, ítnhất là đâu đó trong diễn đàn này đã có các hướng dẫn về MPLAB, chẳng hạn như luồng này:http://www.picvietnam.com/forum/showthread.php?t=354

Về thứ 2: đó chưa hẳn là một pan được gài, MPLAB đã trải qua nhiều lần nâng cấp kể từ khi chú F viết bài tập

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

27 of 53 29/03/2013 11:54 CH

Page 28: Học PIC trong 1 ngày

vudinhlieu

đó, đến nay thì directive END được dùng cho các chương trình hợp ngữ dành cho các vi điều khiển 8-bit(PIC10, PIC12, PIC16 và PIC18, nhưng directive .END vẫn được dùng cho các chương trình hợp ngữ dành chocác vi điều khiển và DSC 16-bit (PIC24, dsPIC30, dsPIC33).

Thân,

12-08-2006, 07:06 PM

Vì quá kém cỏi đành xin trưởng lão thọ giáo thêm chút nữa !vì sao chương trình này em viết dịch bị lỗi !

;====================================; bai tap 2; mach den chop 8 led tu trai qua phai;ngay bat dau :12/08/2006;nguoi thuc hien : vu dinh lieu;mo ta phan cung : Dung PIC16F628A - thach anh 4MHz; : LED giao tiep voi PORTB; : Cuc am cua LED noi voi GND; : RB0 - RB7 la cac chan output; Chu thich :; dùng thanh ghi W ghi vào giá tri 00000001; xuat ra PORTB; delay; dùng lenh dich trai portB; xuat ra PORTB 15;====================================================================TITLE "Mach chop 8 LED_1"PROCESSOR P16F628AINCLUDE <P16F628A.inc>__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC

;================================================= ======count1 EQU 0x20 ; cac bien dung cho doan chuong trinh delaycounta EQU 0x21countb EQU 0x22;===============================================================================ORG 0x0000GOTO MAINORG 0x0005MAINBANKSEL TRISB ; bank selectCLRF TRISB ; trisb = 00000000; portb = outputLOOPBANKSEL PORTBMOVLW 0x01MOVWF PORTB ; rb = 00000001CALL delay_100msRLF PORTB,fGOTO LOOPGOTO $ ; dung chuong trinh tai day; vong lap tai cho^~; khong bao gio ket thucdelay_100ms ; label bat dau chuong trinh conMOVLW d'100' ; doan code cho chuong trinh con delay 100 msMOVWF count1d1MOVLW d'199'MOVWF countaMOVLW d'1'MOVWF countbdelay_0DECFSZ counta,fGOTO $+2DECFSZ countb,fGOTO delay_0DECFSZ count1,fGOTO d1RETURNEND

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

28 of 53 29/03/2013 11:54 CH

Page 29: Học PIC trong 1 ngày

namqn

BVT_BK

BVT_BK

vudinhlieu

tinhthanthep

và các lỗi nhận cược nhu sauMake: The target "E:\pic1\baitap2.o" is out of date.Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F628A "baitap2.asm"/l"baitap2.lst" /e"baitap2.err" /o"baitap2.o"Warning[215] E:\PIC1\BAITAP2.ASM 18 : Processor superseded by command line. Verify processor symbol.Message[302] E:\PIC1\BAITAP2.ASM 32 : Register in operand not in bank 0. Ensure that bank bits arecorrect.Error[113] E:\PIC1\BAITAP2.ASM 54 : Symbol not previously defined ( )Error[112] E:\PIC1\BAITAP2.ASM 54 : Missing operatorError[113] E:\PIC1\BAITAP2.ASM 57 : Symbol not previously defined (f )Error[113] E:\PIC1\BAITAP2.ASM 58 : Symbol not previously defined (d1 )Halting build on first failure as requested.BUILD FAILED: Sat Aug 12 18:02:25 2006

12-08-2006, 09:41 PM

Chương trình này không có lỗi cú pháp, tất nhiên cái warning về bộ xử lý do MPLAB chọn tại dòng lệnh và cáimessage về thanh ghi không nằm trong bank 0 là hợp lý. Tôi cho là bạn đang gặp khó khăn trong việc biêndịch chương trình. Nhân tiện bạn cho biết bạn đang dùng MPLAB phiên bản nào.

Với các bản MPLAB IDE mới, cách đơn giản để bạn biên dịch chương trình chỉ gồm 1 tập tin .asm là chọn loạibộ xử lý cho đúng trong mênu "Configure", lệnh "Select Device ...", sau đó bạn chọn trong mênu "Project"lệnh "Quickbuild <tentaptin.asm>", với <tentaptin.asm> là tập tin .asm mà bạn đang soạn thảo (nó đã đượcmở ra và đang active).

Thân,

13-08-2006, 03:28 PM

O Day Cac Bac Noi Ve Cach Dung Pic Co Ban NhatNhung Nhung Ung Dung Khac Thi Chua Thay Cac Bac De Cap NhieuHi Vong Cac Bac Post Them Nhieu De Anh Em Ta Cung Hoc Nhanh HonVi Du Nhu Timer0, 1, 2Truyen Thong Du LieuPwm...Thank You

13-08-2006, 03:31 PM

Cac Bac Toan Viet Delay Nho Decfsz ACai Lay Dung Cung DuocNhung Ma Thoi Gian De Lay Khong Chinh Xac LamEm Thu Dung Timer0 Cua 16f877a De Tao TreNhung Ma Tim Mai Khong Thay Lenh Khoi Dong Timer0 DauBac Nao Viet Chuong Trinh Tao Tre Nho Timer0 Thi Chi Cho Em VoiHinh Nhu Voi Con Pic877a No Tu Khoi Dong Timer0 Hay Sao DayBac Nao Ro Thi Giup Em VoiThank You!

14-08-2006, 04:47 PM

rất cám ơn trưởng lão !

16-08-2006, 11:29 AM

Nếu mẫu khai báo biến như faleaf trình bày bên trên không tối ưu thì mong bác namp viết lại cho chuẩn. Đâylà mẫu khai báo biến của faleaf:;================================================= ========; KHAI BAO BIEN;--------------; Bien nam o bank 0;----------------------------------------------------------------------ORG 0x020COUNT_L RES 1COUNT_H RES 3;----------------------------------------------------------------------; BiEn NAM O bank 1;----------------------------------------------------------------------ORG 0x0A0COUNT1_L RES 1;----------------------------------------------------------------------; Bien nam o bank 2;----------------------------------------------------------------------

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

29 of 53 29/03/2013 11:54 CH

Page 30: Học PIC trong 1 ngày

newuser

tinhthanthep

tinhthanthep

namqn

namqn

ORG 0x120;================================================= =======2. Trong chuong trình ngắt theo tôi chỉ cần lưu giá trị của thanh ghi W và STATUS vì thanh ghi PC đã được lưutrong stack. Đồng thời trong quá trình xử lý 1 ngắt thì bit toàn cục GIE đã bị clear nên sẽ không có ngắt nàokhác hoạt động được nữa lên không sợ tràn stack.3. Ở cuối chuong trình ngắt không cần phải set bit GIE vì khi ra khỏi chương trình ngắt thì bit GIE tự độngđược set lên. Chỉ phải clear flag trước khi ra khỏi chương trình ngắt.

16-08-2006, 11:52 AM

2. Trong chuong trình ngắt theo tôi chỉ cần lưu giá trị của thanh ghi W và STATUS vì thanh ghi PC đã được lưutrong stack. Đồng thời trong quá trình xử lý 1 ngắt thì bit toàn cục GIE đã bị clear nên sẽ không có ngắt nàokhác hoạt động được nữa lên không sợ tràn stack.

Đồng ý với tinhthanthep ở những điểm còn lại trừ điểm trên, theo tôi thì phải lưu giữ cả thanh ghi PCLATH,theo datasheet của P16F877A nói là PCLATH sẽ không bị thay đổi giá trị ngay sau lệnh RETFIE, giả sử chươngtrình ngắt của bạn đặt tại Page2, vậy thì khi trở về từ ngắt, liệu có đảm bảo chương trình của bạn sẽ chạyđúng???vì thế không cần lưu trữ giá trị thanh ghi PCLATH chỉ chính xác với những dòng PIC có bộ nhớ chương trình<=2K (2^11=2048 địa chỉ).

16-08-2006, 02:59 PM

Các bác cho hỏi trong khi thực hiện chương trình ngắt ta thường lưu giá trị các thanh ghi W và status vào địachỉ 0x70, 0x71.... Mấy cái địa chỉ này nằm ở bank 0. Nhưng nếu khi vào chương trình ngắt mà ta đang ở bank1 thì sao nhỉ? Theo tôi hiểu là trước khi lưu giá trị thanh ghi W và STATUS ta phải chuyển về bank 0 trướcđúng không? nhưng tôi thấy các chương trình ngắt viết mẫu đều không thấy làm điều này? Hình như nó tựđộng hiểu được à? Các bác có thể giải thích cái địa chỉ ghi tạm giá trị thanh ghi W, status được không?

16-08-2006, 04:27 PM

Tiện thể hỏi thêm một câu nữa: để chuyển giá trị các thanh ghi đặc biệt vào các thanh ghi lưu trữ thì chỉ cầndùng các lệnh mov là được sao thấy trong tài liệu hướng dẫn và cũng thấy một số bạn trên này hay dùng lệnhswapf?

16-08-2006, 08:28 PM

Tiện thể hỏi thêm một câu nữa: để chuyển giá trị các thanh ghi đặc biệt vào các thanh ghi lưu trữ thì chỉ cầndùng các lệnh mov là được sao thấy trong tài liệu hướng dẫn và cũng thấy một số bạn trên này hay dùng lệnhswapf?Lệnh swapf không làm thay đổi cờ Z, còn lệnh movf thì làm thay đổi cờ Z. Nếu trước đó bạn đã phục hồi thanhghi STATUS, sau đó bạn phục hồi thanh ghi khác bằng lệnh movf thì cờ Z có thể bị đổi trạng thái, lúc đó cóphải việc phục hồi thanh ghi STATUS trở thành công cốc hay không?

Thân,

16-08-2006, 08:48 PM

Các bác cho hỏi trong khi thực hiện chương trình ngắt ta thường lưu giá trị các thanh ghi W và status vào địachỉ 0x70, 0x71.... Mấy cái địa chỉ này nằm ở bank 0. Nhưng nếu khi vào chương trình ngắt mà ta đang ở bank1 thì sao nhỉ? Theo tôi hiểu là trước khi lưu giá trị thanh ghi W và STATUS ta phải chuyển về bank 0 trướcđúng không? nhưng tôi thấy các chương trình ngắt viết mẫu đều không thấy làm điều này? Hình như nó tựđộng hiểu được à? Các bác có thể giải thích cái địa chỉ ghi tạm giá trị thanh ghi W, status được không?Tôi dịch phần hướng dẫn của Microchip về lưu ngữ cảnh khi ngắt (lấy từ datasheet của PIC16F87xA):

Khi xử lý ngắt, chỉ có giá trị trở về của PC được lưu vào ngăn xếp. Thông thường, người dùng có thể muốn lưucác thanh ghi chính khi xử lý ngắt (nghĩa là thanh ghi W và thanh ghi STATUS). Điều này phải được thực hiệnbằng phần mềm.

Với các chip PIC16F873A/874A, thanh ghi W_TEMP phải được định nghĩa trong cả bank 0 lẫn bank 1 và phảiđược định nghĩa ở cùng offset từ địa chỉ nền của bank (nghĩa là, nếu W_TEMP được định nghĩa tại 0x20 trongbank 0, nó cũng phải được định nghĩa tại 0xA0 trong bank 1). Các thanh ghi PCLATH_TEMP và STATUS_TEMPchỉ được định nghĩa trong bank 0.

Vì có tối đa 16 byte của mỗi bank (người dịch: địa chỉ 0x70-0x7F) là được dùng chung trong các chipPIC16F876A/877A, các thanh ghi tạm nên được đặt ở đây. 16 ô nhớ này không cần chuyển bank và do đó sẽlàm cho việc lưu và phục hồi ngữ cảnh dễ dàng hơn.

Hy vọng là bạn đã nắm được các lý do khiến chương trình mẫu được viết như vậy.

Thân,

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

30 of 53 29/03/2013 11:54 CH

Page 31: Học PIC trong 1 ngày

tinhthanthep

newuser

namqn

leduy173

newuser

namqn

16-08-2006, 09:29 PM

Bây giờ thì đã thông. Thanks namqn

18-08-2006, 12:14 PM

Trong P16F877A, một vài thanh ghi SFR có mặt trong cả 4 bank như: PCL, FSR, STATUS, PCLATH... như thếgiá trị của chúng sẽ được tham chiếu qua lại và ta đều có thể truy cập đến mà không cần quan tâm đến vị tríbank hiện tại. Việc lưu trữ giá trị thanh ghi Status theo em chỉ có ý nghĩa đối với các bit cờ C, DC, Z,PD\ vàTO\ thôi, còn các bit chọn bank thì không cần vì mỗi khi cần truy cập đến thanh ghi nào thì chỉ cần bankselthanhghi là ổn, hoặc có thói quen luôn có dòng page0 mỗi khi hoàn thành việc truy cập đến SFR.riêng về PCLATH thì dòng note trang 30/phần PCL và PCLATH đã có chú ý rồi.còn phần này:Vì có tối đa 16 byte của mỗi bank (người dịch: địa chỉ 0x70-0x7F) là được dùng chung trong các chipPIC16F876A/877A, các thanh ghi tạm nên được đặt ở đây. 16 ô nhớ này không cần chuyển bank và do đó sẽlàm cho việc lưu và phục hồi ngữ cảnh dễ dàng hơn.như thế theo em hiểu thì giá trị nằm trong các thanh ghi ở địa chỉ này cũng có khả năng tham chiếu qua lại?sao trogn datasheet em không thấy nói đến nhỉ? Anh Nam có thể giải thích dùm em được không?

18-08-2006, 07:35 PM

Cái này được dịch từ datasheet của PIC16F87xA mà em, có điều em tìm ở chỗ không có nói, còn chỗ này cónói đến nó thì có lẽ em chưa tìm. Nó nằm ở mục 14.12 của DS39582B, trang 154.

Thân,

24-08-2006, 02:18 AM

em đang làm chớp tắt trên led bằng TMR0 ;ngõ ra là porta ;sao khi làm em thấy 1 số lệnh như Comf portA vàincf portA khi thực hiện nó ko xuất ra portA dc, muốn thực hiện điều đó thì em phải tác động qua 1 thanh ghitrung gian sau đó mới chuyển giá trị từ thanh ghi trung gian đó vào portA thì nó mới hiển thị!!!không hiểu taisao lun!!!mong được chỉ thêm!

24-08-2006, 05:15 PM

em đang làm chớp tắt trên led bằng TMR0 ;ngõ ra là porta ;sao khi làm em thấy 1 số lệnh như Comf portA vàincf portA khi thực hiện nó ko xuất ra portA dc, muốn thực hiện điều đó thì em phải tác động qua 1 thanh ghitrung gian sau đó mới chuyển giá trị từ thanh ghi trung gian đó vào portA thì nó mới hiển thị!!!không hiểu taisao lun!!!mong được chỉ thêm!bạn viết hai lệnh đó không có thêm chỉ số nào đằng sau thanhghi à? nếu tôi nhớ không lầm thì chương trìnhbiên dịch sẽ tự hiểu là bạn đang ghi giá trị đó vào thanh ghi W (bạn kiểm tra lại dùm)COMF PORTA; lấy bù PORTA rồi ghi giá trị này vào W, giá trị PORTA không thay đổi.bạn sửa lại như thế này: COMF PORTA,F; lấy bù PORTA rồi ghi vào chính nó.và nhớ thiết lập PORTA là ngõ xuất:MOVLW H'FF'; W=0xFFMOVWF TRISAchắc bạn đang tư duy theo tập lệnh 8051 nên mới thế

24-08-2006, 07:01 PM

bạn viết hai lệnh đó không có thêm chỉ số nào đằng sau thanhghi à? nếu tôi nhớ không lầm thì chương trìnhbiên dịch sẽ tự hiểu là bạn đang ghi giá trị đó vào thanh ghi W (bạn kiểm tra lại dùm)COMF PORTA; lấy bù PORTA rồi ghi giá trị này vào W, giá trị PORTA không thay đổi.bạn sửa lại như thế này: COMF PORTA,F; lấy bù PORTA rồi ghi vào chính nó.và nhớ thiết lập PORTA là ngõ xuất:MOVLW H'FF'; W=0xFFMOVWF TRISAchắc bạn đang tư duy theo tập lệnh 8051 nên mới thếKhông đúng vậy đâu newuser, mặc định là ghi vào thanh ghi f. Vấn đề ở đây là hoạt động read-modify-writecủa các lệnh thao tác dữ liệu như COMF, BSF chẳng hạn. Lấy ví dụ, khi dùng lệnh COMF PORTA, PIC sẽ đọctrạng thái từ PORTA trước, lấy bù giá trị đó, và xuất ra PORTA. Do đó nếu dùng PORTA nối vào các LED đãđược nối theo kiểu anode chung (nghĩa là PORTA xuất 0x00 để làm cho tất cả các LED sáng) thì khi đó PIC đọcvào sẽ được 0xFF, và sau đó COMF sẽ có 0x00, các LED sẽ sáng. Đến lần chạy lênh COMF kế tiếp thì tình trạngvẫn diễn ra như vậy, khiến chúng ta nghĩ rằng lệnh không tác động lên PORTA được.

Vấn đề sẽ không xảy ra nếu bạn dùng một ô nhớ để lưu trạng thái của PORTA, khi đó bạn sẽ thao tác trạngthái của PORTA thông qua biến trung gian, và không bị ảnh hưởng của hoạt động read-modify-write (vì ô nhớkhông bị ảnh hưởng của hoạt động này).

Bạn newuser viết nhầm chỗ thanh ghi TRISA luôn, để PORTA là các ngõ ra thì phải đặt TRISA = 0x00.

Thân,

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

31 of 53 29/03/2013 11:54 CH

Page 32: Học PIC trong 1 ngày

leduy173

namqn

duylinh28

tranhuyky

giaosucan

binhdt04

tranvanthuong

25-08-2006, 12:32 AM

bạn newuser ah mình cũng đã đặt portA la output và cũng đặt các đích nguồn của lệnh comf là thanh ghi Fmà vẫn bị như vậy!Anh namqn có thể nói rõ hơn về vấn đề đó ko , và những lệnh nào bi ảnh hưởng theo kiểu đó , nếu em ko lầmthì chỉ có những lệnh toán học thôi phải ko?phải bắt buộc phải thao tác qua thanh ghi trung gian như để cóthể có kết quả hiển thị trên các port khi mình thao tác trực tiếp trên nó sao ???

28-08-2006, 11:54 PM

bạn newuser ah mình cũng đã đặt portA la output và cũng đặt các đích nguồn của lệnh comf là thanh ghi Fmà vẫn bị như vậy!Anh namqn có thể nói rõ hơn về vấn đề đó ko , và những lệnh nào bi ảnh hưởng theo kiểu đó , nếu em ko lầmthì chỉ có những lệnh toán học thôi phải ko?phải bắt buộc phải thao tác qua thanh ghi trung gian như để cóthể có kết quả hiển thị trên các port khi mình thao tác trực tiếp trên nó sao ???Ví dụ như vậy là rõ lắm rồi, làm sao nói rõ hơn được. Về các lệnh thuộc loại read-modify-write thì đoạn tríchsau đây từ tài liệu của Microchip đã nói (mặc dù vẫn không liệt kê hết các lệnh):Actually, any instruction that depends on a value currently in the register is going to be a Read-Modify-Writeinstruction. This includes ADDWF, SUBWF, BCF, BSF, INCF, XORWF, etc... Instructions that do not depend onthe current register value, like MOVWF, CLRF, and so on are not R-M-W instructions.

Tạm dịch: Thực tế, bất kỳ lệnh nào phụ thuộc vào một giá trị hiện hành trong một thanh ghi sẽ là một lệnhRead-Modify-Write (R-M-W). Điều này bao gồm các lệnh ADDWF, SUBWF, BCF, BSF, INCF, XORWF, v.v... Cáclệnh không phụ thuộc vào giá trị hiện hành của thanh ghi, như MOVWF, CLRF, và tương tự thì không phải làcác lệnh R-M-W.

Thân,

19-10-2006, 01:05 PM

aho em hoi chut. bao gio co lop hoc pic moi day ? Neu ai biet thi nhan cho em qua dia chi saukhungbohanhtinh2000. thanks

17-12-2006, 11:29 PM

À, anh xem lướt qua nên không phát hiện lỗi ở lần đầu.

Phần khai báo của bạn friends dịch không có lỗi, nhưng chạy chương trình sẽ bị sai (vì các địa chỉ biến đượcđặt không đúng). Toàn bộ 4 biến đó đều sẽ có địa chi 0x20. Bạn friends cần phải chỉnh lại như sau thì mới cóchương trình đúng:Org 0x20W_SAVE res 1STAT_SV res 1PCH_SV res 1FSR_SV res 1ORG 0X0000

Giải thích thêm về phần này. Directive org chỉ làm thay đổi bộ đếm địa chỉ của trình hợp dịch. Với đoạn codenhư trên, chúng ta sẽ có W_SAVE là nhãn ở địa chỉ 0x20, STAT_SV là nhãn ở địa chỉ 0x21, và cứ thế. Từ khóares và giá trị 1 sẽ làm bộ đếm địa chỉ tăng 1 đơn vị. Cách này không hay vì các địa chỉ biến thực chất là địachỉ của các nhãn được hiểu là sẽ được dùng làm đích của các lệnh chuyển điều khiển (hay nói cách khácchúng là các địa chỉ của các từ lệnh), nếu dùng chúng trong các PIC18 chẳng hạn thì sẽ bị sai (vì các từ lệnhcách nhau 2 byte, và PIC18 dùng địa chỉ byte).

Thân,Theo lời bác namqn nói cách dùng org không hay nếu chuyển sang PIC18 thì sai, em cũng thử rồi, làm nhưvậy phải sửa lại nhiều. Xin hỏi các bác có cách nào hay hơn không? cảm ơn các bác.

18-12-2006, 10:29 PM

xin hỏi 1 tí ,tui có 1 con 18F45 có thể dùng mạch của 16F877 cho con này dc ko ,vì tui chưa tìm dc sơ đồmạch của chon 18F45

namqn: theo tôi biết thì không có PIC18 nào có số hiệu là PIC18F45, do đó câu hỏi của bạn chưa rõ ràng.

28-05-2007, 12:25 AM

minh khong dao duoctai lieu cacban goi cho monh duockhong minh cam on nhieu [email protected]

28-05-2007, 08:46 AM

chương trình em viet đề điều khiển 4 led chớp tắt và dùng ngắt RB để kết hợp điều chỉnh tốc độ không biết tại

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

32 of 53 29/03/2013 11:54 CH

Page 33: Học PIC trong 1 ngày

sao chương trình không chạy rồi có khi chạy rút nguồn ra ghim lại thì chương trình không chay nhờ các anhchỉ giúpchương trình em viet như sau:

include "E:\ccs c\chuong_trinh_ccsc\banh_kem_duc_thanh\chuong_trin h.h"#int_RBRB_isr(){int8 y;disable_interrupts(INT_RB);disable_interrupts(GLOBAL);

if ( input(PIN_B6) ) //tang gia tri trong o nho{y = read_eeprom(0x00);y = y + 20;write_eeprom (0x00,y);}

if ( input(PIN_B7) ) //giam gia tri trong o nho{

y = read_eeprom(0x00);y = y - 20;write_eeprom (0x00,y);}

delay_ms(1000);

enable_interrupts(GLOBAL);enable_interrupts(INT_RB);

}//===========CAC CHUONG TRINH CON==============

void tao_tre(int16 x);

//============================================

void main(){ int8 x=10,y;

output_B(0x00);output_A(0x00);enable_interrupts(INT_RB);enable_interrupts(GLOBAL);

while(1){output_high(pin_B0);tao_tre(1);output_low(pin_B0);tao_tre(1);

output_high(pin_B1);tao_tre(1);output_low(pin_B1);tao_tre(1);

output_high(pin_B2);tao_tre(1);output_low(pin_B2);tao_tre(1);

output_high(pin_B3);tao_tre(1);

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

33 of 53 29/03/2013 11:54 CH

Page 34: Học PIC trong 1 ngày

falleaf

tranvanthuong

tranvanthuong

output_low(pin_B3);tao_tre(1);

output_low(pin_B0);output_low(pin_B1);output_low(pin_B2);output_low(pin_B3);tao_tre(1);

output_high(pin_B0);output_high(pin_B1);output_high(pin_B2);output_high(pin_B3);tao_tre(1);

output_low(pin_B0);output_low(pin_B1);output_low(pin_B2);output_low(pin_B3);tao_tre(1);

}}//============================================

void tao_tre(int16 x){int16 z,i;

z = x + read_eeprom (0x00);delay_ms(100);for(i=0;i<z;++i)delay_ms(2);

}

//===========================================và file.h#include <16F84A.h>

#FUSES NOWDT,NOPUT,PROTECT //No Watch Dog Timer#FUSES HS#use delay(clock=10000000)

28-05-2007, 08:57 AM

Thử xem lại việc quản lý các cờ ngắt.

Chúc vui

28-05-2007, 09:17 AM

HIC HIC, anh nào giup em di

28-05-2007, 09:19 AM

a anh ơi~! em viết chạy ổn rồi ne!

#include "E:\ccs c\chuong_trinh_ccsc\banh_kem_duc_thanh\chuong_trin h.h"#int_RBRB_isr(){int8 y;disable_interrupts(INT_RB);disable_interrupts(GLOBAL);

if ( input(PIN_B6) ) //tang gia tri trong o nho{y = read_eeprom(0x00);if(y<244){y = y + 10;

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

34 of 53 29/03/2013 11:54 CH

Page 35: Học PIC trong 1 ngày

write_eeprom (0x00,y);}}

if ( input(PIN_B7) ) //giam gia tri trong o nho{

y = read_eeprom(0x00);if(y>10){y = y - 10;write_eeprom (0x00,y);}}

delay_ms(50);

enable_interrupts(GLOBAL);enable_interrupts(INT_RB);

}//===========CAC CHUONG TRINH CON==============

void tao_tre(int8 x);

//============================================

void main(){

output_B(0x00);output_A(0x00);enable_interrupts(INT_RB);enable_interrupts(GLOBAL);

while(1){output_high(pin_B0);tao_tre(1);output_low(pin_B0);tao_tre(1);

output_high(pin_B1);tao_tre(1);output_low(pin_B1);tao_tre(1);

output_high(pin_B2);tao_tre(1);output_low(pin_B2);tao_tre(1);

output_high(pin_B3);tao_tre(1);output_low(pin_B3);tao_tre(1);

output_low(pin_B0);output_low(pin_B1);output_low(pin_B2);output_low(pin_B3);tao_tre(1);

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

35 of 53 29/03/2013 11:54 CH

Page 36: Học PIC trong 1 ngày

Dolphin

namqn

vodka1505

output_high(pin_B0);output_high(pin_B1);output_high(pin_B2);output_high(pin_B3);tao_tre(1);

output_low(pin_B0);output_low(pin_B1);output_low(pin_B2);output_low(pin_B3);tao_tre(1);

}}//============================================

void tao_tre(int8 x){int8 z,i;

z = x + read_eeprom (0x00);delay_ms(100);for(i=0;i<z;++i)delay_ms(2);

}

//===========================================

15-07-2007, 05:52 PM

+ Cho em hỏi về phần nút bấm với điện trở kéo lên. Khi bấm thì chân ở mức thấp (ok); khi ko bấm thì lamsao biết được trạng thái của chân? (do chân mắc với nguồn qua điện trở nên điện áp ở chân ko biết xác địnhthế nào, vẫn có thể là H hoặc L).+ Đặt chân là input với điện áp là 0. Nếu nối chân đó với nguồn 5V thì nó sẽ chuyển từ 0-->5V và dòng điệnsẽ chạy từ nguồn vào chân Pic? Còn nếu là output thì sao dòng điện sẽ chạy đi đâu?Mấy cái này em vẫn chưa thông lắm...

15-07-2007, 10:03 PM

+ Cho em hỏi về phần nút bấm với điện trở kéo lên. Khi bấm thì chân ở mức thấp (ok); khi ko bấm thì lamsao biết được trạng thái của chân? (do chân mắc với nguồn qua điện trở nên điện áp ở chân ko biết xác địnhthế nào, vẫn có thể là H hoặc L).+ Đặt chân là input với điện áp là 0. Nếu nối chân đó với nguồn 5V thì nó sẽ chuyển từ 0-->5V và dòng điệnsẽ chạy từ nguồn vào chân Pic? Còn nếu là output thì sao dòng điện sẽ chạy đi đâu?Mấy cái này em vẫn chưa thông lắm...1. Thông thường, người ta dùng điện trở vài k để kéo lên cho nút bấm, còn ngõ vào của PIC thì có tổng trở vàokhá lớn (hàng megaohm). Do đó, nếu bấm nút thì điện áp đặt vào ngõ vào là 0V, còn không bấm nút thì điệnáp đặt vào ngõ vào là điện áp ở điểm giữa của mạch phân áp, với 5V đi qua trở kéo lên, rồi đến điện trở vàohàng megaohm của PIC. Như vậy áp tại ngõ vào của PIC sẽ xấp xỉ 5V, tức là mức cao.

2. Câu này bạn hỏi không rõ ràng: 'Còn nếu là output thì sao dòng điện sẽ chạy đi đâu?'. Nếu bạn muốn biếtkhi bạn xuất mức cao hay thấp thì dòng điện sẽ chạy ra sao thì câu trả lời thế này: khi bạn xuất mức cao,MOSFET phía cao của cặp transistor ngõ ra sẽ dẫn, do đó ngõ ra là gần bằng 5V và PIC cấp dòng cho tải, nếucó tải thì tùy theo dòng tải mà điện áp ở ngõ ra sẽ bị giảm nhiều hay ít do áp rơi trên MOSFET phía cao. Khibạn xuất mức thấp, MOSFET phía thấp của cặp transistor ngõ ra sẽ dẫn, do đó ngõ ra là gần bằng 0V và PICrút dòng từ tải xuống Vss, nếu có tải thì tùy theo dòng tải mà điện áp ở ngõ ra sẽ cao hơn Vss nhiều hay ít doáp rơi trên MOSFET phía thấp. Bạn xem thêm mục I/O Ports trong các datasheet của chip sẽ thấy họ vẽ cấutrúc của ngõ ra.

Thân,

30-03-2008, 07:26 PM

- Bác nào rảnh giải thích giúp em cái hàm Delay này cái:DelayMovlw d’250’Movwf count1D1Movlw 0xc7Movwf countaMovlw 0x01Movwf countbDelay_0

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

36 of 53 29/03/2013 11:54 CH

Page 37: Học PIC trong 1 ngày

namqn

vodka1505

vnchampion

thaile

tuanlq14

Decfsz counta, fGoto $+2Decfsz countb, fGoto Delay_0Decfsz count1, fGoto D1Return- em chưa hiểu về cái lệnh này "Goto $+2"?- và lệnh "Goto Delay_0" với "Goto D1" thì có gì khác nhau? em thấy trong một số hàm Delay người ta chỉdùng có lệnh "Goto Delay_0"Em xin cảm ơn rất nhiều.

30-03-2008, 07:55 PM

$ là địa chỉ lệnh hiện hành, $ + 2 là ô nhớ lệnh cách vị trí hiện hành 2 đơn vị.

Với ví dụ trên của bạn (giả sử viết cho PIC16), lệnh GOTO $ + 2 dùng để chuyển điều khiển đến lệnh GOTODelay_0 nếu sau khi giảm biến counta kết quả vẫn khác 0 (tức là nếu sau khi giảm counta mà counta vẫnkhác 0 thì bỏ qua lệnh giảm countb).

Đoạn chương trình trên dùng 3 biến đếm, do đó nếu cập nhật counta, rồi countb, thì sẽ đến lượt count1 đượccập nhật. Do đó cần dùng các nhãn Delay_0 hay D1 cho các lệnh GOTO một cách thích hợp.

Thân,

31-03-2008, 08:51 PM

- Cảm ơn anh Nam đã giúp đỡ:em viết hàm delay như này được không? và hai cái này khác nhau ở chỗ nào?

DelayMovlw d’250’Movwf count1Movlw 0xc7Movwf countaMovlw 0x01Movwf countbDelay_0Decfsz countaGoto Delay_0Decfsz countbGoto Delay_0Decfsz count1Goto Delay_0Return

13-04-2008, 03:26 PM

Chài khó hiểu quá mấy bác ơi

13-04-2008, 09:35 PM

PIC16 thì em không biết nhưng với PIC18F4580 thì không cần lưu lại giá trị của PCLATH :1>Bình thường nếu không có tác động trực tiếp thì thanh ghi PCLATH sẽ không thay đổi giá trị, kể cả khi PCthay đổi từ địa chỉ 0xFF đến 0x100. Lúc đó PCL=00 và PCLATH=00. ( Kết quả có được nhờ giả lập MPLAB SIM)2>Sau lenh RETIF hoặc RET thì chương trình đọc PC từ Stack (TOSL, TOSH, TOSU). Lúc này PC sẽ được phụchồi như ngay tại thời điểm gặp ngắt, hoặc lệnh CALL. Nhưng PCLATH vẫn không bị thay đổi nếu không có lệnhtác động trực tiếp (chẳng hạn MOVWF PCLATH)3>Thanh ghi PCLATH chỉ có tác dụng khi ta tác động ghi lên thanh ghi PCL, chẳng hạn:+ với PCLATH=1 thì lệnh MOVWF PCL sẽ làm cho PC=0x100 ( với WREG=0)

Nói túm lại bình thường PC không tham khảo đến thanh ghi PCLATH, chỉ khi có tác động ghi trực tiếp lênthanh ghi PCL thì PC mới tham khảo đến nó. Theo em thấy thì khi sử dụng bảng mới thực sự cần đến thanhghi PCLATH

Em là Newbie, có sai sót gì thì nhẹ nhàng chỉ bảo em ^^

14-04-2008, 05:44 PM

co thể chạy chương trinh MPLAB ngay trong CCS C khôngco thể vừa viết MPLAB và CCS C cung trong CCS C không

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

37 of 53 29/03/2013 11:54 CH

Page 38: Học PIC trong 1 ngày

namqn

vodka1505

14-04-2008, 08:30 PM

co thể chạy chương trinh MPLAB ngay trong CCS C khôngco thể vừa viết MPLAB và CCS C cung trong CCS C khôngMPLAB IDE là môi trường phát triển tích hợp, CCS C là một trình biên dịch. Do đó, nói ngược lại thì đúng hơn,nghĩa là có thể nhúng CCS C vào MPLAB IDE.

Bản thân CCS cũng có IDE. Tuy nhiên, IDE của CCS không hỗ trợ các trình biên dịch của Microchip (MPLABC18, MPLAB C30, MPLAB C32).

Thân,

19-04-2008, 04:36 PM

;==============================================================================================;KHOI TAO VI DIEU KHIENTITLE "TUTORIAL_1"PROCESSOR P16F628AINCLUDE <P16F628A.INC>__CONFIG _CP_OFF&_PWRTE_OFF&_WDT_ON&_HS_OSC;==============================================================================================;PHAN DAT BIENORG 0x20COUNT1 RES 1COUNTA RES 1COUNTB RES 1;==============================================================================================ORG 0x0000GOTO MAINORG 0x0005MAIN; MOVLW 0x07 ;CHUYEN 0000 0111 VAO THANH GHI W; MOVWF CMCON ;TAT THANH GHI SO SANH

BANKSEL TRISBCLRF TRISB

BANKSEL PORTBCLRF PORTB

LOOPMOVLW B'11111111' ;W = 1111 1111MOVWF PORTB ;SANG CAC LEDCALL DELAY ;GOI HAM TAO TRE

MOVLW B'00000000' ;W = 0000 0000MOVWF PORTB ; TAT LEDCALL DELAY ;GOI HAM TAO TRE

MOVLW B'11111111' ;W = 1111 1111MOVWF PORTB ;CALL DELAY ;GOI HAM TAO TRE

MOVLW B'00000000' ;W = 0000 0000MOVWF PORTBCALL DELAY ;GOI HAM TAO TRE

MOVLW B'11111111' ;W = 1111 1111MOVWF PORTB ;CALL DELAY ;GOI HAM TAO TRE

MOVLW B'00000000' ;W = 0000 0000MOVWF PORTBCALL DELAY ;GOI HAM TAO TRE

MOVLW B'11111111' ;W = 1111 1111MOVWF PORTB ;CALL DELAY ;GOI HAM TAO TRE

MOVLW B'10000000'MOVWF PORTBLOOP_1CALL DELAY

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

38 of 53 29/03/2013 11:54 CH

Page 39: Học PIC trong 1 ngày

vodka1505

BCF STATUS, CRRF PORTBBTFSS STATUS, CGOTO LOOP_1

MOVLW B'00000001'MOVWF PORTBLOOP_2CALL DELAYBCF STATUS,CRLF PORTBBTFSS STATUS,CGOTO LOOP_2

MOVLW B'11000000'MOVWF PORTBCALL DELAY

MOVLW B'11100000'MOVWF PORTBCALL DELAY

MOVLW B'11110000'MOVWF PORTBCALL DELAY

MOVLW B'11111000'MOVWF PORTBCALL DELAY

MOVLW B'11111100'MOVWF PORTBCALL DELAY

MOVLW B'11111110'MOVWF PORTBCALL DELAY

MOVLW B'11111111'MOVWF PORTBCALL DELAY

GOTO LOOP ;GO BACK AND DO IT AGAIN;==============================================================================================;CHUONG TRINH CON;----------------------------------------------------------------------------------------------DELAYMOVLW D'255' ;MOVWF COUNT1 ;COUNT1 = 255MOVLW d'255' ;MOVWF COUNTA; MOVLW d'51'; MOVWF COUNTBDELAY_1DECFSZ COUNT1 ;COUNT1 = COUNT1 - 1GOTO DELAY_1 ;QUAY TRO LAI NHAN DELAY; DECFSZ COUNTA ;COUNTA = COUNTA - 1; GOTO DELAY_1DECFSZ COUNTBGOTO DELAY_1RETURNGOTO $END

- Đoạn chương trình trên của em chạy rất tốt nếu khai báo dùng thạch anh nội của PIC, còn nếu em khai baonhư trên ( dùng thạch anh ngoài) thì nó không chạy. cụ thể là các led không nháy, và chân rb4 của nó khôngcó mức tín hiệu cao, mặc dù em đã set nó lên mức cao.- Anh nào biết nó sai ở chỗ nào chỉ giúp em với. Mạch em dùng thạch anh 10Mhz, tụ gốm 33p.Cảm ơn các anh nhiếu

21-04-2008, 08:20 AM

không có ai giúp mình sao? đang cần quá.

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

39 of 53 29/03/2013 11:54 CH

Page 40: Học PIC trong 1 ngày

namqn

tam_pascal

namqn

bachelor

21-04-2008, 09:05 AM

Bạn đã khẳng định là chương trình chạy tốt rồi, chỉ có thay đổi thiết lập cấu hình từ bộ dao động nội sangthạch anh ngoài thôi. Như vậy có nhiều khả năng là thạch anh không dao động (đã có bạn gặp trường hợp làchân OSC2 bị hỏng, do đó chỉ dùng được cấu hình clock ngoài, không dùng được cấu hình thạch anh ngoài).Bạn cũng chú ý là bạn đang bật WDT, và trong code không hề có lệnh xóa WDT. Có khả năng là bạn tắt WDTkhi chạy bằng bộ dao động nội, và bật WDT khi cấu hình lại để dùng thạch anh ngoài hay không?

Thân,

22-04-2008, 08:46 AM

Bang chủ làm ơn cho hỏi: địa chỉ cổng b của 18f4550 là gì ?, mình tìm mãi không thấy nó ghi ở chỗ nào cả.Xin cảm ơn !!!

22-04-2008, 04:59 PM

Bang chủ làm ơn cho hỏi: địa chỉ cổng b của 18f4550 là gì ?, mình tìm mãi không thấy nó ghi ở chỗ nào cả.Xin cảm ơn !!!Trong datasheet của PIC18F4550, bảng 5-1, có bản đồ bộ nhớ của vùng RAM dữ liệu. Thanh ghi TRISB có địachỉ 0xF93, còn PORTB có địa chỉ 0xF81.

Thân,

01-08-2008, 05:36 PM

Các bạn cần chú ý thêm, nếu phía trên chỗ biến ở băng 2, các bạn không đặt biến gì cả, thì các bạn cứ đểnguyên như vậy, vì ngay bên dưới, các bạn đã đặt lại địa chỉ 0x0000, nó chẳng ảnh hưởng gì đến chươngtrình.

Cũng giống như, nếu bạn không viết gì ở đoạn ORG 0x0000 và GOTO MAIN, mà bạn để ngay dòng ORG0x0005 thì chương trình vẫn chạy bình thường. Đơn giản là từ đoạn 0x0000 đến 0x0004, PIC sẽ không làm gìcả. Chúng tôi đang cố gắng từng bước hình thành cho bạn kết cấu chương trình viết bằng MPASM, mỗi ngàymột hoàn thiện hơn, để các bạn nắm rõ lý do vì sao các chương trình được viết như vậy, và chúng ta cùngthống nhất với nhau ở điểm này khi viết chương trình. Nếu các bạn tin tưởng vào việc tạo ra một chuẩn viếtchương trình MPASM cho Việt Nam, thì các bạn là người đang đặt nền móng cho nó. Tôi cũng có tham vọngnày, cho nên các quy cách ký hiệu tôi cố gắng dùng một chuẩn thống nhất, và mong rằng các bạn cùng tôilàm việc này, để sau này tất cả mọi người khi làm việc cùng với nhau có thể hiểu và truyền tải ý tưởng mộtcách nhanh nhất.

Kể từ nay, các bạn đã biết cách đặt biến, biết cách viết phần khởi tạo, chúng ta sẽ chỉ còn bàn tới việc viết ởphần chương trình chính như thế nào nữa mà thôi.

;============================================================================ORG 0x0000GOTO MAIN

ORG 0x0005MAINBANKSEL TRISBCLRF TRISB ; đặt portb là output

MOVLW D'255'MOVWF COUNT_L ; COUNT_L là 1 byte

BANKSEL PORTBLOOP BSF PORTB, 0CALL DELAYBCF PORTB, 0CALL DELAYGOTO LOOP

;=============================================================================; Các chương trình con;=============================================================================DELAY DECFSZ COUNT_L, FGOTO DELAYRETURN

;=============================================================================

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

40 of 53 29/03/2013 11:54 CH

Page 41: Học PIC trong 1 ngày

GOTO $END;=============================================================================

Các bạn vừa làm gì với đoạn chương trình trên?

Điểm thứ nhất các bạn nên chú ý, đó là việc tôi thêm phần các chương trình con vào trong phần chương trìnhchính. Phần cuối chương trình tôi vẫn luôn để là GOTO $ và kết thúc với lệnh END. Tạm thời các bạn cứ viếtnhư vậy để khoá chương trình ở dòng GOTO $, khi chương trình nhảy đến đó, nó sẽ thực hiện vòng lặp vôcùng tại chỗ, còn lệnh END là lệnh bắt buộc.

Việc này giúp chúng ta phần tách rạch ròi phần chương trình con và chương trình chính để tránh nhầm lẫn.Bởi vì ở đây chúng ta mới bắt đầu các bài học cơ bản, cho nên tôi cho rằng các chương trình của các bạn viếtlà ngắn, nên chúng ta chưa đi xa hơn về việc phân bổ vị trí này. Các bạn chỉ đơn giản hiểu là chúng ta cầnphải bỏ đoạn chương trình con ở đâu đó, và chúng ta nên tách thêm một phần nữa để dành riêng cho việc viếtchương trình con. Việc làm này về sau sẽ rất có lợi, nhưng tạm thời chúng ta khoan bàn tới, và chúng ta cứviết như vậy đã.

Phân tích về đoạn chương trình con này, chúng ta thấy chương trình con luôn bao gồm như sau:

[NHÃN]các câu lệnhRETURN

Lưu ý rằng ở trên, chúng ta gọi chương trình con CALL DELAY. Như vậy, việc gọi hàm được thực hiện bằnglệnh CALL [NHÃN].

Con trỏ chương trình sẽ nhảy về [NHÃN] được gọi. Nó thực hiện các lệnh nằm từ nhãn đó trở đi. Thực hiện chođến khi gặp lệnh RETURN, nó sẽ quay trở về và thực hiện lệnh tiếp theo ngay bên dưới lệnh CALL. Ở đây,chúng ta gặp phải một vấn đề, đó là khái niệm Top of Stack. Tuy nhiên, chúng ta tạm gác nó lại cho bài họcsau, còn bây giờ các bạn chỉ cần nắm được việc thực hiện lệnh CALL bao giờ cũng đi kèm với một nhãn. Contrỏ nhảy tới nhãn và thực hiện các lệnh bên trong đó, đến khi gặp lệnh RETURN thì nó nhảy trở về vị trí nằmsau lệnh CALL đó và thực hiện tiếp công việc đang làm.

Vì bỏ qua khái niệm Top of Stack, cho nên đề nghị các bạn không đặt ra câu hỏi nếu trong các lệnh thực hiện,nó lại có một lệnh CALL gọi đi chỗ khác thì làm thế nào? Chúng ta sẽ giải quyết vấn đề này ở phần sau.

Thế bên trong hàm DELAY chúng ta làm những gì?

Lưu ý rằng, ở trên chương trình chính, sau khi đã khởi tạo PORTB là ngõ output, các bạn thấy chúng ta đã ghigiá trị d'255' vào biến COUNT_L. Cách viết giá trị như sau:

b'11001010' để xác định số nhị phând'234' để xác định số thập phân0xF3 để xác định số thập lục phân

Lưu ý:Số nhị phân chỉ có các giá trị 0 và 1, và tối đa dài 8 bit. Số thập phân chỉ có thể có giá trị từ 0 đến 255, và sốthập lục phân chỉ có giá trị từ 00 đến FF

Quay trở lại, biến COUNT_L đang mang giá trị 255.

Khi thực hiện hàm DELAY, các bạn thực hiện lệnh DECFSZ (DECrement File, Skip if Zero), có nghĩa là nó sẽgiảm giá trị của một thanh ghi nào đó một đơn vị. Nếu sau khi giảm xong, mà kết quả là 0, thì nó sẽ nhảycách ra một ô nhớ trong bộ nhớ chương trình, và thực hiện lệnh tiếp theo đó. Nếu giá trị sau khi giảm một đơnvị chưa bằng 0, thì nó sẽ thực hiện lệnh liền kề với nó.

Như vậy, vòng lặp được thực hiện như sau:

COUNT_L = 255 (ở trên đã đặt)

DELAY COUNT_L = COUNT_L - 1if COUNT_L <> 0GOTO DELAYif COUNT_L = 0RETURN

Lệnh DECFSZ [File], F/W

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

41 of 53 29/03/2013 11:54 CH

Page 42: Học PIC trong 1 ngày

namqn

Nếu phía sau dấu phẩy, chúng ta để W, thì kết quả sẽ lưu vào thanh ghi W, và [File] không thay đổi giá trị gìhết. Nhưng ở đây, chúng ta muốn thực hiện như đoạn mã giả ở trên, nên chúng ta phải để là F.

COUNT_L sẽ giảm dần từ 255 đến 1, trong quá trình đó nó cứ chạy lên DELAY, rồi giảm COUNT_L một đơn vị,xong lại nhảy về DELAY, lại thực hiện việc giảm 1 đơn vị của COUNT_L

Khi COUNT_L = 1 nó lại giảm 1 đơn vị, lúc này COUNT_L = 0. Và nó không thực hiện lệnh GOTO nữa, mà thaybằng lệnh NOP, sau đó nó thực hiện lệnh RETURN, có nghĩa là quay về lại lệnh CALL ở trên.

Như vậy, các bạn đã hiểu rõ hàm DELAY rồi. Nhưng quan trọng nhất là làm sao tính toán được thời gian haotốn của đoạn vòng lặp này kể từ khi bắt đầu thực hiện lệnh CALL, vì thực ra chúng ta muốn là muốn biết chínhxác thời gian thực hiện lệnh của nó.

Thời gian thực hiện của lệnh CALL DELAY là bao lâu?

Lệnh CALL khi thực hiện tốn 2 chu kỳ máy, như vậy chúng ta ghi chú là (2) ở đây.

Lệnh DECFSZ tốn 1 chu kỳ máy khi giá trị trả về khác 0. Như vậy, trong quá trình thực hiện giảm từ 255xuống 1, nó thực hiện 255 - 1 = 254 lần. Mỗi lần thế này nó tốn 1 chu kỳ máy, chúng ta ký hiệu (254) ở đây.

Khi thực hiện lệnh GOTO, lệnh GOTO tốn 2 chu kỳ máy, vậy nó cũng thực hiện 254 lần, chúng ta ký hiệu (254x 2 = 506) ở đây.

Khi COUNT_L = 1, nó vẫn thực hiện lệnh DECFSZ, vậy nó tốn thêm 1 chu kỳ máy nữa (1). Sau khi thực hiệnlệnh này, kết quả trả về là 0, vậy nó sẽ thực hiện một lệnh NOP (1), và sau đó thực hiện lệnh RETURN, lệnhRETURN tốn 2 chu kỳ máy (2)

Kết quả:

(2) + (254) + (508) + (1) + (1) + (2) = 768 chu kỳ máy

Nếu chúng ta dùng thạch anh 10MHz, mỗi chu kỳ máy tốn 0.4 us, có nghĩa là lệnh CALL DELAY tốn:

768 * 0.4 us tức là khoảng 1/3000 giây.

Chúng ta khoan bàn đến việc xa hơn, vậy thì chúng ta đã biết cách tính thời gian hao tốn của hàm DELAY rồi.Nhưng nếu tính như thế này thì quá mất công, chúng ta có thể chuyển nó thành công thức cụ thể như sau:

CALL = 2

DELAY (COUNT_L) = [COUNT_L - 1] * (DECFSZ + GOTO) + 1 + 1

RETURN = 2

Các bạn nên nhớ công thức này để sau này phát triển lên tính các công thức khác.

Có lẽ hôm nay chúng ta tạm dừng bài học ở đây

Các bạn lưu ý, tôi có tính sai một đoạn phía trên, vì quáng gà hay sao đó, tính từ 255 xuống 1 giảm chỉ có253 lần. Đúng là phải 254 lần. Như từ 2 giảm xuống 1 thì chỉ có 1 lần thôi. Xin thành thật cáo lỗi với các bạn.

trong ví dụ mẫu trên theo tôi có một chỗ không hợp lý, đó là việc để các hàm con (ở ví dụ là hàm delay) nằmtrên dòng lệnh goto $. ở ví dụ này sẽ không có lỗi vì bản thân vòng lặp loop là vòng lặp vô hạn nên không cóvấn đề gì. nếu không phải là vòng lặp vô hạn thì chương trình sẽ được thực hiện tiếp tục và các lệnh tronghàm con sẽ được thực hiện sau đó mới đến dòng lệnh goto $ vì vậy chương trình sẽ chạy sai.theo tôi nên đặt các hàm con nằm giữa dòng lệnh goto $ và endmạn phép bang chủ có mấy lời góp ý :D xin mọi người cho ý kiến !

01-08-2008, 07:21 PM

trong ví dụ mẫu trên theo tôi có một chỗ không hợp lý, đó là việc để các hàm con (ở ví dụ là hàm delay) nằmtrên dòng lệnh goto $. ở ví dụ này sẽ không có lỗi vì bản thân vòng lặp loop là vòng lặp vô hạn nên không cóvấn đề gì. nếu không phải là vòng lặp vô hạn thì chương trình sẽ được thực hiện tiếp tục và các lệnh tronghàm con sẽ được thực hiện sau đó mới đến dòng lệnh goto $ vì vậy chương trình sẽ chạy sai.theo tôi nên đặt các hàm con nằm giữa dòng lệnh goto $ và endmạn phép bang chủ có mấy lời góp ý :D xin mọi người cho ý kiến !PIC là một bộ xử lý nhúng, và thông thường chỉ chạy chương trình ứng dụng duy nhất (ở đây không tính đếncác RTOS nhé). Do đó, luôn luôn có một vòng lặp vô tận (vòng lặp chính) trong chương trình.

Do đó, mệnh đề "nếu không phải là vòng lặp vô hạn" của bạn chỉ có giá trị true khi chương trình cho PIC đượcviết tồi. Và cấu trúc của chương trình mẫu không có gì bất hợp lý.

Lệnh goto $ ngay phía trước directive end của chương trình mẫu vốn là một lệnh thừa. Việc đặt các chươngtrình con ở đâu trong chương trình hợp ngữ vốn không quan trọng, trừ một số trường hợp liên quan đến kỹthuật bảng.

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

42 of 53 29/03/2013 11:54 CH

Page 43: Học PIC trong 1 ngày

bachelor

namqn

bachelor

Lập trình cho PIC có một số điểm khác biệt so với lập trình cho PC, vì sự hạn chế tài nguyên cùng cấu trúc đặcbiệt của PIC so với một máy vi tính (đa dụng).

Thân,

02-08-2008, 01:11 AM

PIC là một bộ xử lý nhúng, và thông thường chỉ chạy chương trình ứng dụng duy nhất (ở đây không tính đếncác RTOS nhé). Do đó, luôn luôn có một vòng lặp vô tận (vòng lặp chính) trong chương trình.

Do đó, mệnh đề "nếu không phải là vòng lặp vô hạn" của bạn chỉ có giá trị true khi chương trình cho PIC đượcviết tồi. Và cấu trúc của chương trình mẫu không có gì bất hợp lý.

Lệnh goto $ ngay phía trước directive end của chương trình mẫu vốn là một lệnh thừa. Việc đặt các chươngtrình con ở đâu trong chương trình hợp ngữ vốn không quan trọng, trừ một số trường hợp liên quan đến kỹthuật bảng.

Lập trình cho PIC có một số điểm khác biệt so với lập trình cho PC, vì sự hạn chế tài nguyên cùng cấu trúc đặcbiệt của PIC so với một máy vi tính (đa dụng).

Thân,

Đó, chính bản thân lệnh goto $ theo namqn đã là thừa, vậy nên phải sửa chg trình mẫu là đúng rồi :DTuy nhiên, theo tôi lệnh goto $ chỉ thừa trong trường hợp này thôi (trong vi dụ mẫu) còn trong một số trg hợpkhác bản thân nó là một "vòng lặp vô hạn không làm gì cả " (kiểu như: while(TRUE) {}; ) thì lại không thừa.Chẳng hạn một chương trình không làm gì cả mà chỉ khởi tạo các giá trị ban đầu rồi chờ các sự kiện ngắt đểphục vụ thì không thể coi đó là một chương trình tồi và lẽ đương nhiên là cần phải có một lệnh goto $ để tạora vòng lặp vô hạn (tất nhiên mọi người có thể nói là không cần lệnh goto $ mà dùng lệnh loop goto loop :))Tất nhiên chương trình con thì đặt đâu mà chả được, nhưng đây là nói tới cái chương trình mẫu mà F tạo radành cho người mới học (như tôi chẳng hạn), cứ copy nguyên về, thay cái phần nội dung trong main vàchương trình con cho phù hợp với bài toán của mình rồi biên dịch rồi chạy rồi thấy nó chạy loạn lên vì các lýdo mà tôi đã đề cập ở bài trước. vì thế mới góp ý để F sửa đổi một chút chương trình mẫu để cho những ngườimới học khác có muốn copy về, xào xáo lại như tôi sẽ không bị nhầm lẫn nữa :D

02-08-2008, 01:39 AM

Đó, chính bản thân lệnh goto $ theo namqn đã là thừa, vậy nên phải sửa chg trình mẫu là đúng rồi :DTuy nhiên, theo tôi lệnh goto $ chỉ thừa trong trường hợp này thôi (trong vi dụ mẫu) còn trong một số trg hợpkhác bản thân nó là một "vòng lặp vô hạn không làm gì cả " (kiểu như: while(TRUE) {}; ) thì lại không thừa.Chẳng hạn một chương trình không làm gì cả mà chỉ khởi tạo các giá trị ban đầu rồi chờ các sự kiện ngắt đểphục vụ thì không thể coi đó là một chương trình tồi và lẽ đương nhiên là cần phải có một lệnh goto $ để tạora vòng lặp vô hạn (tất nhiên mọi người có thể nói là không cần lệnh goto $ mà dùng lệnh loop goto loop :))Tất nhiên chương trình con thì đặt đâu mà chả được, nhưng đây là nói tới cái chương trình mẫu mà F tạo radành cho người mới học (như tôi chẳng hạn), cứ copy nguyên về, thay cái phần nội dung trong main vàchương trình con cho phù hợp với bài toán của mình rồi biên dịch rồi chạy rồi thấy nó chạy loạn lên vì các lýdo mà tôi đã đề cập ở bài trước. vì thế mới góp ý để F sửa đổi một chút chương trình mẫu để cho những ngườimới học khác có muốn copy về, xào xáo lại như tôi sẽ không bị nhầm lẫn nữa :DKhông đồng ý với bạn, vì bạn nêu lên một chi tiết không hợp lý ở post trước đó, bây giờ lại bắt sang một chitiết (được cho là) không hợp lý khác, mà không thể hiện được cái bất hợp lý mà bạn đã nêu ở post trước.

Trong cấu trúc của chương trình mẫu, vòng lặp chính là vòng lặp giữa nhãn loop và lệnh goto loop. Nếu muốnbiến nó thành while (true) {} thì không cần viết lệnh gì vào vòng lặp đó là xong. Do vậy, lệnh goto $ phíatrước dẫn hướng end vẫn là thừa. Hơn nữa, viết theo kiểu loop goto loop hay goto $ đều dịch ra cùng kết quả.

Cấu trúc của chương trình mẫu là ổn, đảm bảo không có chuyện "copy nguyên về, thay cái phần nội dungtrong main và chương trình con cho phù hợp với bài toán của mình rồi biên dịch rồi chạy rồi thấy nó chạy loạnlên". Đề nghị bạn post những chương trình kiểu đó lên để minh họa cho lý luận của bạn.

Về việc lệnh goto $ nằm trước dẫn hướng end: nó thừa nhưng chẳng ảnh hưởng gì đến chương trình ứng dụng(được viết đúng quy tắc) nên việc loại bỏ nó hay không vốn không phải là vấn đề.

Thân,

02-08-2008, 01:06 PM

Không đồng ý với bạn, vì bạn nêu lên một chi tiết không hợp lý ở post trước đó, bây giờ lại bắt sang một chitiết (được cho là) không hợp lý khác, mà không thể hiện được cái bất hợp lý mà bạn đã nêu ở post trước.

Trong cấu trúc của chương trình mẫu, vòng lặp chính là vòng lặp giữa nhãn loop và lệnh goto loop. Nếu muốnbiến nó thành while (true) {} thì không cần viết lệnh gì vào vòng lặp đó là xong. Do vậy, lệnh goto $ phíatrước dẫn hướng end vẫn là thừa. Hơn nữa, viết theo kiểu loop goto loop hay goto $ đều dịch ra cùng kết quả.

Cấu trúc của chương trình mẫu là ổn, đảm bảo không có chuyện "copy nguyên về, thay cái phần nội dungtrong main và chương trình con cho phù hợp với bài toán của mình rồi biên dịch rồi chạy rồi thấy nó chạy loạn

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

43 of 53 29/03/2013 11:54 CH

Page 44: Học PIC trong 1 ngày

lên". Đề nghị bạn post những chương trình kiểu đó lên để minh họa cho lý luận của bạn.

Về việc lệnh goto $ nằm trước dẫn hướng end: nó thừa nhưng chẳng ảnh hưởng gì đến chương trình ứng dụng(được viết đúng quy tắc) nên việc loại bỏ nó hay không vốn không phải là vấn đề.

Thân,

Theo mẫu:;======================================processor p16f84ainclude <p16f84a.inc>__config _cp_off & _wdt_off & _xt_osc;======================================org 0x0ccount0 res 1count1 res 1count2 res 1;======================================org 0x00goto mainorg 0x05;-------------------------------------------------mainbanksel trisaclrf trisamovlw 0xffmovwf trisbbanksel portaclrf portamovlw 0x09movwf count0clrwbtfsc portb, 0iorlw b'00001'btfsc portb, 1iorlw b'00010'btfsc portb, 2iorlw b'00100'btfsc portb, 3iorlw b'01000'btfsc portb, 4iorlw b'10000'addwf count0, 1delay0 call delay100mdecfsz count0, fgoto delay0bsf porta, 0;-------------------------------------------------delay100mmovlw 0x4emovwf count2delay2nopnopcall delay1278decfsz count2, fgoto delay2movlw 0xf0movwf count2delay3nopdecfsz count2, fgoto delay3return;-------------------------------------------------delay1278movlw 0xffmovwf count1delay1nopnopdecfsz count1, fgoto delay1return;-------------------------------------------------goto $end

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

44 of 53 29/03/2013 11:54 CH

Page 45: Học PIC trong 1 ngày

namqn

bachelor

namqn

;======================================thì chạy sainhưng chuyển các chương trình con xuống giữa 2 dòng goto $ và end thì chạy đúngbây giờ quay trở lại chương trình mẫu: để như vậy đương nhiên vẫn chạy đúng chuyển các chương trình conxuống giữa 2 dòng goto $ và end vẫn chạy đúnglẽ đương nhiên quẳng các chương trình con ở đâu mà chẳng được, thế nhưng với tiêu chí "học pic trong mộtngày" tức là dành cho người mới học thì mẫu càng tổng quát càng tốt đúng không, vậy thì tại sao lại khôngchỉnh sửa một chút (chẳng sai gì và chẳng thiệt hại gì) để chương trình mẫu có thể tránh thêm một lỗi có thểgặp trong thực tế.To Namqn: Từ đầu tôi vẫn nhất quán là chuyển chương trình con xuống thôi. còn những cái khác có thể là docách diễn đạt làm bạn hiểu sai. Thế còn goto $ hay loop goto loop ai chả biết bản chất nó là một, ý tôi muốnnói ở đây là tôi thì thích dùng goto $ để làm vòng lặp while(TRUE); còn có thể ng khác lại thích dùng loopgoto loop để làm vòng lặp while(TRUE);

02-08-2008, 06:44 PM

Bạn đã phá vỡ cấu trúc của chương trình mẫu. Trong chương trình mẫu, phần code của chương trình chính bắtđầu với các lệnh khởi tạo ban đầu, sau đó đi vào vòng lặp chính, còn các chương trình con nằm dưới vòng lặpchính.

Bạn đã bỏ mất vòng lặp chính (loop ... goto loop), dẫn đến chương trình con của bạn trở thành một phầntrong đoạn mã khởi tạo, và sau đó bạn mượn lệnh goto $ thừa ngay trước dẫn hướng end để làm vòng lặpwhile (true) của bạn. Nếu bạn vẫn giữ vòng lặp chính loop ... goto loop nhưng không viết gì vào giữa thì cấutrúc của chương trình mẫu vẫn được giữ, và bạn đạt được mục đích của mình.

Do đó, tôi xin khẳng định rằng bạn viết code không tuân theo cấu trúc của chương trình mẫu, và chương trìnhmẫu không có vấn đề gì cần phải sửa.

Chương trình mẫu là tổng quát, đúng cho cả trường hợp bạn thích đặt cái gì vào vòng lặp chính, hay chỉ muốncó một vòng lặp vô tận ở đó. Nếu bạn thích dùng goto $ cho vòng lặp chính, thì sau khi loại bỏ hết code giữaloop và goto loop, bạn có thể viết nó lại thành goto $ (chứ không phải xóa hẳn cái vòng lặp đó đi như bạn đãlàm).

Thân,

02-08-2008, 07:49 PM

Bạn đã phá vỡ cấu trúc của chương trình mẫu. Trong chương trình mẫu, phần code của chương trình chính bắtđầu với các lệnh khởi tạo ban đầu, sau đó đi vào vòng lặp chính, còn các chương trình con nằm dưới vòng lặpchính.

Bạn đã bỏ mất vòng lặp chính (loop ... goto loop), dẫn đến chương trình con của bạn trở thành một phầntrong đoạn mã khởi tạo, và sau đó bạn mượn lệnh goto $ thừa ngay trước dẫn hướng end để làm vòng lặpwhile (true) của bạn. Nếu bạn vẫn giữ vòng lặp chính loop ... goto loop nhưng không viết gì vào giữa thì cấutrúc của chương trình mẫu vẫn được giữ, và bạn đạt được mục đích của mình.

Do đó, tôi xin khẳng định rằng bạn viết code không tuân theo cấu trúc của chương trình mẫu, và chương trìnhmẫu không có vấn đề gì cần phải sửa.

Chương trình mẫu là tổng quát, đúng cho cả trường hợp bạn thích đặt cái gì vào vòng lặp chính, hay chỉ muốncó một vòng lặp vô tận ở đó. Nếu bạn thích dùng goto $ cho vòng lặp chính, thì sau khi loại bỏ hết code giữaloop và goto loop, bạn có thể viết nó lại thành goto $ (chứ không phải xóa hẳn cái vòng lặp đó đi như bạn đãlàm).

Thân,

Có lẽ stop việc tranh luận ở đây bởi vì thực ra chẳng ai sai cả (chỉ có khác nhau ở cách nhìn nhận vấn đề, màđó lại thuộc về suy nghĩ riêng rồi, miễn là giải quyết tốt bài toán của chính mình) mà người khác đọc vào lạichẳng tiếp nhận được thông tin gì mớiNhân đây cũng xin hỏi namqn (và mọi người :)) : những định nghĩa trong các tệp .inc (vd p16f84a.inc) có cầnthời gian không nhỉ ? (ý tôi muốn hỏi là có cần thời gian để thực hiện như các lệnh không)mong mọi người chỉ giúp, thanks !

03-08-2008, 12:35 AM

Có lẽ stop việc tranh luận ở đây bởi vì thực ra chẳng ai sai cả (chỉ có khác nhau ở cách nhìn nhận vấn đề, màđó lại thuộc về suy nghĩ riêng rồi, miễn là giải quyết tốt bài toán của chính mình) mà người khác đọc vào lạichẳng tiếp nhận được thông tin gì mớiNhân đây cũng xin hỏi namqn (và mọi người :)) : những định nghĩa trong các tệp .inc (vd p16f84a.inc) có cầnthời gian không nhỉ ? (ý tôi muốn hỏi là có cần thời gian để thực hiện như các lệnh không)mong mọi người chỉ giúp, thanks !Nếu không sai thì tại sao bạn lại góp ý sửa chương trình mẫu?

Bạn đã nói rằng "copy nguyên về, thay cái phần nội dung trong main và chương trình con cho phù hợp với bàitoán của mình rồi biên dịch rồi chạy rồi thấy nó chạy loạn lên", nhưng cái chương trình bị "chạy loạn lên" của

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

45 of 53 29/03/2013 11:54 CH

Page 46: Học PIC trong 1 ngày

window

window

NATO308

thaithien

namqn

bạn thì lại phá vỡ cấu trúc của chương trình mẫu (xóa mất vòng lặp vô tận loop ... goto loop), và dẫn đến gópý của bạn rằng chương trình mẫu có chỗ không hợp lý. Góp ý của bạn do đó là không hợp lý.

Vấn đề ở đây không phải ai đúng ai sai, mà là vấn đề bạn phá vỡ cấu trúc chương trình rồi đề nghị sửa lạichương trình mẫu để những người học sau đều phá vỡ cấu trúc giống như bạn. Đó là điều tôi không muốn xảyra.

Với câu hỏi về các tập tin .inc: những định nghĩa trong đó được trình biên dịch sử dụng khi dịch ra mã máycho PIC, và không hề liên quan đến việc thực thi chương trình trong PIC, do đó không hề tiêu tốn một chu kỳmáy nào của PIC.

Thân,

22-09-2008, 04:17 PM

Mình đọc luồng này và rất cảm ơn các bạn rất nhiều .

22-09-2008, 04:46 PM

Mình đang làm đồ án về con PIC 16F877 , thiết lập hệ thồng tổng đài điện thoại nội bộ :_2 trunk_8 Tel ra_Giao tiếp PCHiện mình đang tìm tài liệu và mong các bạn hổ trợ những kiến thức kinh nghiệm trong quá trình thực hiện....Cảm ơn rất nhiều

29-01-2009, 10:45 PM

Cám ơn sự nhiệt tình của bang chủ và các câu hỏi của thành viên nhiều lắm . Mình học được rất nhiều từ cácbạn . Cám ơn 1 lần nữa . Chúc picvietnam năm mới phát triển hơn trước và mọi người có được sức khỏe tốt đểchúng ta tiếp tục tranh luận ^^

19-02-2009, 10:25 PM

Cơ bản về PIC

http://i3.photobucket.com/albums/y64/falleafd/MachchayPIC16F628A.gif

Mình hỏi cái này hơi newbie chút nghen,trong cái hình đầu thread của anh falleaf thì làm cái mạch tạo nguồn5V-500A ở bên dưới như thế nào vậy?Cụ thể :-Con U3 C78l05/TO29 là con gì vậy ?-Nguồn 9V-12V DC thì mua ở đâu ra ?Bao nhiêu ampe ?-Liệu có trực tiếp nguồn 5V-500A mà không qua mạch trên kia không?-Con thạch anh chọn bao nhiêu MHZ là tốt nhất ?

Hic,câu hỏi quá newbie luôn chứ không còn hơi hơi nữa,mong mọi người giúp đỡ với !!!Thanks

19-02-2009, 11:24 PM

Mình hỏi cái này hơi newbie chút nghen,trong cái hình đầu thread của anh falleaf thì làm cái mạch tạo nguồn5V-500A ở bên dưới như thế nào vậy?Cụ thể :-Con U3 C78l05/TO29 là con gì vậy ?-Nguồn 9V-12V DC thì mua ở đâu ra ?Bao nhiêu ampe ?-Liệu có trực tiếp nguồn 5V-500A mà không qua mạch trên kia không?-Con thạch anh chọn bao nhiêu MHZ là tốt nhất ?

Hic,câu hỏi quá newbie luôn chứ không còn hơi hơi nữa,mong mọi người giúp đỡ với !!!Thanks- Nguồn 5V-500 mA chứ không phải 5V-500A!

- C78L05/TO92 là vi mạch ổn áp 5 V thuộc dòng 7805 (phiên bản 78L05 chỉ có định mức 100 mA chứ khôngphải 500 mA như trong sơ đồ của falleaf), có kiểu vỏ TO92 (3 chân loại nhỏ, giống như các transistor C1815hay A1015).

- Nguồn 9 - 12 VDC mua ở chợ (Ở Tp. HCM thì đến chợ Nhật Tảo), số ampe tối thiểu bằng với định mức của vimạch ổn áp 5 V (chắc chắn có thể tìm được).

- Các thạch anh 4 MHz, 10 MHz, và 20 MHz tốt như nhau.

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

46 of 53 29/03/2013 11:54 CH

Page 47: Học PIC trong 1 ngày

thaithien

namqn

chienbinhgiuden

thaithien

chienbinhgiuden

chienbinhgiuden

mtuankct

thaithien

chienbinhgiuden

thaithien

Thân,

21-02-2009, 12:34 AM

Như vậy là nguồn 5V-500 mA sẽ không có sẵn và mình phải làm mạch giống như trên?

21-02-2009, 08:35 PM

Như vậy là nguồn 5V-500 mA sẽ không có sẵn và mình phải làm mạch giống như trên?Tôi không khẳng định như vậy, mà chỉ trả lời những câu hỏi của bạn. Tôi tin rằng bạn có thể tìm mua cácadapter có điện áp ngõ ra là 5 VDC, với khả năng cấp dòng từ 500 mA trở lên. Nhưng giải pháp dùng mạch ổnáp trên mạch ứng dụng là linh hoạt hơn trong vấn đề cấp nguồn cho mạch.

Thân,

15-03-2009, 12:53 AM

Cho tui hỏi là cái mạch ở trên đầu tiên của falleaf có thể áp dụng cho PIC 16F877a hok dzậy . Tui biết để tui ratiệm mua linh kiện về làm liền .

15-03-2009, 06:10 AM

Cho tui hỏi là cái mạch ở trên đầu tiên của falleaf có thể áp dụng cho PIC 16F877a hok dzậy . Tui biết để tui ratiệm mua linh kiện về làm liền .

Hình như là được.Cái đó làm mạch chạy thôi mà,chỉ gần gắn PIC đúng chân vào đó là hoạt động được

15-03-2009, 10:00 PM

àh cho tui hỏi thêm là chân 6 của PORTA và chân 2 của PORTB có chung với nhau không , và 2 chân đó là gìvậy ( câu này có vẻ hơi ngu nhưng vì tui dở lắm nên thông cảm dùm +_+ )

Và tại sao mình phải qua 1 mạch ôn áp , mình có thể dùng PIN 5V được không

3W1 3W2 chỉ đơn thuần là tên thôi hay có ý nghĩa gì khác (tại vì tui thấy mấy nút reset chỉ cần qua 1 conđiện trở tới nguồn ở trên là đủ gòi hok thấy có cái 3W)

Àh nếu được thì cho tui chương trình viết MPASM luôn nha .

18-03-2009, 05:48 PM

T_T sao hok ai trả lời hết trơn dzậy . Kỉu này hok kịp nộp bài tập cho thầy quá

18-03-2009, 11:32 PM

àh cho tui hỏi thêm là chân 6 của PORTA và chân 2 của PORTB có chung với nhau không , và 2 chân đó là gìvậy ( câu này có vẻ hơi ngu nhưng vì tui dở lắm nên thông cảm dùm +_+ )mình không hiểu bạn đang nói sơ đồ nào, nhưng mình nghĩ chẳng ai nối 2 chân này lại với nhau làm gìVà tại sao mình phải qua 1 mạch ôn áp , mình có thể dùng PIN 5V được khôngBạn hoàn toàn có thể dùng pin 5V để chạy vđk(nếu bạn có), cái này tùy ứng dụng thôi, nếu làm để học thìlàm bộ nguồn 5V sẽ tiện dụng, kinh tế hơn việc chạy bằng pin3W1 3W2 chỉ đơn thuần là tên thôi hay có ý nghĩa gì khác (tại vì tui thấy mấy nút reset chỉ cần qua 1 conđiện trở tới nguồn ở trên là đủ gòi hok thấy có cái 3W)nếu bạn đang nối về cái mạch đầu tiên của anh falleaf thì mình không thấy cái nào là 3W1 và 3W2 cả chỉ cócái nút ấn và công tắc là SW1, và SW2 thôi

21-03-2009, 03:43 PM

Cái nguồn 9V-12V thì dòng điện vào là bao nhiêu vậy ?Nó có ảnh hưởng nhiều đến đầu ra 5V-500mA không?

21-03-2009, 09:12 PM

^^ nhìn lộn , là SW chứ hok phải 3W .

Còn vụ chân số 2 của PORTB và chân số 6 của PORTA là sao vậy . Bỏ chân đó hay là sao . Àh mà tui gắn thêmPORTC , D chắc hok sao đâu ha .

21-03-2009, 10:15 PM

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

47 of 53 29/03/2013 11:54 CH

Page 48: Học PIC trong 1 ngày

chienbinhgiuden

thaithien

linhdien

vocuvoba

f85635

thuongcdtspkt

luyenmta

lehung1212

minhphuong2004

tuananhbkbn

lampic

Cho hỏi cái này:công dụng của các con thạch anh trong mạch đầu thread là gì vậy?Nếu không có con thạchanh thì mạch có chạy không?

22-03-2009, 07:30 PM

COn thạch anh dùng để cung cấp xung cho con PIC hoạt động . Cứ 4 nhịp động thì con PIC thực hiên 1 lệnh .Bạn hãy đọc kỹ trang 1 đi Falleaf viết rõ lắm đó

23-03-2009, 12:00 AM

Cái đó thì mình đọc rồi và cũng hiểu chút ít.Nhưng do mình lắp mạch thật ở ngoài mà chạy chưa được nên mớinghĩ vậy.Trong mạch thật mình lắp không có thạch anh.Mà trong PIC cũng đã có sẵn dao động nội rồi đúngkhông?

18-05-2009, 03:46 PM

Cam on fallaf, tôi đang tìm hiểu và bắt đầu học Pic. Bài viết của bạn rất hữu ích. Có kinh nghiệm nhiều bạnchỉ giáo cho tôi với nhé. Mail: [email protected]."Chuyển tải thông tin là bạn đã nhận được thông tin"

23-09-2009, 10:46 PM

hay quá các bác àlàm em mở rộng tầm mắt:D

11-11-2009, 06:35 AM

Thnaks bác Falleaf nhiều:) Bác hướngd dẫn rất cụ thể. Em mới bắt đầu học nhưng cũng hiểu so so rồi.hihimong Bác chỉ bảo thêm

19-03-2010, 07:31 PM

Cam on Pic pang chu, mac du cuoi tuan minh phai hoc lai ve pic rat met, 19h30 ma van chua an com nhungxem dc may cai file cua bac toi mung lam

09-06-2010, 02:30 AM

hay qá em moi hoc pic nên doc bai nay em vo cac ra nhieu cam on da dua bai nay len

31-07-2010, 04:59 PM

em mon bai moi cua a qua, giup tui em voi a nha, cam on anh falleaf nhiu nhiu ^^

31-07-2010, 05:31 PM

Xin chào tất cả mọi người. Hiện nay chúng ta vẫn hay viết chương trình điều khiển và ghéo nối máy tính bằngVB6.Nhưng tôi đi làm thấy người Nhật các phần mềm của họ đều chuyển sang Vb2005 hoặc VB2008.Code củathằng này khác rất nhiều so với VB6.Vậy ai có tài liệu hoặc có kinh nghiệm làm về VB2008 (phần giao tiếp máy tính)thì port bài lên cho anh emcùng tham khảo nhé.Cảm ơn tất cả mọi người.

09-08-2010, 06:23 PM

các anh chị ơi! em đang học lập trình về pic.trong đó có LCD nữa,em không hiểu làm thế nào để hiểu được cácthư viện ví dụ như LCD-lib-4c để có thể dùng nó! thank

13-01-2011, 10:37 AM

Chào cac bạnMình thấy bác F chỉ viết phuong trình dễ quá,nên copy vào MPLAB V8.63 ,nhưng bị báo lổi.Mong các bạn chỉlổi của mình ,Thành thât cám ơn.================================================== ======; Ten chuong trinh : Mach test den LED_1; Nguoi thuc hien : Falleaf; Ngay thuc hien : 23/05/2005; Phien ban : 1.0; Mo ta phan cung : Dung PIC16F628A - thach anh 10MHz

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

48 of 53 29/03/2013 11:54 CH

Page 49: Học PIC trong 1 ngày

vodich01

luongkim

lehuybinhddt

lehuybinhddt

pstin

; : LED giao tiep voi PORTB; : Cuc am cua LED noi voi GND; : RB0 - RB7 la cac chan output;----------------------------------------------------------------; Ngay hoan thanh : 23/05/2005; Ngay kiem tra : 23/05/2005; Nguoi kiem tra : Doan Hiep;----------------------------------------------------------------;TITLE "Mach test LED_1"PROCESSOR P16F628AINCLUDE <P16F628A.inc>__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSCORG 0x0000

GOTO MAIN

ORG 0x0005

MAINBANKSEL TRISB ; bank selectCLRF TRISB ; trisb = 00000000; portb = outputBANKSEL PORTBBSF PORTB, 0 ; rb0 = 1; RB0 = 5VGOTO $ ; dung chuong trinh tai day; vong lap tai cho^~; khong bao gio ket thucEND. ; lenh bat buoc de ket thuc;==========================

16-01-2011, 06:24 PM

Cho mình hỏi mấy cái nối đất, nối điện trở làm sao biết nối như thế nào, số liệu bao nhiêu, mình mới học nênko rõ lấm, mong mọi người giúp đỡ. Nếu như có 1 thread chỉ viết code + mô phỏng luôn thì đối với 1 người kochuyên về điện tử nhưng có hứng thú như mình có lẽ tiếp thu đc nhanh hơn.

14-05-2011, 11:54 PM

huynh nào có tài liệu bằng tiếng việt về pic6f88x cho mình tham khảo với nha

09-06-2011, 09:56 PM

em cám ơn các bác nha.em là tân binh còn nhiều điều cần học hỏi.mong các bác giúp đỡ em nhiều ak.

09-06-2011, 09:59 PM

dạ thưa bác nào có thể dạy em 1 bài về lập trình cho PIC đc không ạem tks trc nha

10-06-2011, 05:19 PM

ĐANG RẢNH, THẤY ANH EM HAY THẮC MẮC CÁI CHUYỆN HIỂN THỊ LED 7 ĐOẠN, SẴN TUI POST LÊN CHO ANHEM THAM KHẢO, CHƯƠNG TRÌNH QUÉT LED 4X7 ANODE CHUNG, KHÔNG DÙNG IC GIẢI MÃ.D4:LED1;D5:LED2;D6:LED3;D7:LED4;

CHƯƠNG TRÌNH ĐỌC GIÁ TRỊ ANALOGE AN0 XUẤT GIA TRỊ RA LED.MẠCH ĐÍNH KÈM BÊN DƯỚI, ĐIỆN TRỞ DÙNG VÀI TRĂM OHM CHO LED SÁNG NHIỀU HƠN.ĐẤU DÂY LUNG TUNG THÌ THAY LẠI CÁC ĐỊA CHỈ SET CŨNG OK LUÔN, MẠCH DÙNG NGUYÊN PORTB CHOTIỆN.

Void hien_thi(){set_ADC_channel(0);delay_us(100);adc0=read_ADC(ADC_START_AND_READ);delay_us(100);adcn0 = adc0/1000;

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

49 of 53 29/03/2013 11:54 CH

Page 50: Học PIC trong 1 ngày

alycuong

a0= adc0%1000;adct0 = a0/100;b0 = a0%100;adcc0 = b0/10;adcd0 = b0%10;i=adcn0;chuyen();PortD=0x10;PortB=n;delay_ms(5);i=adct0;chuyen();PortD=0x20;PortB=n;delay_ms(5);i=adcc0;chuyen();PortD=0x40;PortB=n;delay_ms(5);i=adcd0;chuyen();PortD=0x80;PortB=n;delay_ms(5);}

Void chuyen(){switch(i){case 0:n=0x03;break;case 1:n=0x9f;break;case 2:n=0x25;break;case 3:n=0x0D;break;case 4:n=0x99;break;case 5:n=0x49;break;case 6:n=0x41;break;case 7:n=0x1f;break;case 8:n=0x01;break;case 9:n=0x09;break;}}

12-06-2011, 07:45 PM

Trong thư viện lcd.c có sẵn của CCS thì có các hàm bên dưới, e chỉ biết công dụng của 1 số, a nào biết chúthích giúp e các cái còn lại với.

void lcd_send_byte(BYTE address, BYTE n) ??? cai nay la gi ah?void lcd_send_nibble(BYTE n) ??? cai nay la gi ah?void lcd_init(void) //Khoi tao LCDvoid lcd_gotoxy(BYTE x, BYTE y) // Di den vi tri cot , hangvoid lcd_putc(char c) // Gui ki tu len LCDchar lcd_getc(BYTE x, BYTE y) // Nhan ki tu tu LCD

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

50 of 53 29/03/2013 11:54 CH

Page 51: Học PIC trong 1 ngày

pstin

qiuyinffy

phamhaihoc

vinhhai

nguyenvyled

Cho e hỏi là với 1 thư viện khác thì có hàm void LCD_PutCmd ( unsigned int cX )

Ví dụ muốn nhấp nháy con trỏ thì viết : LCD_PutCmd(0x0f)

Nhưng với thư viện lcd.c

void lcd_send_byte(BYTE address, BYTE n)void lcd_send_nibble(BYTE n)void lcd_init(void)void lcd_gotoxy(BYTE x, BYTE y)void lcd_putc(char c)char lcd_getc(BYTE x, BYTE y)

Với các lệnh trên e k biết làm sao để nhấp nháy con trỏ hết. A nào bít hướng dẫn gúp e. E cảm ơn nhiều lắm!

13-06-2011, 11:45 AM

Đối với hàm void lcd_gotoxy(BYTE x, BYTE y) thì nhấp nháy con trỏ là:

lcd_gotoxy(BYTE x, BYTE y);lcd_send_byte(0,0x0f);

14-06-2011, 08:58 AM

Hoi Cac anh em cho, CPI manure Chuong Trinh Nhu Mau Theo Ben Ngata two contrary, cooperation may KhaiThi Bao CC Vung ram two contrary Khong Ben

19-06-2011, 09:28 PM

PIC ổn định...có bộ nào hây hơn bộ này không vậy mấy anh...

18-02-2012, 05:10 PM

cảm ơn bạn đã post bài.

27-03-2012, 10:27 PM

Cơ bản về PIC

Dưới đây là hình mạch chạy của PIC16F84A, PIC16F628A và PIC16F88. Tất cả các PIC này đều có vị trí chântương ứng nhau, và thậm chí có thể nói PIC16F628A tương thích PIC16F84A và PIC16F88 tương thích với hailoại còn lại. Có nghĩa là trong các ứng dụng của PIC16F84A, khi thay đổi bằng PIC16F88, hay PIC16F628Ađều được.

http://i3.photobucket.com/albums/y64/falleafd/MachchayPIC16F628A.gif

Tất nhiên, 3 loại vi dòng PIC trên đây có thể tương thích với nhiều dòng PIC cũ hơn, nhưng vì thị trường PICViệt Nam phổ biến với 3 loại PIC này, cho nên chúng tôi chỉ đề cập đến 3 loại PIC này mà thôi.

Sau khi các bạn có mạch nạp, chương trình nạp, MPLAB IDE, CCS C hoặc HT PIC, các bạn làm mạch chạy này.Kể từ đây khi thiết kế cách mạch test, hoặc các thiết bị ngoại vi khác, cần thử nghiệm, các bạn chỉ việc thiếtkế mạch ngoài, sau đó cắm vào các chân ra và chạy thử.

Khi mạch chạy tốt, các bạn muốn thiết kế được hoàn chỉnh, các bạn chỉ việc copy mạch chạy từ Orcad và dánvào mạch nguyên lý của thiết bị của bạn. Xoá các chân header đi, và nối dây vào trong mạch chạy PIC. Nhưvậy, chúng ta không phải tốn thời gian thiết kế cho PIC nữa.

Một vài điểm lưu ý về mạch như sau:

- Nguồn chỉ dùng cho PIC, tuyệt đối không dùng bộ nguồn này cho thiết bị ngoại vi. Nếu thiết bị ngoại vi cầnnguồn, các bạn thiết kế bộ nguồn riêng. Một số thiết bị ngoại vi quá đơn giản, và tốn ít dòng, các bạn có thểdùng nguồn chung (khoảng 100mA)

- Tôi không khuyến khích dùng dao động nội của PIC, bởi vì dao động nội chỉ chạy được ở 4MHz, và không ổnđịnh như dùng thạch anh ngoài. Một số đề tài công nghiệp, họ dùng thạch anh chuẩn công nghiệp 4 chân, nênchúng ta cũng tạo thói quen dùng thạch anh ngoài, không cần quá tận dụng 2 chân của PIC.

- Mạch reset này là mạch reset đơn giản nhất của PIC, và tạo chế độ reset power on. Một số ứng dụng của PICyêu cần mạch brownout reset, các bạn có thể tham khảo trong datasheet. Nhưng tôi thiết nghĩ, những đề tàithông thường, không cần dùng mạch brownout reset này.

- Chúng ta thống nhất chuẩn thiết kế cho các header là nối vào các chân của PIC theo thứ tự hai chân ngoàicùng là Rx0 và GND. Mục đích là để khi chạy mạch in, chân GND có thể được xếp ra phía ngoài, chân Rx0 để

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

51 of 53 29/03/2013 11:54 CH

Page 52: Học PIC trong 1 ngày

hoamaitoasang

kiengo1408

quy định cho tất cả các port khác nhau, vì có port chỉ có 3 chân, có port 5 chân, 8 chân... Nếu lấy chân RB7làm chuẩn chẳng hạn, thì sẽ rất khó giải thích khi lấy chân RA4 đặt ra phía ngoài. Vì vậy RA0 và RB0 chúng talấy làm chuẩn. Điều này cũng đã được thực hiện trong một số tutorial, và gần như là quy ước bất thành vănkhi thực hiện các mạch phát triển cho vi điều khiển. Chân VDD (5V) được nối vào, nhằm sử dụng cho các ứngdụng cần có điện áp ngõ vào, nhưng không cao lắm như ở trên đã nói (100mA). Tuyệt đối không thiết kế chânVSS (GND) và chân VDD (5V) ở hai đầu của header, tránh tình trạng đôi khi chúng ta không để ý cắm nhầm,có thể làm hỏng PIC, hoặc hỏng luôn cả thiết bị ngoại vi.

- Các nút bấm và công tắc, tôi thiết kế là các nút bấm 4 chân, vì hiện nay trên thị trường hầu như chỉ bán loạinút bấm này, và loại nút bấm này chắc chắn hơn loại 2 chân trước đây. Các bạn cũng lưu ý sau này khi thiếtkế nút bấm cũng nên thiết kế nút bấm 4 chân.

- Con ổn áp 78L05 khác với con 7805. Nó là dạng TO92, tức là nó giống như con transistor thông thường, nênrất nhỏ, chứ không phải dạng 3 chân và có tấm tản nhiệt phía sau như con 7805. Do vậy, mạch thiết kế sẽnhỏ đi khá nhiều.

- Ở đây, tôi không chạy ra mạch in, vì rằng tôi muốn dành công việc này cho các bạn sinh viên mới học. Saukhi các bạn làm xong mạch in, nếu các bạn có thể chia sẻ với chúng tôi thì thật là tuyệt vời. Chỉ có một điềulưu ý là, chúng ta thường không cắm trực tiếp vi điều khiển vào mạch để hàn, mà chúng ta cắm qua mộtsocket để có thể gỡ ra lập trình lại, và để đảm bảo không bị cháy PIC khi hàn. Do vậy, khi cắm socket, các bạnsẽ có thể nhét hai tụ nối ở thạch anh vào bên trong socket, khi cắm PIC lên, nó sẽ che hai cái tụ đó đi, vàmạch của các bạn sẽ gọn gàng hơn. Socket loại 18 chân không thể nhét thạch anh và điện trở nối từ chânMCLR đến VDD vào bên trong được, nhưng sau này khi dùng PIC 28 hoặc 40 chân, các bạn nên nhét tất cảvào bên dưới socket để cho mạch gọn gàng hơn.

- Một điểm cuối cùng, chúng tôi không thiết kế phần nạp bằng ICSP, bởi vì chúng tôi không muốn làm cho cácbạn mới học PIC cảm thấy bối rối. Chúng ta sẽ thực hiện mạch chạy PIC với các chân ICSP và bootloader sau.huynh co the goi cho de xin mot doan code mau lam led nhap nhay su dung pic 16f54 theo dia chi mail cuade duoc kg? [email protected] de cam on truoc nhe.

04-06-2012, 09:03 PM

ở day mình xin ép 1 file pdf nói về cơ bản của pic ,có ai đoc thấy hay thì cho mình xin 1 bài code nha:Bai code đó viết như thế này :;viết cho 3 nút nhấn nhập vào ở port E3 nút đó có tên là reset ;up;dowĐể tăng giảm hiển thị lên led 7 đoạn va reset lại từ dầuvà nút tăng từ 1 đến 100 và giảm xuống ...mình xin cảm ơn trước ;nếu được như vậy mình sẽ học mau hơn va minh sẽ viết nhiều bài cơ bản giúp cho''ĐIỄN DÀN '' phát triển với CCS hơn la các ngôn ngữ khác.

hoặc gửi mail cho mình :[email protected]

mình xin cảm ơn:thank very must

07-09-2012, 05:31 PM

Cơ bản về PIC

Dưới đây là hình mạch chạy của PIC16F84A, PIC16F628A và PIC16F88. Tất cả các PIC này đều có vị trí chântương ứng nhau, và thậm chí có thể nói PIC16F628A tương thích PIC16F84A và PIC16F88 tương thích với hailoại còn lại. Có nghĩa là trong các ứng dụng của PIC16F84A, khi thay đổi bằng PIC16F88, hay PIC16F628Ađều được.

http://i3.photobucket.com/albums/y64/falleafd/MachchayPIC16F628A.gif

Tất nhiên, 3 loại vi dòng PIC trên đây có thể tương thích với nhiều dòng PIC cũ hơn, nhưng vì thị trường PICViệt Nam phổ biến với 3 loại PIC này, cho nên chúng tôi chỉ đề cập đến 3 loại PIC này mà thôi.

Sau khi các bạn có mạch nạp, chương trình nạp, MPLAB IDE, CCS C hoặc HT PIC, các bạn làm mạch chạy này.Kể từ đây khi thiết kế cách mạch test, hoặc các thiết bị ngoại vi khác, cần thử nghiệm, các bạn chỉ việc thiếtkế mạch ngoài, sau đó cắm vào các chân ra và chạy thử.

Khi mạch chạy tốt, các bạn muốn thiết kế được hoàn chỉnh, các bạn chỉ việc copy mạch chạy từ Orcad và dánvào mạch nguyên lý của thiết bị của bạn. Xoá các chân header đi, và nối dây vào trong mạch chạy PIC. Nhưvậy, chúng ta không phải tốn thời gian thiết kế cho PIC nữa.

Một vài điểm lưu ý về mạch như sau:

- Nguồn chỉ dùng cho PIC, tuyệt đối không dùng bộ nguồn này cho thiết bị ngoại vi. Nếu thiết bị ngoại vi cầnnguồn, các bạn thiết kế bộ nguồn riêng. Một số thiết bị ngoại vi quá đơn giản, và tốn ít dòng, các bạn có thểdùng nguồn chung (khoảng 100mA)

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

52 of 53 29/03/2013 11:54 CH

Page 53: Học PIC trong 1 ngày

wikj10

tosang

- Tôi không khuyến khích dùng dao động nội của PIC, bởi vì dao động nội chỉ chạy được ở 4MHz, và không ổnđịnh như dùng thạch anh ngoài. Một số đề tài công nghiệp, họ dùng thạch anh chuẩn công nghiệp 4 chân, nênchúng ta cũng tạo thói quen dùng thạch anh ngoài, không cần quá tận dụng 2 chân của PIC.

- Mạch reset này là mạch reset đơn giản nhất của PIC, và tạo chế độ reset power on. Một số ứng dụng của PICyêu cần mạch brownout reset, các bạn có thể tham khảo trong datasheet. Nhưng tôi thiết nghĩ, những đề tàithông thường, không cần dùng mạch brownout reset này.

- Chúng ta thống nhất chuẩn thiết kế cho các header là nối vào các chân của PIC theo thứ tự hai chân ngoàicùng là Rx0 và GND. Mục đích là để khi chạy mạch in, chân GND có thể được xếp ra phía ngoài, chân Rx0 đểquy định cho tất cả các port khác nhau, vì có port chỉ có 3 chân, có port 5 chân, 8 chân... Nếu lấy chân RB7làm chuẩn chẳng hạn, thì sẽ rất khó giải thích khi lấy chân RA4 đặt ra phía ngoài. Vì vậy RA0 và RB0 chúng talấy làm chuẩn. Điều này cũng đã được thực hiện trong một số tutorial, và gần như là quy ước bất thành vănkhi thực hiện các mạch phát triển cho vi điều khiển. Chân VDD (5V) được nối vào, nhằm sử dụng cho các ứngdụng cần có điện áp ngõ vào, nhưng không cao lắm như ở trên đã nói (100mA). Tuyệt đối không thiết kế chânVSS (GND) và chân VDD (5V) ở hai đầu của header, tránh tình trạng đôi khi chúng ta không để ý cắm nhầm,có thể làm hỏng PIC, hoặc hỏng luôn cả thiết bị ngoại vi.

- Các nút bấm và công tắc, tôi thiết kế là các nút bấm 4 chân, vì hiện nay trên thị trường hầu như chỉ bán loạinút bấm này, và loại nút bấm này chắc chắn hơn loại 2 chân trước đây. Các bạn cũng lưu ý sau này khi thiếtkế nút bấm cũng nên thiết kế nút bấm 4 chân.

- Con ổn áp 78L05 khác với con 7805. Nó là dạng TO92, tức là nó giống như con transistor thông thường, nênrất nhỏ, chứ không phải dạng 3 chân và có tấm tản nhiệt phía sau như con 7805. Do vậy, mạch thiết kế sẽnhỏ đi khá nhiều.

- Ở đây, tôi không chạy ra mạch in, vì rằng tôi muốn dành công việc này cho các bạn sinh viên mới học. Saukhi các bạn làm xong mạch in, nếu các bạn có thể chia sẻ với chúng tôi thì thật là tuyệt vời. Chỉ có một điềulưu ý là, chúng ta thường không cắm trực tiếp vi điều khiển vào mạch để hàn, mà chúng ta cắm qua mộtsocket để có thể gỡ ra lập trình lại, và để đảm bảo không bị cháy PIC khi hàn. Do vậy, khi cắm socket, các bạnsẽ có thể nhét hai tụ nối ở thạch anh vào bên trong socket, khi cắm PIC lên, nó sẽ che hai cái tụ đó đi, vàmạch của các bạn sẽ gọn gàng hơn. Socket loại 18 chân không thể nhét thạch anh và điện trở nối từ chânMCLR đến VDD vào bên trong được, nhưng sau này khi dùng PIC 28 hoặc 40 chân, các bạn nên nhét tất cảvào bên dưới socket để cho mạch gọn gàng hơn.

- Một điểm cuối cùng, chúng tôi không thiết kế phần nạp bằng ICSP, bởi vì chúng tôi không muốn làm cho cácbạn mới học PIC cảm thấy bối rối. Chúng ta sẽ thực hiện mạch chạy PIC với các chân ICSP và bootloader sau.

cảm ơn bài viết rất nhiều xin hãy tiếp tục hướng dẫn và chia sẻ thêm các phần mềm lập trình và chương trìnhnạp nhé ! thank

20-10-2012, 01:39 AM

luông này viết rất hay nhưng chưa đủ, để một người mới bắt đầu tìm hiểu vể pic thì cần những bài viết rõràng hơn, tối mới học, biết sơ sơ nhưng đọc nhiều chỗ vẫn thấy khó hiểu.

21-10-2012, 10:35 PM

Cái này thời sinh viên có làm, đi làm bỏ lâu. Giờ mò lại cho vui. Mong các trưởng lão chỉ giúp!

vBulletin® v3.7.2, Copyright ©2000-2013, Jelsoft Enterprises Ltd.

Học PIC trong 1 ngày (Upd. 01/01/2006) [Lưu Trữ] - PIC Vietnam http://webcache.googleusercontent.com/search?q=cache:zs6AvCXlFQo...

53 of 53 29/03/2013 11:54 CH


Recommended