Ðăng Nhập

View Full Version : Thảo luận xung quanh Học PIC trong 1 ngày


trung
27-05-2005, 10:46 AM
Cho hỏi Hiệp và các bạn khác post bài trong diễn đàn này, ...tôi mong muốn chuyển mấy bài viết của Hiệp, và những bài của các bạn khác ,...sang PDF, để đưa lên website www.vetecom.com.vn ....cho mọi người download ..Tất nhiên có bản quyền, ghi rõ tên tuổi, địa chỉ liên hệ của tác giả, .....
Lý do là thế này..., nhiều khi các bạn có nhiều bài viết rất chất lượng, nhưng người post vào forum thì nhiều khi chỉ ai hay vào mới biết ...nên những người ít vào sẽ ko biết đâu mà tìm
PicVietnam sau một thời gian cũng nên có portal. Hiện tại admin đang ôn thi, nên chắc phát triển sau
Không biết ý các bạn thế nào ...???

zero2one
21-06-2005, 03:04 AM
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ất cả luôn.



hiểu rồi, thanks bác nhiều.

LEO-XBS
11-10-2005, 03:02 PM
bác có thể viết một bài nho nhỏ về con 16F877A được không?

tinhthanthep
21-10-2005, 11:34 AM
Hôm nay mới thứ 6 mà. Đã cuối tuần đâu.
Cho tớ hỏi? mạch của tớ mắc nút bấm với điện trở kéo xuống: tức là nguồn 5V mắc với nút bấm rồi đến chân của PIC, rồi cái chân đó lại nối với điện trở 10k rồi xuống đất. Tớ thấy nếu mắc kiểu này thì giữa chân PIC và nguồn 5V không có điện trở để giới hạn dòng. Liệu có hỏng PIC khi bấm nút không? Có phải nếu để chân PIC là ngõ INPUT thì nó ko cho dòng vào mà chỉ đọc giá trị điện áp ở chân có đúng không?
Thế là mất toi hai ngày cuối tuần để thử mấy cái nút bấm rùi. Bác falleaf ác như con thú! :cool:

falleaf
21-10-2005, 02:34 PM
Nếu vậy thì bạn cần phải xem thêm luồng này

http://picvietnam.com/forum//showpost.php?p=154&postcount=13
http://picvietnam.com/forum//showpost.php?p=155&postcount=14

Nhưng sorry nhé, vì trong đó mình có viết một câu mà chắc bạn sẽ chửi mình nếu bạn mắc mạch điện giống như bạn nói :D

Dù sao, với mình, thứ 6 là cuối tuần rồi, nên vui vẻ. Thứ hai dù là ngày đầu tuần nên vẫn còn dư âm tối chủ nhật nên khó làm việc buổi sáng.

Vậy nên, hãy làm việc thật hiệu quả từ chiều thứ hai đến tối thứ năm :D

Chúc vui.

tinhthanthep
21-10-2005, 04:57 PM
Chính là tớ đọc 2 luồng đó mới mắc mạch theo kiểu điện trở kéo xuống đấy chứ. Trong mọi tutorial tham khảo thì nó đều mắc theo kiểu điện trở kéo lên. Nhưng do mình hàn linh kiện thiếu chỗ chống nên phải bố trí cái điện trở nằm ở vị trí kéo xuống. Nhưng trong 2 luồng trên có thấy bác nói là điện trở kéo xuống có dùng được hay không đâu? Nói tóm lại là có dùng được hay không? và vì sao? Tớ Vẫn phải làm việc vào thứ 7, chỉ đựơc nghỉ vào chủ nhật thui.

falleaf
21-10-2005, 07:34 PM
Chúng ta xem hình này:

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


Bạn đọc rõ phần này, tôi nói là chỉ còn một cách mắc điện trở kéo xuống như hình tiêp theo đây, điều đó có nghĩa là nó dùng được.

tinhthanthep
21-10-2005, 08:38 PM
Tớ mắc theo kiểu này mà:
Có được không?

falleaf
21-10-2005, 10:49 PM
Tất nhiên là được! Vì nó vẫn đảm bảo không trôi nổi mà!! Bạn cứ đọc và bình tĩnh thực hiện, không vấn đề gì cả.. cùng lắm cháy cái LED thôi... lo gì... :D... Nói đùa chứ, thực hiện được, chỉ cần đảm bảo sao cho nó không bị trôi nổi điện áp là được.

tinhthanthep
22-10-2005, 08:48 AM
Thanks bác falleaf! ;)

Cai_Nguc
18-11-2005, 12:17 AM
Chào bác falleaf. bác có thể giới thiệu tinh năng của bộ nạp pic3 dc ko? Tôi đang muốn trang bị 1 bộ nạp pic mà chưa biết nên dùng loại nào. Tôi mới đang học thôi

falleaf
19-11-2005, 07:01 PM
Bộ nạp Falleaf PIC3, là bộ nạp được cải tiến lại một chút từ mạch nạp GTP_USB.

Nó có thể nạp hầu hết các loại PIC hiện nay, kể cả dsPIC. Đây là tính chất hay nhất của bộ nạp PIC3.

Về tốc độ nạp, nó sử dụng chương trình WinPIC800 để nạp, tốc độ nạp cao nhất hiện nay trong các loại mạch nạp có thể làm được tại Việt Nam.

Điểm yếu của PIC3, đó là không tương thích với MPLAB và không dùng để debug on board giống như ICD2 được. Tuy nhiên, thông thường, theo kinh nghiệm làm việc của chúng tôi, ít khi chúng tôi phải debug onboard, thậm chí như tôi thì chưa bao giờ dùng ICD2 để debug onboard.

Vấn đề người dùng cần, đó chính là nạp được tất cả các loại PIC, thì ICD2 cũng không đảm bảo nạp được tất cả các loại PIC, tốc độ nạp PIC chậm hơn (bạn có thể kiểm tra các thông tin này trên diễn đàn, đã có một lần tôi post bài ở đâu đó.

Tuy nhiên, điểm yếu nữa, không phải từ PIC3 mà là từ chúng tôi. Chúng tôi không làm mạch này để phục vụ sinh viên học tập, mà để dành cho những người làm việc với PIC, cho nên giá cao.

Bạn xem trong phần Quảng Cáo và bán sản phẩm.

Chúc vui.

PS> trong vòng 1 tuần, tôi sẽ dời bài này xuống phần tìm mua sản phẩm.

culan
25-12-2005, 02:35 PM
Các bác làm ơn chỉ giáo cho em hiểu về Pull up, Pull down, open drain, resistive pull up.. strong v.v. nói chung là về các mức digital i/o.
Bác falleaf chắc là rành phần này. Có tài liệu nói về mấy cái này bác chỉ cho em với nhé.
Merci

falleaf
25-12-2005, 03:20 PM
http://www.mcc-us.com/Open-collectorFAQ.htm

Bạn xem bài viết trong này.

Pull up = kéo lên, pull down = kéo xuống. Chỉ điện trở nối vào nguồn, hay mass để giữ cho điện áp tại chân cố định.

Vấn đề này đã được nói trong bài về nút bấm, nó dùng để chống hiện tượng trôi nổi điện áp, không rõ sẽ nằm ở mức H hay L của chân linh kiện. Vì vậy, người ta nối trực tiếp nó vào nguồn/mass, để chắc chắn điều đó.

Chúc vui.

falleaf
25-12-2005, 03:22 PM
http://www.brouhaha.com/~eric/pic/open_drain.html

Luồng này nói về kỹ thuật sử dụng nó cho PIC.

Những cái này bạn nên lên google tìm một cái là có ngay.

chúc vui.

culan
27-12-2005, 11:12 AM
merci bác falleaf.
Em cũng đã đọc các đường link của bác, cả bài về nút bấm và em cũng đã
xem. Tuy nhiên, em vẫn chưa rõ hết về open-drain, hi-z v.v.
Em lên mạng và down về cũng nhiều tài liệu nhưng vẫn chưa tìm được tài liệu nào ưng ý, nó hơi tản mạn và ít hình vẽ (dẽ hiểu hơn)
Tấc nhiên là để làm những cái ứng dụng cho vidieukhien thế cũng ổn rồi.
Nhưng em cũng muốn có một tài liệu từ A-Z về phần này.
Nếu các bác đã từng tìm tài liệu về phần này và nếu có thời gian thì share cho em với. Còn không thì để em tự vậy
Merci.

falleaf
27-12-2005, 11:20 AM
http://focus.ti.com/logic/docs/generalcontent.tsp?templateId=5985&navigationId=11410&path=templatedata/cm/general/data/trans_opendrain

falleaf
27-12-2005, 11:42 AM
merci bác falleaf.
Em cũng đã đọc các đường link của bác, cả bài về nút bấm và em cũng đã
xem. Tuy nhiên, em vẫn chưa rõ hết về open-drain, hi-z v.v.
Em lên mạng và down về cũng nhiều tài liệu nhưng vẫn chưa tìm được tài liệu nào ưng ý, nó hơi tản mạn và ít hình vẽ (dẽ hiểu hơn)
Tấc nhiên là để làm những cái ứng dụng cho vidieukhien thế cũng ổn rồi.
Nhưng em cũng muốn có một tài liệu từ A-Z về phần này.
Nếu các bác đã từng tìm tài liệu về phần này và nếu có thời gian thì share cho em với. Còn không thì để em tự vậy
Merci.

Tài liệu phần này bạn muốn hiểu vì sao nó có thể làm như vậy, thì bạn đọc lại tài liệu về mosfet. Đây là một khái niệm về điện tử rất cụ thể. Link tôi vừa đưa trên kia, miêu tả bằng hình, link đầu tiên tôi đưa, miêu tả bằng lời, link thứ hai, miêu tả ứng dụng trong PIC. Tôi chưa có thời gian để viết tiếp các phần này, mong bạn thông cảm.

Chúc vui.

anhviet
13-01-2006, 02:37 PM
BAC FALLEAF em theo hướng dẫn của bác, với mạch tắt mở led khi nạp cho 16f628a .Rồi dem test thư không chạy, liệu còn thiếu nhưng gì a va cho em hỏi luôn hiện tương của 1con pic hỏng thì như thế nào EM MỚI HỌC NÊN CÒN GÀ QUÁ MONG BÁC CHỈ GIÚP .MẠCH NẠP CỦA EM PG3 WINPIC800.VÀ EM CO THẮC MẮC không hiểu khi tháo pg3 khỏi máy tính dung winpic800 vẫn chạy ấn verify all chạy không báo lỗi.khi cắm pg3 vào dể nạp .khi nạp dèn có nháy sáng thông báo,khi ấn veify all dèn cũng nháy sáng và winpic 800 không báo lỗi gì có bảng thông báo CODE:OK - ID :OK - CONFIG:OK - DATA : OK . KHI rút mạch nap ra khỏi máy tính cũng vậy,thế là hiện tượng gì hả bác MONG BÁC CHỈ GIÚP BÁC CHO EM SỐ DT DE LIÊN LAC NHÈ

falleaf
13-01-2006, 07:21 PM
Em xem lại mạch phần cứng của mạch chạy em đã làm tốt chưa. Em thử đọc ngược nội dung của chip ra xem kết quả có đúng không? Nếu em đọc ra, lưu lại thành file mà nó đúng, thì tức là chip nạp oki, không phải lỗi chip hay mạch nạp.

Không hiểu em dùng chương trình nào để nạp, và em dùng mạch ứng dụng nào? Nếu em dùng chương trình nút bấm, thì nó không giống với cái mạch nút bấm anh làm đâu nhé.

Em đã đặt TRISB = 0 chưa? Bởi vì nếu không thì nó không xuất tín hiệu được. Phải định nghĩa PORT trước.

Chúc vui.

sinhluc
11-04-2006, 11:59 AM
chao anh falleaf !
em la thanh vien moi toe cua dien dan, em vua moi co y dinh tho chan vao pic, nhung la y dinh nghiem tuc. Em mong anh va cac ban da lam quen voi pic giup do.
Truoc day em da lam quen voi 8051 roi, cung da viet chuong trình cho 8051 bang asm, dung uv2 de lap trinh C cho 8051, lam cai phan cung dieu khien quang bao, chua on lam nhung cung da chay tàm tạm, cung dung cai 89c va nap bang cai bộ nap cong noi tiep ezdl4.0 nhu moi nguoi. Noi chung voi vi dieu khien 8051 trinh do cung chi Amatuer, rồi dừng lại ỏ đó.
bay gio em muon chuyen qua hoc pic , vi em thay pic co nhieu cai mạnh hon (do doc trong cai mo ta chuc nang phan cung, chu chưa lam gi het) nhu la adc, usb ... nhung cai ma 8051 khong co. Em da bat dau download datasheet cua con pic18f4550 (sở di chon noi vi em co mot cai mạch TAO GIAO TIEP USB, ơ dó nguoi ta dung pic18f4550 va muc dich cua em la tao giao tiep usb dung pic) ve xem qua, em cung da doc bai huong dan ve vi dieu khien (.pdf ) sau do doc luong Hoc pic trong 1 ngay cua bac, .. Nhung da 5 ngay roi em van chua lam dc gi (buồn quá). Em con down cả tai lieu C18 user guide, roi down ca phan mem MPLAB ban student ve cai roi. Em dịnh lam quen một chut voi pic bang asm de hieu phan cung, sau do chuyen qua C viet cho de, sau khi đã quen se tập chung vào cai giao tiep usb cua nó.
Kế hoạch la nhu the, nhung den gio em bi dung lai vi khong biet lam gi, bac co the chi cho em phai lam gi de lam thu mot cai mạch dieu khien nhap nhay led.
Em da doc luong hoc pic trong 1 ngay roi, nhung trong do co mot so cai bac noi ma em khong hieu vi chua biet mot so khai niem, tiep nua la trong do bac co huong dan lam mot cai mach phan cung rat chi tiet, co ca phan mem (phai noi rat chi tiet và) nhung ko thay noi den phan bien dich và thao tac nap chip nhu the nao, mạch nap gi. Em chua biet gi nen den day coi nhu bi dung lai. cu tuong doc xong la ngon luon co the lam cai ung dung dau tien
Bac co the noi cho em phai lam gi de lam dc cai mạch (nhap nhay led) theo cach don gian nhat (mot ung dung dau tien co 'hello word'),em dang máu qua ma khong bit lam gi! em da co roi buc xuc qua moi hoi bac
Cam on bac nhieu !

namqn
11-04-2006, 07:22 PM
Bạn mới bắt đầu học PIC thì sang phần cơ bản mà học, tìm một con 16F877A chẳng hạn để làm quen. Nếu muốn dùng PIC tạo giao tiếp USB thì bạn phải chuẩn bị tinh thần đọc thật nhiều tài liệu về USB. Bản thân tôi vẫn chưa dám thử sức với USB, vì chỉ thử tìm hiểu thì đã thấy ở USB là một thế giới khác hẳn với serial port hay parallel port.

Thân,

hatuan296
22-04-2006, 05:02 PM
Cám ơn bác namqn . bây giờ ? thì mình đã biết sơ sơ ( chắc phải nghiên cứu lại thật kỹ ) , vì mình cũng chỉ là dân tự học thôi . à, mà bác có dùng ngôn ngữ PICBASIC không ? niếu có thì bác chỉ mình cách sang trang bộ nhớ flash khác được không ?

mình đang làm đề tài về LCD , có ma trận phím để nhập ký tự ( giống phím của DTDD ) , bước cơ bản là nhập các ký tự vào LCD , sau đó thì lưu vào bộ nhớ ngoài . khi cần thì gọi lại và hiển thị trên LCd . nâng cao là viết chương trình trên LCD để điều khiển led đơn . và có thể mở rộng ra điều khiển Relay , Servo Motor , Step Motor ...

nhưng ngặt nổi chuong trình dài quá , mà mình lại không biết cách sang trang như bác nói . bác giúp mình nha . nếu làm thành công , mình sẽ gửi đề tài này lên để cho các bạn tham khảo thêm về ngôn ngữ PICBASIC , mình thấy ngôn ngữ này rất dễ học , chương trình viết rất gọn ...
Bác thấy được không ? cho mình ý kiến nhé .

namqn
22-04-2006, 08:43 PM
Không may là tôi không dùng PICBASIC bao giờ, chỉ có dùng Basic compiler của PIC Simulator (do Vladimir Soso viết). Nhưng tôi nghĩ việc giải quyết chuyển trang bộ nhớ là do trình biên dịch đảm nhận, hay chí ít thì cũng phải có các hướng dẫn để người lập trình có thể thực hiện điều đó. Bạn chịu khó tìm hiểu thêm các tài liệu hướng dẫn của PICBASIC, và đọc thêm các tài liệu liên quan đến PICBASIC trên Internet (có rất nhiều).
Chúc thuận lợi!

Thân,

hatuan296
23-04-2006, 06:27 AM
vậy sao ? tiếc quá nhỉ . phần mềm PICBASIC Pro 2.46 mình đang dùng là dow từ PICVIETNAM.COM . không biết có phải là bản DEMO hay không nữa , mình đã xem rất kỹ phần HELP có trong trình dịch , có đầy đủ tập lệnh , các loại chíp có thể dịch , ...... nhưng mình lại không thấy có phần chỉ cách sang trang .. cũng hơi thất vọng .

bạn nói mình nên lên internet tìm , vậy mình phải gõ từ khóa gì về chủ đề sang trang bộ nhớ đây bạn ? bạn giúp mình được không ?

falleaf
23-04-2006, 12:53 PM
Bạn dùng chính từ khoá là PIC Basic đó, có thể thêm chữ tutorial phía sau, có thể thêm filetype: pdf nữa... Nó có hàng loạt tài liệu hướng dẫn liên quan.

Theo mình nghĩ, thì các phần mềm viết bằng ngôn ngữ cấp cao, thì nó hoàn toàn tự xử lý phần sang page cho bạn. Cho nên ban không phải lo.

Cái của bạn hiểu về sang trang của bộ nhớ PIC, và trang viết chương trình (trang giao diện) là hoàn toàn khác nhau.

Một khi chương trình dài quá, bạn có thể viết thành nhiều file .bas, hoặc .c, hoặc .asm, .s... Sau đó, trong cái file .bas chính, thì bạn include các file kia vào đúng vị trí cần include. Khi đó, nó sẽ dịch tất cả thành một file dài. Nhưng mà việc trình bày dễ dàng hơn.

Còn việc sang page trong bộ nhớ chương trình của PIC, đó là bản thân bộ nhớ chương trình của PIC, để định địa chỉ các ô nhớ chương trình, thì nó có 8KW, khoảng 9 nghìn mấy ô. Vì vậy, nó chia ra làm nhiều đoạn nhỏ, và bạn để ý rằng, khi đang thao tác nhảy tới nhảy lui trong 1 page, thì gần như là chỉ cần thay đổi địa chỉ các bit thấp, còn khi muốn sang page khác, thì thay đổi các bit cao của địa chỉ ô nhớ.

Bạn cần phân biệt rõ hai khái niệm này.

Chúc vui

chuchinh
18-05-2006, 02:29 PM
Bác cho em hỏi, em copy đoạn code của bác rồi vào chạy trong MPLAB thấy nó cứ báo lỗi. Đoạn code như sau:
TITLE "Mach test LED_1"
PROCESSOR P16F628A
INCLUDE <P16F628A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC

;================================================= ======
ORG 0x0000
GOTO MAIN


ORG 0x0005

MAIN
BANKSEL TRISB ; bank select
CLRF TRISB ; trisb = 00000000
; portb = output
BANKSEL PORTB
BSF PORTB, 0 ; rb0 = 1
; RB0 = 5V
GOTO $ ; dung chuong trinh tai day
; vong lap tai cho^~
; khong bao gio ket thuc
END ; lenh bat buoc de ket thuc
;================================================= ========

+ Trỏ dòng khai báo:
PROCESSOR P16F628A
Warning[215] E:\TEST\TEST1\TEST1.ASM 24 : Processor superseded by command line. Verify processor symbol.
+ Trỏ dòng:
CLRF TRISB ; trisb = 00000000
Message[302] E:\TEST\TEST1\TEST1.ASM 38 : Register in operand not in bank 0. Ensure that bank bits are correct.

Giúp em kiểm tra cái nhé!

nhh
20-05-2006, 06:18 PM
Bác cho em hỏi, em copy đoạn code của bác rồi vào chạy trong MPLAB thấy nó cứ báo lỗi. Đoạn code như sau:
TITLE "Mach test LED_1"
PROCESSOR P16F628A
INCLUDE <P16F628A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC

;================================================= ======
ORG 0x0000
GOTO MAIN


ORG 0x0005

MAIN
BANKSEL TRISB ; bank select
CLRF TRISB ; trisb = 00000000
; portb = output
BANKSEL PORTB
BSF PORTB, 0 ; rb0 = 1
; RB0 = 5V
GOTO $ ; dung chuong trinh tai day
; vong lap tai cho^~
; khong bao gio ket thuc
END ; lenh bat buoc de ket thuc
;================================================= ========

+ Trỏ dòng khai báo:
PROCESSOR P16F628A
Warning[215] E:\TEST\TEST1\TEST1.ASM 24 : Processor superseded by command line. Verify processor symbol.
+ Trỏ dòng:
CLRF TRISB ; trisb = 00000000
Message[302] E:\TEST\TEST1\TEST1.ASM 38 : Register in operand not in bank 0. Ensure that bank bits are correct.

Giúp em kiểm tra cái nhé!

Cái message khi bạn có dòng đó thì nó đều báo vậy cả mà, ko sao đâu

Bạn chỉ cần viết trisb = 0;là portb output,không cần một mớ số 0 như vậy đâu
Trường hợp bạn muốn cả input và output thì dùng trisb = 0b01011110
Chân nào muốn output thì đặt số 0, ngược lại input thì số 1.
Nếu thấy dài quá thì bạn chuyển qua số hex vậy!

Còn dòng khai báo PROCESSOR hình như là PROCESSOR PIC16F628A
Bạn đổi lại xem thế nào, lâu không viết ASM nên không nhớ rõ bạn à!

hungnp
22-05-2006, 10:56 AM
Chao ban ZERO2ONE!
Minh cung la nguoi moi bat dau nghien cuu ve PIC. Ve van de ban de cap nhu tren thi theo minh co the giai thich nhu sau:

Trong cau truc lenh cua lenh MOVWF co the giai thich nhu sau:

MOVWF <ADDRESS>

NHU VAY ADDRESS O DAY LA MOT HANG SO MA CHUNG TA CO THE GAN CHO NO MOT CAI TEN NAO DO VI DU NHU BAN GAN LA LABEL1. KHI CPU THUC HIEN DEN LENH NAY THI NO SE NGAM HIEU NGUOI LAP TRINH MUON CHUYEN GIA TRI TRONG THANH GHI W VAO MOT DIA CHI NAO DO TRONG RAM. NOI TOM LAI LABEL1 LA MOT BIEN DIA CHI.

- CON LENH MOVLW THI CO THE GIAI THICH THE NAY:

CAU TRUC LENH MOVLW <VALUE>

LENH NAY KHONG NOI CHAC BAN CUNG BIET NO CHUYEN GIA TRI (VALUE) VAO TRONG THANH GHI W. CO NGHIA LA VALUE LA MOT HANG SO.

BAN THU PHAN BIET 2 LENH NAY CO KHAC NHAU HAY KHONG NHE.

CHUNG TA KHAI BAO...

VALUE EQU 0AH
.....

MOVLW VALUE
VA LENH
MOVLW 0AH

CON TRONG LENH NAY THI SAO?

MOVWF VALUE

NO CHI CHUYEN GIA TRI TRONG W REG VAO THANH GHI VALUE CO DIA CHI 0AH TRONG RAM

HAI LENH NAY CHANG KHAC NHAU GI CA.

TONG QUAT LAI MA NOI.

KHI MINH KHAI BAO MOT BIEN HAY LA KHAI BAO NO LA MOT HANG SO THI KHI TRONG MOT CAU LENH CU THE THI KHONG PHAI NO LA MOT BIEN HOAC LA MOT HANG. NO LA BIEN HAY HANG LA TUY THUOC VAO NO LA DOI SO CUA LENH GI NUA.

TOI CHI BIET THE THOI. MONG RANG BAN CO THE HIEU DUOC RA VAN DE.

truongthinh
22-05-2006, 01:17 PM
con 8051 có hỗ trợ cho minh cổng và thanh ghi trong việc truyền dữ liệu từ nối tiếp sang song song. mình đang sừ dụng con PIC6F84A. mình có thể sử dụng thanh ghi nào để thực hiện việc chuyển đổi. Mong các bạn giúp đở

newuser
22-05-2006, 09:01 PM
P16F84A không giao tiếp song song được đâu bạn à, dùng con khác nhé, 16F877A chẳng hạn

namqn
22-05-2006, 09:26 PM
P16F84A không giao tiếp song song được đâu bạn à, dùng con khác nhé, 16F877A chẳng hạn
Không hẳn là như thế.

PIC16F84A không có sẵn module UART để giao tiếp nối tiếp, nhưng chúng ta vẫn có thể tự thực hiện chức năng của module UART bằng phần mềm. Khi đã dịch được thông tin cần thiết vào một ô nhớ nào đó của chip thì đương nhiên nó đã ở dạng song song rồi, bạn có thể xuất nó ra port B chẳng hạn.

Nếu bạn muốn làm thử thì tìm bằng google với các từ khóa: 'PIC', 'serial', và 'bit bang'.

Thân,

newuser
22-05-2006, 09:54 PM
à... tại em chưa đọc rõ câu hỏi của bạn truongthinh
đặt trường hợp em muốn giao tiếp song song mà không dùng module UART có sẵn, ví dụ như giao tiếp để lấy data trên RTC DS12887, em có thể mô phỏng bằng phần mềm? theo nguyên tắc anh nói, cứ sau nửa giây(do DS12887 gây ngắt) thì em lại lấy mẫu dữ liệu tại từng chân một lần, sau đó đem nó vào vùng nhớ nào đó rồi xử lý...
À, nhân nói về giao tiếp, vẫn là mô phỏng bằng phần mềm, em có thể giả lập I2C bằng hai chân của PIC, cho dù P16F84A không hỗ trợ giao tiếp I2C (em đọc được ở tài liệu gì ấy, hình như mấy anh cũng chia sẻ trên diễn đàn này rồi, em không nhớ tên...)
nếu các bạn không tìm được, hôm sau online mình sẽ gửi lên...

namqn
22-05-2006, 10:20 PM
DS12887 giao tiếp bằng 8-bit, dùng chung cho các tín hiệu địa chỉ và dữ liệu, để giao tiếp với DS12887 chúng ta không cần module UART (module này cung cấp chức năng giao tiếp nối tiếp).

Một ví dụ có liên quan đến việc chuyển đổi dữ liệu giữa dạng nối tiếp và song song có thể là một hệ thống đọc/đặt thông tin về thời gian thực từ xa, trong đó đầu cuối dùng để hiển thị cũng như đặt thông tin về thời gian nằm cách xa chip DS12887. Khi đó người ta có thể muốn dùng giao tiếp nối tiếp để truyền thông tin qua lại giữa đầu cuối và chip đồng hồ thời gian thực. Và chúng ta có thể đặt một vi mạch thông minh (ví dụ như PIC) để thực hiện việc chuyển đổi giữa nối tiếp và song song, nằm gần chip RTC. Từ đó dẫn đến vấn đề mà bạn truongthinh đã hỏi.

Thân,

newuser
23-05-2006, 11:59 AM
mình có gửi tài liệu mà mình nói bên [tài liệu tiếng Anh] ấy, cho khỏi lộn xộn ấy mà, đó là tài liệu"The quintessential PIC Microcontroller", có thể các bạn đã có rồi nhưng dù sao mình vẫn gửi lên.
Cảm ơn anh Nam nhé !

namqn
30-05-2006, 12:31 AM
yêu cầu thực tế của mình là như thế này: mình làm bộ chuyển đổi từ song song sang nối tiếp và một bộ chuyển đổi từ nối tiếp sang song song(PIC 16F84A). cái song song sang nối tiếp thì dễ rồi. còn cái nối tiếp sang song song Khi đã dịch được thông tin cần thiết vào một ô nhớ nào đó của chip thì đương nhiên nó đã ở dạng song song rồi, bạn có thể xuất nó ra port B chẳng hạn. ví dụ : mình chuyển qua 3 bit 001 làm sao để bên thu biết là có bít thứ nhất chuyển qua trong khi nó là o kế đến là bit thứ hai thứ 3. (3 bit đều độc lập)
Mong các bạn giúp giùm( rất gấp)
thanks
Thông thường người ta dùng một chuẩn giao tiếp nối tiếp nào đó để thực hiện công việc trong thực tế. Có nhiều chuẩn khác nhau đã được định nghĩa, nhưng nói chung người ta truyền một lần 7 hay 8 bit, không có chuẩn nào truyền theo kiểu bạn đang đề cập. Thực tế bạn đang làm gì thì nên trình bày rõ hơn.

Lấy ví dụ, nếu dùng chuẩn RS232 thì các đầu thu và phát đều tuân thủ theo chuẩn, do đó dữ liệu sẽ được truyền và nhận theo từng block 7 hay 8 bit, có các bit Start và Stop dùng để phát hiện việc truyền và thực hiện việc nhận. Lẽ đương nhiên không có chuẩn nào yêu cầu các bit được truyền là không độc lập. Một lần nữa, tôi cho rằng bạn nên mô tả rõ ràng hơn vấn đề bạn đang muốn làm. Với những gì mà bạn đang trình bày thì tôi nghĩ rằng bạn chưa hiểu lắm về giao tiếp nối tiếp.

Thân,

truongthinh
31-05-2006, 05:35 PM
Thông thường người ta dùng một chuẩn giao tiếp nối tiếp nào đó để thực hiện công việc trong thực tế. Có nhiều chuẩn khác nhau đã được định nghĩa, nhưng nói chung người ta truyền một lần 7 hay 8 bit, không có chuẩn nào truyền theo kiểu bạn đang đề cập. Thực tế bạn đang làm gì thì nên trình bày rõ hơn.

Lấy ví dụ, nếu dùng chuẩn RS232 thì các đầu thu và phát đều tuân thủ theo chuẩn, do đó dữ liệu sẽ được truyền và nhận theo từng block 7 hay 8 bit, có các bit Start và Stop dùng để phát hiện việc truyền và thực hiện việc nhận. Lẽ đương nhiên không có chuẩn nào yêu cầu các bit được truyền là không độc lập. Một lần nữa, tôi cho rằng bạn nên mô tả rõ ràng hơn vấn đề bạn đang muốn làm. Với những gì mà bạn đang trình bày thì tôi nghĩ rằng bạn chưa hiểu lắm về giao tiếp nối tiếp.

Thân,
Thực tế phần em làm như sau:
8 bit song song ở đầu vào ( có thể là các công tắc) được chuyển đổi thành nối tiếp để đưa qua một mạch phát và thu (điều chế ASK) sau đó nhận nối tiếp và chuyển lại thành song song( đèn led chẳn hạn)
Phần giao tiếp nối tiếp và vi điều khiển em chưa rành lắm chỉ mới vọc đây thôi.
phần thu phát mình ok rồi còn phần chuyển đổi thì em còn bị chút khó khăn vì không có ai hướng dẫn
Mong anh giúp đở em phần này
thanks

namqn
31-05-2006, 06:21 PM
Bạn nên tìm hiểu xem mạch giải điều chế ASK có thể truyền tín hiệu theo chuẩn nào, sau đó tìm hiểu xem việc thực hiện chuẩn đó trên vi điều khiển có khả thi không, và nếu có nhiều chuẩn thì chọn chuẩn nào là thích hợp nhất.

PIC16F84A hiện nay được xem là lỗi thời, nó không tích hợp nhiều tính năng và ngoại vi lắm. Con PIC16F628A được hãng Microchip đưa ra để thay thế cho PIC16F84A, hoàn toàn tương thích với PIC16F84A và có module USART để thực hiện giao tiếp nối tiếp theo chuẩn RS232. Do đó, việc chuyển đổi từ nối tiếp sang song song được thực hiện bằng phần cứng bên trong module USART, bạn sẽ không phải băn khoăn về điều này khi sử dụng nó.

Thân,

chuchinh
04-07-2006, 04:54 PM
Đoạn chương trình sau em viết cho PIC6F628A, khi biên dịch thì OK (chương trình copy từ học PIC trong 1 ngày mà). Thời gian trễ khi LED tắt quá nhỏ nên không nhìn thấy. Vì vậy, khi tắt LED em thêm một số lệnh gọi DELAY. Tuy nhiên, khi em chỉ cần thêm một dòng CALL DELAY nữa thì chương trình báo không thành công, hoặc là thêm một dòng BSF, BCF nữa cũng không được (những dòng này em đang cho dấu phẩy ở đầu).
Vậy đây là lỗi gì nhỉ? Các bác chỉ em với nhé.

ORG 0x0000
GOTO MAIN
ORG 0x0005
MAIN
BANKSEL TRISB
CLRF TRISB; d?t portb là output

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

BANKSEL PORTB
LOOP
BSF PORTB,3
;BCF PORTB,4
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
BCF PORTB,3
;BSF PORTB,4
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
;CALL DELAY
CALL DELAY
GOTO LOOP

;================================================= ========
; Các chuong trình con
;================================================= ========
DELAY DECFSZ COUNT_L,F
GOTO DELAY
RETURN

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

chuchinh
04-07-2006, 05:38 PM
Đoạn này em lấy được trong piclist.com, dùng để thực hiện trễ 1s với thạch anh 4MHz, em thay vào hàm delay trong đoạn chương trình trên nhưng chương trình biên dịch có lỗi. Đoạn này em cũng không hiểu lắm về cách làm của họ, mà trước hết là có lệnh cblock (?)
cblock
d1
d2
d3
endc

;999997 cycles
movlw 0x08
movwf d1
movlw 0x2F
movwf d2
movlw 0x03
movwf d3
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto Delay_0

;3 cycles
goto $+1
nop
Đoạn link chương trình này: http://www.piclist.com/cgi-bin/delay.exe?Delay=1&Type=seconds&Regs=d1+d2+d3+d4&clock=4&name=Delay&CPU=PIC
Các bác xem giùm em luôn nhé.

namqn
04-07-2006, 06:05 PM
cblock là từ khóa bắt đầu macro khai báo một khối hằng số. Trong chương trình của bạn, nó được dùng để khai báo 3 hằng số d1, d2, d3 (được dùng làm địa chỉ của 3 biến byte). Để chương trình có thể dịch được thì bạn phải cung cấp một hằng số sau cblock, đó chính là giá trị bắt đầu của các hằng số. Ví dụ
cblock 0x20
d1
d2
d3
endc
sẽ tạo ra 3 hằng số d1 = 0x20, d2 = 0x21, và d3 = 0x22.

Bạn phải xác định địa chỉ của khối biến cho thích hợp và đặt địa chỉ đầu của khối biến vào sau cblock.

Thân,

chuchinh
05-07-2006, 09:31 AM
Oh, xin lỗi vì em cũng chỉ mới bắt đầu tìm hiểu về MPASM nên chưa hiểu nhiều về các cấu trúc của nó. Em đã thêm 0x023 vào sau cblock, nhưng chương trình vẫn báo lỗi này:
Error - section '.org_4' can not fit the absolute section. Section '.org_4' start=0x00000005, length=0x0000003c
Em gửi kèm theo file của em, anh xem hộ nhé:

namqn
05-07-2006, 06:59 PM
Đã chỉnh lại chương trình cho em rồi đây. Em nhớ chọn chip từ lệnh mênu Configure > Select Device để có chip là 16F628A nhé. Sau đó có thể mở tập tin nguồn, chọn lệnh Quickbuild từ mênu Project (không cần phải tạo project cho chương trình chỉ có một tập tin .asm).

Đừng để ý cái warning về chip và cái message nhắc nhở là thanh ghi không nằm ở bank 0.

Thân,

chuchinh
06-07-2006, 10:32 AM
Em đã biết anh sửa chỗ nào nhưng cũng chưa hiểu sao cách khai báo đấy lại không được. Đang nghiên cứu quyển MPLAB IDE, hy vọng sau khi đọc xong sẽ bớt hỏi hơn.
Em muốn hỏi thêm: Em dùng thạch anh 11,0592MHz có được không? Vì em thấy thời gian trễ lâu quá, cả phút. Mặc dù em đã thay đổi d1, d2, d3 về 0x02 rồi mà vẫn thấy lâu.
Ngoài ra, chân RB4 của em không sáng được. Khi em cho chế độ test led (Sáng hết hoặc tắt hết) thì đo ngay tại chân RB4 thấy như nhau và luôn 0,42V. Liệu có thể hỏng tại đúng một chân không anh?
Muốn gửi đoạn chương trình test LED nhưng phần gửi gặp lỗi gì đó nên em không gửi được.

namqn
06-07-2006, 08:12 PM
Thạch anh 4 MHz là đủ để em học rồi.

Chương trình của em được viết theo kiểu "râu ông nọ cắm cằm bà kia", phản ứng của nó là khó xác định trước. Phần code đã sửa chỉ để hướng dẫn cho em cách viết cblock, nó không phải là một chương trình hoàn chỉnh. Em dùng lệnh gọi chương trình con DELAY, nhưng chương trình con đó lại không có lệnh return để trở về chương trình gọi. Ngoài ra, phần code để đặt d1, d2, và d3 hoàn toàn không được thực thi, nên có chỉnh chúng cũng không có tác dụng.

RB4 của 628A là một chân đặc biệt, nếu con chip của em mới tinh, và em không xóa bit cấu hình LVP, thì chân RB4 là ngõ vào, dùng để kích hoạt chế độ nạp chương trình ở điện áp thấp. Đó có thể là lý do khiến chân RB4 không phản ứng giống những chân kia.

Để hiểu thêm về hợp ngữ thì em đọc thêm tài liệu "MPASM™ Assembler, MPLINK™ Object Linker, MPLIB™ Object Librarian User’s Guide" (DS33014j), download tại đây:
http://ww1.microchip.com/downloads/en/DeviceDoc/33014J.pdf

Nếu không upload được chương trình lên forum thì có thể gửi email cho tôi, địa chỉ email của tôi có trong phần thông tin thành viên.

Thân,

chuchinh
12-07-2006, 11:48 AM
OK. Đúng là phần code d1, d2, d3 của em không thực thi. Bây giờ em đã biết cách thực hiện trễ trong chương trình theo ý muốn.
Em vẫn có một số thắc mắc, mong anh giải đáp dùm:
+ RB4 của em đã sáng sau khi xóa LVP, nhưng RA4 lại không sáng.
+ Đoạn code sau em dùng lệnh if chỉ để thay đổi giá trị thanh ghi W theo d4, trước khi vào kiểm tra em đã đặt d4=1, không hiểu sao vào chương trình nó lại kiểm tra thấy d4!=1 (Em dùng f7 để chạy thấy nó trỏ ngay đến dòng movlw 0x01 sau lệnh else thứ 2).

cblock 0x020
COUNT_L
d4
endc
ORG 0x0000
GOTO MAIN
ORG 0x0005
MAIN
movlw 0x01
movwf d4
if(d4==0x01)
movlw 0x01; bit 0
incf d4,f
else
if d4==0x02
movlw 0x02
decf d4,f
else
movlw 0x01 ; con tro tro luon den dong nay
movf d4
movlw 0x06
endif
endif
movwf COUNT_L
nop
;================================================= ============================
GOTO $
END

Không biết cách đặt code vào trong khung thế nào nhỉ, thấy anh falleaf hướng dẫn đâu đó mà tìm không thấy.

namqn
12-07-2006, 06:55 PM
+ RA4 không sáng vì nó là loại open drain (cực máng hở), nó chỉ có thể kéo dòng vào mà không thể cấp dòng ra. Nói cách khác, nó chỉ có thể tạo mức thấp ở ngõ ra và không thể tạo mức cao ở ngõ ra. Hy vọng không phải giải thích thêm về open drain cho em nữa (nếu cần thì em xem thêm figure 5-4 trong datasheet của PIC16F628A).

+ lệnh if ... else ... endif là lệnh hợp dịch có điều kiện, nó không dùng để thực hiện các lệnh chuyển điều khiển trong chương trình. Trong chương trình của em, d4 được gán giá trị hằng số là 0x21, còn các lệnh movwf d4 sẽ đặt giá trị trong thanh ghi W vào ô nhớ có địa chỉ là d4 (0x21 trong trường hợp này). Do đó những gì mà em đã thấy khi debug là đúng (vì cả hai lệnh if đều không thỏa, chúng so sánh hằng số d4 với các hằng số 0x01 và 0x02).

+ Để đặt khối lệnh vào khung code, em chọn khối lệnh đó, nhấn vào nút có hình # ở phía góc phải (nút thứ ba từ phải sang). Em có thể phải chọn phần Advanced thì mới thấy các nút này.

Thân,

falleaf
12-07-2006, 06:57 PM
[code]... đoạn code...[/c*de]
Thay * bằng chữ o là được

chuchinh
17-07-2006, 10:01 AM
Cảm ơn hai anh, tại vị trí RA4 em cho thêm một con trở kéo lên và đèn đã sáng. Như vậy việc test out tại các cổng đã xong.
Bây giờ em test cổng A như là đầu vào với các chân được nối với trở 560R xuống GND, 4 phím bấm nối với các chân RA0-RA3 và có chân chung là 5V. Em copy đoạn chương trình bật đèn tại cổng B tương ứng phím bấm tại cổng A của anh Falleaf, chỉ bật đèn ở Port B khi có tín hiệu 5V tại port A tương ứng (thay lệnh BTFSC bằng BTFSS). Tuy nhiên các đèn lại sáng hết và không có tác động gì khi ấn phím. Còn khi thay hai lệnh BTFSS bằng BTFSC thì hai đèn tương ứng bị tắt. Dường như Port A không thay đổi giá trị khi ấn phím và luôn luôn giữ giá trị 0. Các anh có thể chỉ cho em tại sao không?
Đoạn chương trình của em:

TITLE "Mach test ban phim"
PROCESSOR P16F628A
INCLUDE <P16F628A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC & _LVP_OFF
;================================================= ======
ORG 0x0000
GOTO MAIN
ORG 0x0005
MAIN
BANKSEL TRISB
CLRF TRISB
MOVLW 0xff ; chon cong A la dau vao
MOVWF TRISA
BANKSEL PORTB
;CLRF PORTA ; lenh nay co hay khong deu thuc hien nhu nhau
CLRF PORTB

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

SW0 BTFSS PORTA, 0
GOTO TURNON0
BCF PORTB, 0

SW1 BTFSC PORTA, 1
GOTO TURNON1
BCF PORTB, 1; khi thay BTFSS boi BTFSC thi den nay tat

SW2 BTFSS PORTA, 2
GOTO TURNON2
BCF PORTB, 2

SW3 BTFSC PORTA, 3
GOTO TURNON3
BCF PORTB, 3; khi thay BTFSS boi BTFSC thi den nay tat

GOTO SW0 ; quay l?i quét t? d?u

TURNON0 BSF PORTB, 0
GOTO SW1

TURNON1 BSF PORTB, 1
GOTO SW2

TURNON2 BSF PORTB, 2
GOTO SW3

TURNON3 BSF PORTB, 3
GOTO SW0


nop
;================================================= ============================
END

Còn nữa, anh có giải pháp nào để em có thể so sánh giá trị tại địa chỉ d4 mà không phải là so sánh d4 với 0x01 không, chỉ em luôn nhé.
Cho em hỏi thêm ngoài lề: nếu dùng LCD với 4 đường dữ liệu thì đấu nối RB0 với D4, RB1 với D5, RB2 với D6, RB3 với D7? còn khi khởi động thì đưa giá trị 30h ra LCD để RESET LCD trước (theo cách 4 đường dữ liệu) hay khởi tạo LCD ở chế độ 4 bít trước?
Thank so much.

namqn
17-07-2006, 06:48 PM
- RA0..RA3 của PIC16F628(A) là các chân được dồn kênh với các ngõ vào của các bộ so sánh, với trạng thái mặc định là ngõ vào cho các bộ so sánh, và sẽ có giá trị '0' khi đọc về. Do đó, để sử dụng như các chân vào/ra số, em phải đặt trạng thái cho các chân là vào/ra số thông qua thanh ghi CMCON. Xem chương 5 'I/O Ports' trong datasheet của chip, đọc ví dụ Example 5-1 để biết cách thiết lập thanh ghi CMCON.

- Câu hỏi thứ hai của em không rõ lắm, thực sự không hiểu em định làm gì.

- Nếu em có datasheet của một LCD dùng chip tương thích HD44780 (của Hitachi), đọc phần hướng dẫn cách khởi tạo cho chế độ giao tiếp 4-bit. Nếu không có datasheet đó thì tải tài liệu dưới đây, xem hình 26.

Thân,

chuchinh
19-07-2006, 04:11 PM
Em phải đặt trạng thái cho các chân là vào/ra số thông qua thanh ghi CMCON

Ổn rồi anh ạ, đèn đã sáng khi em ấn phím tương ứng.

- Câu hỏi thứ hai của em không rõ lắm, thực sự không hiểu em định làm gì.

Trong phần code em gửi kèm trong mục 46 bài này có hằng địa chỉ d4, em đem so sánh với 1 và 2 nhưng không bằng (như anh đã chỉ ở trên là do em nạp giá trị vào địa chỉ d4 chứ bản thân d4 bằng 0x21), vậy em phải viết lệnh như thế nào thì so sánh giá trị tại d4 với 0x01? Ngoài ra câu này em không hiểu: "lệnh if ... else ... endif là lệnh hợp dịch có điều kiện, nó không dùng để thực hiện các lệnh chuyển điều khiển trong chương trình". Khi kiểm tra giá trị tại địa chỉ d4 mà bằng 1, em muốn thực hiện một số thao tác nào đó (sửa giá trị một biến nào đó chẳng hạn), còn nếu không bằng thì thực hiện các thao tác khác, điều này có được không a? Phần ngôn ngữ em có nhiều cái chưa hiểu, mong anh chỉ dùm.

- Nếu em có datasheet của một LCD dùng chip tương thích HD44780 (của Hitachi), đọc phần hướng dẫn cách khởi tạo cho chế độ giao tiếp 4-bit
OK, màn hình của em đã hiển thị được dòng chữ "Cam on anh nhieu". He he, merci.
Em hỏi thêm tý: em muốn dùng ngắt bàn phím, nhưng không biết mắc thế nào. Hiện nay Port B đã dùng để cho LCD 4 bit (RB0-RB3 cho D4-D7, RB4 cho RS, RB6 cho R/W, RB7 cho E). Còn tại cổng A thì RA0-RA3 đang dùng cho đầu vào 4 phím, RA6, RA7 dùng cho CLK. Trong mạch 8051, để dùng ngắt bàn phím em thấy họ dùng con 148 và lấy đầu ra báo ngắt để đưa vào chân ngắt. Ở đây có làm tương tự được không anh?

namqn
19-07-2006, 07:40 PM
Trong phần code em gửi kèm trong mục 46 bài này có hằng địa chỉ d4, em đem so sánh với 1 và 2 nhưng không bằng (như anh đã chỉ ở trên là do em nạp giá trị vào địa chỉ d4 chứ bản thân d4 bằng 0x21), vậy em phải viết lệnh như thế nào thì so sánh giá trị tại d4 với 0x01? Ngoài ra câu này em không hiểu: "lệnh if ... else ... endif là lệnh hợp dịch có điều kiện, nó không dùng để thực hiện các lệnh chuyển điều khiển trong chương trình". Khi kiểm tra giá trị tại địa chỉ d4 mà bằng 1, em muốn thực hiện một số thao tác nào đó (sửa giá trị một biến nào đó chẳng hạn), còn nếu không bằng thì thực hiện các thao tác khác, điều này có được không a? Phần ngôn ngữ em có nhiều cái chưa hiểu, mong anh chỉ dùm.?
Việc em muốn thực thi một số lệnh ứng với d4 = 0x01 chính là sử dụng khả năng chuyển điều khiển trong chương trình, còn những lệnh hợp dịch có điều kiện, chẳng hạn như if ... else ... endif, là những lệnh cho phép em dịch một khối lệnh nào đó tùy theo điều kiện nào đó (ví dụ, lúc debug em muốn có một số lệnh chèn vào code để kiểm tra, nhưng khi chạy tốt thì không cần các lệnh đó, nếu làm bằng tay thì rất mất công, dùng lệnh hợp dịch có điều kiện thì chỉ cần define một hằng nào đó chẳng hạn là xong).

Về chuyển điều khiển dựa vào giá trị tại d4, sau đây là một ví dụ
movf d4, w ;Đặt d4 vào W
sublw 0x01 ;So sánh với 0x01
skpz ;Nếu bằng thì bỏ lệnh kế tiếp
goto sosanh2
incf d4 ;Đây là khối lệnh sẽ được thực thi nếu W = d4 = 0x01
movlw '1'
goto xong
sosanh2
movf d4, w ;Đặt d4 vào W
sublw 0x02 ;So sánh với 0x02
skpz ;Nếu bằng thì bỏ lệnh kế tiếp
goto xong
decf d4 ;Đây là khối lệnh sẽ được thực thi nếu W = d4 = 0x02
movlw '2'
xong


Em hỏi thêm tý: em muốn dùng ngắt bàn phím, nhưng không biết mắc thế nào. Hiện nay Port B đã dùng để cho LCD 4 bit (RB0-RB3 cho D4-D7, RB4 cho RS, RB6 cho R/W, RB7 cho E). Còn tại cổng A thì RA0-RA3 đang dùng cho đầu vào 4 phím, RA6, RA7 dùng cho CLK. Trong mạch 8051, để dùng ngắt bàn phím em thấy họ dùng con 148 và lấy đầu ra báo ngắt để đưa vào chân ngắt. Ở đây có làm tương tự được không anh?
PIC16F628A có một số chân để dùng với ngắt ngoài, chẳng hạn RB0/INT cho phép chọn cạnh tạo ngắt, còn RB4..RB7 thì sẽ tạo ngắt khi có thay đổi (tất nhiên là phải thiết lập một cách thích hợp, và cho phép ngắt tương ứng). Vậy em có thể theo cách tương tự như với 8051, lấy đầu ra báo ngắt để đưa vào RB0/INT chẳng hạn, để thực hiện ngắt bàn phím.

Thân,

briantk_1988
26-07-2006, 08:53 PM
Em la lính mới, lâu nay chỉ quen viết code bằng C và Basic, hôm nay mới xêm căn bản của MPAsm. Từ thread Hoc pic trong 1 ngay, em copy doan code sau

[QUOTE] TITLE "Mach test LED_1"
PROCESSOR P16F628A
INCLUDE <P16F628A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC
ORG 0x0000
GOTO MAIN
ORG 0x0005
MAIN
BANKSEL TRISB ; bank select
CLRF TRISB ; trisb = 00000000
; portb = output
BANKSEL PORTB
BSF PORTB, 0 ; rb0 = 1
; RB0 = 5V
GOTO $ ; dung chuong trinh tai day
; vong lap tai cho^~
; khong bao gio ket thuc
END ; lenh bat buoc de ket thuc
[\QUOTE]


nhung den khi dich thi MPasm lai báo:

Error[132] temp.ASM 2 : Unknown processor (P16F628A)
Message[301] P16F628A.INC 35 : MESSAGE: (Processor-header file mismatch. Verify selected processor.)
Error[131] temp.ASM 4 : Processor type is undefined
Warning[207] ASD.ASM 7 : Found label after column 1. (GOTO)
Error[122] temp.ASM 7 : Illegal opcode (MAIN)
Message[312] temp.ASM 13 : Page or Bank selection not needed for this device. No code generated.
Warning[207] temp.ASM 14 : Found label after column 1. (CLRF)
Error[122] temp.ASM 14 : Illegal opcode (TRISB)
Message[312] temp.ASM 16 : Page or Bank selection not needed for this device. No code generated.
Warning[207] temp.ASM 17 : Found label after column 1. (BSF)
Error[122] temp.ASM 17 : Illegal opcode (PORTB)
Warning[207] temp.ASM 19 : Found label after column 1. (GOTO)
Error[108] temp.ASM 19 : Illegal character ($)
Error[131] temp.ASM 23 : Processor type is undefined


Mong các tiền bối giúp đỡ

Cám ơn

namqn
26-07-2006, 09:29 PM
Bộ xử lý được chọn trong MPLAB khác với PIC16F628A mà bạn đang định dùng. Bạn vào mênu Configure của MPLAB, chọn lệnh Select Device ..., sau đó chọn PIC16F628A trong danh sách thả xuống Device, sau đó nhấn nút OK.

Biên dịch lại xem còn có thông báo lỗi nào không. Các warning là để nhắc nhở, đôi khi bạn viết tập tin nguồn không đúng khuôn dạng đã định trước (nhãn nằm sau cột 1, các directive hay lệnh mnemonic nằm ở cột 1, ...)

Thân,

briantk_1988
27-07-2006, 04:17 PM
Cám ơn rất nhiều

Mình đã gỡ rối được rồi

Thân

chuchinh
01-08-2006, 04:56 PM
Qua bài học pic trong một ngày, cùng với sự giúp đỡ của anh Nam, em đã làm được những việc sau: hiển thị led chạy vòng ở PortB, hiển thị LCD (cũng ở PortB), nhận phím bấm từ PortA và thay đổi hiển thị tương ứng trên LCD.

Chỉ còn chưa tìm ra nguyên nhân tại sao khi hiển thị lên LCD, các ký tự hiển thị lần lượt và cách nhau một lúc chứ không tạo ra được cảm giác hiện đồng thời, dù rằng trong chương trình hiển thị có delay sau khi đưa ký tự nhưng là delay tối thiểu (nhỏ nữa thì cứ hai ký tự nó lại hiện một). Bác Namqn có thể giải thích hộ em không (Data LCD của em là 4 bit, và các chân Port B dùng chung cho cả LCD và các LED hiển thị).

Cũng coi như tạm ổn phần vào ra, bàn phím và hiển thị, bây giờ đang muốn giao tiếp với máy tính nhưng chưa thấy chủ đề nào của anh falleaf cả. Rất mong anh viết tiếp nhé.

Nếu có thể anh cho luôn mạch giao tiếp giữa PIC và cổng COM luôn.

namqn
01-08-2006, 06:23 PM
Chỉ còn chưa tìm ra nguyên nhân tại sao khi hiển thị lên LCD, các ký tự hiển thị lần lượt và cách nhau một lúc chứ không tạo ra được cảm giác hiện đồng thời, dù rằng trong chương trình hiển thị có delay sau khi đưa ký tự nhưng là delay tối thiểu (nhỏ nữa thì cứ hai ký tự nó lại hiện một). Bác Namqn có thể giải thích hộ em không (Data LCD của em là 4 bit, và các chân Port B dùng chung cho cả LCD và các LED hiển thị).

Cũng coi như tạm ổn phần vào ra, bàn phím và hiển thị, bây giờ đang muốn giao tiếp với máy tính nhưng chưa thấy chủ đề nào của anh falleaf cả. Rất mong anh viết tiếp nhé.

Nếu có thể anh cho luôn mạch giao tiếp giữa PIC và cổng COM luôn.
Bạn nên post phần code của bạn lên, cùng với cách kết nối phần cứng nữa thì mới có thể biết tại sao mạch chạy như vậy.

Về phần giao tiếp giữa PIC và cổng nối tiếp, bạn đọc thêm trong luồng về bootloader, và các luồng nói về PIC16F877A.

Thân,

newuser
01-08-2006, 07:20 PM
mình đoán là trong đoạn code ghi dữ liệu lên LCD của bạn có đoạn mã tạo trễ nên mỗi khi gửi một ký tự nó trễ một chút.

chuchinh
24-08-2006, 09:01 AM
Em đã đọc phần truyền thông nối tiếp nhưng chưa kịp làm vì có một số lỗi khi thực hiện phím và hiển thị.
Mục đích của em là ban đầu cho hiển thị hai dòng ký tự, sau khi ấn phím key0 thì nó sẽ xóa hai dòng ban đầu và ghi lên đó hai dòng mới. Em dùng kỹ thuật bảng để truy xuất các dòng ký tự.
Tuy nhiên nếu hai dòng ban đầu của em dài quá (mỗi dòng 19 ký tự chẳng hạn) thì sau khi hiển thị ban đầu xong PIC sẽ tự khởi động lại và liên tục như vậy.
Khi cho dòng ban đầu ngắn đi, thì hiện tượng tương tự xảy ra khi ấn phím. Sau khi ấn, màn hình xóa hai dòng ban đầu và ghi hai dòng mới, sau khi ghi được một số ký tự thì PIC khởi động lại và hiển thị lại hai dòng ban đầu. Nếu cho hai dòng sau ngắn đi thì không khởi động lại.
Đây liệu có phải là hiện tượng tràn trang không anh nhỉ?

Lỗi thứ hai: trong chương trình hiển thị của em dùng hàm trễ (các giá trị không chính xác do em thay đổi các giá trị tham số ở trong để thử). Khi hiển thị, các ký tự lần lượt hiện lên rất chậm. Em đã thử giảm thời gian trễ nhưng khi đó hoặc là hiển thị thiếu ký tự, hoặc là hiển thị sai chỗ hoặc sai từ. Không hiểu lý do gì.

Nếu có thời gian anh xem hộ em lệnh Retlw 0x00 ở sau nhãn NEXTMESSAGE30 sẽ trả về đâu nhé, em muốn nó thoát khỏi KEY1_0 nhưng không biết có được không?

Em gửi kèm đây sơ đồ nguyên lý vẽ bằng Protel, ảnh sơ đồ nguyên lý, và chương trình của em, anh xem hộ nhé!

newuser
24-08-2006, 06:33 PM
Đây liệu có phải là hiện tượng tràn trang không anh nhỉ?

chương trình của bạn chưa đủ làm tràn trang chương trình đâu, bạn có thể kiểm tra trên file .lst
Lỗi thứ hai: trong chương trình hiển thị của em dùng hàm trễ (các giá trị không chính xác do em thay đổi các giá trị tham số ở trong để thử). Khi hiển thị, các ký tự lần lượt hiện lên rất chậm. Em đã thử giảm thời gian trễ nhưng khi đó hoặc là hiển thị thiếu ký tự, hoặc là hiển thị sai chỗ hoặc sai từ. Không hiểu lý do gì.

bạn kiểm tra bit cờ bận của LCD xem sao, sẽ chủ động hơn nhiều vì mỗi LCD có thời gian thực thi lệnh khác nhau, bạn cũng nên có một khoảng thời gian delay chờ LCD khởi động
MOVLW H'28'
CALL WRITE_COMMAND
CALL DELAY
MOVLW H'28'
CALL WRITE_COMMAND
bạn cần thêm lệnh dịch màn hình và con trỏ, trước khi hiển thị thì đưa địa chỉ cần hiển thị để WRITE_COMMAND trước rồi WRITE_DATA sau thì vị trí chữ hiển thị sẽ đúng thôi.
Retlw 0x00 ở sau nhãn NEXTMESSAGE30 sẽ trả về đâu
chỗ nào có lệnh CALL NEXTMESSAGE30 thì trả về chỗ đó chứ nhỉ?

namqn
24-08-2006, 07:13 PM
Chương trình của em chỉ có nhãn NEXTMESSAGE3, thuộc chương trình con HIEN_THI_BAN_DAU, chương trình con này được gọi từ chương trình chính, ngay trước vòng lặp chính. Do đó, lệnh RETLW đó sẽ trở về ngay trước vòng lặp chính.

Các điểm kia newuser đã nói rồi, em cần kiểm tra lại thuật toán của chương trình khi xử lý phím nhấn và hiển thị.

Thân,

kysikodau
01-04-2007, 01:58 PM
các bác ui, em tìm khắp các luồng mà ko thấy chỗ nào nói chi tiết về cái timer cả? nhất là cái ví dụ làm led nhấp nháy ấy, ko biết làm bằng timer ntn, mong mọi người giúp đỡ, em ko biết nhiều lắm nên các bác cứ nói chi tiết vào

kysikodau
01-04-2007, 02:06 PM
tiện thể , cho em xin link thư viện orcad luon

nguyenluong
09-03-2009, 05:52 PM
Hôm nay mới thứ 6 mà. Đã cuối tuần đâu.
Cho tớ hỏi? mạch của tớ mắc nút bấm với điện trở kéo xuống: tức là nguồn 5V mắc với nút bấm rồi đến chân của PIC, rồi cái chân đó lại nối với điện trở 10k rồi xuống đất. Tớ thấy nếu mắc kiểu này thì giữa chân PIC và nguồn 5V không có điện trở để giới hạn dòng. Liệu có hỏng PIC khi bấm nút không? Có phải nếu để chân PIC là ngõ INPUT thì nó ko cho dòng vào mà chỉ đọc giá trị điện áp ở chân có đúng không?
Thế là mất toi hai ngày cuối tuần để thử mấy cái nút bấm rùi. Bác falleaf ác như con thú! :cool:
Bạn mắ như vậy cũng được, tức là khi chưa bấm thì input ở mức thấp (0V), khi bấm thì nối lên mức cao (5V), ko sao cả . Vì trong cấu trúc PIC đã có điện trở nối xuống Mass rùi.
Nhưng tôi thường dùng là ngược lại như bạn. Tức là khi bấm là input ở mức 0
Có gì thì post lên nhé, các bạn sẽ giúp cho, chào bạn

nguyenluong
09-03-2009, 05:55 PM
Các bạn nào nghiên cứu về CCP trong PIC chưa vậy?

kimnga311
28-11-2009, 11:41 PM
sao kì vầy nè, cách mắc đầu tiên trong hai cách mắc thì bảo không được, sau rồi cũng chính cái hình đó (của bạn tinhthanthep) lại bảo được là thế nào vậy a?

phamhiepst
23-07-2010, 09:12 AM
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL3,CPUDIV1,V REGEN
dòng này dùng làm gì vậy các đại ca?

nhan1968
14-08-2010, 08:54 PM
Xin chào tất cả các anh chị em trong diển đàn, năm nay tôi đã ngoài 40 tuổi, ngày xưa đi học thì vi điều khiển chưa có phát triển. Nay đi làm đụng chạm rất nhiều nhưng kiến thức có hạng biết làm sao. Nhưng tính tò mò tìm hiểu thì không thiếu, thấy các bạn trẻ ngày nay giỏi quá thật đáng khâm phục.
Nay các bạn cho mình hỏi nhé: muốn học tốt vi điều khiển nên bắt đầu từ đâu, tài liệu nào hướng dẫn, cách học như thế nào để đạt kết quả tốt;
các bạn có thể chỉ giáo giúp cho mình;
Địa chỉ liên lạc: anhduc1996@gmail.com
Chúc các bạn sức khoảe - xin chân thành cám ơn

ronin
30-08-2010, 01:15 AM
http://www.picvietnam.com/forum/showthread.php?t=263
bac vào đây. ở đây hướng dẫ khá cụ thể các bước để bắt đầu tìm hiều ra sao.
Success-RNET.

DCP
02-09-2010, 03:06 PM
chào các bác,em mới học pic và đang làm quen với con 16f84a.em đang muốn viết một chương trình cho nó giao tiếp với con ep rom họ 24c nhưng không biết phải viết thế nào,mong các sư huynh chỉ giáo giúp,em xin cám ơn rất nhiều.

bankjmun
25-01-2011, 03:15 PM
em đang làm đồ án về ứng dụng GSM trong điều khiển từ xa.và muốn liên kết modul GSM SIM300cz,PIC6F877A,máy tính theo dõi,cùng một số thiết bị dân dụng như điều hòa, bình nóng lạnh...nhưng chưa biết sơ đồ ghép nối(sơ đò khối) sẽ như thế nào.có bác nào đã từng đi qua vấn đề này thì chỉ giáo giúp em cái nhé.em là thành viên mới toánh của gia đình ta mà....

thanhkc
16-11-2011, 09:16 PM
cac anh oi choi em hoi chut sao em k chuyen sang dc duoi .hex nhi. an f9 k bao loi

thanhkc
16-11-2011, 09:18 PM
ai giup em voi

serum
27-04-2012, 10:14 AM
Luồng này bị bỏ quên rùi

thaihoc2401
14-03-2017, 01:02 AM
cho mình hỏi về cách lập trình cho nút nhấn với pwm với, hay ai có tài liệu chi tiết thì cho mình xin cũng được. Xin cảm ơn.