PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Pic16f877a TỪ DỄ TỚi KhÓ (http://www.picvietnam.com/forum/showthread.php?t=238)

phamquocdai 12-10-2008 05:37 AM

Cam on ban ve bai viet!
 
Minh dang hoc lap trinh cho pic nhung khong biet bat dau tu dau? Bai viet cua ban rat hay hy vong minh se nhan tiep bai viet moi cua ban!!!!
Thanks!!!!!!!!!!!!

Mr.Bi 12-10-2008 08:10 PM

Trích:

Nguyên văn bởi luongnhut (Post 19445)
em đọc thấy cách mắc cho chân MCLR nhu hình dưới, mình co thể tạo thời gian trễ cho nút reset bang cách nối song song một tụ điện với nut nhấn dc ko, mún tạo thời gian reset cho pic khoảng 500ms thi giá trị của tụ điên là bao nhiêu

ko cần nối tụ đâu u , trong PIC đã có sẵn tụ này oy . U nối thêm có khi ct lại chạy ko đúng

delpiero10 15-10-2008 11:10 PM

E đang làm về con 16F877A ghép nối theo bus mà kô biết chân chốt địa chỉ của nó là chân nào (như ALE trong 8051) và cổng dùng ghép nối theo bus là cổng nào (như P0,P2 trong 8051)? Ai biết giúp đỡ nhé! Thank!

namqn 15-10-2008 11:42 PM

Trích:

Nguyên văn bởi delpiero10 (Post 19618)
E đang làm về con 16F877A ghép nối theo bus mà kô biết chân chốt địa chỉ của nó là chân nào (như ALE trong 8051) và cổng dùng ghép nối theo bus là cổng nào (như P0,P2 trong 8051)? Ai biết giúp đỡ nhé! Thank!

PIC16F877A không dùng kiến trúc bộ nhớ như 8051, do đó bạn sẽ không tìm thấy các chân này trên nó.

Thân,

8sung 16-10-2008 01:05 AM

xin chào cả nhà
tớ đang muố làm 1 cái bảng quảng cáo bằng den led nhầp nháy theo nhiều kiểu ý
ban nào có thể cho minh xin cái sơ đồ mach dùng pic làm ví dụ với
mình cảm trước nhé

daominhchien 16-10-2008 05:53 AM

kiểu này mai tôi phải mua vỉ nạp PIC thôi! rồi sẽ có chuyện để hỏi.
trên diễn đàn có trang nào giải trình phần cúng của PIC các thầy chỉ tôi với...xin cảm ơn!

namqn 16-10-2008 06:15 AM

Trích:

Nguyên văn bởi daominhchien (Post 19624)
kiểu này mai tôi phải mua vỉ nạp PIC thôi! rồi sẽ có chuyện để hỏi.
trên diễn đàn có trang nào giải trình phần cúng của PIC các thầy chỉ tôi với...xin cảm ơn!

Bạn đọc luồng này, post #4, về các mạch nạp đơn giản không dùng firmware:
http://www.picvietnam.com/forum/showthread.php?t=299

Thân,

anhvult 29-10-2008 11:30 PM

Thân chào! Mình là người mới tìm hiểu về Vi điều khiển PIC. Mình đã học Điện CN, học qua lập trình Pascal rồi. Mình muốn học PIC nhưng k biết bắt đầu tư đâu? Phải mua Phần cứng, phần mền ở đâu, giá bao nhiêu (đủ để học PIC)... Bạn nào biết chỉ giúp mình nhé.
Thanks!
Anh Vu hoanganh204@yahoo.com

namqn 30-10-2008 12:07 AM

Trích:

Nguyên văn bởi anhvult (Post 19969)
Thân chào! Mình là người mới tìm hiểu về Vi điều khiển PIC. Mình đã học Điện CN, học qua lập trình Pascal rồi. Mình muốn học PIC nhưng k biết bắt đầu tư đâu? Phải mua Phần cứng, phần mền ở đâu, giá bao nhiêu (đủ để học PIC)... Bạn nào biết chỉ giúp mình nhé.
Thanks!
Anh Vu hoanganh204@yahoo.com

Bạn có thể bắt đầu từ đây (link này được đặt ở banner và ở menu bên góc trái trên của trang chính của diễn đàn):
http://www.picvietnam.com/forum//showthread.php?t=4

Thân,

delpiero10 06-11-2008 02:24 AM

Cảm ơn bác namqn đúng là PIC kô có cấu trúc ghép nối theo bus như 8051 hay AVR mà nó chỉ ghép nối theo cổng.

window 09-11-2008 11:27 PM

chào các bác!
Mình đang gặp khó khi :
1/Định địa chỉ ROM ngoai gắn vào PIC 16F877A
2/ Gắn con giải mã 74LS138 vào PIC nhưng không biết gắn các chân như thế nào để vận hành (ví dụ như để chọn chân ra nối vào led1. led 2 ...)

window 09-11-2008 11:31 PM

chào!
Trong con 8952, 8951... khi nối chân địa chỉ vào các chân của ROM ngoài hoặc dùng con 74ls138 giải mã địa chỉ thì ta gắn các chân Port 0 hoặc Port 2 vào các chân tương ứng của thiết bị ngoài . Còn con PIC thì mình làm sao ? Các bác cứu mình với !
Cảm ơn nhiều.

nguyencongchung 10-11-2008 10:43 PM

các bác ơi
sao không thấy ai nói về pwm thế
em mới học pic bác cho em hỏi điều khiển động cơ dc bằng phương pháp pwm và hiển thị tốc độ trên led 7 đoạn.thì em phải làm những bước cơ bản nào (hiện giờ em đang mò mẫm trong những tài liệu và diễn đàn mấy hôm roài nhưng chưa có định hình chính xác các bước) mong các bác giúp em cặn kẽ chút nhé.em xin cám ơn!

camlinhnet 11-11-2008 09:54 PM

đã đọc nghiên cứu nhưng ngu nguội nên hiểu biết quá ít!!!!!!!!!!
phần vì lười phần vì bận học trên lớp đã đủ mệt

timon 16-11-2008 07:49 PM

cám ơn các anh rất nhiều!

rongphuongnam 23-12-2008 03:12 PM

Xin lỗi, nếu có lộn chỗ xin mọi người bỏ qua!

A e có biết chỗ nào bán mạch đo nhiệt độ hiển thị đèn led 7 đoạn ở Tp HCM không? Cho mình biệt sớm, sdt 0974311699. Cam on moi nguoi!

thaivodich999 13-01-2009 12:59 AM

Mấy bài viết hay wá !!! sao các anh ko viết 1 bài về timer,couter và ADC nhỉ???????

phandinh 06-02-2009 10:19 PM

cho em hỏi trong phần delay lệnh:
GOTO $-1
GOTO $+2
nghĩa là sao
em mới học nên chưa rành lắm

phandinh 06-02-2009 10:34 PM

cho em hỏi trong phần delay của bác nhh:
LOOP
DECFSZ COUNT1,1
GOTO LOOP
DECFSZ COUNT2,1
GOTO LOOP
DECFSZ COUNT3,1
GOTO LOOP
RETURN

END
vậy khi count1 đã về 0 rồi nhưng khi lặp lại thì gt trong count1 có phải là 255 ko?
nếu đúng như vậy (giống 8051) thì csch1 tính delay sẽ ko chính xác nữa

kyo 08-02-2009 04:42 PM

Tài liệu về điều khiển từ xa!
 
Mình đang nghiên cứu về điều khiển từ xa bằng hồng ngoại và sóng radio. Mọi người ai có tài liệu gì về đề tài này thì chia sẻ cho mình với nhé. Cảm ơn nhiều!

tiendh 09-02-2009 05:25 PM

Chào các huynh
đệ mới nhập môn pic,các huynh cho đệ hỏi chút. Đệ viết đoạn code này nhưng sao nó cứ báo lỗi khi dịch nhỉ? Nhân tiện các huynh cho đệ hỏi cách truy nhập đến từng bit của thanh ghi bất kỳ, chẳng hạn portB. Đệ dùng CCS.ko biết dùng chỉ thị #bit hay #byte vậy có đượcko?

Code:

#include <16F877.h>
#use delay( clock=20000000)
#byte portb=0x06
int1 x;
Main()
{
x=portb.0;
while(1)
{
output_high(x) ;
Delay_ms(50) ; // delay 250ms
Output_low (x);
Delay_ms (50 );
}
}


namqn 09-02-2009 06:08 PM

Trích:

Nguyên văn bởi tiendh (Post 22476)
Chào các huynh
đệ mới nhập môn pic,các huynh cho đệ hỏi chút. Đệ viết đoạn code này nhưng sao nó cứ báo lỗi khi dịch nhỉ? Nhân tiện các huynh cho đệ hỏi cách truy nhập đến từng bit của thanh ghi bất kỳ, chẳng hạn portB. Đệ dùng CCS.ko biết dùng chỉ thị #bit hay #byte vậy có đượcko?

Code:

#include <16F877.h>
#use delay( clock=20000000)
#byte portb=0x06
int1 x;
Main()
{
x=portb.0;
while(1)
{
output_high(x) ;
Delay_ms(50) ; // delay 250ms
Output_low (x);
Delay_ms (50 );
}
}


Bạn nên cho biết thông báo lỗi mà bạn đã gặp, nó sẽ giúp những người khác giúp bạn tốt hơn.

Tôi không dùng CCS C, nhưng theo tài liệu hướng dẫn của trình dịch này, các hàm output_high() và output_low() nhận đối số là địa chỉ bit (ít nhất là cần 8 bit, theo tài liệu thì có thể dùng 16 bit). Code của bạn lấy trạng thái của chân RB0 để gán cho biến x (kiểu bit), rồi dùng biến x đó làm đối số của các hàm vừa nêu, theo tôi là không ổn.

Trong thực tế, để bật/tắt các chân I/O của PIC, bạn cũng cần phải thiết lập chúng như những ngõ ra, bằng cách xóa các bit tương ứng trong thanh ghi TRISx tương ứng.

Các bit của các port I/O đã được định nghĩa sẵn trong các header file được cung cấp cùng với CCS C.

Thân,

namqn 09-02-2009 07:13 PM

Trích:

Nguyên văn bởi phandinh (Post 22425)
cho em hỏi trong phần delay lệnh:
GOTO $-1
GOTO $+2
nghĩa là sao
em mới học nên chưa rành lắm

GOTO $-1 nghĩa là nhảy đến lệnh nằm trước (dấu trừ) lệnh hiện hành (ký hiệu $) 1 từ lệnh, GOTO $+2 là nhảy đến lệnh nằm sau (dấu cộng) lệnh hiện hành 2 từ lệnh.

Thân,

tong nhat khon 09-02-2009 07:51 PM

sao em không thấy anh Chính viết tiếp các bải dạy về Pic16f877a nữa ạ . Em thấy anh viết rất dễ hiểu mà nhất là đối với người mới bắt đầu học về Pic như em. Mong anh tiếp tục viết bài để giúp đỡ những người mơi học chúng em . em cảm ơn anh nhiều !

namqn 09-02-2009 09:15 PM

Trích:

Nguyên văn bởi phandinh (Post 22427)
cho em hỏi trong phần delay của bác nhh:
LOOP
DECFSZ COUNT1,1
GOTO LOOP
DECFSZ COUNT2,1
GOTO LOOP
DECFSZ COUNT3,1
GOTO LOOP
RETURN

END
vậy khi count1 đã về 0 rồi nhưng khi lặp lại thì gt trong count1 có phải là 255 ko?
nếu đúng như vậy (giống 8051) thì csch1 tính delay sẽ ko chính xác nữa

Không rõ bạn nói đến cách tính nào sẽ không chính xác.

Tôi vừa xem lại phần tính toán của nhh ở post #31, thấy có chỗ không ổn, nên đã ngồi tính toán lại (tôi thường ít dùng các hàm delay kiểu này cho thời gian từ vài ms trở lên). Sau đây là phần tính toán:

- Gọi a, b, c (a > 0, b > 0, và c > 0) là các giá trị được khởi tạo của các biến COUNT1, COUNT2, và COUNT3 trước khi thực hiện chương trình con LOOP trên.

1. Sau (a-1)*3 chu kỳ máy thì COUNT1 = 1.

2. Tốn thêm 2 chu kỳ máy để COUNT1 = 0 và bỏ qua lệnh GOTO thứ nhất (ngay sau lệnh DECFSZ COUNT1, 1). Từ lúc này a không còn tác dụng.

3. Sau (b-1)*[3 + 255*3 + 2] chu kỳ máy tiếp theo thì COUNT2 = 1.

4. Tốn thêm 2 chu kỳ máy để COUNT2 = 0 và bỏ qua lệnh GOTO thứ hai (ngay sau lệnh DECFSZ COUNT2, 1). Từ lúc này b không còn tác dụng.

5. Sau (c-1)*{3 + 255*[3 + 255*3 + 2] + (255*3 + 2) + 2} chu kỳ máy để COUNT3 = 1.

6. Tốn thêm 2 chu kỳ máy để COUNT3 = 0 và bỏ qua lệnh GOTO thứ ba (ngay sau lệnh DECFSZ COUNT3, 1).

Như vậy, tổng số chu kỳ máy cần thiết để hoàn tất đoạn lệnh bên trong chương trình con LOOP (không kể lệnh RETURN) sẽ là:
No_cycles = (a-1)*3 + 2 + (b-1)*[3 + 255*3 + 2] + 2 + (c-1)*{3 + 255*[3 + 255*3 + 2] + (255*3 + 2) + 2} + 2 = 3*(a-1) + 770*(b-1) + 197122*(c-1) + 6

Chú ý giả thiết a, b, và c đều là các số dương. Công thức đã được kiểm tra với các giá trị ngẫu nhiên a, b, và c, sử dụng MPLAB SIM.

Thân,

phandinh 10-02-2009 06:26 AM

thanhks so much

phandinh 11-02-2009 12:38 AM

Tài liệu về pic
 
Em có tài liệu này nói về phần ngắt timer khá hay của bác nào ko rõ, em đang nghiên cứuuuu.
Các bác xem thử

phandinh 11-02-2009 12:52 AM

giờ mới được
 
1 Attachment(s)
giờ mới được

phandinh 11-02-2009 01:03 AM

Em đang học PIC bằng cả 2 ngôn ngữ A SM và C
ko biết có tham lam quá ?????
khi viết bên mplab ok rồi qua ccs viết lại nếu ok nữa thì
thật tuyệt vời (...dù chỉ mói viết nhấp nháy led...)
Nhưng không sao , em sẽ cố gắng từ cái đơn giản nhất.
Chúc cả làng ngon giấc
"impossible i s nothing"

phandinh 11-02-2009 10:55 AM

sao không có ai thảo luận luồng này nữa vậy

phandinh 11-02-2009 09:53 PM

kíu em
 
1 Attachment(s)
Đây là bài em viết mỗi khi nhấn nút ở chân RB0 thì sẽ hiển thị lên led ở po rtA.
Dịch ra file he x thì ok, nhưng mô phỏng proteus lại ko dc.
Em nghĩ là do ngắt .
Code:

;=======================================================
                TITLE                "Mach test ngat ngoai"
                PROCESSOR        P16F877A
                INCLUDE        <P16F877A.inc>
                __CONFIG    _CP_OFF        & _PWRTE_ON & _WDT_OFF &_HS_OSC

;chan RB0 noi voi cong tac de dem so lan nhan
;port A noi voi cac led hien de hien thi so binary
;===============================================================================
count        equ        0x30
portA        equ        0x05
intcon        equ        0x0b
TRISB        equ        0x86
trisA        equ        0x85

                ORG        0x0000
                GOTO        MAIN
                org 0x0400
                goto        ngat
                ORG        0x0005
MAIN       
                bsf                intcon,7
                bsf                intcon,4
                bcf                intcon,1
                BANKSEL                TRISB                ; bank select
                movlw                b'00000001'
                movwf                TRISB        ; trisb = #w; rb0 = input
                BANKSEL                trisA
                movlw                  0x000
                movwf                        trisA

                movwf                count
                movlw                portA               
                goto                $-2
ngat   
                incf                count,1        ;tăng giá trị lên 1 và lưu lại trong count       
                retfie
                END                               
;================================================================================


phandinh 11-02-2009 11:32 PM

em cũng đã thử thêm lệnh ' BCF INTCON,INTF '
vào chương trình ngắt mà vẫn ko dc

namqn 12-02-2009 01:20 AM

- Vector ngắt nằm ở 0x0004 chứ không phải ở 0x0400 như bạn đã viết.

- TRISA và TRISB nằm cùng bank, do đó BANKSEL TRISA là không cần thiết.

- PORTA nằm khác bank với TRISA, chỗ này thì bạn lại thiếu BANKSEL PORTA.

- Hai lệnh MOVWF COUNT và MOVLW PORTA lẽ ra phải là MOVF COUNT, W và MOVWF PORTA.

- Xử lý xong ngắt thì phải xóa cờ ngắt, do đó vẫn cần xóa cờ INTF trong thanh ghi INTCON trước khi thoát khỏi chương trình xử lý ngắt.

Thân,

phandinh 12-02-2009 04:39 PM

Từ sáng giờ em đã làm lại. Do vừa tìm hiểu lệnh, các thanh ghi nữa nên
hơi lâu. ct được viết lại như dưới nhưng vẫn chưa được.
Nút nhấn chỉ có tác dụng ở lần đầu tiên. tức là ' nhấn lần thứ NHẤT ---> RA0 = 1 '
nhưng những lần nhấn tiếp theo vẫn chỉ có RA0 = 1 .
Em nghi ngờ ở lần ngắt đầu tiên (trong chương trình ngắt) đã tác động
đến thanh ghi nào đấy , và nó đã không cho phép ngắt nữa.
---------------------------------------------
Code:

;=======================================================
                TITLE                "Mach test ngat ngoai"
                PROCESSOR        P16F877A
                INCLUDE        <P16F877A.inc>
                __CONFIG    _CP_OFF        & _PWRTE_ON & _WDT_OFF &_HS_OSC

;chan RB0 noi voi cong tac de dem so lan nhan
;port A noi voi cac led hien de hien thi so binary
;=================================================================
COUNT        equ        20H
                ORG                00H
                GOTO        MAIN
                org        04H       
                goto        NGAT
;===============CHUONG TRINH CHINH================================
                ORG        0x0005
MAIN               
                BANKSEL                TRISB                ; bank select
                movlw                b'00000001'
                movwf                TRISB                ; trisb = #w; rb0 = input
                movlw                  00h
                movwf            TRISA
                BANKSEL        PORTA
                bsf                INTCON,7                       
                bsf                INTCON,4
                bcf                INTCON,1
                CLRF                W
                movwf                PORTA               
                goto                $-1                       
;==================CHUONG TRINH NGAT=============================
NGAT   
                incf                COUNT,0        ;tang g.tri count len 1 & luu trong 'W'               
                BCF                        INTCON,1
                retfie                                        ; return from interrupt               
END                               
;====================================================================


namqn 12-02-2009 09:07 PM

Chương trình chạy theo đúng những gì bạn đã viết. Trong phần xử lý ngắt, bạn tăng biến COUNT lên 1 đơn vị, nhưng lại ghi kết quả vào W, do đó biến COUNT vẫn chứa giá trị ban đầu (không hề bị thay đổi). Ở những lần ngắt tiếp theo, giá trị cũ của biến COUNT vẫn được tăng lên 1 đơn vị và ghi vào thanh ghi W, còn biến COUNT hoàn toàn không bị thay đổi giá trị.

Phần xử lý ngắt của bạn còn thiếu một lệnh, đó là ghi lại kết quả phép toán tăng 1 đơn vị vào biến COUNT (movwf COUNT), sau lệnh INCF COUNT, 0.

Thân,

phandinh 12-02-2009 09:54 PM

À em hiểu rồi . đúng là bị chỗ đấy thật.
Chắc em nhớ mãi lệnh này ( ngồi từ sáng tới trưa)
Thanks bác nhiều

phandinh 15-02-2009 10:01 PM

1 Attachment(s)
Sợ thằng Proteus quá rồi.
Em vừa làm xong mạch test 16f877A.Mà không hiểu sao nó ko chạy.
Các bác có rảnh thì xem hộ em coi sơ đồ nguyên lí có gì sai ko.
Cảm ơn các bác nhiều.
-------------------------------------------------------------
À em dùng phần mềm WinPic 800 để nạp.
trên thanh công cụ có các nút sau mà em ko hiểu lắm:
Read All, Programe All và Verify All.
Như khi em nạp thì em chọn Programe All trước sau đó mới đến Verify All.
Mong các bác chỉ giáo

namqn 15-02-2009 11:31 PM

Trích:

Nguyên văn bởi phandinh (Post 22626)
Sợ thằng Proteus quá rồi.
Em vừa làm xong mạch test 16f877A.Mà không hiểu sao nó ko chạy.
Các bác có rảnh thì xem hộ em coi sơ đồ nguyên lí có gì sai ko.
Cảm ơn các bác nhiều.
-------------------------------------------------------------
À em dùng phần mềm WinPic 800 để nạp.
trên thanh công cụ có các nút sau mà em ko hiểu lắm:
Read All, Programe All và Verify All.
Như khi em nạp thì em chọn Programe All trước sau đó mới đến Verify All.
Mong các bác chỉ giáo

Mạch nguyên lý của bạn về nguyên tắc thì không có vấn đề, nhưng bạn không cho biết giá trị cụ thể của linh kiện, nên khó mà nhận xét mạch thử nghiệm của bạn. Bạn nên cho biết thêm:

- Tụ điện dùng cho thạch là bao nhiêu, tần số của thạch anh là bao nhiêu? Bạn đã cấu hình cho PIC như thế nào?
- Điện trở của mạch reset là bao nhiêu?
- Bạn có dùng các tụ ceramic 100 nF giữa các cặp chân VDD và VSS nằm gần nhau hay không? Nếu câu trả lời là không thì bạn nên bổ sung các tụ này.
- Nếu PIC của bạn còn mới tinh hoặc bạn cho phép nạp ở điện áp thấp (LVP), bạn nên có điện trở vài k từ chân RB3/PGM đến VSS.

Bạn nên đọc post #1 của luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=3451

Thân,

phandinh 16-02-2009 12:01 AM

Thạch anh em dùng 12 Mhz, tụ 33pF như hồi em làm 8051.
Điện trở kéo lên Reset là 10 k
Tụ ceramic 100 nF nối VDD và VSS thì em ko có.

phandinh 16-02-2009 12:13 AM

dạ để mai em sửa như bác hướng dẫn. mà sắp thi rồi ko biết có kịp sửa không.
có gì em nhờ bác tiếp.
thanks.


Múi giờ GMT. Hiện tại là 08:08 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam