PDA

View Full Version : Pic16f877a TỪ DỄ TỚi KhÓ


Pages : [1] 2

ntc
04-12-2005, 01:28 PM
Chào cả làng!


Luồng thứ hai là luồng “PIC16F877A! Nào ta cùng chat!”. Rút kinh nghiệm cái luồng “Học PIC trong vòng một ngày” của bác Falleaf, tui tạo ra them một luồng nữa để cho các bạn thảo luận, thắc mắc và … nói nhảm. Như vậy các bạn sẽ dễ dàng theo dõi các bài viết trong luồng “PIC16F877A TỪ DỄ TỚI KHÓ”, đồng thờI giảm bớt sự luộm thuộm, lung tung cho các luồng trong trang web của chúng ta.

Rất mong các bạn tuân thủ đúng qui định trên để đảm bảo mục đích chung của các luồng.

Qyuết định như vậy đi. Hehe. trị thấy tui làm vậy có được không vậy? Nhớ cho biết ý kiến nghe.

Chào thân ái! Chúc cả làng PICVietnam một ngày chủ nhật vui vẻ! ;)

falleaf
04-12-2005, 08:13 PM
Tuần tới, anh sẽ cung cấp mạch phát triển của PIC16F877A cho nhóm PIC ở HCM làm, sau khi có các kết quả thực hành, anh sẽ cung cấp các bài viết chi tiết về mạch phát triển cho PIC16F877A.

Tuy nhiên, trong giai đoạn này, em nên đưa ra một số mạch ứng dụng cụ thể, theo từng bài học cụ thể, các source code và các mạch cần phải cung cấp theo từng bài liên tục, không viết tràn lan, và tránh đi sai mục tiêu.

Trước tiên, em nên chỉ rõ hướng em sẽ đi, để người đọc dễ theo dõi, khi luồng này phát triển và có nhiều người quan tâm, em dán nó lên để cho mọi người dễ thấy.

Chúc vui.

ntc
04-12-2005, 10:45 PM
OK! Phản hồi như vậy là được rồi. Tui sẽ làm tới nới tới chốn cái dzụ này.

Nói thiệt là tui cũng chẳng phải là tiền bối gì, chỉ có biết tới đâu thì viết tới đó thôi.

Ghi nhận ý kiến của bác falleaf. Em sẽ tổ chức lại cái tài liệu em gửi cho bác thành từng bài nhỏ có liên quan cụ thể với nhau, chuyển qua pdf và post lên. Việc này cứ để em làm, bác chỉ cần viếng thăm đều đều để có ý kiến ý cò là được rồi.

Mục đích của luồng này trước hết là giúp các bạn làm quen từ từ với PIC16F877A. Trong thời gian đầu, tui sẽ cố gắng viết bài càng chi tiết càng tốt (từ mạch test cho tới chương trình cụ thể) để các bạn có thể làm quen với con PIC này một cách dễ dàng. Sau bước đầu làm quen, các bài viết sẽ mang tính chất đặt vấn đề để tất cả cùng giải quyết, chúng ta sẽ đi theo hướng làm việc dựa trên quá trình tìm hiểu các datasheet của cái mà mình muốn điều khiển, rồi sau đó mới đưa ra phương pháp điều khiển cụ thể cho nó.

Các bài viết sẽ đi theo trình tự từ dễ tới khó, và để tiện cho việc thảo luận, các bài viết sẽ được đánh số rõ ràng, như vậy bên cái luồng "PIC! Nào ta cùng chat!", muốn thảo luận về bài nào ta chỉ cần nói số thứ tự của cái bài đó ra là mọi người sẽ biết. Mỗi bài sẽ chỉ đi sâu vào một ứng dụng cụ thể, các thông tin cung cấp trong mỗi bài sẽ có tính tập trung cao để các bạn dễ theo dõi.

ntc
05-12-2005, 09:14 PM
Bài tui viết xong rồi, nhưng dang chờ mấy tiền bối xét duyệt và điều chỉnh. Trong khi chờ đợi, tui sẽ đưa ra cái mục lục của các bài sắp được post lên. Trong quá trình viết bài có thể sẽ có vài điều chỉnh nhỏ, nhưng định hướng các bài viết sẽ là như vậy. Bài nào có điều chỉnh khác với mục lục tui sẽ đề cập cụ thể:

Bài 1 Điều khiển các port I/O
Bài 2 Chương trình delay
Bài 3 Một số ứng dụng xuất/nhập qua các port của vi điều khiển (bài này
khá dài nên có khả năng sẽ được chia ra thành nhiều bài nhỏ).
Bài 4 Điều khiển IC ghi dịch 74HC595
Bài 5 PIC16F877A và LED 7 đoạn (bài này cũng khó khả năng được chia ra)
Bài 6 Ngắt và cấu trúc của một chương trình ngắt dành cho vi điều khiển
PIC16F877A
Bài 7 Các Timer của vi điều khiển PIC16F877A
Bài 8 Timer và hoạt động định thời
Bài 9 Ứng dụng tổng hợp (coi như là một bài tập để ôn lại tất cả các bài
trước, tui cho rằng bài này sẽ khá thú vị, hehe)
Bài 10 Điều khiển LCD

Tạm thời là như vậy cái đã. Các bạn thấy cái mục lục như vậy đã đủ hấp dẫn chưa?? Hay phải thêm bớt cái gì nữa??

tuanva
08-12-2005, 01:07 PM
Theo tôi nên bổ xung thêm phần Serial Communication

Quygia
09-12-2005, 04:16 AM
Và thêm phần AD converter, giáo trình PIC tiếng Anh và những thứ liên quan, kể cả một cuốn note book cho 16F877 tui có nhiều, có điều không hiểu giữa A và không A, có khác nhau gì không hả bác ntc

ntc
09-12-2005, 06:00 PM
Cai A hay khong A thi bac Falleaf da tra loi roi. Co A thi bo nho chuong trinh cua no la bo nho Flash, con khong co A thi bo nho chuong trinh cua no la bo nho EEPROM.

Hehe, bai dau tien chinh sua hoi nhieu (vi chua the lam hai long cac vi tien boi) nen cac ban chiu kho doi mot hai bua nua di.

Con viec nay nua, lam on chuyen qua cai luong "PIC16F877A!Nao ta cung chat". Hehe, tui bat dau thay cai luong nay hoi lon xon roi do.

falleaf
09-12-2005, 08:18 PM
Em dang làm mod của box này mà, em có quyền sử dụng các chức năng điều khiển trong box của em, để di chuyển bài viết, cắt dán bài viết....

Các bạn cố gắng chuyển luồng để post bài, để tránh mod phải làm việc nhiều.

Chúc vui.

ntc
10-12-2005, 12:55 PM
NÓ ĐÂY! Hehe. Bài đầu tiên.

Hy vọng sau khi đọc xong bài này, các bạn sẽ nhận ra rằng đây không phải là tài liệu dịch hay copy từ đâu đó.

Các bạn đọc xong nhớ cho biết ý kiến nghe, cách viết của tui như vậy đọc có thấy dễ hiểu không.

Bài này là bài cơ bản và khá đơn giản và được viết khá kĩ, hy vọng các bạn có thể hiểu được một cách dễ dàng và thực hiện thành công ứng dụng trong bài.

Còn nữa, tui nhắc lại lần cuối cùng, qua cái luồng "PIC16F877A!NÀO TA CÙNG CHAT" rồi mình cùng thảo luận, hehe, nếu không thì tui bắt buộc phải dùng tới ... vũ lực à nghe.

tinhthanthep
25-12-2005, 11:50 PM
Bài 1 của bác hay lắm, đọc dễ hiểu. Bác có thể viết tiếp về ngắt, timer, counter, comparator, PWM... Đây mới là những phần đáng để ngâm cứu.

minhtienbk
06-01-2006, 12:31 AM
sao trong doan code ko có phần khai báo hả anh ,ví dụ trisb equ 03h chẳng hạn ,em vẫn ko hiểu ,anh chỉ giùm !

acom
09-01-2006, 04:14 PM
Cam on ban ntc ve bai viet do. Rat co ban va chi tiet. Dieu nay se giup cho nguoi moi tim hieu ve PIC co cai nhin don gian ve PIC hon. Mong bac co nhieu bai viet moi de giup anh em trong dien dan tiep can voi PIC nhanh hon.

tinhthanthep
09-01-2006, 08:29 PM
sao trong doan code ko có phần khai báo hả anh ,ví dụ trisb equ 03h chẳng hạn ,em vẫn ko hiểu ,anh chỉ giùm !
----------------------

cần gì phải khai báo. vì trong chương trình có tác động trực tiếp lên trisb rồi.
movfw b'00000000'
movwf trisb
mplap sẽ tự hiểu trisb nằm ở địa chỉ 03h

falleaf
10-01-2006, 03:12 PM
Chính đang phải đi mổ chân, cho nên không thể viết bài tiếp được, hôm nọ anh quên mất vì quá nhiều việc.

Mọi người thông cảm. Khi nào Chính hồi phục sẽ viết bài tiếp cho các bạn học.

Chúc vui.

ntc
04-02-2006, 04:57 PM
Chào năm mới. Chúc mọi người một năm mới vui vẻ, hạnh phúc, và thành đat.
Đây là bài viết thứ hai, mời mọi người cùng xem.

www.picvietnam.com/download/Tutorial/TUT02.02.PVN.NTCR.300106.pdf

nily
05-02-2006, 10:01 AM
cảm ơn nhiều ,chúc mau bình phục và chúc mừng năm mới luôn .

hungkhanh
05-02-2006, 10:55 PM
Trong bài 2, có một đoạn code mình không hiểu cho lắm?


Đoạn chương trình 2:
MOVLW d’255’
MOVWF delay‐reg1 ; đưa giá trị 255 vào thanh ghi “delay‐reg1”
loop
DECFSZ delay‐reg1,0 ; giảm giá trị thanh ghi “delay‐reg1”và so sánh với 0
GOTO loop1 ; nếu chưa bằng 0 nhảy tới label “loop1”
GOTO next ; nếu đã băng 0 chương trình delay hoàn tất
loop1
MOVLW d’255’
MOVWF delay‐reg2 ; đưa vào thanh ghi “delay‐reg2” giá trị 255
DECFSZ delay‐reg2,0 ; giảm giá trị thanh ghi “delay‐reg2” và so sánh với 0
MOVWF loop1 ; nếu chưa bằng 0 thì nhảy đến label “loop1”
GOTO loop ; nếu bằng 0 thì nhảy đến label “loop”
next


Thử phân tích một chút. Bây giờ ta sẽ xem xét đoạn code sau chạy từ đầu như thế nào


MOVLW d’255’
MOVWF delay‐reg1 ; đưa giá trị 255 vào thanh ghi “delay‐reg1”
loop
DECFSZ delay‐reg1,0 ; giảm giá trị thanh ghi “delay‐reg1”và so sánh với 0; GIÁ TRỊ ĐƯỢC GHI TRONG DELAY-REG1 GIẢM 1 THÀNH 244, SAU ĐÓ GIÁ TRỊ 244 ĐƯỢC GHI VÀO W-REGISTER, CÒN GIÁ TRỊ ĐƯỢC GHI TRONG DELAY-RED1 VẪN GIỮ NGUYÊN LÀ 255
GOTO loop1 ; nếu chưa bằng 0 nhảy tới label “loop1”
GOTO next ; nếu đã băng 0 chương trình delay hoàn tất
loop1
MOVLW d’255’
MOVWF delay‐reg2 ; đưa vào thanh ghi “delay‐reg2” giá trị 255
DECFSZ delay‐reg2,0 ; giảm giá trị thanh ghi “delay‐reg2” và so sánh với 0. TƯƠNG TỰ NHƯ TRÊN, GIÁ TRỊ ĐƯỢC DÁN CHO DELAY-REG2 SAU KHI THỰC HIỆN LỆNH NÀY VẪN LÀ 255
MOVWF loop1 ; nếu chưa bằng 0 thì nhảy đến label “loop1”
GOTO loop ; nếu bằng 0 thì nhảy đến label “loop”
next


Dó đó, đoạn code sau sẽ delay với khoảng thời gian là infinity.

Đoạn code sau sẽ đúng ghi ta thay đổi 0 thành 1 để sau khi thực hiện kệnh, giá trị sẽ được ghi vào file register. Ngoài ra, còn một chỗ không ổn ở chỗ loop1. Thử phân tích:

- Đầu tiên gán giá trị 255 vào dalay-reg2.
- giảm giá trị của delay-reg2 và so sánh với 0, nếu khác 0 thì thực hiện lệnh tiếp theo. (do ban đầu giá trị là 255 nên giảm 1 còn 254, khác 0 nên sẽ thực hiệ lênh tiếp theo, tức goto loop1)
- lại set giá trị của delay-reg2 là 255.
- giảm gias trị đi 1 và so sánh với 0.
....
như vậy, riêng loop1 cũng thực với với thời gian là infinity dù ở lệnh DECFSZ có để giá trị tham số là 1 hay 0.

vì vậy, ngoài sửa lại giá trị tham số của lệnh DECFSZ từ 0 thành 1, cần đưa phần gán giá trị 255 cho delay-reg2 ra ngoài vòng lặp, đặt nó ở cùng vị trí với chỗ gán giá trị 255 cho delay-reg1.

chắc là NTC đau chân quas nên không chú ý chỗ này ;D


Btw, cho mình hỏi một câu rất dở hơi, thạch anh tên tiếng Anh là gì vậy? có bạn nào giải thích cho mình biết thạch anh là gì không, mình hiểu nó là dùng để tạo xung, nhưng cụ thể hơn thì không biết. Mong được giúp đỡ.

falleaf
06-02-2006, 09:40 AM
Xin lỗi các bạn, đoạn chương trình trên đã có sự nhầm lẫn, F đã được báo về vẫn đề lỗi chương trình ngay từ hôm đầu NTC post lên, nhưng vẫn không có thời gian sửa chữa chương trình. Có lẽ các bạn vào đây thường xuyên thì cũng biết F đang làm việc gì. Vì vậy, thành thật xin lỗi các bạn vì sự lầm lẫn trên.

Nếu bạn nào có thời gian, xin sửa chữa giúp đoạn code trên để bạn đọc không bị vướng vào lỗi sai này nữa.

Chúc vui.

falleaf
06-02-2006, 10:07 AM
MOVLW d’255’
MOVWF delay‐reg1 ; đưa giá trị 255 vào thanh ghi “delay‐reg1”
loop
DECFSZ delay‐reg1,0 ; giảm giá trị thanh ghi “delay‐reg1”và so sánh với 0
GOTO loop1 ; nếu chưa bằng 0 nhảy tới label “loop1”
GOTO next ; nếu đã băng 0 chương trình delay hoàn tất
loop1
MOVLW d’255’
MOVWF delay‐reg2 ; đưa vào thanh ghi “delay‐reg2” giá trị 255
DECFSZ delay‐reg2,0 ; giảm giá trị thanh ghi “delay‐reg2” và so sánh với 0
MOVWF loop1 ; nếu chưa bằng 0 thì nhảy đến label “loop1”
GOTO loop ; nếu bằng 0 thì nhảy đến label “loop”
next


Xin lỗi các bạn vì hiện nay diễn đàn đang được sửa chữa, vì vậy không thể trình bày tốt được.

F sửa luôn đoạn code trên để tránh các bạn mắc lỗi sai. Bản sửa sẽ được NTC cập nhật lại sau:


MOVLW d’255’
MOVWF delay_reg1 ; đưa giá trị 255 vào thanh ghi “delay_reg1”
loop
DECFSZ delay_reg1, F ; giảm giá trị thanh ghi “delay_reg1”và so sánh với 0 và ghi lại vào delay-reg1
GOTO loop1 ; nếu chưa bằng 0 nhảy tới label “loop1”
GOTO next ; nếu đã băng 0 chương trình delay hoàn tất
loop1
MOVLW d’255’
MOVWF delay_reg2 ; đưa vào thanh ghi “delay_reg2” giá trị 255

DECFSZ delay_reg2, F ; giảm giá trị thanh ghi “delay_reg2” và so sánh với 0 và ghi lại vào delay_reg2
GOTO $-1 ; nếu chưa bằng 0 thì nhảy lên trên để tiếp tục giảm delay_reg2
; vòng lặp này nhằm giảm delay_reg2 về đến 0
; thời gian giảm delay_reg2 chính là thời gian delay_trong vòng lặp con.
GOTO loop ; nếu bằng 0 thì nhảy đến label “loop”
next


Cách viết hai:

À thôi, H hiểu vì sao NTC viết sai rồi... oki,

để F nói NTC sửa lại sau ... sorry cả nhà...

Chúc vui...

falleaf
06-02-2006, 10:18 AM
Trong cách viết trên, F cũng đồng thời chỉ ra hai cách viết cho lệnh GOTO.


LOOP GOTO LOOP





GOTO $


Hai cách viết này tương đương nhau. Trong đó, $ thay cho vị trí con trỏ tại vị trí lệnh đang thực hiện.

Chính vì vậy, trong đoạn code trên, thay vì viết


loop
DECFSZ delay_reg1, F ; giảm giá trị thanh ghi “delay_reg1”và so sánh với 0 và ghi lại vào delay-reg1
GOTO loop1 ; nếu chưa bằng 0 nhảy tới label “loop1”
GOTO next ; nếu đã băng 0 chương trình delay hoàn tất
loop1
...


Chúng ta co thể thay thành:


loop
DECFSZ delay_reg1, F ; giảm giá trị thanh ghi “delay_reg1”và so sánh với 0 và ghi lại vào delay-reg1
GOTO $+2 ; nếu chưa bằng 0 nhảy tới label “loop1”
GOTO next ; nếu đã băng 0 chương trình delay hoàn tất
...


Và đoạn code phía dưới:


loop1
MOVLW d’255’
MOVWF delay_reg2 ; đưa vào thanh ghi “delay_reg2” giá trị 255

DECFSZ delay_reg2, F ; giảm giá trị thanh ghi “delay_reg2” và so sánh với 0 và ghi lại vào delay_reg2
GOTO $-1 ;
...


chúng ta co thể thay lại thành:


loop1
MOVLW d’255’
MOVWF delay_reg2 ; đưa vào thanh ghi “delay_reg2” giá trị 255
loop2
DECFSZ delay_reg2, F ; giảm giá trị thanh ghi “delay_reg2” và so sánh với 0 và ghi lại vào delay_reg2
GOTO loop2;
...


Chúc vui.

ntc
06-02-2006, 01:53 PM
Cảm ơn bạn hungkhanh đã phát hiện ra các lỗi sai của bài 2. Xin lỗi cả làng nghe, mình sẽ chỉnh sửa lại gấp.

ntc
10-02-2006, 10:37 AM
Đây là bản đã được chỉnh sửa. Phần chỉnh sửa là phần tô màu đỏ trong tài liệu. Mọi người dowwnload lại rồi xem luôn nhé.

nhh
12-02-2006, 01:19 PM
Bác ntc post tiếp các phần tiếp theo cho anh em tham khảo!Đợi bác mãi sốt ruột quá!

nhh
14-02-2006, 08:08 AM
BẬT TẮT LED 1s


;========================================
;Auhor: NHH
;Date: 10/02/06
;Hardware: PIC16F877A
;XTAL 10MHz, PORTB noi voi 8 LED qua 8 dien tro 220Ohm
;========================================
TITLE "ON-OFF LED 1 SECOND"
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF
;================================================= ============================
COUNT1 EQU 0x20
COUNT2 EQU 0x21
COUNT3 EQU 0x22
;=========================CHUONG TRINH CHINH=========================
ORG 0x000
GOTO MAIN

MAIN
BCF STATUS,RP1
BSF STATUS,RP0 ; select BANK 1
CLRF TRISB ; PORTB output
BCF STATUS,RP0 ; select BANK 0

MOVLW d'255'
MOVWF COUNT1 ;<-COUNT1=255
MOVWF COUNT2 ;<-COUNT2=255
NEXT
MOVLW d'14'
MOVWF COUNT3 ;<-COUNT3=13
MOVLW b'11111111' ;LED ON
MOVWF PORTB
CALL LOOP

MOVLW d'14'
MOVWF COUNT3 ;<-COUNT3=13
MOVLW b'00000000' ;LED OFF
MOVWF PORTB
CALL LOOP

GOTO NEXT
;========================CHUONG TRINH CON====================
LOOP
DECFSZ COUNT1,1
GOTO LOOP
DECFSZ COUNT2,1
GOTO LOOP
DECFSZ COUNT3,1
GOTO LOOP
RETURN

END

nhh
14-02-2006, 08:10 AM
;hex File
;====================
:020000040000fa
:1000000001280313831686018312ff30a000a1008c
:100010000d30a200ff30860013200d30a20000300a
:10002000860013200828a00b1328a10b1328a20b6d
:040030001328080089
:02400e00323f3f
:00000001ff

falleaf
14-02-2006, 10:01 AM
Ai phân tích đoạn chương trình này nào?

Lưu ý là có đoạn goto LOOP về chung, và lưu ý rằng khi 0 - 1 = 255 <> 0, nên sẽ không bị nhảy về LOOP trở lại nhé

Công thức tính thời gian delay ở đây được tính như thế nào? Mời các bạn tham gia tính toán con số chính xác.

Chúc vui.

ntc
15-02-2006, 01:19 PM
Ặc ăc !! Viết chương trình delay như vậy thì tính thời gian delay cũng chua lắm đó. Bà con thử phân tích coi. Đây cũng là một đề bài thú vị. Chú ý là mhh sử dụng thạch anh 10 MHz.
nhh đã nạp vào PIC và chạy thử chưa. Nhìn sơ qua có cái gì đó không ổn.

falleaf
15-02-2006, 02:49 PM
Cách tính khá đơn giản, không phải quá khó đâu em, anh đã viết gợi ý rồi, nhưng xoá đi để mọi người cùng thảo luận.

Anh cũng chưa tính ra con số cụ thể, nhưng nếu biết cách tính khéo léo thì rất là hay. Đoạn code này là một thủ thuật viết hàm delay khá thú vị.

Bây giờ giả sử loop 3 vòng như thế này, các giá trị count1, count2, count3 là a, b, và c. Vậy công thức tổng quát của còng lặp này là bao nhiêu chu kỳ máy?

Đây là câu hỏi!

Chúc vui.

falleaf
15-02-2006, 02:52 PM
Tất nhiên, phải chỉ ra điều kiện ràng buộc của a, b và c. Nếu như mình làm 1 vòng, 2 vòng, 3 vòng lặp thì giá trị a, b, c phải là bao nhiêu?

Chúc vui.

nhh
17-02-2006, 09:06 AM
Ặc ăc !! Viết chương trình delay như vậy thì tính thời gian delay cũng chua lắm đó. Bà con thử phân tích coi. Đây cũng là một đề bài thú vị. Chú ý là mhh sử dụng thạch anh 10 MHz.
nhh đã nạp vào PIC và chạy thử chưa. Nhìn sơ qua có cái gì đó không ổn.
nhh đã chạy thử rồi mới dám post lên chứ!Bác ntc thử chạy xem sao?

nhh
17-02-2006, 09:59 AM
Nếu sử dụng vòng lặp như thế này với giá trị nạp vào của count1,count2,count3 là a,b,c:
------------------------------
LOOP
DECFSZ COUNT1,1
GOTO LOOP
DECFSZ COUNT2,1
GOTO LOOP
DECFSZ COUNT3,1
GOTO LOOP
RETURN
------------------------------
Khi count1 giảm đến 0,sau đó giảm count2 xuống 1 và quay về LOOP
count1 giảm thêm 1 nên sẽ là 255.Do vậy giá trị a không có ý nghĩa.
Tương tự giá trị b cũng vậy.

THỜI GIAN CHO VÒNG LẶP LOOP NÀY:

Khi con trỏ đang ở dòng DECFSZ COUNT2,1 thì count1 có giá trị 0
Khi con trỏ đang ở dòng DECFSZ COUNT3,1 thì count1,count2 đều có giá trị 0

1) DECFSZ COUNT1,1 mất 1 chu kỳ máy
GOTO LOOP mất 2 chu kỳ máy
Để count1 giảm từ 0 về 1 mất 255*3 chu kỳ máy,giảm từ 1 về 0 mất thêm 1 chu kỳ máy nữa.Bây giờ con trỏ đang ở dòng DECFSZ COUNT2,1
Vậy thời gian đã thực thi là :
(255*3 + 1)*t (t là thời gian thực thi 1 chu kỳ máy)

2) Mỗi lần count2 giảm 1 thì lại quay lại giảm count1
Thời gian giảm count2 cũng tính tương tự
Vậy khi con trỏ ở DECFSZ COUNT3,1 thì thời gian đã thực thi là:
((255*3 + 1)*t)*255 + (255*3 + 1)*t

3) Tương tự tính cho giảm count3 từ c về 0.
Vậy thời gian cho vòng lặp LOOP sẽ là:
{[(255*3 + 1)*t]*255 + (255*3 + 1)*t}*(c-1) + [(c-1)*3 + 1]*t
= {{[(255*3 + 1)]*255 + (255*3 + 1)}*(c-1) + (c-1)*3 + 1}*t
= [(766*255 + 766)*(c-1) + (c-1)*3 + 1]*t
= [196096*(c-1) + (c-1)*3 + 1]*t
= (196099*c - 196098)*t

Với c = 14 ,t = 0,4us thời gian này là (196099*14 - 196098)*0.4us = 1.02s

Chắc không khó khăn gì để tính thời gian lặp kiểu này với n biến count!

nhh
17-02-2006, 10:18 AM
Bác NTC hay bác F có thể post bài hướng dẫn tiếp về ngắt,timer,PWM,....cho anh em tham khảo được không ?
Đợi bài của các bác!

ntc
17-02-2006, 11:23 AM
Thú vị thiêt. Tuy là cách tính có vẻ rắc rối, nhưng công thức cuối cùng lại rất đơn giản. Tính để một hai bữa nữa cho bà con ngâm cứu rồi trả lời mà nhh đã tự bật mí rồi.

falleaf
17-02-2006, 11:27 AM
Một điểm chú ý là, giữa các vòng lặp sau, thì điểm khởi đầu của count1 và count2 luôn luôn là 0. Vì vậy, để đảm bảo lần thứ nhất chạy đúng, thì giá trị khởi tạo phải là 0. Như vậy, a = b = 0.

Nếu như có N vòng lồng nhau, thì giá trị các vòng trước đó là count1,2...n-1 = 0.

Nếu không đặt như vậy, thì lần đầu tiên chạy sẽ bị sai. Khi đem ứng dụng vào những bài toán khác, không phải là nhấp nháy led, thì việc không cẩn thận này rất nguy hiểm.

Khi có độ lệch về thời gian trong các vòng lặp, phải chọn mức thấp hơn.

Vd: không chọn c = 14 để vòng lặp là 1.02s mà phải chọn c =13, sau đó dùng một đoạn code khác để bù vào vòng lặp này.

Như vậy, chúng ta sẽ có chính xác thời gian thực.

Một thủ thuật nhỏ của việc viết vòng lặp này đó là cài đặt lại giá trị ở vòng lặp thứ n-1, trong trường hợp này là cài đặt lại giá trị của count2 mỗi khi count3 giảm đi 1 đơn vị. Có nghĩa là chỉ cần thực hiện một lệnh DECF cho count2 trước khi giảm count3.

Khi đó count2 luôn giảm từ 254 xuống. Mất 1 lệnh, hệ số trước count2 lại nhân 3. Như vậy, mình giảm được 2 lệnh. Tính lên vòng lặp trên, lại giảm được 255*3 ..

Vậy chỉ cần thêm một lệnh giảm, thì sẽ giảm ít hơn là giảm count3 1 đơn vị. Cái này là do độ phân giải mình muốn.

Bạn thử dùng lại cách này, và tính chính xác lại thời gian, sau đó bù lại sao cho nó đáp ứng đúng 1s thử xem?

Chúc vui

tinhthanthep
20-02-2006, 01:29 PM
Tiến tới Timer, ngắt và PMW đi thôi các bác.

ngkdong
21-02-2006, 07:24 AM
Ban NTC giup minh ti,
Minh thu viet giao dien P6F876A voi PC trong CSS, sau khi PIC khoi dong no se goi len PC 1 dong: Hello!
Tuy nhien khi noi may tinh, PIC goi lien tuc nhieu dong: Hello! va co nhieu dong ky tu bi loi, ma khong chay tiep phan sau.
Xin nho ban huong dan dum.

ntc
23-02-2006, 12:05 PM
Bạn phải mô tả kĩ hơn ứng dụng của mình mới được. Kết nối phần cứng như thế nào, chương trình viết trên PIC và trên PC ra sao thì mới biết đường mà giúp chứ. CSS mình chưa xài, nhưng nếu mô tả kĩ hơn thì rất nhiều thành viên có thể giúp cho bạn.

LEO-XBS
24-02-2006, 02:57 PM
bác nào có thể giải thích cho em đoạn khai báo này với:
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF

ntc
25-02-2006, 04:14 PM
Đây là đoạn code dùng để khai báo các "Configuration bits" của vi điều khiển PIC. Nó bao gồm:
Khai báo chế độ bảo vệ code CP (code Protection). ON: bật chế độ. OFF: tắt chế độ.
Khai báo cho phép sử dụng Watchdog Timer WDT.
Khai báo các chế độ reset BODEN, PWRTE: đại khái là trước khi vi điều khiển đi vào hoạt động một cách ổn định, nó phải trải qua một khoảng thời gian quá độ để ổn định nguồn, ổn định xung clock,... có thể tạm gọi là các giai đoạn reset. Các giai đoạn này cho phép ta điều khiển bằng các bit trên.
Khai báo loại nguồn xung clock OSC : HS, XT hay RC. Tùy theo loại nguồn xung clock mà khai báo thích hợp.
Khai báo chế độ nạp chương trình LVP (Low Voltage Programming):chế độ nạp này sử dụng chân RB4/PGM đối với PIC16F877A. Các PIC khác cũng được hỗ trợ chế độ nạp này. Vấn đề này đã được đề cập trong cái TUT01. Bạn xem lại nhé.
Chức năng cụ thể của các khai báo này bạn xem lại cái datasheet ( phần "CONFIGURATION BITS") để biết thêm. Mình không nhớ hết được.
Mỗi PIC sẽ được hỗ trợ một số chế độ chứ không phải chế độ nào cũng được hỗ trợ, tùy theo con PIC bạn sử dụng mà khai báo cho thích hợp. Ví dụ, bạn sẽ thấy là khai báo cho con PIC16F84A sẽ ít hơn khai báo cho con PIC16F877A.
Mọi thông tin cho phần khai báo này đều có trong datasheet. Chỉ cần đọc và hiểu được thì mình sẽ sử dụng được.
Chúc vui! (mượn đỡ câu này của anh Hiệp một tí nghe)

ngkdong
25-02-2006, 04:39 PM
Cac ban giai thich dum, minh cung moi hoc PIC thoi, minh viet mot doan de thu giao dien PIC16F876A nhu sau:
#include <16F876A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=24000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
void main() {

printf("\r\n\Hello! \r\n");

do {
delay_ms(2000);
printf("\r\n\Running...\r\n");
} while (TRUE);
Chi vay thoi de thu giao dien voi PC, nhung khi minh nap PIC roi, dung tool Serial Port Monitor trong CCS C de giam sat thu, thi thay PIC luon goi ve rat nhieu dong Hello!, ma khong thay co dong Running...
Dung ra thi no chi goi lan luot 2 dong tren thoi va khong lam gi ca, nhung o day no cu goi lien tuc dong Hello!, doi khi bi loi ky tu nua chu.
Mong cac ban chi giao giup nhe.
}

totite
27-02-2006, 02:14 PM
Các bác vui lòng chỉ giúp em cách nào truy xuất vào vùng data trong bộ nhớ chương trình sau khi được định nghĩa bằng chỉ dẫn DB của Assembly. Em cần lập một bảng tra các giá trị cho led 7 đoạn giống như trong hợp ngữ của MCS51.

hpecom
27-02-2006, 02:33 PM
void main()
{ printf("\r\n\Hello! \r\n");
do
{ delay_ms(2000);
printf("\r\n\Running...\r\n");
} while (TRUE);
}

Chương trình của bạn, nếu chạy đúng thì nó sẽ
xuất ra dòng Hello,
và tiếp theo cứ mỗi 2s nó lại xuất ra dòng Running...
dòng Running... trước sẽ cách dòng Running... sau nó hai dòng trắng.:D
và vòng lặp là vô tận.

LEO-XBS
01-03-2006, 07:23 PM
bác ntc co thể chỉ giúp em cách sử dụng cổng analog duoc ko
làm thế nào để sử dụng cổng đó trong việc thu tín hiệu từ led thu-phat va chuyển thành tín hiệu số (không dùng khuếch đại thuật toán) cộng với cách xư lý tín hiệu đó

ntc
05-03-2006, 01:19 PM
Bảng tra giá trị cho vi điều khiển PIC sử dụng kĩ thuật bảng. Mình đã viết tutorial về kĩ thuật này rồi. Một hai bữa nữa sẽ post lên diễn đàn.
:D

ntc
05-03-2006, 01:22 PM
Dùng bộ ADC đi. Trong PIC16F877A có tích hợp sẵn bộ ADC đó. Bạn nên tham khảo cái datasheet để biết được cấu trúc ADC trong PIC và cách sử dụng nó.:)

ntc
06-03-2006, 02:51 PM
Tutorial thứ 3.:D

www.picvietnam.com/download/Tutorial/TUT03.02.PVN.NTCR.050306.pdf

Đây là bài viết về kĩ thuật bảng. Sau bài này, có thể nói ta đã trang bị được những cơ sở cơ bản nhất cho việc lập trình cho vi điều khiển PIC.
Có thể tham khảo thêm một số tutorial trong diễn đàn để xây dựng một số ứng dụng cho mình dựa trên các kĩ năng đã có được.
Bài thứ 4 mình định viết về một số ứng dụng, phần quan trọng nhất là các thao tác về chức năng input của các cổng của vi điều khiển, nhưng nghĩ lại thấy không cần, bạn có thể tham khảo rồi tự thực hiện các ứng dụng cũng được. Có gì thắc mắc thì hỏi vậy. Mọi người thấy thế nào.
Nếu không có gì thay đổi, bài tới mình dự định sẽ viết về LED 7 đoạn và các thao tác hiển thị cơ bản với LED 7 đoạn dùng vi điều khiển PIC.

ahchu
18-03-2006, 08:45 AM
Cho em hỏi là làm thế nào biết được 1 chương trình bắt đầu từ address nào? VD như trong tutor của ntc thì tất cả đều bắt đầu tại 0x000. Khi em đọc datasheet của con 16F877a thì địa chỉ 0x000 là "Reset vector", chứ đâu phải là "On-chip program memmory"???
Vậy thì em phải thể bắt đầu từ address 0x000 hay là 0005h?Em không hiểu rõ phần này.

ntc
20-03-2006, 11:57 AM
0x000 là reset vector, có nghĩa là khi được reset, bộ đếm chương trình sẽ nhảy đến địa chỉ này và bắt đầu thực hiên lệnh tại đây.

0x004 là interrupt vector, có nghĩa là khi có ngắt xảy ra, bộ đếm chương trình sẽ quay về địa chỉ này để thực hiện lệnh từ đây.

Ví dụ ta có một đoạn code như sau:
ORG 0x000
GOTO start

Có nghĩa là lệnh "GOTO start" sẽ được đưa vào bô nhớ chương trình của vi điều khiển tại địa chỉ 0x000. Khi vi điều khiển được reset, bộ đếm chương trình quay về "reset vector" tại địa chỉ 0x000, ở đó nó đọc được lệnh "GOTO start" và nhảy đến label "start".

Còn việc label start nằm ở chỗ nào thì còn tùy thuộc vào việc ta đặt cái label "start" tại vị trí nào trong chương trình, hoặc ta có thể điều khiển địa chỉ đặt nó bằng cách sử dụng lệnh "ORG ....". Ví dụ ta viết như sau:

ORG 0x050
start
; đoạn chương trình start

Thì khi đó đoạn chương trình "start" sẽ được bắt đầu tại địa chỉ 0x050 của bộ nhớ chương trình.

Như vậy bạn có thể tổ chức bộ nhớ chương trình theo như mình mong muốn.

:D

ngoalongdochanh
25-03-2006, 04:10 PM
Cho toi hoi tai sao khi khai bao:
#device PIC16F877 *=16 ADC=10

thi CCSC bao loi: "Can not change device type this far into the code"
Cach khac phuc

dohoangnam
27-03-2006, 09:26 AM
Bác port tiếp lên đi, chờ bác lâu quá. Giống như việc 1 bữa ăn ngon nhưng cứ vừa ăn vừa nghỉ vậy. Bác cố gắng vì anh em với!!!!
Trân thành,
Nam.

nhh
27-03-2006, 07:57 PM
Cho toi hoi tai sao khi khai bao:
#device PIC16F877 *=16 ADC=10

thi CCSC bao loi: "Can not change device type this far into the code"
Cach khac phuc

Hi!

CCS C báo lỗi tại vị trí câu lệnh này,nhưng bản thân nó hoàn toàn đúng đắn,vì bạn không post toàn bộ chương trình của bạn lên nên không thể biết chỉ độc mỗi tội bạn đã cố tình thay đổi device type,nên chương trình báo lỗi.
Tớ có post 1 bài ADC đơn giản ở luồng này :
http://www.picvietnam.com/forum/showthread.php?p=2113#post2113

Hy vọng nó sẽ có ích cho bạn !

nhh
27-03-2006, 08:17 PM
Tớ cũng đang nóng lòng đọc những module tiếp theo của mod Chính !
Nhưng thông cảm,hình như Chính đang thi giữa kì thì phải !:D

ntc
27-03-2006, 10:17 PM
Hì hì. Không phải là bận thi giữa kì. Trường mình không thi giữa kì.

Mình đang bận phát triển một hai sản phẩm trên PICVIETNAM.

Nên mấy cái Tutorial, cho nợ lại vài bữa nghe!

Nợ hoài mang tiếng quá.

:D

anhviet
30-03-2006, 01:59 PM
các bác giải thích dùm em
list p=16f873A,r=dec ; list directive to define processor ; constantes syst?e d?imal
#include <p16f873A.inc>
#include <Delay.inc>

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _CPD_OFF & _LVP_OFF


TRONG DOẠN #INCLUDE <DELAY.INC> CÓ NGHĨA LÀ GÌ

Khoa
31-03-2006, 11:04 AM
chú nào có tài liệu đầy đủ về asm của pic thì cho anh xin

Khoa
31-03-2006, 11:06 AM
nhất là các khai báo directive,khai baó hàm module....

ntc
31-03-2006, 12:21 PM
#include <delay.inc> là một cái file đính kèm được tạo ra bởi người sử dụng. Thông thường các file này sẽ chứa các hàm asm được viết dưới dạng các macro để thuận tiện trong quá trình viết chương trình bằng asm.

Nguyên tắc hoạt động của nó đại khái giống như mấy cái header file vậy đó. Nó sử dụng chức năng thay thế của trình biên dịch để làm tăng thêm tính linh động và thân thiện cho một chương trình asm. Khác biệt ở chỗ mấy cái header file thì dùng để định nghĩa phần cứng cho một vi điều khiển, còn các file tạo bởi người lập trình thông thường là dùng để định nghĩa các hàm.

Ví dụ, trong cái header file "p16f877a.inc" của PIC6F877A nó có một lệnh define như sau:

#define PCLATH 0x0A

Lệnh này dùng để định nghĩa địa chỉ của thanh ghi PCLATH trong bộ nhớ chương trình của vi điều khiển.

Do đó trong chương trình chính, nếu ta có một lệnh nào đó liên quan tới thanh ghi PCLATH, ví dụ lệnh:

CLRF PCLATH (lệnh 1)

Thì trình biên dịch sẽ thay thế như sau:

CLRF 0x0A (lệnh 2)

Và trình biên dịch sẽ dựa vào lệnh này để tạo thành mã máy (file hex), chứ không phải là dựa vào lệnh 1.

Trong trường hợp ta không đính kèm file <p16f877a.inc> thì nếu viết chương trình như lệnh 1, thì trình biên dịch sẽ không hiểu, vì thực chất trình biên dịch sẽ không biết PCLATH là cái quái gì (do ta chưa định nghĩa). Việc định nghĩa các tham số phần cứng này có thể thông qua các file <... .inc> được tạo sẵn hoặc định nghĩa trực tiếp trong chương trình ứng dụng.

Tương tự như các file đính kèm khác, trong trường hợp này là file <delay.inc>. Thông thường nó bao gồm việc định nghĩa một số hàm asm được viết dưới dạng các macro. Khi macro đó được gọi trong chương trình ứng dụng, nó sẽ thay thế macro đó bằng đoạn code tương ứng với macro đó trong file đính kèm.

Thực ra ta vẫn có thể viết trực tiếp đoạn code đó trên chương trình ứng dụng mà không cần phải đính kèm hay gọi cho mất thời gian.

Tuy nhiên việc xây dựng các file đính kèm như vậy mang lại nhiều tác dụng:
- Thứ nhất, nó cho phép ta tạo các hàm bằng asm, giống như các module chương trình được viết sẵn, khi cần chỉ việc gọi nó ra.
- Thứ 2, chương trình asm viết bằng cách sử dụng các chức năng thay thế của trình biên dịch giúp cho ngôn ngữ asm trở nên thân thiện hơn, giống như một dạng ngôn ngữ lập trình cấp cao hơn.

Nếu để ý kĩ, thì các ngôn ngữ lập trình cấp cao khác, ví dụ như C cũng có cách xây dựng tương tự. Các hàm xử lí thuật toán được viết trong một file riêng, các hàm hiển thị được viết trong một file riêng, ... Khi cần sử dụng một hàm nào đó trong C, ta vẫn phải đính kèm cái file đó vào chương trình ứng dụng thông qua các lệnh "#include ...". Nếu không đính kèm thì trình biên dịch sẽ báo kỗi, vì nó sẽ không hiểu được hàm ta vừa viết.

Như vậy ta có thể hiểu chức năng thay thế của trình biên dịch là một trong những cơ sở để xây dựng các ngôn ngữ lập trình cấp cao .Thực chất các ngôn ngữ cấp cao khi biên dịch sẽ có giai đoạn nó thay thế các hàm của nó bằng các hàm của ngôn ngữ ...asm, rồi dựa trên đó để tạo ra mã máy (file hex). Mã máy là cái duy nhất mà vi điều khiển thực sự hiểu được để biết được nó cần phải làm gì.

Do việc lập trình bằng mã máy đối với con người là quá khó khăn, cho nên mới có chuyên ra đời các ngôn ngữ lập trình asm, cấp cao, cao hơn nữa, ..., Như vậy con người không phải thao tác trực tiếp với mã máy, mà công việc đó được chuyên giao cho các trình biên dịch.

Nói nhiều quá!

:D

namqn
31-03-2006, 06:31 PM
chú nào có tài liệu đầy đủ về asm của pic thì cho anh xin
nhất là các khai báo directive,khai baó hàm module....
Bạn download tài liệu sau đây của Microchip nhé.
http://ww1.microchip.com/downloads/en/DeviceDoc/33014J.pdf
Và tài liệu sau nếu muốn dùng các chip PIC16:
http://ww1.microchip.com/downloads/en/DeviceDoc/33023A.pdf
Tài liệu sau dành cho các chip PIC18:
http://ww1.microchip.com/downloads/en/DeviceDoc/39500a.pdf

Thân,

anhviet
31-03-2006, 08:09 PM
cảm ơn các bác rất nhiều . các bác viết càng nhiều càng tốt vì rất rễ hiểu cho người mới học ltr pic

dohoangnam
03-04-2006, 09:01 AM
cảm ơn các bạn đã share các đường link!

zero_OR_one
03-04-2006, 12:15 PM
các bác cho em hỏi tý:


; Bài toán yêu cầu :nhấn 2 lần nút button(nối tại RA0) led nối với RB0
; sẽ sáng(mạch dùng luôn của bác Chính vậy chỉ khác có cái button
; nối với VCC qua RA0 xuống đất)
; chương trình sẵn:
; Project: Two pushes to turn on a LED

Processor 16F84a
include <p16F84a.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _RC_OSC


ORG 0 ;This is the start of memory for the program.
SetUp
BSF 03,5 ;Go to Bank 1
CLRF 06 ;Make all port B output
MOVLW 01 ;Load W with 0000 0001
MOVWF 05 ;Make RA0 input
BCF 03,5 ;Go to Bank 0 - the program memory area.
CLRF 1F ;Clear the button file
CLRF 06 ;Blank the output
GOTO Main

Delay
NOP ;Create approx 250mS delay
DECFSZ 1A,1
GOTO Delay
DECFSZ 1B,1
GOTO Delay
RETURN

Delay2
NOP ;Create 1mS debounce delay
DECFSZ 1A,1
GOTO Delay2
RETURN

Sw
BTFSS 05,0 ;Test the push button
GOTO Sw3 ;Button not pressed
BTFSC 1F,2 ;Test end-of-flash flag
RETURN
BTFSC 1F,0 ;First pass?
RETLW 00 ;No
BTFSS 1F,1 ;Test first-press flag
GOTO Sw2 ;First press
BSF 06,0 ;Button has been pressed twice. Illuminate LED
CALL Delay ;Keep LED on
CALL Delay ;Keep LED on
BCF 1F,1 ;Clear second-push flag bit
BSF 1F,2 ;Set end-of-flash flag
BCF 06,0 ;Turn LED off
RETURN
Sw2
BSF 1F,1 ;Set the first-press flag
BSF 1F,0 ;Set button pass flag bit
RETURN
Sw3
BCF 1F,0 ;Clear button pass flag bit
BCF 1F,2 ;Clear end-of-flash flag
RETURN

Main
CALL Sw
CALL Delay2 ;Debounce switch
GOTO Main

END ;Tells assembler end of program


Một số chỗ em chưa hiểu:
1.Các file 1A,1B mặc định bao nhiêu mà tạo được các thời gian trễ như trên
2.File 1F với các bit hoạt động ra sao
3.Chương trình này hoạt động thế nào :em chư hiểu giải thuật ,tại sao nhấn nút button lần 1 led chưa sáng,lần 2 led mới sáng
Chỗ này:

Sw
BTFSS 05,0 ;Test the push button
GOTO Sw3 ;Button not pressed
BTFSC 1F,2 ;Test end-of-flash flag
RETURN
BTFSC 1F,0 ;First pass?
RETLW 00 ;No
BTFSS 1F,1 ;Test first-press flag
GOTO Sw2 ;First press
BSF 06,0 ;Button has been pressed twice. Illuminate LED
CALL Delay ;Keep LED on
CALL Delay ;Keep LED on
BCF 1F,1 ;Clear second-push flag bit
BSF 1F,2 ;Set end-of-flash flag
BCF 06,0 ;Turn LED off
RETURN


Nhấn lần 1:->BTFSC 1F,2->BTFSC 1F,0->BTFSS 1F,1->GOTO Sw2
Sw2 BSF 1F,1 ;Set the first-press flag
BSF 1F,0 ;Set button pass flag bit
RETURN
Vậy thì sau khi nó trở về từ Sw2 sẽ BSF 06,0 ;Button has been pressed twice. Illuminate LED.
Em hiếu sai ở đâu ,mong anh Chính và mọi người trả lời hộ(Giait thích kĩ hộ em sử dụng các file 1A,1B,nhất là 1F)
Em cảm ơn nhiều

ntc
03-04-2006, 01:24 PM
Mọi người khi post phần code nhớ post theo cách như trên nghe. Nhìn nó sáng sủa, dễ đọc, dễ hiểu, dễ trả lời.

Hic, viết code kiểu gì mà đọc muốn túi mắt túi mũi luôn.

Cái thời gian delay còn phụ thuộc vào tần số hoạt động của con PIC nữa, không biết làm sao tính được. Bạn coi lại coi tần số của thạch anh là bao nhiêu?

1A, 1B là 2 thanh ghi nằm trong RAM sử dụng cho chương trình delay. Nó không được khởi tạo nên có thể xem giá trị ban đầu bằng 0. Khi giảm lần đầu tiên thì 0 sẽ giảm về 255.

Cách tính thời gian delay cho đoạn chương trình delay này nhh đã giải thích rất cụ thể ở các bài trước. Bạn xem lại các bài trước trong luồng này sẽ thấy (cái chương trình điều khiển LED chớp tắt trong 1 giây á).

Còn cái thanh ghi 1F. Hic, chóng mặt quá, để từ từ xem sau vậy. Đại khái nó dùng 3 bit LSB để chỉ thị trạng thái cái nút bấm nó như thế nào mà xử lí. Chưa bấm thì giá trị trong thanh ghi 1F nó như thế nào đó, bấm 1 lần thì như thế nào đó, 2 lần thì như thế nào đó.

falleaf
03-04-2006, 02:50 PM
Anh đề nghị em quản lý luồng như sau:

1) Nếu post bài hướng dẫn, thì việc post source code là rất tốt, vì người dùng có thể thử nghiệm ngay

2) Nếu post bài câu hỏi, nếu không phải code người đó viết, sẽ không trả lời, vì không có đủ thời gian để đọc code và xem code. Trước đây anh đọc code rất nhanh, nhưng trả lời một thời gian sau, quá nhiều người nhờ, lại viết email nhờ về code. Chúng ta không có thời gian để làm việc đó.

3) Nếu các bạn muốn hỏi về code, các bạn phải đọc hiểu, và trích ra những phần mà các bạn không hiểu để hỏi, chứ không post toàn bộ đoạn code lên để hỏi như thế này. Mỗi người lập trình, có một tư duy lập trình khác nhau. Không thể nào trả lời các câu hỏi về code được, nếu như bạn không trình bày ý đồ của bạn một cách rõ ràng, nhất là khi các bạn muốn lấy code của những người khác.

4) Nếu như các bạn muốn đặt câu hỏi về các chương trình, cấu trúc, và việc tận dụng các chức năng của PIC, cũng như vận dụng các chức năng đó một cách hợp lý, với dạng câu hỏi này, các bạn lưu ý post lưu đồ giải thuật, hoặc nội dung cần làm, chứ không post đoạn code.

Chúc vui

zero_OR_one
08-04-2006, 05:56 PM
Mọi người khi post phần code nhớ post theo cách như trên nghe. Nhìn nó sáng sủa, dễ đọc, dễ hiểu, dễ trả lời.

Hic, viết code kiểu gì mà đọc muốn túi mắt túi mũi luôn.

Cái thời gian delay còn phụ thuộc vào tần số hoạt động của con PIC nữa, không biết làm sao tính được. Bạn coi lại coi tần số của thạch anh là bao nhiêu?

1A, 1B là 2 thanh ghi nằm trong RAM sử dụng cho chương trình delay. Nó không được khởi tạo nên có thể xem giá trị ban đầu bằng 0. Khi giảm lần đầu tiên thì 0 sẽ giảm về 255.

Cách tính thời gian delay cho đoạn chương trình delay này nhh đã giải thích rất cụ thể ở các bài trước. Bạn xem lại các bài trước trong luồng này sẽ thấy (cái chương trình điều khiển LED chớp tắt trong 1 giây á).

Còn cái thanh ghi 1F. Hic, chóng mặt quá, để từ từ xem sau vậy. Đại khái nó dùng 3 bit LSB để chỉ thị trạng thái cái nút bấm nó như thế nào mà xử lí. Chưa bấm thì giá trị trong thanh ghi 1F nó như thế nào đó, bấm 1 lần thì như thế nào đó, 2 lần thì như thế nào đó.
Xin lỗi anh C,em sẽ rút kinh nghiệm lần sau.
Thạch anh ở đây dùng 4 MHZ anh à
Em vẫn chưa hiểu giải thuật,ai hiểu giải thuật thì chỉ cho em với.
Em thấy bài toán này khó đấy chứ nhỉ

nhh
12-04-2006, 10:34 AM
Hey,mấy đồng bào có thể hướng dẫn viết C trên pic6f877a ko?

Mình đã có những bài viết ở luồng này rồi mà !
http://www.picvietnam.com/forum//showthread.php?t=357

picpicpic
16-04-2006, 12:54 PM
hihi....Đợi mãi vẫn chưa thấy bài mới....

nguyenan
18-04-2006, 02:49 PM
cac bac xem dum em sao no lai bao noi vay,co can phai bo phan khai bao khong vay:


MPASM 5.02 TEXT3.ASM 4-18-2006 12:05:38 PAGE 1


LOC OBJECT CODE LINE SOURCE TEXT
VALUE

00001 ;CHUONG TRINH HIEN THI RA PORTB
00002 processor 16f877a
00003
00004 include <p16f877a.inc>
00001 LIST
00002 ; P16F877A.INC Standard Header File, Version 1.00 Microchip Technology, Inc.
00400 LIST
00005
Warning[207]: Found label after column 1. (_config)
Error[122] : Illegal opcode (_cp_off)
00006 _config _cp_off &_wdt_off &_pwrte_on &_xt_osc &_lvp_off
00007
0000 00008 org 0x000
00009 ;bat dau chuong trinh
0000 2801 00010 goto START
0001 00011 START
0001 1303 00012 bcf STATUS,RP1
0002 1283 00013 bcf STATUS,RP0
Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
0003 0186 00014 clrf TRISB
0004 1283 00015 bcf STATUS,RP0
0005 308F 00016 movlw B'10001111'
0006 0086 00017 movwf PORTB
0007 00018 lop
0007 2807 00019 goto lop
Warning[205]: Found directive in column 1. (end)
00020 end ;ket thuc chuong trinh

newuser
20-04-2006, 11:59 PM
uhm...chán quá, gõ bài gửi cho bạn,đến khi gửi thì chẳng hiểu sao mình lại bị log out. Mình trả lời bạn ngắn gọn thôi vậy, ngại gõ lại quá...
bạn thấy dòng thông báo rồi đó, nó nói rằng bạn không thể tác động lên thanh ghi TRISB vì đơn giản là thanh ghi này không nằm ở bank0, nó nằm ở bank1/bank3 bạn à, vì thế bạn phải sửa lại đoạn code như sau:
BSF STATUS,RP0;chọn bank 1
BCF STATUS,RP1
bạn nên viết macro cho việc chọn bank thanh ghi cho tiện vì nếu bạn viết chương trình bằng asm thì phải nhảy qua nhảy lại các bank thanh ghi rất nhiều. Ví dụ như:
bank0 macro
bcf STATUS,RP0
bcf STATUS,RP1
endm
bank1 macro
bsf STATUS,RP0
bcf STATUS,RP1
endm
....
lưu lại với đuôi *.inc trong cùng thư mục với file *.asm
đặt dòng include *.inc vào đầu chương trình bạn nhé.

ntc
21-04-2006, 01:08 PM
Một số vấn đề về các thông báo, cảnh báo và lỗi khi biên dịch dùng MPASM. Mấy cái này, trong mấy cái Tutorial, mình đã rất cẩn trọng khi viết, để tránh được những thông báo không cần thiết của trình biên dịch, nhưng chắc có một số bạn không để ý.

Error[122] : Illegal opcode (_cp_off)

Cái "config" phải có tới hai dấu gạch ở đằng trước nó lận. Viết như thế này nó mới hiểu "__config". Nếu chỉ có một dấu gạch ở đằng trước, trình biên dịch sẽ không hiểu được đó là một derective, mà chỉ hiểu là một cái label bình thường.

Warning[207]: Found label after column 1. (_config)


Do trình biên dịch chỉ hiểu cái derective "_config" của bạn là một label khi bạn viết sai, nên mới xuất hiện thông báo này. Các label phải được đặt ở cột đầu tiên khi soạn thảo các file asm. Khi đó các thông báo tương tự sẽ không xuất hiện nữa.

Warning[205]: Found directive in column 1. (end)


Các lệnh phải được đặt ở các cột tiếp theo, mà không viết ở đầu hàng như các label. Nếu bạn cho lệnh "END" thụt vào bên trong hàng đầu tiên (trở về đầu dòng và nhấn "tab" một cái cho cái lệnh "END" nó thụt vô bên trong, khi đó, nếu biên dịch lại, dòng thông báo này sẽ không xuất hiện nữa. Các lệnh khác cũng vậy, bạn nên viết thụt vào trong một cột.

Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.


Đây không phải là một thông báo lỗi, mà chỉ là một cảnh báo để bạn xem lại việc truy xuất thanh ghi đó có nằm trong bank hiện hành hay không. Trình biên dịch không kiểm tra các thao tác này cho bạn, mà chỉ đưa ra một thông báo như vậy để bạn kiểm tra lại thôi. Xin nhắc lại, đây không phải là một thông báo lỗi. Bằng chứng là, mặc dù các thông báo này xuất hiện rất nhiều khi biên dịch, nhưng nếu không có lỗi nào khác ngoài các thông báo này, thì việc build vẫn "success".

Trong chương trình của bạn, bạn truy xuất thanh ghi TRISB ở BANK 1 trong khi vẫn đang ở BANK 0. Như vậy là không đúng, và giả sử, không còn lỗi nào khác, thì trình biên dịch vẫn báo "build success", nhưng chương trình khi thực thi sẽ không đúng. Phải sửa dòng lệnh 00013 thành "bsf STATUS,RP0" mới đúng.

Error[122] : Illegal opcode (_cp_off)


Phải có thêm dấu "&" ở đằng trước mới được.

Vạn sự khởi đầu nan hả. :D

Như vậy, có một số điểm cần lưu ý khi soạn thảo chương trình asm cho trình biên dịch MPASM như sau:

Các label nên được viết ở cột đầu tiên của trình soạn thảo. Như vậy các cảnh báo "warning[207]" sẽ không xuất hiện khi biên dịch.

Các lệnh, kể cả lệnh END nên được viết ở các cột tiếp theo (nên cách một khoảng tab từ đầu dòng rồi viết lệnh). Khi đó các "warning[205]" sẽ không xuất hiện khi biên dịch.

Các thông báo (message) và cảnh báo (warning) không phải là lỗi. Trình biên dịch chỉ đưa ra các thông điệp này để lưu ý bạn rằng các chỗ này đã được kiểm tra chưa, đã bảo đảm đúng hay chưa, và không gây ảnh hưởng đến việc build chương trình có "successed" hay "failed".

Các thông báo lỗi (error) mới là những lỗi thực sự. Nếu không sửa lại cho đúng thì biên dịch không thành công (failed).

Vậy đó.

:D

ntc
24-05-2006, 05:50 PM
Parallel Slave Port _ Một phương pháp khá đơn giản để giao tiếp giữa các vi điều khiển PIC cũng như giữa PIC và các thiết bị ngoại vi.

Mọi người đọc rồi cho biết ý kiến nhá.

:D

Cái này chủ yếu mang tính ... academic nhiều hơn. Mình xây dựng một số module cơ bản cho giao tiếp này dựa trên 2 vi điều khiển PIC16F877A.

falleaf
29-05-2006, 02:12 PM
Parallel Slave Port _ Một phương pháp khá đơn giản để giao tiếp giữa các vi điều khiển PIC cũng như giữa PIC và các thiết bị ngoại vi.

Mọi người đọc rồi cho biết ý kiến nhá.



F đặt ra vấn đề này cho mọi người suy nghĩ để giải quyết, và mong rằng có thể đưa ra những giải pháp tốt.

Giả sử, có một mạng 16 con vi điều khiển nằm chung với nhau. Bây giờ, chúng ta có một con master, chỉ làm nhiệm vụ truyền dữ liệu xuống cho 16 con kia. Hãy thiết kế mạch nguyên lý, và đưa ra giải pháp firmware cho mạng các vi điều khiển này.

Bài toán cụ thể đơn giản hơn:

Có 4 con slave, và 1 con master, tất cả đều là 16F877A. Cho một giá trị khởi tạo là b'11111111' đặt trong thanh ghi GIATRI của con master. Giảm đi 1 đơn vị sau mỗi lần thực hiện:

- Nếu GIATRI chia hết cho 4, gửi giá trị của GIATRI vào con slave 1 và hiển thị ra LED.
- Nếu GIATRI chia 4 dư 1, gửi giá trị của GIATRI vào slave 2 và hiển thị ra LED
- Nếu GIATRI chia 4 dư 2, gửi giá trị của GIATRI vào slave 3 và hiển thị ra LED
- Nếu GIATRI chia 4 dư 3, gửi giá trị của GIATRI vào slave 4 và hiển thị ra LED.

Hay nói cách khác, thực ra là cứ giảm GIATRI đi một đơn vị, rồi gửi theo thứ tự đến các slave, cứ lặp lại, cho đến khi GIATRI = 0.

Chú ý, thử dùng PSP để giao tiếp, và thử không dùng PSP mà chỉ nối port với port. Có nghĩa là tất cả các portD của các master và slave được nối chung với nhau, portD của master là ngõ xuất, portD của các slave là nhập.

Như vậy, chúng ta thử tìm giải pháp dùng giao tiếp PSP và giao tiếp song song giống như giao tiếp với cổng LPT của máy tính vậy.

Từ bài học này, chúng ta sắp nhấn một bước tới việc thực hành giao tiếp LPT, và một số thuật toán xử lý tín hiệu song song.

Mong rằng các bạn đầu tư thời gian để đưa ra một giải pháp tốt, phân tích tốc độ tính toán của giải pháp.

Chúc vui.

hungnp
29-05-2006, 02:43 PM
Chao ban nhh. ban co cong nhan voi toi la loi viet bai nhu cua ban ntc thi da co qua nhieu bai viet trong nuoc va nuoc ngoai roi khong? co can toi chi ra mot it khong?. ban doc lai tu dau den cuoi cai forum nay di. co bao nhieu ban cho bai moi cua ban ntc. nhu the chang qua cac bai viet truoc chang co y nghia gi nhieu voi ho ca. Con van de toi co viet bai hay khong con tuy thuoc trinh do cua toi den muc do nao nua. Toi cam thay minh chua the du nang luc de viet nhung bai co chat luong that su nen toi chua viet duoc.

hungnp
29-05-2006, 03:01 PM
De thuc hien duoc mot mang nhu cua bac F co the su dung mang 485. cho phan cung va giao thuc master/slave cho phan mem. giao tiep uart

giao thuc master/slave co the tuy bien theo ý thich cua nguoi dung.

Uu diem cua mang nay la: co the ket noi duoc nhieu slave tren mang(tat nhien con tuy thuoc vao mach chuyen hoi 232-485). truoc day toi da lam den 6 slave bang 89c51 ma chua co van de gi ca.

co kha nang tuyen data di xa do tin hieu truyen di va nhan ve cua VĐk la hieu cua tin hieu tren 2 day cua 485. do vay khi bi nhieu thi nhieu tren 2 day la dong deu nhu nhau nen khi lay hieu cua chung thi nhieu do bi triet tieu.

thoi dang ban khi khac noi tiep neu nhu co ai quan tam den cai mang nay cua toi.

hungnp
31-05-2006, 06:26 PM
Sao không ai nói tiếp chuyện của bác F thế. Buồn Wá. Tôi đưa ra thuật toán thế này nhé. thuật toán này chỉ dùng cho mạng 485 của tôi.

hungnp
31-05-2006, 06:29 PM
Các bác tham khảo và cho ý kiến nhé.

ntc
31-05-2006, 09:41 PM
Chao ban nhh. ban co cong nhan voi toi la loi viet bai nhu cua ban ntc thi da co qua nhieu bai viet trong nuoc va nuoc ngoai roi khong? co can toi chi ra mot it khong?. ban doc lai tu dau den cuoi cai forum nay di. co bao nhieu ban cho bai moi cua ban ntc. nhu the chang qua cac bai viet truoc chang co y nghia gi nhieu voi ho ca. Con van de toi co viet bai hay khong con tuy thuoc trinh do cua toi den muc do nao nua. Toi cam thay minh chua the du nang luc de viet nhung bai co chat luong that su nen toi chua viet duoc.

Ý nghĩa của bài viết có thể không quan trọng với những thành viên đã rành về vi điều khiển PIC, nhưng mình tin rằng nó sẽ rất bổ ích cho những ai mới chập chững làm quen với nó, vì đó là những vấn đề rất cơ bản, được viết rất cơ bản, chi tiết và có trách nhiệm với cộng đồng quan tâm đến PIC.

Mình không có tham vọng biên soạn tất cả các vấn đề liên quan đến vi điều khiển PIC, và không thể viết với tốc độ nhanh để đáp ứng yêu cầu của cộng đồng, nhưng mình sẽ xây dựng nó theo tiêu chí "chậm mà chắc", từ dễ tới khó, rồi đây nó sẽ đầy đủ hơn, nhiều vấn đề hơn và có tác dụng tham khảo, ứng dụng nhiều hơn.

Tất nhiên một người không thể làm hết được tất cả, sự giới hạn về thời gian cũng như kiến thức không cho phép mình thực hiện điều đó. Mình vẫn luôn hy vọng có nhiều thành viên tham gia vào công việc này hơn, để cùng xây dựng một cái gì đó có ích cho cộng đồng, đồng thời tiết kiệm được nhiều thời gian và công sức hơn cho những thành viên muốn làm chủ công cụ PIC.

Vấn đề về năng lực có quan trọng hay không trong trường hợp này. Quan trọng là bạn muốn làm một cái gì đó thực sự có ích hay không. TÙy theo năng lực mà có được những đóng góp thích hợp. Bản thân mình cũng không thể khẳng định là có năng lực, nhưng tinh thần trách nhiệm và nỗ lực đóng góp đã thúc đẩy mình làm điều đó.

Mình tin rằng bạn hoàn toàn có thể có những bài viết có chất lượng cho diễn đàn, quan trọng là có muốn làm hay không thôi.

Đâu có cái gì hoàn toàn mới mẻ, vì mình đâu có phát minh ra con PIC, sử dụng nó không đã mệt lắm rồi. Bạn không nên dựa vào việc đã có nhiều bài viết trong nước và nước ngoài viết về các vấn đề tương tự mà đưa ra các nhận định rằng các bài viết của mình là không cần thiết như vậy. Mình tin rằng vẫn có nhiều thành viên cần đến nó, vì người mới học PIC bao giờ cũng có, và luôn hy vọng rằng những đóng góp của mình sẽ giúp ích được cho những thành viên đó.

Rất mong bạn đóng góp những tài liệu trong nước và nước ngoài đó. Chỉ nó ra để mọi người cùng tham khảo đi.

Một vài góp ý như vậy.

:D

ntc
31-05-2006, 10:02 PM
Sao không ai nói tiếp chuyện của bác F thế. Buồn Wá. Tôi đưa ra thuật toán thế này nhé. thuật toán này chỉ dùng cho mạng 485 của tôi.

Hìhì. Bác Falleaf đang đặt ra các vấn đề về giao tiếp song song mà.

Mạo muội đưa ra một giải pháp về giao tiếp nhiều PIC qua PSP như sau:

Module PSP có chân CS*, ta có thể chọn chân này làm giải pháp để giao tiếp nhiều PIC qua PSP. Các PIC sẽ được nối với nhau theo dạng BUS (nối tất cả các chân data của Slave và Master lại với nhau). Muốn giao tiếp với chip nào chỉ cần đưa chân CS* của chip đó xuống mức logic thấp (tất nhiên, bàn đầu đưa tất cả các chân CS* lên cao). Đại khái cách nối giống như nối nhiều LED 7 đoạn. Các chân RD* và WR* cũng được nối chung với nhau.

Trong trường hợp có nhiều PSP Slave, có thể dùng thêm các IC ghi dịch hoặc giải mã để tiết kiệm chân điều khiển cho PIC, ngõ ra các IC ghi dịch và giải mã sẽ được nối với các chân CS* của PIC.

PSP Master không nhất thiết phải sử dụng module PSP, mà có thể sử dụng bất cứ port 8 chân nào để làm ngõ data và một số chân để điều khiển việc chọn chip. PSP Slave nên sử dụng module PSP để việc truyền nhận dữ liệu đơn giản hơn.

Về firmware, cách đọc và ghi dữ liệu có thể dùng ngắt, và cách điều khiển cũng tương tự như giao tiếp giữa 2 PSP, các vấn đề phát sinh cần xử lí là chọn chip và xử lí thuật toán chia lấy phần dư.

Tuy nhiên cần tối ưu code xử lí ngắt để cải thiện thời gian truyền. Vì cứ mỗi lần phát sinh ngắt, phải mất một số chu kì lệnh phát sinh để vào ngắt và thoát ngắt.

ntc
31-05-2006, 10:06 PM
À, quên nữa. Cái TUT của mình phân tích quá trình hoạt động của PSP dựa vào giản đồ xung. Nếu vừa đọc bài của mình, vừa nhìn vào giản đồ xung của PSP trong cái datasheet của PIC thì sẽ dễ hiểu hơn rất nhiều.

:D

hungnp
02-06-2006, 05:08 PM
bạn có khẳng định được là PSP hay hơn 485 không?. Nếu bạn khẳng định được điều này thì hãy sử dụng PSP.

hungnp
02-06-2006, 05:13 PM
Tôi muốn hỏi bạn một chút về PSP:

Khả năng chống nhiễu của nó thế nào. Nếu mang sản phẩm của bạn sử dụng PSP vào trong một nhà máy công nghiệp thì nó có hoạt động ổn định không?

Khoảng cách truyền của PSP có thể tối đa là bao nhiêu mà tín hiệu vẫn có thể đảm bảo.

PSP có thể kết nối được bao nhiêu PSP slave trên cùng một mạng.



PSP dùng 8 sợi dây để truyền tín hiệu nhưng 485 chỉ cần 3 dây thôi. 2 dây tín hiệu và một dây GND

namqn
02-06-2006, 05:40 PM
Tôi muốn hỏi bạn một chút về PSP:

Khả năng chống nhiễu của nó thế nào. Nếu mang sản phẩm của bạn sử dụng PSP vào trong một nhà máy công nghiệp thì nó có hoạt động ổn định không?

Khoảng cách truyền của PSP có thể tối đa là bao nhiêu mà tín hiệu vẫn có thể đảm bảo.

PSP có thể kết nối được bao nhiêu PSP slave trên cùng một mạng.

PSP dùng 8 sợi dây để truyền tín hiệu nhưng 485 chỉ cần 3 dây thôi. 2 dây tín hiệu và một dây GND
Không nên so sánh kiểu này bạn ạ. Mỗi giao thức được sinh ra đều có mục đích, cũng như những ưu điểm và khuyết điểm. Bạn dùng cái mục đích của RS485 để so sánh giữa nó và PSP thì không công bằng. Bạn thử so sánh nó với PSP theo tiêu chuẩn tốc độ truyền dữ liệu ở cự ly gần xem.

Thân,

hungnp
02-06-2006, 06:08 PM
Cái tôi cần nói là ở chỗ đó. Nếu bạn đã đi làm thì những ứng dụng ở cự ly gần có nhiều không?. Chúng ta nên làm những cái gì mà nó có ý nghĩa trong thực tế nhiều hơn. Làm không chỉ để học mà cũng phải có tính ứng dụng nữa.

namqn
02-06-2006, 07:39 PM
Cái tôi cần nói là ở chỗ đó. Nếu bạn đã đi làm thì những ứng dụng ở cự ly gần có nhiều không?. Chúng ta nên làm những cái gì mà nó có ý nghĩa trong thực tế nhiều hơn. Làm không chỉ để học mà cũng phải có tính ứng dụng nữa.
Đó là quan điểm của bạn, còn những người khác có thể có quan điểm khác bạn. Một số sinh viên của tôi cũng có quan điểm như vậy, chỉ chịu học những gì họ cho là sẽ dùng nhiều trong thực tế.

Tôi luôn luôn khuyến khích sinh viên của mình nghiên cứu dựa vào thực tế. Cám ơn bạn đã có lời khuyên như vậy.

Thân,

falleaf
02-06-2006, 07:53 PM
Cái tôi cần nói là ở chỗ đó. Nếu bạn đã đi làm thì những ứng dụng ở cự ly gần có nhiều không?. Chúng ta nên làm những cái gì mà nó có ý nghĩa trong thực tế nhiều hơn. Làm không chỉ để học mà cũng phải có tính ứng dụng nữa.

Điều bạn nói hoàn toàn đúng. Hiện nay, trên thế giới, người ta chủ yếu sử dụng giao tiếp nối tiếp. Theo lịch sử, ban đầu luôn xuất hiện các giao tiếp song song, vì người ta cho rằng giao tiếp song song, tại một lúc có thể truyền nhiều bit hơn giao tiếp nối tiếp. Nhưng về mặt điện, thì càng ngày người ta càng phát hiện, giao tiếp nối tiếp lợi thế hơn giao tiếp song song rất nhiều về mặt tốc độ.

Đơn cử một thí dụ, chúng ta có cổng IDE để giao tiếp với ổ cứng, nhưng hiện nay, giao tiếp SATA nối tiếp, cho phép đọc ổ cứng tốc độ cao hơn nhiều.

Do vậy, điều bạn nói hoàn toàn không sai. Nhưng một vấn đề đặt ra, nếu như bạn giao tiếp với các thiết bị đóng gói, và những sản phẩm đóng gói, có thể những sản phẩm đó sẽ là các giao tiếp nối tiếp. Nhưng nếu như bạn sản xuất thiết bị, thì bạn sẽ thấy, trong đó còn rất nhiều phần cần dùng giao tiếp song song.

Những linh kiện đơn giản như chuyển đổi ADC vẫn sử dụng giao tiếp song song, những linh kiện mã hoá, vẫn dùng giao tiếp song song. Trong một sản phẩm nhỏ vd như điều khiển động 3 động cơ bước cho ống kính thiên văn cá nhân, người ta vẫn dùng tín hiệu song song để điều khiển, vì tốc độ của nó chỉ cần 1 instruction để điều khiển động cơ bước đi 1 bước, và như vậy, trong vòng 3 instructions có thể điều khiển 3 động cơ bước, gần như tức thời. Nếu lập trình nối tiếp thì sẽ thế nào? Đây là ứng dụng thực tế, không phải là lý thuyết.

picvietnam nhận vai trò đào tạo phổ cập, cho nên những vấn đề picvietnam đưa ra, một phần là hơi mang tính academic, có nghĩa là phải mang tính chất đầy đủ, chưa chắc ứng dụng nhiều. Bạn có thể không cần, nhưng người khác sẽ cần. Đó là một vấn đề khiến picvietnam phải hao tổn sức lực khá nhiều so với việc cứ làm rồi làm. Ví dụ như bài toán của F đưa ra, há chẳng phải F không thể làm được giao tiếp nối tiếp, nhưng F đặt ra bài toán, để các bạn học sinh, sinh viên suy nghĩ giải pháp. Điều này cho thấy rằng picvietnam luôn muốn các bạn sinh viên suy nghĩ, vận dụng đầu óc của mình, với những điều kiện cố định cho trước (giao tiếp PSP, song song) để thực hiện bài toán. Khi có những kinh nghiệm suy nghĩ này, thì việc ứng dụng nó vào trong thiết kế về sau sẽ giúp người kỹ sư có một cái nhìn tổng quát hơn, và khi cần thì người ta có thể biết cách dùng.

Nếu bạn muốn thảo luận những vấn đề cao siêu, không mang tính chất học thuật mà ứng dụng nhiều, không mang tính chất đào tạo mà chỉ là trao đổi sơ qua, hoặc muốn thể hiện khả năng kỹ thuật của mình, hàng loạt sinh viên của F và bác BA sẽ có thể trả lời các vấn đề về PIC cho bạn tại www.dientuvietnam.net

Về việc bạn nhận xét về các bài viết không được mọi người theo dõi nhiều, xin thông báo là hiện nay picvietnam có phần lỗi counter, không hiểu sao bộ đếm người xem không tăng khi có người ra và vào. Bạn lưu ý điểm này và có thể thử vào xem rồi đi ra. Số lượt xem hoàn toàn không thay đổi. Do bộ phận kỹ thuật hiện nay quá bận, và đang phải ổn định www.dientuvietnam.net, đồng thời cá nhân F đang phải thiết kế bộ thư viện về Điện Tử, Điều Khiển, và Toán Ứng Dụng, nên rất hạn chế về mặt thời gian. Hơn nữa, F cũng vẫn phải đi học trên lớp, và vẫn phải thi, cho nên về mặt thời gian càng hạn chế hơn. Việc sử chữa này F sẽ cố gắng thực hiện sớm nhất có thể.

Mặc dù vậy, mỗi ngày F vẫn theo dõi không thiếu một bài trên picvietnam, và những bài có tính chất quan trọng, định hướng, và lý luận như của bạn, F sẽ phải dành thời gian để trả lời.

Có lẽ vì anh Nam trả lời bạn một cách khúc chiết, và quá ngắn gọn, cho nên làm cho bạn có cảm giác về câu trả lời chưa được thỏa mãn. Mong rằng bạn hiểu được ý đồ của picvietnam, muốn đem pic đến cho mọi người.

Chúng ta mỗi người, mỗi ngày làm một việc cho pic, F mong muốn rằng cái điều F nói "Học PIC trong 1 ngày" sẽ sớm thành sự thật. Đừng bảo việc gì khó thì không làm được, đó là tôn chỉ của picvietnam.

Chúng tôi rất mong những người đã có kinh nghiệm làm việc như bạn cùng tham gia xây dựng và phát triển về pic, robotics và các bài học cho picvietnam. Sức một vài người không làm được gì cả, nhưng sức của cả một cộng đồng thì không có gì không làm được. "Học pic trong 1 ngày" không phải là điều mà F cố đạt được, mà đây là tinh thần kêu gọi, chúng ta sẽ làm được.

Mong những đóng góp của bạn cho picvietnam nói riêng, và cho cộng đồng điện tử nói chung.

Chúc vui.

ntc
03-06-2006, 12:51 PM
Tôi muốn hỏi bạn một chút về PSP:

Khả năng chống nhiễu của nó thế nào. Nếu mang sản phẩm của bạn sử dụng PSP vào trong một nhà máy công nghiệp thì nó có hoạt động ổn định không?

Khoảng cách truyền của PSP có thể tối đa là bao nhiêu mà tín hiệu vẫn có thể đảm bảo.

PSP có thể kết nối được bao nhiêu PSP slave trên cùng một mạng.



PSP dùng 8 sợi dây để truyền tín hiệu nhưng 485 chỉ cần 3 dây thôi. 2 dây tín hiệu và một dây GND

Chính xác là cần từ 9 đến 11 sợi dây, chứ không phải chỉ cần 8 dây.

Các vấn đề này mình đã có đề cập đến trong phần kết luận của bài viết TUT04. Bạn đọc xem như thế nào, rồi cho mình biết ý kiến nhá.

:D

Hì, đã nhấn mạnh là bài viết này mang tính academic nhiều hơn mà, nhưng ứng dụng của nó trong thực tế thì phải có trường hợp hữu dụng cho nó, giống như sự hữu dụng của RS485 trong môi trường công nghiệp vậy.

Tùy thực tế mà mình quyết định dử dụng cái nào chứ bạn. Không để đem PSP vào các mạng công nghiệp, cũng như không nên đem RS485 vào ứng dụng trong các mạng cần khoảng cách ngắn và đơn giản, hì, nói nôm na là giết ruồi mà xài dao mổ bò.

giao_su_can
18-06-2006, 10:53 AM
sao các bác ko có cái tut bằng C nhỉ ngôn ngữ C rất hay mà

falleaf
18-06-2006, 03:01 PM
Không, picvietnam hướng dẫn về căn bản, để mọi người hiểu bản chất của PIC, nên chủ trương sử dụng MPASM để mọi người hiểu rõ bản chất của nó. Việc sau này dùng C hoặc B, đó là chuyện rất đơn giản.

Chúc vui

ncv
20-06-2006, 11:36 AM
Không, picvietnam hướng dẫn về căn bản, để mọi người hiểu bản chất của PIC, nên chủ trương sử dụng MPASM để mọi người hiểu rõ bản chất của nó. Việc sau này dùng C hoặc B, đó là chuyện rất đơn giản.

Chúc vui

Tôi nghĩ không nên tự bó buộc chúng ta khi chỉ quyết định dùng MPASM. Hãy thử tưởng tượng việc phát triển lĩnh vực vi điều khiển tại VN. Ta cần bao nhiêu chuyên viên / chuyên gia làm việc trong từng phạm vi nào? Tôi chưa tìm ra câu trả lời toàn diện cho câu hỏi này, nhưng tôi không nghĩ là tất cả mọi người cần học căn bản thông qua assembly. Thậm chí tỉ lệ người dùng assembly là rất nhỏ, mặc dù họ đóng một vai trò vô cùng quan trọng. Có phải "căn bản" là dành cho tất cả mọi người không?

falleaf
20-06-2006, 11:54 AM
Nhận định này của bạn rất hợp lý, chúng ta sẽ nhanh chóng đi đến việc phổ biến và nghiên cứu C, đó là cách cần thiết để tiếp cận với các dự án thực hành.

Do vậy, các thành viên vẫn thường xuyên viết các bài viết về C và trao đổi về C, ban điều hành của diễn đàn thì chú trọng vào phần MPASM. Thực tế, nếu ban điều hành không làm hoạt động nghiên cứu theo nghĩa hơi chuyên gia một chút, thì rất khó để có thể phát triển hoạt động và hỗ trợ, cũng như có cách nhìn về lâu về dài.

Chúng tôi vẫn luôn ủng hộ các hoạt động trao đổi về các ngôn ngữ cấp cao, bằng chứng là chúng tôi hỗ trợ rất nhiều công cụ trình dịch, cũng như có box dành cho ngồn ngữ cấp cao. Tuy nhiên, thử nghĩ đến việc, cả ban điều hành cũng không làm việc với MPASM nữa, thì gần như hoạt động của các ngôn ngữ cấp cao sẽ phát triển rất nhanh, mà đôi lúc không thể có những bài hướng dẫn một cách bản chất cho các bạn được.

Vd: Nguyễn Trung Chính phụ trách thực hành và báo cáo vừa qua về bootloader, PIC877A, và giao tiếp PSP, chúng ta không thể nói dùng dòng lệnh C này, dòng lệnh C kia để làm... Như anh Nam, hướng dẫn về dsPIC, thực sự mà nói, làm việc với dsPIC thì làm với C sẽ có nhiều lợi thế hơn, nhưng để các bạn hiểu, thì cách thể hiện bằng ASM30 là tốt nhất.

Chúng tôi hoàn toàn ủng hộ các hoạt động của các thành viên và những người viết tut bằng ngôn ngữ cấp cao, còn nhiệm vụ của chúng tôi thì lại là nghiên cứu PIC... Nhưng F khẳng định một điều, khi các bạn hiểu ASM, sẽ rất tốt cho các bạn khi sử dụng ngôn ngữ cấp cao để làm việc

Chúc vui

MHz
22-06-2006, 08:33 PM
Nhưng F khẳng định một điều, khi các bạn hiểu ASM, sẽ rất tốt cho các bạn khi sử dụng ngôn ngữ cấp cao để làm việc

... rất đúng, khi các bạn hiểu về ASM các bạn sẽ thấy tự tin hơn khi làm việc với PIC, vì khi đó bạn đã hỉu rất rõ về cấu trúc phần cứng của PIC... và việc chuyển qua ngôn ngữ bậc cao chỉ là chuyện nhỏ... :)

hoanf
23-06-2006, 12:41 AM
Em nghĩ việc học PIC thông qua ASM là rất là hay. Pic kô quá lớn để chúng ta phải dùng C để học và điểu khiển nó qua các driver như trong CCS cung cấp.
Điều này sẽ gây sự mù mờ cho người viết chương trình và cảm giác e sợ khi kô có driver đi kèm và đụng phải vấn đề liên quan tới phần cứng khác kô được sự hỗ trợ của driver.
Khi học ASM ta sẽ dễ dàng hiểu cấu tạo và cách hoạt động của PIC và chúng ta có thể dùng C để viết thử driver cho PIC (điều khiển ADC, keypad, các ứng dụng tạo ngắt và timer). Điều này sẽ rất hữu ích và làm cho ta tự tin khi phải làm quen với các hệ thống lớn hơn.
Em nghĩ phải đi từ thấp lên cao. Giống như ta học chữ vậy, phải học bảng chữ cái trước rồi mới ghép thành từ rồi ghép từ thành câu .....
Đây là ý kiến chủ quan của em. Mong nhận đc nhiều góp ý để đưa ra được cách học Pic tốt nhất cũng như tạo nền tảng cho ta phát triển làm các hệ thống Embedded sau này chẳng hạn.
Hoanf
Chúc ngủ ngon.

ncv
23-06-2006, 07:22 AM
...
Em nghĩ phải đi từ thấp lên cao. Giống như ta học chữ vậy, phải học bảng chữ cái trước rồi mới ghép thành từ rồi ghép từ thành câu .....


Điều gì khiến tôi nhớ đến những ngày đầu học i-tờ? Tôi nằm lòng những ca dao tục ngữ của người xưa. Chẳng hạn:

Một cây làm chẳng nên non
Ba cây chụm lại nên hòn núi cao

Hay học phép cộng:

Hôm qua em giúp mẹ 2 việc: Quét nhà và trông em. Hôm nay em giúp mẹ rửa bát. Vậy em đã giúp mẹ mấy việc?

Tôi chán nhất là học thuộc lòng bảng cửu chương. Nếu không có truyện tranh Lưu Bình - Dương Lễ hay một truyện hấp dẫn in kèm vào bảng cửu chương thì "có thể" tôi chẳng bao giờ thuộc được nó.

hoanf
23-06-2006, 10:13 AM
Chào buổi sáng.
Bác ncv nói gi tui ko hiểu lắm nhưng tui xin nói thêm về điều tôi nói bữa hôm qua.:D
Một người học chữ mà học cách viết một từ trước mà kô biết là một từ chỉ gồm các chữ cái ghép lại thì học đến bao giờ mớt hết.
Còn về bảng cửu chương bác ncv nói thì nếu ta kô học bảng cửu chương trước thì làm sao ta có thể làm các bài toán cộng trừ nhân chia các số đơn giản đây chứ nói gì đến giải phương trình.
Thân chào. Mong anh em góp ý để có cách học PIC tốt nhất.
hoanf

ntc
23-06-2006, 02:38 PM
Các hàm trong các thư viện của ngôn ngữ cấp cao được xây dựng sẵn là rất thuận lợi. Nếu chỉ sử dụng hàm đó mà không tìm hiểu sâu hơn các chức năng bên trong thì đúng là thiếu sót, hơn nữa, khi có các yêu cầu phát sinh đối với các hàm khi xây dựng hệ thống, thì mình sẽ không xử lí được.
Có một điểm chung ở đây, đó là dù đứng trên phương diện nào, cũng cần phải tìm hiểu thấu đáo các công cụ mình đang tiếp cận.

Một vài ý kiến của mình như vậy.


:D

chuthong1
23-06-2006, 02:57 PM
Cam' on Anh Nguyen Trung Chinh'
Anh lam on post bai tiep di Em dang doc thay rat hay, rat de hieu.

hoanf
23-06-2006, 04:26 PM
Cám ơn ý kiến của anh Nguyễn Trung Chính.
Em rất mong vấn đề này được nhiều người góp ý hơn nữa để chúng ta có một hướng đi tốt nhất và ngắn nhất.

ncv
23-06-2006, 05:26 PM
...
Có một điểm chung ở đây, đó là dù đứng trên phương diện nào, cũng cần phải tìm hiểu thấu đáo các công cụ mình đang tiếp cận.
...

Tôi hoàn toàn đồng ý với quan điểm trên. Dùng bất kỳ ngôn ngữ hay công cụ nào, đó cũng chỉ là phương tiện để đạt được một mục đích nào đó. Mục đích càng cao, người dùng công cụ phải càng sáng suốt. Mục đích càng liên quan đến nhiều người, việc lựa chọn công cụ càng phải vừa cẩn thận vừa thoáng đạt.

typhn
30-06-2006, 10:28 AM
Cảm ơn anh NTC,anh viết khá hay,đọc rất là dễ hiểu.
Em đã đi rất nhiều hiệu sách,tìm trên mạng cũng khá nhiều tài liệu
Nhưng vì mới học nên ko biết bắt đầu như thế nào
Đọc bài của anh,mọi thứ dường như đã sáng tỏ.
Thanks

typhn
30-06-2006, 10:34 AM
Anh cho em hỏi chút,ở bài 2 của anh,khi khai báo biến
count1 equ 0x20
counta equ 0x21
countb equ 0x22
anh có thể giải thích chi tiết hơn được ko? equ la khai bao j? va nhat thiet phai la 0x20,21,22 ko?
nếu em khai báo như sau có được ko:

count1 db 0 ;khai bao 3 bien va cho chung gia tri ban dau la 0
cuonta db 0
countb db 0
thanks

typhn
30-06-2006, 10:54 AM
ah,còn nữa,ở bài 2,có đoạn:

delay_0
decfsz counta,1 ;giam counta va so sanh voi 0
goto $+2 ;neu khac 0 thi th lenh nay( bo qua lenh tiep theo)
decfsz countb,1 ;neu bang 0 thi giam countb va sau lenh nay
; countb =0 nen ko thuc hien lenh tiep theo
goto delay_0 ;neu counta khac 0 thi tro lai va giam tiep
decfsz count1,1
goto d1
return


Bây giờ,em ko dung biến countb nữa mà em làm như sau:

delay_0
decfsz counta,1
goto $+2
goto tro_ve
goto delay_0
tro_ve
decfsz count1,1
goto d1
return


2 chương trình này có giống nhau ko anh?
thanks

typhn
30-06-2006, 11:02 AM
Xin lỗi anh,em edit nhưng ko được
Hơi khó nhìn 1 chút
thanks

ntc
30-06-2006, 02:01 PM
Không nhất thiết, bạn có thể khai báo ở các ô nhớ khác. Bạn cũng có thể tham khảo thêm tài liệu hướng dẫn sử dụng cho trình biên dịch để hiểu thêm. Cái tài liệu gì ấy anh Nam nhỉ, tự nhiên em quên mất tiêu. Hình như là MPLAB, MPASM & MPLINK user guide gì đó.

Còn vấn đề vè delay, bạn chịu khó nghiền ngẫm một tí là hiểu ngay í mà.

:D

namqn
30-06-2006, 05:25 PM
Tài liệu đó là "MPASM Assembler, MPLINK Object Linker, MPLIB Object Librarian User's Guide". Phiên bản hiện tại là DS33034J, download tại đây:
http://ww1.microchip.com/downloads/en/DeviceDoc/33014J.pdf

Thân,

ntc
01-07-2006, 11:09 AM
Đấy, hèhè.

Cảm ơn anh Nam cứu bồ.

:D

typhn
01-07-2006, 07:24 PM
Em mới học pic nên muốn mua 1 bộ nạp píc.
Bác nào có mạch nạp PG2C nạp cho con pic16F877A bán cho em cái
thanks
Email của em: typhn1985@yahoo.com

newuser
02-07-2006, 01:16 PM
bạn nên viết chương trình delay theo dạng như sau sẽ rất tiện:
DELAY
MOVLW D'xx'
MOVWF COUNTA
CLRF COUNTB
HERE
NOP ;1us
DECFSZ COUNTB,F ;1us
GOTO HERE ;4us*255~1000uS=1ms
DECFSZ COUNTA,F
GOTO HERE ;'xx' ms
; DECFSZ COUNTx,F
; GOTO HERE
RETURN
bạn thay COUNTA và COUNTB như thế này cũng được :
DECFSZ 0X22,F
GOTO HERE
DECFSZ 0X21,F
GOTO HERE

bạn muốn tạo trễ bao lâu chỉ cần thêm biến COUNTx rồi nạp giá trị ban đầu cho nó ,không mất công nhảy tới nhảy lui--->chóng mặt ^_^

được không bạn ?

typhn
02-07-2006, 09:21 PM
Mấy bác ơi,giúp em với.
Em mới bắt đầu học pic,nhưng chưa có mạch nạp.
Em thử biên dịch chương trình bằng mplap.
Em làm y hệt anh NTC,cái bài cho led chạy từ trái sang phải ấy
code như sau:



;8 led o portb
;cho led chay tu trai sang phai
;thoi gian delay la 100ms


list p=16f877A ; list directive to define processor
#include <p16f877A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

;==========================
;KHOI TAO CAC BIEN

;==========================
count1 equ 0X20
counta equ 0X21
countb equ 0X22

ORG 0X0000
GOTO MAIN


MAIN
BCF STATUS,RP1 ;RP1=0
BSF STATUS,RP0 ;RP0=1=>CHON BANK1
CLRF TRISB ;XUAT DU LIEU RA PORTB

BCF STATUS,RP0 ;CHON BANK0
MOVLW B'10000000'
MOVWF PORTB ;BAT LED O CHAN RB7
LOOP
CALL DELAY_100MS
RRF PORTB,1
GOTO LOOP

DELAY_100MS

MOVLW d'100'
MOVWF count1
DELAY0

MOVLW d'199'
MOVWF counta
MOVLW d'1'
MOVWF countb
D1
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO D1
DECFSZ count1,1
GOTO DELAY0
RETURN
end


Sau đó em nhấn alt+F10 để dịch ra file hex thì nó báo như sau:

Clean: Deleting intermediary and output files.
Clean: Deleted file "D:\pic\B3.mcs".
Clean: Done.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F877A "B3.ASM" /l"B3.lst" /e"B3.err"
Warning[207] D:\PIC\B3.ASM 15 : Found label after column 1. (count1)
Warning[207] D:\PIC\B3.ASM 16 : Found label after column 1. (counta)
Warning[207] D:\PIC\B3.ASM 17 : Found label after column 1. (countb)
Message[302] D:\PIC\B3.ASM 26 : Register in operand not in bank 0. Ensure that bank bits are correct.
Loaded D:\pic\B3.COD.
BUILD SUCCEEDED: Mon Jul 03 15:52:56 2006

Ko hiểu sao lại có mấy cái warning ở trên
Mấy bác giải thích dùm em với
thanks

falleaf
02-07-2006, 09:40 PM
list p=16f877A ; list directive to define processor
#include <p16f877A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

;==========================
;KHOI TAO CAC BIEN

;==========================
count1 equ 0X20
counta equ 0X21
countb equ 0X22



Em chú ý, nó báo warning cái đoạn này, khi em gán count1 equ 0x20, có nghĩa là em đặt cái 0x20 thay bởi count1, nghĩa là em đặt một cái nhãn cho 0x20. Thay vì sau này viết 0x20 thì em viết là count1.

Cách viết này, có thể dùng để đặt hằng số, có thể đặt biến, nếu em dùng nó như một thanh ghi, thì nó là biến, nếu em dùng nó như là số, thì nó là hằng.

Cho nên, lúc này em phải viết nó vào cột thứ nhất, như một cái nhãn.

Vì vậy, nó mới thông báo rằng tìm thấy một cái nhãn không viết trong cột 1. Hay dịch nguyên văn là nó tìm thấy một cái nhãn viết sau cột 1.

Trong phần này anh nhớ đã có viết rất chi tiết trong bài viết về tập lệnh, đặt biến. Khi đặt biến, em dùng cách đặt RES thì sẽ tốt hơn dùng equ. Sau này chuẩn hoá, đặt biến sẽ dùng RES chứ không dùng EQU nữa.

Chúc vui

PS, em nhớ phải đặt chương trình trong cái thẻ [code] [/ code] (viết liền lại), thì mọi người mới thấy đựơc những chỗ sai kiểu như thế này.

Chúc vui

typhn
03-07-2006, 08:37 AM
cảm ơn anh!
Em sửa được rồi.
Nhưng cái lỗi này thì em chưa hiểu lắm:
Message[302] D:\PIC\B3.ASM 26 : Register in operand not in bank 0. Ensure that bank bits are correct.
Sao thanh ghi lại ko ở trong bank 0 hả anh?
Anh giải thích giùm em với
thanks

ntc
03-07-2006, 10:39 AM
http://www.picvietnam.com/forum//showthread.php?t=238&page=5

Bạn tham khảo thêm ở chỗ này.

:)

phutdv
03-07-2006, 04:11 PM
Thấy mấy anh bàn luận sôi nổi quá.
Em có 1 thắc mắc: khi trước, làm việc với 8051, em dùng ASM51 để biên dịch ra file hex. Bây giờ, học PIC, mấy anh cho em cái trình biên dịch cho PIC nhé, hình như là MPLAP như bác typhn có nói.
Rất mong sự giúp đỡ!
Thân mến!

txt
03-07-2006, 05:12 PM
Tui học PiC bằng C trước khi hoc bằng ASM và hiểu rõ PIC hoạt động bằng cách giám sát mã ASM dịch ngược cho mỗi dòng lệnh . Do vậy học C không có nghĩa là sẽ không thể hiểu rõ PIC làm gì ,vấn đề là ta có muốn hiểu hay không , và bởi vì không có trình biên dịch nào mà kho hàm dựng sẵn của nó lại đủ cho tất cả mục đích và mong muốn của chúng ta . Đôi khi bạn có thể viết như thể viết kiểu ASM nhưng lại đang dùng kiểu thể hiện ( phong cách viết ) theo C ( không cần chèn mã ASM) , nhưng sẽ rất dễ nhìn , rõ ràng , thấy ngay được mọi thứ , và có thể đơn giản nhiều thứ ( ví dụ như lặp lại hoài việc chuyển bank phiền phức ). Tôi khoái C và mặc dù đang viết "CCS tiếng Việt " dở dang , nhưng tôi có ý định viết thành 1 quyển sách " Lập trình C cho PIC ", sử dụng CCS là chính , kết hợp MPLAB . Chỉ nói về C , còn ASM chỉ nói như là giải thích cách hoạt động của hàm , chương trình . Không biết điều này có là ngược đời hay không ?( nắm C trước , ASM nắm sau thông qua làm việc với C ) . Rõ ràng có ưu điểm : C dễ hiểu và viết nhanh , ASM chỉ cần hiểu , không cần phải viết . Nhưng các bạn có đồng ý về điều này ?

acbossvn
03-07-2006, 06:06 PM
Mình mới chuyển sang tiếp cận PIC sau khi đã nghiên cứu 89C51 với trình dịch Keil. Khi dùng trình dịch này mình đã thấy hết ưu điểm của ngôn ngữ C với Micro-controler. Vì vậy, hiện tại mình rất ủng hộ và tán thành việc nghiên cứu PIC bằng ngôn ngữ C và tạm thời dùng trình dịch CCS. Txt đã có 1 ý tưởng rất hay là viết sách. Hoan hô bác Txt vì thành ý của bác dành cho anh em mới và đang tiếp cận PIC. Chúc bác viết sách thành công và sớm up lên diễn đàn cho mọi người. Mình sẽ theo dõi liên tục vấn đề này trong thời gian tới. Mong mọi người chỉ bảo thêm...

acbossvn
03-07-2006, 06:09 PM
Dù mới tham gia, mình vẫn thấy luồng này vẫn lộn xộn quá. Nếu được, xin hãy tách riêng các bài viết bằng code C và ASM ra. Như vậy sẽ tiện theo dõi hơn.

falleaf
03-07-2006, 09:05 PM
Bạn đọc kỹ tiêu đề, luồng này nói về 16F877A, cho nên mục tiêu là để phác thảo nên các tính năng, ứng dụng của nó. Đây là một cách học khác với cách học lập trình.

Để học lập trình, bạn vào từng mục cụ thể, MPASM hoặc Các ngôn ngữ lập trình khác, để thảo luận riêng về một ngôn ngữ nào đó.

Chúc vui

acbossvn
04-07-2006, 09:26 AM
Các huynh cho đệ hỏi chút: la cái CCS dịch xong chương trình ko thấy thông báo lỗi gì...nhưng khi debug lại ko được và có thông báo: cannot detect ICD type? Nghĩa là sao zaay....

vẫn có thông báo như thế kể cả khi tiểu đệ debug code cho CCS được viết trên diễn đàn này.

typhn
04-07-2006, 09:36 PM
Mấy anh cho em hỏi về giao tiếp ICSP.
Có tài liệu tiếng anh nhưng em đọc ko hiểu lắm
thanks

namqn
04-07-2006, 10:16 PM
Các huynh cho đệ hỏi chút: la cái CCS dịch xong chương trình ko thấy thông báo lỗi gì...nhưng khi debug lại ko được và có thông báo: cannot detect ICD type? Nghĩa là sao zaay....

vẫn có thông báo như thế kể cả khi tiểu đệ debug code cho CCS được viết trên diễn đàn này.
Bạn debug chương trình bằng CCS hay MPLAB?

Trong trường hợp MPLAB, nếu bạn không có ICD (thường là như vậy, vì ICD đâu có dễ gì mua được) thì bạn vẫn có thể debug bằng MPLAB SIM. Bạn vào mục mênu Debugger > Select Tool, chọn 2 MPLAB SIM.

Còn CCS thì tôi không dùng nên không rõ, nhưng có vẻ như nó chỉ hỗ trợ ICD hay MACH X là mấy cái debugger của riêng hãng CCS, cùng với việc liên kết với MPLAB SIM.

Thân,

namqn
04-07-2006, 10:21 PM
Mấy anh cho em hỏi về giao tiếp ICSP.
Có tài liệu tiếng anh nhưng em đọc ko hiểu lắm
thanks
ICSP là giao tiếp dùng để đưa chương trình mã máy và các thông tin cấu hình, dữ liệu trong EEPROM (nếu có), vào chip thông qua một chuẩn nối tiếp, nó cho phép nạp chương trình cho chip ngay trong mạch đích.

Bạn dùng chức năng tìm kiếm của diễn đàn để tìm các luồng có liên quan đến ICSP để đọc thêm.

Để sử dụng thì chỉ cần có mạch nạp hỗ trợ ICSP, mạch đích được thiết kế theo khuyến cáo của hãng Microchip, và một số chú ý mà tôi đã nói qua trong các luồng khác khi trả lời về vấn đề này.

Thân,

typhn
04-07-2006, 11:29 PM
Cảm ơn anh.Em cũng hơi hiểu rồi
Mạch nạp em sử dụng là PG2C.
Nếu cắm theo chuẩn ICSP thì ta có thể nạp cho PIC khi nó ở mạch ngoài mà ko cần cắm pic vào mạch nạp nữa.
Thanks

typhn
04-07-2006, 11:32 PM
Ở đây có anh nào dùng proteus chưa.
Em tìm trong thư viện ko có con p16f877a nên em dùng con p16f877
Vì 2 con này cũng gần giống nhau
Nhưng em tìm mãi ko thấy chân VDD và VSS đâu.
2 chân này đã bị ẩn đi thì phải
Có anh nào biết cách làm nó hiện lên ko?
thanks

namqn
04-07-2006, 11:42 PM
Bạn định dùng Proteus với PIC16F877 để làm gì?

Có thể có cách khác để đạt được mục đích của bạn mà không phải hiện các chân hidden của chip.

Thân,

typhn
05-07-2006, 10:08 AM
Em định dùng để mô phỏng chương trình của anh NTC
Làm mấy cái led nhấp nháy,chạy từ trái qua phải...
Nhưng muốn nó hoạt đọng phải cấp nguồn +5v cho nó
Nhưng em ko thấy chân VDD và GND thì làm sao mà cấp nguồn được hả anh
thanks

ntc
05-07-2006, 10:25 AM
Chú typhn phức tạp gớm.

Có mấy cái led thì mô phỏng làm gì.

:D

chuthong1
05-07-2006, 11:07 AM
Sao may hom nay em vao ma khong thay' cac anh post tiep' bai len vay?
Mong qua'.....................hic...

namqn
05-07-2006, 07:06 PM
Em định dùng để mô phỏng chương trình của anh NTC
Làm mấy cái led nhấp nháy,chạy từ trái qua phải...
Nhưng muốn nó hoạt đọng phải cấp nguồn +5v cho nó
Nhưng em ko thấy chân VDD và GND thì làm sao mà cấp nguồn được hả anh
thanks
Proteus tự cấp nguồn cho mấy con chip trong mạch mô phỏng. Bạn đọc cái tutorial của nó về mô phỏng trong Proteus VSM Help.

Thân,

totite
24-07-2006, 09:56 AM
Anh Nguyễn Trung Chính ơi. Anh viết tiếp về ADC đi. Sao em làm giống như hướng dẫn trong datasheet mà nó không chạy.

ntc
24-07-2006, 04:51 PM
Thì bạn cứ gửi code và sơ đồ nguyên lí mạch lên để cùng thảo luận.

Uh, sắp xong tutorial mới rồi.

Ráng chút xíu đi.

:D

friends
26-07-2006, 08:57 PM
cac anh oi, chuong trinh duoi day em viet neu nap cho pic 16f877a thi lieu no co chay khong, em đã viết nó để nạp cho pic 16f876a ,nhưng khi thử nghiệm với pic 16f876a thì ở portb em thấy các led đều tắt, cho em hỏi chương trình em viết để nạp cho pic16f876a có sai chỗ nào không?


#include<p16f876a.inc> ;chen thu vien lien ket cho chuong trinh

org 0x20
count1 res 1
count2 res 1
org 00h
goto START
START

clrf PORTB
bsf STATUS,RP0 ;chon bank1
movlw D'0'
movwf TRISB ; chon bortb xuat
bcf STATUS,RP0
movlw b'00000001'
movwf PORTB
call DELAY
QUAY1
rlf PORTB,1 ;co so 1la vi de dua vao portb
call DELAY
btfss PORTB,7
goto QUAY1
QUAY2
rrf PORTB,1
call DELAY
btfss PORTB,0 ;bit0
goto QUAY2
goto $
DELAY
movlw D'250'
movwf count1
movlw D'250'
movwf count2
LOOP1
decfsz count1,1 ;giam count xuong 1
goto LOOP1
LOOP2
decfsz count2,1
goto LOOP2
return
end

namqn
26-07-2006, 09:43 PM
Chương trình viết cho PIC16F876A có thể chạy tốt trên PIC16F877A.

Chương trình của bạn đã viết không có vấn đề gì về cú pháp, nhưng chương trình con DELAY của bạn chỉ thực hiện delay khoảng 1500 chu kỳ lệnh, có thể là quá nhanh để bạn nhìn thấy thay đổi ở ngõ ra bằng mắt thường nếu tần số của vi điều khiển nằm trong tầm MHz. Nếu vi điều khiển có clock là 4 MHz thì tần số của các dịch chuyển giữa các bit là khoảng hơn 660 Hz!

Thân,

chuthong1
28-07-2006, 11:34 AM
Cac anh post tiep di

nam03
29-07-2006, 07:27 PM
cam on su huynh. Bai cua huynh hay lam.

long2007
02-08-2006, 05:20 PM
bài viết thật là hay
mong bạn có điều kiện post nhiều chuyên mục nữa lên để anh em cùng tham khảo

Ngoc Du
03-08-2006, 12:05 AM
Thấy các bác khen bài viết của ntc nhiều nên em down về đọc thử thì thấy trong TUT về hàm delay bác ấy tính toán nhầm loạn cả lên. Các bác mà tính toán theo cách tính của ntc thì chỉ có vỡ thớt. Đề nghị mọi người đọc kỹ lại cái TUT này đi. Em chỉ ví dụ cái công thức số (4) nếu tính đúng phải là: [(N-1)*3+4]*Ti . Cái công thức đầu mà sai thì tất nhiên các công thức phía sau mà dựa vào công thức này cũng sẽ sai. Chỉ là góp ý thôi các bác đừng trách em là soi mói nhé.
Nhưng cũng phải công nhận là những người mới làm quen với vi điều khiển mà có mấy cái TUT của bác ntc thì hữu ích lắm đấy. Bác ntc cố gắng viết nhiều TUT hơn nữa để anh em được nhờ.

spirit
05-08-2006, 10:08 PM
Thì bạn cứ gửi code và sơ đồ nguyên lí mạch lên để cùng thảo luận.

Uh, sắp xong tutorial mới rồi.

Ráng chút xíu đi.

:D
Anh viết rất hay và dễ hiểu cho những người mới học pic như em.
Anh viết xong chưa,em mong bài của anh từ lâu lắm rồi

trantanoai
19-08-2006, 03:39 PM
cảm ơn bạn ntc vì bai của bạn viết dễ hiểu . tôi đang học về pic đây nhờ bạn post tài liệu về các tâp lệnh và ứng dụng lệnh như bài 1 cho mọi người cùng học hỏi với

hicd
19-08-2006, 05:41 PM
chao cac bac
em dang muon tim hieu ve pic nhung khong biet bat dau tu dau
mong cac bac chi giao
em xin cam on

newuser
19-08-2006, 07:09 PM
chao cac bac
em dang muon tim hieu ve pic nhung khong biet bat dau tu dau
mong cac bac chi giao
em xin cam on
sao bạn hicd không nhìn xuống bên dưới một chút nhỉ? cái chủ đề [học PIC như thế nào] đó, đích thân bang chủ hướng dẫn rồi còn gì.
sao các bạn không qua luồng [PIC6F877A nào ta cùng chat] hay luồng [lập nhóm PIC6F877A] mà thảo luận nhỉ? luồng để thảo luận mới có vài trang thôi các bạn à...

leduy173
28-08-2006, 09:56 PM
ah pic 16f877a có giao tiếp I2C ko? em chưa bít j về I2C cả ,có thể mod NTC cho cai tut về vấn đề này hay ko hay cho em link nào đó để hướng dẫn em làm I2C cũng được ko? mong được chỉ giáo thêm nhiều vể I2C!!!

namqn
28-08-2006, 11:02 PM
ah pic 16f877a có giao tiếp I2C ko? em chưa bít j về I2C cả ,có thể mod NTC cho cai tut về vấn đề này hay ko hay cho em link nào đó để hướng dẫn em làm I2C cũng được ko? mong được chỉ giáo thêm nhiều vể I2C!!!
Bạn đọc ở luồng này nhé:
http://www.picvietnam.com/forum/showpost.php?p=4616&postcount=95

Thân,

LEO-XBS
01-09-2006, 11:17 AM
Các bác cho em hỏi tý:em viết 2 chương trình giống nhau đều là xuất dữ liệu ra cổng PORTB, viết bằng MPASM thì chạy được con viết bằng CCS C thi lại chạy không đúng là sao vậy. Em đã dịch ra mã AMS rồi, 2 chương trình đều tương đương nhau

hvqphu
01-09-2006, 11:43 AM
Dung la thu tui dang can, cam on nhieu
Mong cac bac tiep tuc post them nhieu bai nua
Tui con dot lam nen mong duoc cac bac giup do nhieu

linhnc308
02-09-2006, 12:38 AM
Hi All
Về PIC877 và các bài lập trình cho các tính năng ngoại vi của nó tôi có tổng hợp và đưa lên dientuvietnam.net tại :http://dientuvietnam.net/forums/showthread.php?t=1008
- Chương trình viết trên CCS
- Các mạch điện vẽ băng Orcad9.2
Có khá nhiều chương trình hay, nhiều mạch chính là đồ án cho các môn học của tôi, mạch chạy chính xác, code dễ hiểu (CCS mà).
Chúc thành công với PIC.

Dang Khoa
03-09-2006, 10:58 AM
co ban nao viet chuong trinh ve quet LED khong chi giup minh voi?

moihocpic1985
03-09-2006, 12:30 PM
Bài tui viết xong rồi, nhưng dang chờ mấy tiền bối xét duyệt và điều chỉnh. Trong khi chờ đợi, tui sẽ đưa ra cái mục lục của các bài sắp được post lên. Trong quá trình viết bài có thể sẽ có vài điều chỉnh nhỏ, nhưng định hướng các bài viết sẽ là như vậy. Bài nào có điều chỉnh khác với mục lục tui sẽ đề cập cụ thể:

Bài 1 Điều khiển các port I/O
Bài 2 Chương trình delay
Bài 3 Một số ứng dụng xuất/nhập qua các port của vi điều khiển (bài này
khá dài nên có khả năng sẽ được chia ra thành nhiều bài nhỏ).
Bài 4 Điều khiển IC ghi dịch 74HC595
Bài 5 PIC16F877A và LED 7 đoạn (bài này cũng khó khả năng được chia ra)
Bài 6 Ngắt và cấu trúc của một chương trình ngắt dành cho vi điều khiển
PIC16F877A
Bài 7 Các Timer của vi điều khiển PIC16F877A
Bài 8 Timer và hoạt động định thời
Bài 9 Ứng dụng tổng hợp (coi như là một bài tập để ôn lại tất cả các bài
trước, tui cho rằng bài này sẽ khá thú vị, hehe)
Bài 10 Điều khiển LCD

Tạm thời là như vậy cái đã. Các bạn thấy cái mục lục như vậy đã đủ hấp dẫn chưa?? Hay phải thêm bớt cái gì nữa??

minh moi hoc pic, dang tim hieu ve pwm,compare ban co the them module CCP vao khong!

ntc
05-09-2006, 11:47 PM
Hi all!

:D

Mình quay lại diễn đàn với một tutorial mới đây.

Đây là một bài tập ứng dụng để thiết kế một real time clock sử dụng IC thời gian thực DS12c887, bao gồm các hướng dẫn xây dựng các module ứng dụng và hoàn tất ứng dụng.

Trong bài tập này, mình chưa đặt ra yêu cầu hoàn thiện ứng dụng. Công việc này chúng ta sẽ cùng làm, cùng xây dựng. Như vây sẽ tốt hơn.

Mình để trống một số chỗ chưa hoàn thiện, với ý đồ, làm chạy được rồi, nhưng mà thấy hơi ngứa mắt, thì mọi người sẽ tìm cách làm cho nó đỡ ngứa mắt hơn. :D

Những điểm chưa hoàn thiện, và những chỗ cần hoàn thiện cho ứng dụng, mình sẽ chỉ ra sau.

Chúng ta sẽ xây dựng ứng dụng theo cách suy nghĩ "củ chuối" nhất, và dễ hiểu nhất.

Sau khi đã thực hiện thành công, vấn đề hoàn thiện sẽ được đặt ra sau, từ chương trình đến mạch ứng dụng.

Thôi, nói nhiều quá. Nó đây!

Hy vọng có người chịu thực hành, và hi vọng nó giúp ích cho các thành viên của PICVIETNAM.

:D

ntc
05-09-2006, 11:57 PM
Mình gửi thêm sơ đồ nguyên lí mạch và datasheet của ds12887 để mọi người tham khảo thêm.

Chú ý là module ứng dụng cho ds12887 trong tutorial mình viết dựa trên giản đồ xung của chip. Nên nếu vừa đọc tutorial, vừa xem giản đồ xung trong datasheet thì sẽ dễ hiểu hơn.

:D

spirit
07-09-2006, 07:32 PM
Thanks anh NTC rất nhiều,anh viết tut rất hay và dễ hiểu
Hi vọng một ngày nào đó em sẽ đóng góp nhiều cho diễn đàn như anh vì bây giờ kiến thức em còn hạn chế quá

vtt
07-09-2006, 11:22 PM
Chào bác!
Tôi có xem các bài đó nhưng tôi thấy bác không post phần chương trình trên PC lên rất khó theo dõi ( do tôi mới học PIC), bác có thể Post cả phần chương trình trên máy tính được không?
Cảm ơn bác!

vtt
07-09-2006, 11:23 PM
Xin lỗi!
ý tôi đang nói bài của bác linhnc308

vtt
07-09-2006, 11:42 PM
Bác nào chỉ giùm tôi với!
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define RunningLed RD2
int8 ch;

void main(void) {

//Output_high(PIN_D2);
RunningLed = 1;
while(true){
ch = getc();
if (ch == 0) {
putc(ch);
}
else {
ch = ch + 1;
putc(ch);
}
}
}
Trên đây là chương trình tôi viết thử để giao tiếp với PC, nhưng không được.
Có hai điều tôi muốn hỏi các bác!
- Tại sao khi tôi dùng lệnh RunningLed = 1; ở trên thì mạch lại không chạy ( tức là chân RD2 không tích cực mức cao). Còn khi tôi dùng lệnh output_high(PIN_D2) thì lại được.
- Tôi dùng chương trình mô phỏng giao tiếp nối tiếp của CCS và chạy thử chương trình trên thì không được
Bác nào bớt chút thời gian trở lời giúp được không!
Bác nào có thể post cho tôi một chương trình giao tiếp với PC được không, cả trên PC lẫn chương trình của PIC

namqn
07-09-2006, 11:50 PM
Bác nào chỉ giùm tôi với!
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define RunningLed RD2
int8 ch;

void main(void) {

//Output_high(PIN_D2);
RunningLed = 1;
while(true){
ch = getc();
if (ch == 0) {
putc(ch);
}
else {
ch = ch + 1;
putc(ch);
}
}
}
Trên đây là chương trình tôi viết thử để giao tiếp với PC, nhưng không được.
Có hai điều tôi muốn hỏi các bác!
- Tại sao khi tôi dùng lệnh RunningLed = 1; ở trên thì mạch lại không chạy ( tức là chân RD2 không tích cực mức cao). Còn khi tôi dùng lệnh output_high(PIN_D2) thì lại được.
...
Đã dùng được output_high(PIN_D2) thì tại sao còn phải tìm cách khác! Cách dùng này là chuẩn đối với CCS.

Trong tập tin "DEFS_16F877A.h" bạn có định nghĩa RD2 hay không? Nếu có thì định nghĩa như thế nào?

Thân,

vtt
08-09-2006, 10:52 AM
Cảm ơn bác nhiều!
dùng output_high(PIN_X) nhiều khi thấy bất tiện, con thu vien DEFS_16F877A.h là mình load trên diễn đàn này.
Bác cho hỏi luôn tại sao tôi viết như trên dùng Serial Input/output monitor thì không test được?

linhnc308
08-09-2006, 06:01 PM
ch = getc();
if (ch == 0) {
putc(ch);

bạn không mô phỏng được vì nếu bạn nhập thử vào màn hình đen phim 0 thì nó gửi xuống là mã ASCII của số 0 = 0x30h. bạn thử nhập vào mục Hex Send xem.

Một điều nữa là check lại phân setting cổng COM

leduy173
08-09-2006, 06:07 PM
bac NTC cho them tut ve LCD di.thanks bac NTC cai tut ve RTC nha,doc de hieu lam.h dang lam thu voi no

falleaf
09-09-2006, 01:01 PM
Hiện nay F đang giao cho NTC làm về phần truyền thông, vì vậy chắc chưa có thời gian làm tutorial về LCD. Tuy vậy, hiện nay trong luồng Lập nhóm 877 bạn nhh đang viết các tài liệu hướng dẫn mô phỏng và thiết lập LCD cũng như LED 7 đoạn khá hay, bạn có thể theo dõi ở đó.

Chúc vui.

vtt
09-09-2006, 05:18 PM
Cảm ơn linhnc308!
Tôi thực sự thấy mình ngu dốt, tôi có về thử lại nhưng vẫn không được, bực quá tôi viết thử lại môt chương trình test đơn giản khác để thử mà vẫn không được. Tôi gửi một số hex vào thì nhận được mốt số hex khác và toàn là số 0 (0x00h), chân RXT trên Serial Input/output monitor sáng liên tục. Bác có thể chỉ giùm tôi cái lỗi của tôi được không?
Dưới đây là đoạn chương trình mà tôi viết lại.
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define RunningLed RD2
int8 ch;

void main(void) {

Output_high(PIN_D2);
//RunningLed = 1;
while(!true){
ch = getc();
if ((ch >= 0x30)&(ch <= 0x7A)){
putc(ch);
}
}
}
Bác nào đã test giao tiếp PIC với PC rồi xin chỉ giáo để tử ngu dốt này với!

nevergoback1001
10-09-2006, 09:39 AM
Tôi không thấy đoạn code của bác bị gì cả! Copy- past vào CCS C là chạy bình thường trừ 1 lỗi: bỏ dấu "!" trước true trong vòng lặp while, vì not true nghĩa là false mà false thì biết bao giờ nó mới thực thi! (He he he)
Nếu sửa lại mà vẫn ko chạy thì bác xem lại modul giao tiếp với PC ( hổng biết có mắc lộn chân Tx với Rx hay ko?

vtt
10-09-2006, 11:36 PM
Cám ơn bạn
Tôi đã sử lý tạm thời được rồi, nhưng không hiểu tại sao tôi chỉ truyền một ký tự mà nó đáp lại hàng đống ký tự. (khoảng chục ký tự thì nó mới dừng lại).

nevergoback1001
11-09-2006, 01:20 AM
Tối viết tạm 1 chương trình đơn giản mà bạn có thể test được!
Chương trình trên PC viết bằng VB, còn chương trình trên PIC thì bạn có thể lấy ngay đoạn code của bạn đã viết đó ( Tôi đã thử rồi nếu như ko có gì trục trặc thì OK hết, nếu có gì trục trặc thì tôi bó tay. He he!). Bạn nhập số hay kí tự vào ô text2, thì PIC sẽ trả kết quả vào ô text1 sau khi nhấn command1. VD: bạn nhập vào đó chữ 'A' hay số '80' thì sau khi nhấn command1 ô text1 sẽ hiện chữ 'A' hoặc '80'.
Việc nhập số hay kí tự thì bạn tự tìm hiểu thêm về việc truyền thông nối tiếp vậy, vì không phải nhập cái gì cũng được đâu, nó sẽ báo lỗi tè lè đấy, bạn có thể phân tích kĩ đoạn code tôi viết để hiểu thêm ( rất đơn giản!)
Good luck!!

nevergoback1001
11-09-2006, 01:23 AM
Ý quên tôi chưa up code lên sorry nhé!
Giờ mới up nè!

vtt
14-09-2006, 08:47 PM
Cảm ơn Nevergoback1001!
Tôi sẽ về thử, có gì xin sự chỉ giúp của bạn!
Thank!

ngulapphuong
15-09-2006, 12:32 PM
các cao thủ có tài liệu và code, sơ đồ nguyên lý về giao tiếp pic với SPI EPROM cho em share với

briantk_1988
26-09-2006, 06:28 AM
Chào bác ntc,

Sao cháu không thấy bác post phần RS232 cho Pic16f877a? Mặc dù cháu biết viết RS232 bằng CCS C nhưng ASm thi chịu. Mong bác giúp đỡ.

Thnx

B

huunam
27-09-2006, 10:23 PM
trong bai test cho portB cua pic16f877a, em viết code giống hệt nhu bác ntc nhưng vẫn 'build failed' , va báo lỗi sau:

Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F877A "f877atemp.asm" /l"f877atemp.lst" /e"f877atemp.err" /o"f877atemp.o"
Message[302] C:\PROGRAM FILES\MICROCHIP\MPASM SUITE\TEMPLATE\CODE\F877ATEMP.ASM 27 : Register in operand not in bank 0. Ensure that bank bits are correct.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPLink.exe" "C:\Program Files\Microchip\MPASM Suite\LKR\16f877a.lkr" "C:\Program Files\Microchip\MPASM Suite\Template\Code\f877atemp.o" /o"NAM.cof" /M"NAM.map"
MPLINK 4.05, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - section '.org_0' can not fit the absolute section. Section '.org_0' start=0x00000000, length=0x00000012
Errors : 1

BUILD FAILED: Wed Sep 27 21:12:59 2006

em không hiểu lỗi gì , mong cac bác chỉ giúp.
Đây là code của em :


;************************************************* *********************
;
; Filename: testportb.asm
; Date: 25/9/2006
; File Version: 1
;
; Nguoi thuc hien : huunam
;************************************************* *************************** *


list p=16f877A ; khai bao thiet bi
#include <p16f877A.inc> ;file header dinh kem

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC& _WRT_OFF & _LVP_ON & _CPD_OFF

;khai bao configuration bit

;************************************************* *********************
; chuong trinh bat dau tai day
ORG 0x000 ;
GOTO start
start
BCF STATUS,RP1
BSF STATUS,RP0 ;chon bank1

CLRF TRISB ;khoi tao portb la cong xuat du lieu

BCF STATUS,RP1 ; chon bank0
BCF STATUS,RP0
MOVLW b'10001111' ;ghi gia tri can xuat ra portb
MOVWF PORTB ;PORTB<8Fh
loop
GOTO loop ; vong lap vo han

END ;ket thuc chuong trinh

namqn
27-09-2006, 11:40 PM
Ở luồng này có người gặp lỗi hệt như bạn:
http://www.picvietnam.com/forum//showthread.php?t=636

Như tôi đã nói, bạn kiểm tra lại cách dịch chương trình của bạn. Cách tạo project cho các chương trình hợp ngữ trong MPLAB tôi đã post ở đây:
http://picvietnam.com/forum/showthread.php?t=354

Thân,

chuchinh
12-10-2006, 04:13 PM
Em thiết kế một mạch dùng PIC6F877A, hiển thị LCD (song song 8 bit), ADC (cũng song song 8 bit), kết nối PC. Vấn đề là khi kết nối PC: mất 2 chân RC6 và RC7, LCD và ADC mất hai cổng song song 8 bit còn lại là port B và portD, như vậy, em không còn chân nào khác phục vụ ngắt dùng cho bàn phím. Trong khi cũng không muốn giảm số chân kết nối của LCD hay ADC để giải phóng cổng B.
Bác nào có phương án hay giúp hộ em cái, em xin chân thành cảm ơn.
Em xin viết lại yêu cầu:
+ Kết nối PC
+ Hiển thị LCD dùng đường dữ liệu 8 bit
+ Kết nối ADC ngoài dùng bus 8 bit
+ Dùng 4 phím bấm
Giúp em nhé các bác ơi...............................................

hieulongan039
12-10-2006, 07:02 PM
trước tiên xin gửi lời chào đến các cao thủ PIC
mình mới vừa bít trang web này và cũng vừa đăng ký thành viê thôi.
minh chưa bit gì về pic hết mình chỉ biét về At89 thôi.
minh thấy hàng loạt bài viết của bác NTC dăng trên diển dàn nên mạng phép down về và tham khảo.
mình nghe nói PIC có rất nhiều cái hay lắm nên cũng muốn học hỏi để biết thêm. vậy mong các bác giúp đỡ cho mình với nhé
chân thành cảm ơn.
tiện thể cho mình hỏi thăm ở Hà Nội có mở lớp PIC vậy ở thành phố có mở chưa. nếu chưa vậy các cao thủ ở Hà Nội có tài liệu hãy pót lên cho mình tham khảo và còn chĩ bảo thêm cho diển dàn ngày càng lớn mạnh.

namqn
12-10-2006, 08:13 PM
Em thiết kế một mạch dùng PIC6F877A, hiển thị LCD (song song 8 bit), ADC (cũng song song 8 bit), kết nối PC. Vấn đề là khi kết nối PC: mất 2 chân RC6 và RC7, LCD và ADC mất hai cổng song song 8 bit còn lại là port B và portD, như vậy, em không còn chân nào khác phục vụ ngắt dùng cho bàn phím. Trong khi cũng không muốn giảm số chân kết nối của LCD hay ADC để giải phóng cổng B.
Bác nào có phương án hay giúp hộ em cái, em xin chân thành cảm ơn.
Em xin viết lại yêu cầu:
+ Kết nối PC
+ Hiển thị LCD dùng đường dữ liệu 8 bit
+ Kết nối ADC ngoài dùng bus 8 bit
+ Dùng 4 phím bấm
Giúp em nhé các bác ơi...............................................
Tham khảo các app. note sau:

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

Thân,

ppthaidpp
08-11-2006, 10:23 AM
:D

Đồng ý hoàn toàn, các bài viết dẫu sao cũng tốn nhiều công sức của người viết và post lên để hướng dẫn lại cho những người mới dễ dàng hơn trong việc tìm hiểu và tự học.
Cám ơn nhiều.

hanspkt
08-11-2006, 08:32 PM
Xin chào!
Sao không thấy ai bàn về cách viết chương trình xuất ra led 7 đoạn bằng ASM nhỉ?
Em vừa mới tìm được cách chuyển đổi từ mã nhị phân 8bit sang mã bcd để xuất ra led 7 doan, nhưng em không biết cách để chuyển mã nhị phân 16bit sang mã bcd, mong được các bác chỉ giáo.
Đây là cách chuyển mã nhị phân 8bit sang mã bcd
;***********************************************
tram
movwf tam
clrf tg
tram_loop
movlw .100
incf tg,f
subwf tam,f
btfsc STATUS,C
goto tram_loop
decf tg,w
return
;*************************************************
chuc
movwf tam
clrf tg
chuc_loop
movlw .10
incf tg,f
subwf tam,f
btfsc STATUS,C
goto chuc_loop
decf tg,w
goto chuc1

chuc1
movwf tg
movlw .10
chuc1_loop
subwf tg,f
btfsc STATUS,C
goto chuc1_loop
addwf tg,w
return
;*************************************************
DONVID

MOVWF tg
DV
MOVLW .10
SUBWF tg,F
BTFSC STATUS,C
GOTO DV
MOVLW .10
ADDWF tg,W
RETURN
;************************************************* **
các kết quả nằm trong W

cám ơn nhiều!

namqn
08-11-2006, 09:06 PM
Thuật toán trực quan:

Ví dụ với số 8-bit, giá trị tối đa là 255, do đó số BCD có 3 chữ số. Tính từ hàng trăm đến hàng đơn vị, lấy số cần chuyển trừ cho 1 đơn vị của hàng trăm (tức là 100) đến khi có kết quả âm thì không trừ nữa, coi như đã chuyển xong hàng trăm, lấy phần dư thực hiện tiếp cho hàng chục, sau đó đến hàng đơn vị.

Với số 16-bit, giá trị tối đa là 65535, do đó số BCD có 5 chữ số. Cũng có thể làm theo cách tương tự, nhưng vấn đề ở đây là vi xử lý 8 bit không thể trừ hai số 16-bit với nhau một cách trực tiếp. Do đó cần phải có một số chương trình con để thực hiện các phép toán giữa các số 16-bit. Nếu không muốn đau đầu thì người dùng thường chọn ngôn ngữ cấp cao. Nếu vẫn muốn đau đầu thì tìm trên mạng hay tự viết các chương trình con hợp ngữ cho 16-bit.

Thân,

minhtruong
30-11-2006, 07:40 PM
cho em hỏi đã có ai sử dụng pascal để viết chương trình cho pic chưa vậy

namqn
30-11-2006, 07:49 PM
cho em hỏi đã có ai sử dụng pascal để viết chương trình cho pic chưa vậy
Bạn có thắc mắc gì thì cứ hỏi, ít nhất thì tôi cũng đã dùng thử. Kẹt lắm thì đọc sách giùm bạn thôi.

Thân,

Jerry
03-12-2006, 10:06 AM
Xin chào!
Em vừa mới tìm được cách chuyển đổi từ mã nhị phân 8bit sang mã bcd để xuất ra led 7 doan, nhưng em không biết cách để chuyển mã nhị phân 16bit sang mã bcd, mong được các bác chỉ giáo.


; Đổi mã nhị phân 16bit sang 5byte BCD unpacked

;****************************
;Binary 16 bit to BCD unpacked 5 digit
;****************************
; Input : hex number in Hi, Lo (16bit binary)
; Output : TenK:Thou:Hun:Ten:Ones

bin16tobcdup5:
swapf Hi,w
andlw 0x0F
addlw 0xF0
movwf Thou
addwf Thou,f
addlw .226
movwf Hun
addlw .50
movwf Ones

movf Hi,w
andlw 0x0F
addwf Hun,f
addwf Hun,f
addwf Ones,f
addlw .233
movwf Ten
addwf Ten,f
addwf Ten,f

swapf Lo,w
andlw 0x0F
addwf Ten,f
addwf Ones,f

rlf Ten,f
rlf Ones,f
comf Ones,f
rlf Ones,f

movf Lo,w
andlw 0x0F
addwf Ones,f
rlf Thou,f

movlw 0x07
movwf TenK

movlw .10
Lb1:
addwf Ones,f
decf Ten,f
btfss 3,0
goto Lb1

Lb2:
addwf Ten,f
decf Hun,f
btfss 3,0
goto Lb2
Lb3:
addwf Hun,f
decf Thou,f
btfss 3,0
goto Lb3
Lb4:
addwf Thou,f
decf TenK,f
btfss 3,0
goto Lb4
retlw 0

; Phần khai báo đầu chương trình thêm vào khai báo RAM:
CBLOCK 0x20
TenK
Thou
Hun
Ten
Ones
Hi
Lo
ENDC

; gọi thử chương trình đổi mã nhị phân 16bit sang 5 byte bcd unpacked
movlw 0xff
movwf Hi
movlw 0xff
movwf Lo
call bin16tobcdup5


Notes: Nhờ các Mod edit lại phần code sao cho dễ nhìn hộ em, em chẳng biết làm thế nào!!!Thanks

namqn: Chọn phần code cần định dạng, chọn nút có hình dấu '#' trên thanh công cụ (ở trong khung soạn thảo lớn nhé). Cách khác là đặt mã [ code] trước phần code cần định dạng, và mã [ /code] ngay sau phần cần định dạng (nhớ là không có khoảng trắng bên trong các tag [] nhé, tôi phải để khoảng trắng thì các tag mới hiển thị được).

LEO-XBS
24-12-2006, 05:38 PM
Giải đáp thắc mắc của bạn vtt:
bạn gán biến RunningLed = RD2 (#define RunningLed RD2), bạn muốn đưa chân này lên mức cao tức là dùng lệnh RunningLed = 1; tuy nhiên chương trình của bạn ko chạy được, lý do rất đơn giản là bạn chưa thiết lập chế độ I/O cho cổng D. Trước đó bạn phải dùng lệnh set_tris_d(0); để cổng D làm cổng ra rồi mới thực hiện lệnh RunningLed = 1; Còn lệnh output_high(PIN_D2) ; thì nó đã tự thiết lập cho chân RD2 làm chân ra rồi. Bạn thư lại xem sao nhé!

giaosucan
31-12-2006, 10:47 PM
sao không thấy hướng dẫn bằng C các bác nhỉ

phamgiaquang
11-01-2007, 04:21 PM
Mình đã dịch file bật tắt led 1s của NHH bằng MPLABIDEv7.51 nhưng không được. Chương trình báo lỗi:

Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "F:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p18F452 "onoffled1s.asm" /l"onoffled1s.lst" /e"onoffled1s.err"
Warning[215] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 8 : Processor superseded by command line. Verify processor symbol.
Message[301] F:\PROGRAM FILES\MICROCHIP\MPASM SUITE\P16F877A.INC 37 : MESSAGE: (Processor-header file mismatch. Verify selected processor.)
Warning[230] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 10 : __CONFIG has been deprecated for PIC18 devices. Use directive CONFIG.
Error[126] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 10 : Argument out of range (not a valid config register address)
Warning[207] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 12 : Found label after column 1. (COUNT1)
Warning[207] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 13 : Found label after column 1. (COUNT2)
Warning[207] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 14 : Found label after column 1. (COUNT3)
Error[173] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 53 : Source file path exceeds 62 characters (F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM)
Halting build on first failure as requested.
BUILD FAILED: Thu Jan 11 16:17:17 2007

Mình cũng đã dịch file mạch test led 1 của bác F nhưng cũng bị lỗi. Không biết tại sao.

namqn
11-01-2007, 06:36 PM
Mình đã dịch file bật tắt led 1s của NHH bằng MPLABIDEv7.51 nhưng không được. Chương trình báo lỗi:

Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "F:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p18F452 "onoffled1s.asm" /l"onoffled1s.lst" /e"onoffled1s.err"
Warning[215] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 8 : Processor superseded by command line. Verify processor symbol.
Message[301] F:\PROGRAM FILES\MICROCHIP\MPASM SUITE\P16F877A.INC 37 : MESSAGE: (Processor-header file mismatch. Verify selected processor.)
Warning[230] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 10 : __CONFIG has been deprecated for PIC18 devices. Use directive CONFIG.
Error[126] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 10 : Argument out of range (not a valid config register address)
Warning[207] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 12 : Found label after column 1. (COUNT1)
Warning[207] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 13 : Found label after column 1. (COUNT2)
Warning[207] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 14 : Found label after column 1. (COUNT3)
Error[173] F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM 53 : Source file path exceeds 62 characters (F:\DOCUMENTS AND SETTINGS\PHAM GIA QUANG\DESKTOP\ONOFFLED1S.ASM)
Halting build on first failure as requested.
BUILD FAILED: Thu Jan 11 16:17:17 2007

Mình cũng đã dịch file mạch test led 1 của bác F nhưng cũng bị lỗi. Không biết tại sao.
Warning[215], Message[301], và Warning[230] không quan trọng lắm. Tuy nhiên trong MPLAB bạn đang chọn PIC18F452, trong khi tập tin header được gộp vào trong mã nguồn lại là cho PIC16F877A!

Các Warning[207] cho thấy format của tập tin nguồn của bạn không chuẩn. Tất cả các nhãn (label) phải nằm ở cột 1 của các dòng mã nguồn.

Error[173] chính là rắc rối, tên đường dẫn đến tập tin nguồn của bạn quá dài (dài hơn chiều dài tối đa là 62 ký tự). Bạn đặt mã nguồn trong một thư mục nào đó ở gần thư mục gốc, đặt tên thư mục sao cho đường dẫn tương đối ngắn thôi.

Thân,

namqn
30-01-2007, 06:16 PM
Em chưa từng làm việc với bảng quang báo...Bây giờ bạn em rủ làm đề tài cùng nên bọn em đang fải tìm tài liệu(vì bạn ấy cũng chưa biết nhiều)...Có anh nào biết chỉ em với...
Cám ơn nhiều
Có thông tin về bảng cần làm chưa? Số hàng, số cột, đơn sắc hay bao nhiêu màu, các yêu cầu về tính năng: giao tiếp để nhập dữ liệu, điều chỉnh độ sáng hay không, ...

Về nguyên tắc thì có nhiều trang đã đề cập, vào google với từ khóa 'led matrix' thôi. Cách hay nhất theo nhiều người đã từng làm là dùng vi mạch dịch/chốt 74HC595 cùng với các vi mạch source/sink dòng như UDN2981/ULN2803.

Thân,

newuser
01-02-2007, 08:55 PM
Đề tài về quang báo nói chung là không mới và cũng đã có nhiều người làm với 8051 rùi, nhưng với PIC-midrange thì sẽ gặp đôi chút khó khăn với cái vụ bộ đếm PC đấy.Nội giải quyết tốt bài toán công suất cho các Led sáng đều và đủ độ sáng(kể cả mở rộng hàng/cột) cũng đã là tốt rồi.

newuser
03-02-2007, 08:28 PM
tôi có tài liệu này, chẳng nhớ lấy từ đâu nữa, mà cũng chưa đọc thử bao giờ. Bạn xem thử có tham khảo được phần nào không.

hero01
05-02-2007, 02:20 PM
mấy anh ơi ! down tài liệu PIC ở đâu thế.tài liệu tiếng anh cũng được(miễn không phải là tiếng arap). chỉ giùm em với.cám ơn các anh nhiều

ntc
05-02-2007, 05:31 PM
mấy anh ơi ! down tài liệu PIC ở đâu thế.tài liệu tiếng anh cũng được(miễn không phải là tiếng arap). chỉ giùm em với.cám ơn các anh nhiều

Ngay trong luồng này. Hoặc vào phần "Cơ bản về vi điều khiển và PIC", có hai luồng cho cả tài liệu tiếng Việt và tài liệu tiếng Anh, và còn nhiều luồng khác nữa, hoặc search trên google.

Bạn phải chịu khó tìm, đây là kĩ năng rất cần thiết mà bạn cần phải trang bị.

Thân.

1322
09-03-2007, 04:30 PM
Xin giup dum em, lam sao doc va viet tu pic16F877A to MCP2515, can controller, bang SPI.

namqn
09-03-2007, 06:07 PM
Xin giup dum em, lam sao doc va viet tu pic16F877A to MCP2515, can controller, bang SPI.
Bạn đã tìm hiểu gì về SPI chưa? Bạn đã đọc các phần liên quan đến SPI trong datasheet của PIC16F877A và MCP2515 chưa?

Thân,

1322
09-03-2007, 11:56 PM
em da doc roi, nhung bang tieng anh, nen chua hieu duoc nhieu lam, nho ban giup dum

tinhbanso
14-03-2007, 07:38 PM
các bác ơi cho em hỏi các làm mạch nạp cho pic 16f877a thông qua cổng USB làm như thế nào vậy. em đang làm một project về phần này.

anh_gioi
28-04-2007, 11:14 AM
Em chưa từng làm việc với bảng quang báo...Bây giờ bạn em rủ làm đề tài cùng nên bọn em đang fải tìm tài liệu(vì bạn ấy cũng chưa biết nhiều)...Có anh nào biết chỉ em với...
Cám ơn nhiều

chào mọi người. mình muốn tự học quang báo dùng C lập trình cho pic.nhưng ko có tài liệu(hiện tại chua biết gì về quang báo cả)
mong mọi người cho mình tài liệu về vấn đề này được ko?
cám ơn nha

jeanpiere
28-04-2007, 10:18 PM
Nếu có thêm đoạn code viết bằng ngôn ngữ C thì hay hơn

hieulongan039
01-05-2007, 11:08 PM
cho minh hỏi tí, khi mình sử dụng các lệnh CALL hoặc GOTO mà nó vượt quá bank thanh ghi mình đang làm việc thì mình xử lí thế nào. còn nữa cho mình hòi thêm trong thanh ghi status co bit IRP và 2 bit RP1: RP2 để chon bank thank ghi, bit IRP = 1, chọn bank 2,3; =0 chọn bank 0,1, vậy nếu mình chi sử dụng IRP ko để chọn 1 lượt 2 bank thì co phải tiện hơn ko, lúc đó đỡ mất công chọn mỗi lần 1 bank khi sử dụng RP1, RP0 (ko bit đúng ko?). Mình đã đọc ở diển đàn rùi về call và goto và đọc trong datasheet nữa nhung chưa hiểu mình nhờ các cao thủ PIC chỉ giúp.
thanks

tranvanthuong
07-05-2007, 06:31 PM
minh cho tài lệu bạn nhé, làm quang báo ko dể đâu- nặng óc lắm nếu bạn thích thì theo ý kiến tui như sau: định hướng trước mình cần thiết kế bằng nhửng IC gi: pic, quét cột-74193, truyền dữ liệu vào cột 74hc595, phải biết vẽ orcad hoặc protuer. còn tài liệu ccs c thì tui sẻ cho link nè: đợi tý nhé

tranvanthuong
07-05-2007, 06:34 PM
http://www.tailieuvietnam.net/download/PICSoft/CCSC_3.249.rar

tranvanthuong
07-05-2007, 06:36 PM
và còn nhiều tài liệu nữa nếu anh em cần thì cứ đặt câu hỏi lên diễn đàn nhé mình sẽ cố gắng giúp cho!

tranvanthuong
07-05-2007, 06:42 PM
a! wên nữa chào anh_gioi anh vào các đề tài học tập dùng pic mà tìm chương trình C, hoặc trong luồng lập trình nhóm 16f877a cũng rất nhiều và anh nên bắt đầu từ đó em có 1 bài gởi cho anh ne!

dvnccbmacbt
30-05-2007, 09:19 PM
Chào mọi người! Em mới học về pic một ít thôi. Trước đây có học về 8051. Cho em hỏi một tí. Các nguyên tắc hoạt động của bộ định thời, các ngắt của PIC có giống với 8051 không? Ý em muốn hỏi về nguyên tắc hoạt động thôi. Mong các bác giúp đỡ! Em cảm ơn nhiều.

namqn
30-05-2007, 11:38 PM
Chào mọi người! Em mới học về pic một ít thôi. Trước đây có học về 8051. Cho em hỏi một tí. Các nguyên tắc hoạt động của bộ định thời, các ngắt của PIC có giống với 8051 không? Ý em muốn hỏi về nguyên tắc hoạt động thôi. Mong các bác giúp đỡ! Em cảm ơn nhiều.
Về nguyên tắc thì PIC và 8051 đều là các vi điều khiển, do đó các khối chức năng (module) sẽ có nguyên tắc hoạt động giống nhau. Chẳng hạn, bộ định thời sẽ đếm xung với tần số đã biết, do đó sẽ tạo được khoảng thời gian cần thiết. Tuy nhiên, bộ định thời trong PIC có thể sử dụng khá nhiều nguồn xung khác nhau, do đó linh hoạt hơn so với 8051. Đa số module ngoại vi của PIC là tiện lợi hơn hay là không hề có trong 8051.

Thân,

dvnccbmacbt
31-05-2007, 09:41 AM
và còn nhiều tài liệu nữa nếu anh em cần thì cứ đặt câu hỏi lên diễn đàn nhé mình sẽ cố gắng giúp cho!
Anh cho em hỏi có tài liệu nào về Các IC giải mã địa chỉ hàng và cột kô? Em chưa hiểu rõ chỗ này lắm. Cảm ơn anh nhiều.

dvnccbmacbt
31-05-2007, 03:14 PM
Các bác cho em hỏi thêm câu nữa! Ví dụ như ở 8051 ta có timer hoạt động như sau: đầu tiên chọn chế độ hoạt động cho timer ( vi dụ như chế độ tự động nạp lại), sau đó nạp giá trị bắt đầu đếm, rồi cho phép timer. Thế còn ở Pic chúng ta có làm tương tự như vậy không? tức là cũng sử dụng các cờ và các bit để điều khiển và chọn chế độ cho timer tương tự như 8051 hay không? Em muốn tìm một sự tương tự giữa Pic và 8051 để có thể hiểu PIc nhanh hơn. Cảm ơn các bác nhiều!

namqn
01-06-2007, 12:14 AM
Các bác cho em hỏi thêm câu nữa! Ví dụ như ở 8051 ta có timer hoạt động như sau: đầu tiên chọn chế độ hoạt động cho timer ( vi dụ như chế độ tự động nạp lại), sau đó nạp giá trị bắt đầu đếm, rồi cho phép timer. Thế còn ở Pic chúng ta có làm tương tự như vậy không? tức là cũng sử dụng các cờ và các bit để điều khiển và chọn chế độ cho timer tương tự như 8051 hay không? Em muốn tìm một sự tương tự giữa Pic và 8051 để có thể hiểu PIc nhanh hơn. Cảm ơn các bác nhiều!
Về nguyên tắc thì các vi điều khiển hoạt động giống nhau, nhưng về mạch hiện thực thì có nhiều công nghệ khác nhau. Nếu bạn học AVR rồi và muốn tìm sự tương đồng giữa AVR và PIC để học nhanh hơn thì tôi cho là hợp lý, vì chúng cùng sử dụng kiến trúc RISC. Nhưng nếu bạn học 8051 rồi và định tìm sự tương đồng giữa 8051 và PIC (dưới cái nhìn của một người thiết kế) thì tôi cho là không có nhiều lợi ích cho bạn, vì 8051 dùng kiến trúc CICS.

Thân,

rosanhdieu
01-06-2007, 07:01 PM
Các sư huynh ntc,nnh pót bai` hay wa',sao ko tiep tuc viet cac chu~ de` con lai di,minh rta mong cho`.Khi doc bai cac anh viet,em hoc rat de~ hieu~,mong cac anh giup do~

rosanhdieu
03-06-2007, 12:03 AM
Em Ko Biet Ve Cach Dat Bien Nhu :cuont1 Equ 0x20??
Ox20 La Gi`,tai Sao Ta Phai Dat No' Nhu Vay.
Em Thay Moi~ Pic Thi Cach Dat Baien Do Cung Khac Nhau,cac Bac Tra~ Loi` Giu`m Em Nhe

namqn
03-06-2007, 01:55 AM
Em Ko Biet Ve Cach Dat Bien Nhu :cuont1 Equ 0x20??
Ox20 La Gi`,tai Sao Ta Phai Dat No' Nhu Vay.
Em Thay Moi~ Pic Thi Cach Dat Baien Do Cung Khac Nhau,cac Bac Tra~ Loi` Giu`m Em Nhe
Khai báo 'count1 equ 0x20' cho trình dịch biết count1 có giá trị là 0x20. Đây là địa chỉ được dùng trong chương trình để truy xuất biến, là một ô nhớ nằm ở địa chỉ 0x20 (trong RAM của PIC).

Đây chỉ là một trong nhiều ứng dụng của directive equ, vốn dùng để làm cho symbol bên trái nó mang giá trị nằm bên phải nó.

Bạn có thể dùng thẳng địa chỉ 0x20 trong chương trình, nhưng nếu chương trình của bạn có nhiều biến và sau thời gian vài tuần, khi đọc lại chương trình bạn có khả năng không hiểu được ô nhớ đó mang ý nghĩa gì.

Thân,

cachua
03-06-2007, 03:16 PM
bác Chính oi còn bài nào bac post nên cho anh em học với các bài của bác hay lắm em chờ mãi mà khong thấy bài mới có bài nào vể ngắt không em đang muốn học về nó cám ơn bác nhé

rosanhdieu
03-06-2007, 06:46 PM
Cảm ơn bác namqn nhiều.Bây giờ em đã hiểu em cần đọc lại phần cứng PIC rồi.Mong các bác sau này pót càng nhiều bài nha.
Ah.em đang cần tài liệu về cách hiển thị giờ.Ví dụ như:đèn giao thong,em đã biết cách delay nhưng ko biết cách nào để hiển thị trên bảng hiện thị.Mong các bác giúp đỡ

david
27-07-2007, 09:42 PM
Bác nào chỉ cho em cách download mấy cái Application Notes trên Microchip.com cái.Em đang học về Pic6f877a,nếu bác nào down rồi thì post đây cho em xin với.Xin cảm ơn!

namqn
27-07-2007, 11:27 PM
Bác nào chỉ cho em cách download mấy cái Application Notes trên Microchip.com cái.Em đang học về Pic6f877a,nếu bác nào down rồi thì post đây cho em xin với.Xin cảm ơn!
Tôi không hiểu lắm câu hỏi của bạn, các application note của Microchip có một link nằm ngay trang chính của Microchip (www.microchip.com). Bạn có thể dùng chức năng tìm kiếm, hay có thể duyệt toàn bộ danh sách như link dưới đây:

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2048

Thân,

david
28-07-2007, 12:39 AM
Bây giờ thì em down được rồi a.

david
04-08-2007, 10:50 PM
em chỉ viết một chương trình đơn giản là cho môt led sáng chạy từ portc sang portd thôi,nhưng mà mô phỏng bằng Proteus thì led chỉ chạy ở portc thôi,còn portd thì sáng loạn lên,bác nào chỉ hộ cho em với!
Hic! chỉ một cái đơn giản mà viết không xong!
;================================================= =======
TITLE "Ledchay"
PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF & _LVP_OFF

;================================================= =========
;Khai bao bien :
count1 equ 0x20
counta equ 0x21
countb equ 0x22
DEM EQU 0x23


;================================================= ===========
;Chuong trinh chinh:
;================================================= ===========
ORG 0x0000
GOTO MAIN
ORG 0x0005
MAIN
BANKSEL TRISC
CLRF TRISC
CLRF TRISD
BANKSEL PORTC
CLRF DEM
LOOP
MOVLW B'1000000'
MOVWF PORTC
CALL delay_200ms
RLF PORTC,1
CALL delay_200ms
INCF DEM,1
MOVLW DEM
XORLW D'7'
BTFSS STATUS,Z
GOTO $-6
CLRF DEM
CLRF PORTC
MOVLW B'1000000'
MOVWF PORTD
CALL delay_200ms
RLF PORTD,1
CALL delay_200ms
INCF DEM,1
MOVLW DEM
XORLW D'7'
BTFSS STATUS,Z
GOTO $-6
CLRF DEM
GOTO LOOP
;================================================= ===============
;Chuong trinh con
;================================================= ===============
;Delay 200ms
;-----------------------------------------------------------------
delay_200ms ; label bat dau chuong trinh con
MOVLW d'200' ; doan code cho chuong trinh con delay 100 ms
MOVWF count1
d1
MOVLW d'199'
MOVWF counta
MOVLW d'1'
MOVWF countb
delay_0
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_0
DECFSZ count1,1
GOTO d1
RETURN ;ket thuc chuong trinh con, tro ve chuong trinh chinh
END

Mà dạo này không ai hoc Pic6f877a nữa à?Để mình em solo vậy

namqn
04-08-2007, 11:43 PM
Nếu bạn mô phỏng bằng MPLAB SIM thì có chạy đúng không?

Bạn nên thao tác trên ô nhớ và xuất kết quả ra port I/O (để tránh các hiệu ứng của hoạt động read-modify-write). Lấy ví dụ phần code của bạn, có thể dùng thêm 1 biến để chứa giá trị hiện thời của thanh ghi port, thực hiện lệnh xoay dữ liệu trên biến đó và xuất giá trị mới ra thanh ghi port.

Thân,

david
05-08-2007, 12:17 AM
Không cần đâu bác Nam ah,em làm cách này với 1 Port chạy vẫn đúng.Nhưng mà thôi,em ngán thằng Proteus lắm rồi,lần này quyết làm xong cái mạch nạp rồi viết gì thì viết
Cảm ơn bác đã quan tâm.Mà sao dạo này chỉ thầy mình bác reply vậy?Picvietnam nhiều cao thủ lắm mà.

Jerry
25-08-2007, 10:03 AM
cho minh hỏi tí, khi mình sử dụng các lệnh CALL hoặc GOTO mà nó vượt quá bank thanh ghi mình đang làm việc thì mình xử lí thế nào. còn nữa cho mình hòi thêm trong thanh ghi status co bit IRP và 2 bit RP1: RP2 để chon bank thank ghi, bit IRP = 1, chọn bank 2,3; =0 chọn bank 0,1, vậy nếu mình chi sử dụng IRP ko để chọn 1 lượt 2 bank thì co phải tiện hơn ko, lúc đó đỡ mất công chọn mỗi lần 1 bank khi sử dụng RP1, RP0 (ko bit đúng ko?). Mình đã đọc ở diển đàn rùi về call và goto và đọc trong datasheet nữa nhung chưa hiểu mình nhờ các cao thủ PIC chỉ giúp.
thanks

Bạn phải hỏi là "Khi sử dụng các lệnh CALL và GOTO mà nó vượt quá page mà mình đang làm việc thì phải xử lý thế nào" mới đúng.

Mình trả lời luôn: Bạn dùng lệnh LCALL và LGOTO. Tuy nhiên sau khi gọi như vậy, đến khi return thì nó sẽ quay về không đúng vị trí đã gọi nó. Vì vậy sẽ phải làm như sau:

[code
lcall {Label1} ; gọi đến nhãn Label 1 đặt ở page khác (page nào cũng được)
pagesel $ ; trở về đúng page đang làm việc

lgoto {label2} ; vì là goto nên không cần pagesel nữa

Jerry
25-08-2007, 10:03 AM
cho minh hỏi tí, khi mình sử dụng các lệnh CALL hoặc GOTO mà nó vượt quá bank thanh ghi mình đang làm việc thì mình xử lí thế nào. còn nữa cho mình hòi thêm trong thanh ghi status co bit IRP và 2 bit RP1: RP2 để chon bank thank ghi, bit IRP = 1, chọn bank 2,3; =0 chọn bank 0,1, vậy nếu mình chi sử dụng IRP ko để chọn 1 lượt 2 bank thì co phải tiện hơn ko, lúc đó đỡ mất công chọn mỗi lần 1 bank khi sử dụng RP1, RP0 (ko bit đúng ko?). Mình đã đọc ở diển đàn rùi về call và goto và đọc trong datasheet nữa nhung chưa hiểu mình nhờ các cao thủ PIC chỉ giúp.
thanks

Bạn phải hỏi là "Khi sử dụng các lệnh CALL và GOTO mà nó vượt quá page mà mình đang làm việc thì phải xử lý thế nào" mới đúng.

Mình trả lời luôn: Bạn dùng lệnh LCALL và LGOTO. Tuy nhiên sau khi gọi như vậy, đến khi return thì nó sẽ quay về không đúng vị trí đã gọi nó. Vì vậy sẽ phải làm như sau:


lcall {Label1} ; gọi đến nhãn Label 1 đặt ở page khác (page nào cũng được)
pagesel $ ; trở về đúng page đang làm việc

lgoto {label2} ; vì là goto nên không cần pagesel nữa


Ý thứ 2 bạn hỏi về bit IRP, mình xin trả lời: bit IRP sử dụng để chọn bank 0,1 hoặc bank 2,3. Tuy nhiên chỉ khi sử dụng nó trong chế độ địa chỉ gián tiếp (thao tác với thanh ghi FSR và INDF) thì mới truy xuất được hết các byte RAM trong cả 2 bank. Còn nếu sử dụng chế độ địa chỉ trực tiếp thì vẫn phải dùng 2 bit RP0,, RP1 để truy xuất các byte RAM trong từng bank.

vinhteo
02-09-2007, 09:14 PM
cam on bac NTC vi su phat trien dien tu cua nuoc nha

nguyenvo
26-09-2007, 09:51 PM
chao cac ban!
cho minh xin hoi minh dung pic16f877a nay de lam mot vi mach tuong tu nhu pld(programnable logic devices) duoc khong co ban nao dang nghien cuu ve nay cho minh xin chi giao.thank

wicamb
03-10-2007, 07:07 PM
chào mọi người ,có ai thấy bài viết hay có bài viết nào về PIC để điều chế độ rộng xung trong luồng này không nhỉ ?chỉ cho tớ với. Sao lâu rùi không thấy bác Chính post bài mới gì cả?

vandungevn
04-10-2007, 12:40 PM
Xin hỏi ai có tài liệu MPLAB mcc18 send cho tui với, thank you. Đang cần, học chay hơi khó.... hiccccc

namqn
04-10-2007, 05:32 PM
Xin hỏi ai có tài liệu MPLAB mcc18 send cho tui với, thank you. Đang cần, học chay hơi khó.... hiccccc
Các tài liệu của MCC18 nằm trong thư mục con 'docs' của thư mục cài đặt MCC18.

Thân,

vandungevn
05-10-2007, 08:55 AM
Ngoài tài liệu đó bác còn có tài liệu khác nữa không vậy, bằng Tiếng Việt càng tốt, có cả các ví dụ minh họa nữa, càng nhiều càng tốt, thanks you bác.

namqn
05-10-2007, 04:55 PM
Ngoài tài liệu đó bác còn có tài liệu khác nữa không vậy, bằng Tiếng Việt càng tốt, có cả các ví dụ minh họa nữa, càng nhiều càng tốt, thanks you bác.
Tôi chỉ dùng các tài liệu đó, và tham khảo từ diễn đàn của Microchip, từ piclist, hoặc từ mạng nói chung. Tôi không biết có tài liệu tiếng Việt nào cho C18.

Thân,

uydanh
12-10-2007, 01:06 AM
Em mới học về pic, đang cần lĩnh hội nhanh để thực hiện đồ án điều khiển động cơ nên nhờ các anh trên diễn đàn hổ trợ.
Cho em hỏi, trong bộ timer của PIC, em thấy có bộ tiền định prescaler và bộ hậu định postscaler, em không hiểu nó là gì và chức năng là gì. Mong các anh chỉ dẫn.
Gửi anh nct : các tutorial mà anh post lên rất hay và dễ hiểu. Rất mong anh viết tiếp phần Timer và PWM .Xin cảm ơn anh.
Mọi người trên diễn đàn ,ai có tài liệu hay về Timer và PWM của 16F877A cho mình xin được không?

vandungevn
12-10-2007, 05:34 PM
Bác có thể nói rõ một số điạ chỉ cụ thể về ví dụ MCC18, để em download về học = English cũng được> cảm ơn bác namqn nhiều.

vandungevn
12-10-2007, 06:02 PM
Vào đây xem Prescale và Postscale nhé http://www.picvietnam.com/forum/showthread.php?t=357&page=23

namqn
12-10-2007, 06:18 PM
Bác có thể nói rõ một số điạ chỉ cụ thể về ví dụ MCC18, để em download về học = English cũng được> cảm ơn bác namqn nhiều.
Các tài liệu tôi đã nói ở trên. Forum cho C18 của Microchip ở link sau:

http://forum.microchip.com/tt.aspx?forumid=3

Thư mục con 'examples' của thư mục cài đặt C18 có một số ví dụ cơ bản. Thư mục con 'src' của thư mục cài đặt C18 có các tập tin nguồn cho tất cả các hàm thư viện của C18 (nếu bạn tìm không có thì có lẽ lúc cài đặt C18 bạn đã không chọn cài đặt bộ source này), từ chúng bạn có thể học được cách sử dụng các module ngoại vi (tôi học theo cách này).

Link sau dẫn đến thư viện các hàm C của piclist (source code viết cho HT-PIC hay PICC-Lite, nhưng có thể được thay đổi để biên dịch với C18):

http://www.piclist.com/techref/microchip/language/c/index.htm

Google với các từ khóa 'C18' và 'examples' cho thấy có vài liên kết đến các trang có các source code dành cho C18.

Thân,

KA52
19-10-2007, 04:36 PM
a nam cho e hoi sao khi biên dịch cho 16F887 nó lại báo lổi "argument out of memory" chổ dòng __config của em:
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_XT_OSC &_BODEN_OFF

RE: a sửa lại giùm em

namqn
19-10-2007, 08:25 PM
a nam cho e hoi sao khi biên dịch cho 16F887 nó lại báo lổi "argument out of memory" chổ dòng __config của em:
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_XT_OSC &_BODEN_OFF

RE: a sửa lại giùm em
PIC16F887 có 2 từ cấu hình, do đó directive trên phải sửa lại tương tự như sau:
__CONFIG _CONFIG1, _FCMEN_OFF & _XT_OSC & _CP_OFF & _WDT_OFF & _BOR_ON & _PWRTE_ON & _LVP_OFF & _DEBUG_OFF

Bạn cũng nên thiết lập từ cấu hình thứ hai, theo mẫu:
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V

Thân,

nttnew
30-10-2007, 01:11 PM
Tôi đã down cái tutorial của NTC và thấy khó hiểu ở đoạn delay sau:
movlw 20
movwf delay-reg
loop decfsz delay-reg,1
goto loop
...
Tại sao tổng số chu kỳ lệnh để thực hiện đoạn delay trên là: (20+1)3ti?
theo tôi tính thì chỉ có [(20-1)3+2+2 ]ti.
Tác giả còn nói là nếu nạp vào reg_delay già trị là N thì Tdelay=(N+1)3ti?
Tôi mới học pic nên còn non lắm.Mong các bác giúp thêm
thanks!

tiendungkct
07-11-2007, 09:00 PM
em đang học pic hỗ trợ USB ,ai có thể khuyên em nên học con nào khộng ạ
cho em biết thông tin về mạch mạp luôn càng tốt
thanks

hmo
08-11-2007, 09:05 AM
Tui là lính mới, vừa down tất cả các bài Tut của bác NTC, thank bác nhiều nhé ....

anchovy
21-11-2007, 08:41 PM
;***********************************************
tram
movwf tam
clrf tg
tram_loop
movlw .100
incf tg,f
subwf tam,f
btfsc STATUS,C
goto tram_loop
decf tg,w
return
;*************************************************
chuc
movwf tam
clrf tg
chuc_loop
movlw .10
incf tg,f
subwf tam,f
btfsc STATUS,C
goto chuc_loop
decf tg,w
goto chuc1

chuc1
movwf tg
movlw .10
chuc1_loop
subwf tg,f
btfsc STATUS,C
goto chuc1_loop
addwf tg,w
return
;*************************************************
DONVID

MOVWF tg
DV
MOVLW .10
SUBWF tg,F
BTFSC STATUS,C
GOTO DV
MOVLW .10
ADDWF tg,W
RETURN
;************************************************* **
các kết quả nằm trong W
Mình mới hoc pic và đang làm đề tài đo nhiệt độ và đang bí chổ chuyển mã nhị phân 16bit sang mã bcd em có tham khảo cách chuyển đổi của bạn hanspkt nhưng không hiểu lệnh movlw .100 mong bạn giải thích giúp
Cảm ơn.

Jerry
22-11-2007, 12:45 PM
movlw .100 = nạp giá trị 100 decimal vào thanh ghi w

mrknow
03-12-2007, 10:06 AM
Bài tui viết xong rồi, nhưng dang chờ mấy tiền bối xét duyệt và điều chỉnh. Trong khi chờ đợi, tui sẽ đưa ra cái mục lục của các bài sắp được post lên. Trong quá trình viết bài có thể sẽ có vài điều chỉnh nhỏ, nhưng định hướng các bài viết sẽ là như vậy. Bài nào có điều chỉnh khác với mục lục tui sẽ đề cập cụ thể:

Bài 1 Điều khiển các port I/O
Bài 2 Chương trình delay
Bài 3 Một số ứng dụng xuất/nhập qua các port của vi điều khiển (bài này
khá dài nên có khả năng sẽ được chia ra thành nhiều bài nhỏ).
Bài 4 Điều khiển IC ghi dịch 74HC595
Bài 5 PIC16F877A và LED 7 đoạn (bài này cũng khó khả năng được chia ra)
Bài 6 Ngắt và cấu trúc của một chương trình ngắt dành cho vi điều khiển
PIC16F877A
Bài 7 Các Timer của vi điều khiển PIC16F877A
Bài 8 Timer và hoạt động định thời








Bài 9 Ứng dụng tổng hợp (coi như là một bài tập để ôn lại tất cả các bài
trước, tui cho rằng bài này sẽ khá thú vị, hehe)
Bài 10 Điều khiển LCD

Tạm thời là như vậy cái đã. Các bạn thấy cái mục lục như vậy đã đủ hấp dẫn chưa?? Hay phải thêm bớt cái gì nữa??

Chào bạn!
Tôi cũng đang rất quan tâm về Pic bạn có thể gởi cho mình xin tài liệu này được ko? Cảm ơn nhiều!
mail. buithanhluan@gmail.com

byte
04-12-2007, 10:28 AM
anh ơi bài 4 đâu anh. E cũng đã mất bao nhiêu ngày với cái con 595 rồi. Cuối cùng vẫn chẳng biết sử dụng nó. Anh post lên cho anh em nhé. Thanhks

ntc
04-12-2007, 11:18 AM
http://www.picvietnam.com/forum//showthread.php?t=238&page=10

Bài số #146

Mình hướng dẫn làm cái digital clock củ chuối, kaka.

Chúc vui.

background
29-02-2008, 09:54 PM
Thanks! nhiều nha, tui đang rất cần ^^!

tinhgiac_vp
01-03-2008, 10:26 AM
các tiền bối chỉ dùm với. Làm sao để cho MPLAB chạy từng lệnh và kết quả của lệnh đó. Em mò mãi mà không được.

nhong
06-03-2008, 01:16 AM
Em làm bài tập pic đầu tiên với 16F877A bật tắt đèn led.

đầu tiên em cho nháy 1s một thì thấy nó nháy loạn cả lên rồi kết thúc bằng sáng trơ ra hoặc tắt ngóm(sau khoảng 4-5s) mà có lúc cả chân RB6 chân nó cũng sáng nữa(em chỉ cho nó nháy chân RB7 thôi) là sao?

sau đó em sửa cho nháy 2s một, nhưng khi nạp vào con pic rồi chạy thì thấy thằng led nó cứ sáng trơ ra chứ chẳng bật tắt gì cả là sao các bác.

với cả khi nạp cho pic mà cắm nhầm chiều vào mạch nạp thì có nguy hiểm không, rồi em cho verify trong winpic800 thì luôn bị lỗi(lúc program xong verify thì không sao cả), lại phải erase đi rồi program lại , như thế có hại ko. lỗi thế này
Error: verifying address0x000000 verified:0x3FFF Read:0x3000

cuối cùng: khi nạp mới 1 con thì phải erase hết đi rồi mới program lại hả các bác

em xin cám ơn.

code viết trong ccs như này(code trong luồng ccs for pic thôi, chỉ thay nháy 1s một thành nháy 2s một và chỉnh clock từ 10 thành 4mhz thôi)

#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
main()
{
while(true)
{
output_high(PIN_B7);
delay_ms(2000);
output_low(PIN_B7);
delay_ms(2000);
}
}

PS/ nút reset làm việc tốt ạ :D vì khi ấn reset thì nó trở về trạng thái đầu, tất nhiên là vẫn lỗi như trên^^

namqn
06-03-2008, 05:11 AM
các tiền bối chỉ dùm với. Làm sao để cho MPLAB chạy từng lệnh và kết quả của lệnh đó. Em mò mãi mà không được.
Sau khi đã biên dịch thành công project, bạn vào mênu Debugger, chọn Select Tool, rồi chọn MPLAB SIM. Khi đó, phía bên phải của thanh công cụ của MPLAB IDE sẽ có các nút cho phép bạn thực hiện việc mô phỏng. Nếu bạn đã từng dùng chức năng debug trong một phần mềm mô phỏng nào đó thì có lẽ sẽ nhận ra ngay tác dụng của từng nút. Khi chạy từng lệnh (stepping) bạn có thể đi vào chương trình (Step Into), hay chỉ chạy chương trình con như 1 lệnh (Step Over).

Để xem kết quả của các lệnh đã chạy, bạn có thể đến mênu View, chọn lệnh Watch. Cửa sổ Watch với nhiều frame khác nhau cho phép bạn xem các thanh ghi SFR hay các symbol đã được định nghĩa trong chương trình đang được debug. Bạn chỉ cần chọn SFR hay symbol trong danh sách thả xuống và nhấn vào nút tương ứng (Add SFR hay Add Symbol).

Thân,

dinhthem
11-05-2008, 07:03 PM
mong các bác chỉ bảo thêm nhe, mới đọc tiêu đề đã thấy hay rồi, cái mình cần học đây rùi, cám ơn bác nhe, trong quá trình học hỏi có điều chi thắc mắc mong các bác trả lời giúp, em có hỏi những câu ngớ ngẩn cũng đừng chê nhe, beginner mà. Thanks.
em đọc hết chương 3, đọc cũng hiểu và có thể viết cho nó chạy đc, mà vẫn chưa biết nãy giờ các anh viết bằng cái gì? ( ngôn ngữ gì, chương trình gì?) cho em xin luôn đc không?

chutieu_719
11-05-2008, 08:20 PM
em cung dang tim hieu ve pic16f877.em rat can nhieu tai lieu ve pic hon xin mong cac tien boi giup gui cho it de hoc hoi vi moi hoc ma.cam on

dinhthem
11-05-2008, 09:22 PM
các tiền bối gửi nhiều bài tiếng việt dễ hiểu lắm mà, còn bạn thích tài liệu tiếng anh thì liên lạc với mình.

dinhthem
11-05-2008, 09:29 PM
ủa, các bác up bài hướng dẫn viết bằng C đâu? sao em hok thấy vậy?

dinhthem
11-05-2008, 09:34 PM
à, em biết rồi.
thì ra nãy giờ các bác viết bằng MPLAB. cho em xin phần mềm này đc ko?

dinhthem
11-05-2008, 09:39 PM
các bác cho em hỏi
BANK dùng để làm gì?
tại sao mới vào ta lại chọn BANK 1
sau khi cho PORTB là cổng xuất lại chọn BANK 0
????

dinhthem
11-05-2008, 11:15 PM
các anh ơi, sao ko post bài nữa vậy?
em đang cần hiển thị LCD, các anh giúp nhe.
Thanks

namqn
12-05-2008, 12:47 AM
các bác cho em hỏi
BANK dùng để làm gì?
tại sao mới vào ta lại chọn BANK 1
sau khi cho PORTB là cổng xuất lại chọn BANK 0
????
Vì các PIC được chế tạo như vậy, nên chúng ta phải chọn bank của một thanh ghi để có thể truy xuất thanh ghi đó. Bạn cứ chấp nhận như vậy đi, sau này nắm rõ hơn về kỹ thuật số và vi điều khiển thì sẽ tìm hiểu thêm. Thông tin về bản đồ bộ nhớ của PIC nằm trong datasheet của PIC.

Thân,

namqn
12-05-2008, 12:49 AM
các anh ơi, sao ko post bài nữa vậy?
em đang cần hiển thị LCD, các anh giúp nhe.
Thanks
Vấn đề này đã được đề cập nhiều lần ở picvietnam, bạn thử link sau nhé:
http://www.google.com/search?hl=en&q=LCD+site%3Awww.picvietnam.com&btnG=Google+Search

Thân,

dinhthem
12-05-2008, 06:57 AM
Vì các PIC được chế tạo như vậy, nên chúng ta phải chọn bank của một thanh ghi để có thể truy xuất thanh ghi đó. Bạn cứ chấp nhận như vậy đi, sau này nắm rõ hơn về kỹ thuật số và vi điều khiển thì sẽ tìm hiểu thêm. Thông tin về bản đồ bộ nhớ của PIC nằm trong datasheet của PIC.

Thân,

cám ơn anh.
có phải viết bằng mikroC thì ko cần khai báo BANK?

namqn
12-05-2008, 07:57 AM
cám ơn anh.
có phải viết bằng mikroC thì ko cần khai báo BANK?
Thông thường, các trình biên dịch ngôn ngữ cấp cao sẽ tự động chuyển bank khi cần thiết cho bạn. Cũng có trình biên dịch cho phép bật/tắt việc tự động chuyển bank này, và khi đó người lập trình sẽ chịu trách nhiệm chuyển bank khi cần thiết (như ý họ muốn khi chọn tắt tính năng tự động chuyển bank của trình biên dịch).

Thân,

doremino
12-05-2008, 02:08 PM
BẬT TẮT LED 1s


;========================================
;Auhor: NHH
;Date: 10/02/06
;Hardware: PIC16F877A
;XTAL 10MHz, PORTB noi voi 8 LED qua 8 dien tro 220Ohm
;========================================
TITLE "ON-OFF LED 1 SECOND"
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF
;================================================= ============================
COUNT1 EQU 0x20
COUNT2 EQU 0x21
COUNT3 EQU 0x22
;=========================CHUONG TRINH CHINH=========================
ORG 0x000
GOTO MAIN

MAIN
BCF STATUS,RP1
BSF STATUS,RP0 ; select BANK 1
CLRF TRISB ; PORTB output
BCF STATUS,RP0 ; select BANK 0

MOVLW d'255'
MOVWF COUNT1 ;<-COUNT1=255
MOVWF COUNT2 ;<-COUNT2=255
NEXT
MOVLW d'14'
MOVWF COUNT3 ;<-COUNT3=13
MOVLW b'11111111' ;LED ON
MOVWF PORTB
CALL LOOP

MOVLW d'14'
MOVWF COUNT3 ;<-COUNT3=13
MOVLW b'00000000' ;LED OFF
MOVWF PORTB
CALL LOOP

GOTO NEXT
;========================CHUONG TRINH CON====================
LOOP
DECFSZ COUNT1,1
GOTO LOOP
DECFSZ COUNT2,1
GOTO LOOP
DECFSZ COUNT3,1
GOTO LOOP
RETURN

END

cho em hỏi đoạn _CONFIGURATION_... có tác dụng gì vậy!!!
không có thì có vấn đề gì không ạ?????Tại sao đoạn code trên không thấy khai báo tần số của thạch anh?có phải người viết quên không anh?
"CLOCK(10000000)"
Cảm ơn các bác nhiều!!!