PDA

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


Pages : 1 [2]

doremino
12-05-2008, 03:10 PM
các bác trao đổi với nhau thấy hấp dẫn quá!!!Cảm ơn sự nhiệt tình cũng như tâm huyết của các bác.Em tin rằng Picvietnam sẽ thành công trong việc đưa pic đến với mọi người!!
chúc may mắn

dinhthem
12-05-2008, 08:23 PM
các anh ơi, mạch reset của pic có R1<40k, cụ thể là bao nhiêu?
cám ơn.
có anh nào ở tp hcm cung cấp con pic này ko? mạch nạp nữa? giá bao nhiêu vậy?
cám ơn.

namqn
12-05-2008, 08:36 PM
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!!!
Đoạn __CONFIG ... dùng để đặt cấu hình cho PIC, nên có. Nếu không có đoạn này thì PIC sẽ chạy ở cấu hình mặc định (thông tin có trong datasheet của PIC).

Khi lập trình hợp ngữ thì thông tin tần số của thạch anh thường không cần thiết, đặc biệt là trình hợp dịch không cần thông tin này. Mọi tính toán dựa vào tần số của thạch anh đều do người viết code chịu trách nhiệm.

Thân,

namqn
12-05-2008, 08:41 PM
các anh ơi, mạch reset của pic có R1<40k, cụ thể là bao nhiêu?
cám ơn.
có anh nào ở tp hcm cung cấp con pic này ko? mạch nạp nữa? giá bao nhiêu vậy?
cám ơn.
Nếu bạn cần giá trị cụ thể, hãy dùng 10 k. Câu hỏi của bạn khiến tôi nhớ lại câu chuyện sau:
Hãng Compaq thường xuyên nhận được điện thoại của các khách hàng mới,
than phiền rằng họ không thể tìm thấy phím "any" trên bàn phím (tài liệu
hướng dẫn của Compaq thường dùng cụm từ "press any key to continue").
Hãng Compaq sau đó đã quyết định đổi toàn bộ cụm từ "press any key to
continue" thành "press <Enter> key to continue".
Nếu bạn cần mua PIC và mạch nạp, hãy sang box sau:
http://www.picvietnam.com/forum/forumdisplay.php?f=17

Thân,

dinhthem
13-05-2008, 08:14 AM
cám ơn anh.
em làm đc mạch hiển thị led rồi hihihi.
ko thấy anh Chính up bài hiển thị led7doan. em đọc sách tiếng anh thấy có mạch đó.
nhưng em ko biết con transitor nó tên gì, cái hình mờ quá em ko biết điện trở vào mỗi đoạn led là bao nhiêu? (110ohm hay 330ohm)
các anh chỉ giúp em với nhe
cám ơn.

doremino
13-05-2008, 01:32 PM
cám ơn anh nhiều lắm!!!
anh có tài liệu về ngắt-timer cho em tham khảo với!!!!!!!!!

tamlan
13-05-2008, 01:32 PM
hình như dạo này anh NTC quên mất nhiệm vụ rồi thì phải, lau quá không thấy máy cái bài mới nào cả, buòn thế

doremino
13-05-2008, 02:40 PM
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^^

Trả lời giúp đi các anh!!!!!

namqn
13-05-2008, 06:36 PM
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^^
Theo hiện tượng bạn đã mô tả, có thể PIC được kích hoạt chế độ nạp chương trình ở điện áp thấp (LVP). Bạn nên thêm NOLVP vào directive #fuses.

Nếu cắm PIC ngược chiều vào socket trên mạch nạp thì còn tùy thuộc vào việc các chân của socket tại những vị trí ngược chiều đó có gây hư hại gì cho PIC hay không. Bạn chưa cho biết mạch nạp gì, socket được kết nối ra sao, thì không thể có câu trả lời chắc chắn.

Xóa chip trước khi nạp chip là thao tác cần thiết, một số phần mềm tự động thực hiện xóa chip trước khi nạp (và việc này cũng có thể được cấu hình bật/tắt), WinPic800 là phần mềm thuộc loại này.

Về lỗi verify của bạn, có lẽ mạch nạp của bạn không tốt lắm.

Thân,

doremino
13-05-2008, 08:28 PM
cảm ơn anh nhiều!!em sẽ rút kinh nghiệm!!Anh có tài liệu về điều khiển ngắt -timer cho em tham khảo với!!em cảm ơn nhiều!!!

namqn
13-05-2008, 08:49 PM
cảm ơn anh nhiều!!em sẽ rút kinh nghiệm!!Anh có tài liệu về điều khiển ngắt -timer cho em tham khảo với!!em cảm ơn nhiều!!!
Thông tin liên quan đến timer của PIC16 nằm trong datasheet của PIC. Tôi không rõ bạn cần thêm tài liệu gì. Thông thường chỉ cần đọc phần tương ứng của một timer nào đó trong datasheet và viết code khởi tạo, cùng với code xử lý ngắt cho timer, nếu sử dụng ngắt timer.

Thân,

doremino
14-05-2008, 06:19 AM
Thông tin liên quan đến timer của PIC16 nằm trong datasheet của PIC. Tôi không rõ bạn cần thêm tài liệu gì. Thông thường chỉ cần đọc phần tương ứng của một timer nào đó trong datasheet và viết code khởi tạo, cùng với code xử lý ngắt cho timer, nếu sử dụng ngắt timer.

Thân,

anh có thể cho em biết ngắt ngoài là như thế nào?Có phải là chúng ta tác động bằng công tắt không?

bien_van_khat
16-05-2008, 06:20 PM
anh có thể cho em biết ngắt ngoài là như thế nào?Có phải là chúng ta tác động bằng công tắt không?

Ngắt ngoài của PIC là ngắt do sự chuyển mức điện áp trên chân IO hỗ trợ ngắt ngoài (có thể lựa chọn ngắt xảy ra do chuyển từ mức cao xuống mức thấp hoặc mức thấp lên mức cao).

Bạn cũng có thể lưu ý, ngắt ngoài luôn luôn là ngắt có mức ưu tiên vật lý cao nhất (chỉ với PIC18 trở lên nhé, cấu trúc PIC16 ko có khái niệm ưu tiên ngắt).

nhatminh_happy
18-06-2008, 03:43 PM
tai sao khi khai bao mang:
unsigned char dem_EEPROM[256];
thi dich binh thuong
con khi khai bao :
unsigned char dem_EEPROM[512];// lon hon 256
thi dich bao loi nhu sau:
MPLINK 4.1, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - section '.udata_BDPIC1.o' can not fit the section. Section '.udata_BDPIC1.o' length=0x00000200
Errors : 1


minh dang dung trinh dich c18 v10 full

david
18-06-2008, 04:47 PM
nếu bạn dùng PIC6F877A thì SRAM của nó bé hơn 512 (hình như là 398 :D ) nên bạn không khai báo như thế được.

namqn: người hỏi đang dùng PIC18.

thuyvu
18-06-2008, 09:29 PM
mình thấy có bạn nói về RS485 trong luồng này, Mình đang cần mạch chuyển RS485 sang RS232 bạn nào có mạch nguyên lý cho mình xin với mình cần lắm.
xuanvudk2@gmail.com

thuyvu
18-06-2008, 09:38 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!

Anh có tài liệu học vẽ mạch protell không cho em xin nhé:xuanvudk2@gmail.com

nguyenthinho
19-07-2008, 02:24 PM
Cảm ơn bác namqn,ntc,f nhiều lắm nha.Em mới tìm hiểu về Pic thấy các bài viết của các bác rât có ích.hehehe

luuvandung
01-08-2008, 11:22 AM
cam on cac anh nhe.hay pỏt nhieu tai lieu hon di

namqn: diễn đàn có quy định viết bài bằng tiếng Việt có dấu, và bạn không cần cài đặt gì thêm vào máy vì diễn đàn đã có sẵn bộ gõ, hỗ trợ các kiểu gõ thông dụng.

phamngocloi
04-08-2008, 06:18 PM
anh em giup tui voi tui khong down dc cac chuong con lai
moi toi chuong 4 ah
co j goi qua visaokhongten1608@yahoo.com
cam on tuoc nha

minoan
19-09-2008, 10:36 AM
Tại sao lại thế?

Delay
movlw 0xFF
movwf giatri1 ; dia chi 0x80
movwf giatri2 ; dia chi 0x81
movwf giatri3 ; dia chi 0x82

loop1
loop2
loop3

decfsz giatri3
goto loop3

decfsz giatri2
goto loop2

decfsz giatri1
goto loop1

return

Mình viết chương trình con để tạo trễ, không hiểu tại sao lúc mô phỏng MPLAB 8.0 thì được nhưng khi đổ vào PIC lại không chạy, hình như nó cứ đứng ì luôn không thoát ra được chương trình con đó, mình dùng cà 16F877A và 16F84A cũng thấy thế. Không hiểu tại sao cả? Ai biết thì chỉ dùm nhé.

namqn
19-09-2008, 05:16 PM
Tại sao lại thế?

...

Mình viết chương trình con để tạo trễ, không hiểu tại sao lúc mô phỏng MPLAB 8.0 thì được nhưng khi đổ vào PIC lại không chạy, hình như nó cứ đứng ì luôn không thoát ra được chương trình con đó, mình dùng cà 16F877A và 16F84A cũng thấy thế. Không hiểu tại sao cả? Ai biết thì chỉ dùm nhé.
Việc PIC chạy như thế nào còn tùy thuộc vào cách cấu hình của bạn. Bạn chưa cho biết các cấu hình của PIC16F877A và PIC16F84A mà bạn đã dùng ra sao.

Thân,

kiwi
20-09-2008, 12:16 AM
Em mới vừa học PIC ,bác nào có bài tập hay ví dụ về Pic thì cho em xin, đọc lý thuyết nhiều mà nhiều lúc ko hiểu j hết. Thank!

chiataytuday
29-09-2008, 10:45 AM
sao không thấy tài liệu về ngắt mấy anh em. Tập tài liệu cuối cùng mình download về giải nén bị lỗi mất. cho mình lại cái link đi.

sevenlove_1001
30-09-2008, 02:14 PM
Cảm ơn Bác cho Bọn em tài lệu hay nhé! bác chuẩn bị post bài 3 đi em chờ dài cổ rùi

nutiepthi4
30-09-2008, 02:38 PM
SDCC là trình biên dịch nhỏ gọn, ban đầu được phát triển trên Linux để biên dịch chương trình viết bằng C cho vi xử lý. Đối tượng ban đầu của SDCC là các vi xử lý họ 8051, vế sau được phát triển cho các vi điều khiển. Hiện nay SDCC lả trình biên dịch khá mạnh cho PIC chạy trên Linux (mặc dù đã có bản chạy trên MS Windows). Đi kèm với SDCC là trình mô phỏng GPSIM, và các chương trình hỗ trợ khác như gputils,...
Tôi giới thiệu giới thiệu trình biên dịch này bởi vì cấu trúc chương trinh viết bằng SDCC đơn giản, các file header (*.h) mô tả các vi điều khiển rất sát với Dataset của vi điều khiển. Ví dụ: trên Dataset của Microchip PIC 16f877a, mô ghi tên các chân cổng A là RA0, RÁ, ..., thanh ghi điều khiển vào ra cổng A là TRISA thì
trên SDCC muốn xuất mức 1 cho chân RA0, bạn chỉ cần viết:
TRISA0 = 0;
RA0 = 1;
Trông có vẻ đơn giản phải không? Vì vậy để điều khiển PIC bằng SDCC, gần như bạn chỉ cần học Dataset, bởi vì SDCC quá đơn giản và sát với Dataset!
Kiến thức về vi điều khiển của mình còn co hạn. Mong các bạn chỉ giáo thêm, Cảm ơn!

chiataytuday
03-10-2008, 09:22 AM
sao mà càng về sau các admin lại không nhiệt tình thế này?

Sangdth
03-10-2008, 12:58 PM
Mình viết chương trình con để tạo trễ, không hiểu tại sao lúc mô phỏng MPLAB 8.0 thì được nhưng khi đổ vào PIC lại không chạy, hình như nó cứ đứng ì luôn không thoát ra được chương trình con đó, mình dùng cà 16F877A và 16F84A cũng thấy thế. Không hiểu tại sao cả? Ai biết thì chỉ dùm nhé.

Mình cũng có cùng câu hỏi như minoan, nhưng lại cố mò mẫm theo hướng khác.

Làm theo hướng dẫn trong tut "Học PIC trong một ngày" của trưởng lão falleaf, cũng đến đoạn tạo trễ thì rối lên. Mình cũng viết 3 vòng loop, nhưng không gọi theo cách của bạn, mà lồng nó vào nhau,


DELAY1 DECFSZ COUNT_1, F
GOTO DELAY2
RETURN

DELAY2 DECFSZ COUNT_2, F
GOTO DELAY3
RETURN

DELAY3 DECFSZ COUNT_3, F
GOTO DELAY3
RETURN


Không hiểu lồng như thế thì đúng hay sai? Mong mọi người xem giúp, sau cái này còn cái khác nữa ^^

Cảm ơn mọi người.

nguyencuong4988
04-10-2008, 12:37 AM
thank anh ^^

luongnhut
09-10-2008, 10:23 AM
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

phamquocdai
12-10-2008, 05:37 AM
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
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
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
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
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
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?

#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
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?

#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
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
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
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

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
Đâ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 .
;================================================= ======
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.
---------------------------------------------
;================================================= ======
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
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
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.

phandinh
17-02-2009, 04:37 PM
Em đang định làm đề tài truyền thông nối tiếp F877 với PC.
8 kênh ADC ( dùng 1 sensor nhiệt độ, còn lại chỉ dùng biến trở) --> RS232--->f877---> màn hình máy tính(dùng VB để viết).
bác cho em hỏi tí:
.Nguồn cho pic em có thể dùng chính nguồn (biến đổi) của cổng COM được không?
.Giao tiếp cổng COM thì vẫn dùng Max 232 như gt với 8051 hả bác?
BÁc chỉ dùm em đường link có liên quan với.
Em đang chuẩn bị thi nên mấy hôm nay ko học được
thanks!

namqn
17-02-2009, 05:59 PM
Em đang định làm đề tài truyền thông nối tiếp F877 với PC.
8 kênh ADC ( dùng 1 sensor nhiệt độ, còn lại chỉ dùng biến trở) --> RS232--->f877---> màn hình máy tính(dùng VB để viết).
bác cho em hỏi tí:
.Nguồn cho pic em có thể dùng chính nguồn (biến đổi) của cổng COM được không?
.Giao tiếp cổng COM thì vẫn dùng Max 232 như gt với 8051 hả bác?
BÁc chỉ dùm em đường link có liên quan với.
Em đang chuẩn bị thi nên mấy hôm nay ko học được
thanks!
- Đa số các cổng COM hiện đại có khả năng cấp nguồn rất hạn chế (các cổng này được thiết kế cho mục đích truyền thông, chứ không phải cho mục đích cấp nguồn). Do đó, bạn không nên dùng nguồn từ cổng COM để cấp cho PIC.

- Giao tiếp một vi điều khiển bất kỳ với máy tính đều có thể dùng MAX232 (hoặc một vi mạch tương thích), do đó với PIC bạn vẫn dùng như vậy. Sơ đồ cụ thể còn tùy thuộc vào việc bạn dùng module USART của PIC hay hiện thực bằng phần mềm (bit-banging). Nếu dùng USART của PIC thì nối như sau:
+ Chân TX (PIC) -> T1IN/T2IN (MAX232) -> T1OUT/T2OUT (MAX232) -> chân RD (chân 2) của cổng COM
+ Chân RX (PIC) <- R1OUT/R2OUT (MAX232) <- R1IN/R2IN (MAX232) <- chân TD (chân 3) của cổng COM.

Những chân còn lại của MAX232 được nối như trong datasheet.

Thân,

phandinh
19-02-2009, 02:39 AM
bác cho em hỏi:
địa chỉ ngắt f877 là 004h. Nếu mình sử dụng 1 ngắt thì ko vấn đề gì.
Nhưng khi em sử dụng nhiều ngắt , Vậy thì mình phải làm gì
để nó phân biệt được đâu là ngắt ngoài , ngắt timer , counter.... hả bác

xuanhiendk2
19-02-2009, 01:50 PM
Các bác ơi sao ko viết bằng C đi!! Em thấy viết bằng C dễ hiểu hơn.

phanhuuhoan
19-02-2009, 02:40 PM
chào mọi người !theo em nhận thấy tại sao chúng ta không một dự án nhỏ từ a đến z giống như tụi nước ngoài luôn !Em thấy các cứ post kiểu em thấy xưa cũ quá rồi !nhai đi nhai lại hoài chán lắm !phải có cái gì mới lạ hơn và khó hơn để cùng nhau mổ xẻ !..........

phandinh
19-02-2009, 08:25 PM
uh mình cũng thấy viết C thì đơn giản hơn nhiều.
mình đang học cả 2. mình muốn trước tiên phải hiểu
về cấu trúc PIC thật rõ ràng đã nên học ASM.
Muốn học lắm mà ko có nhiều thời gian.

phandinh
19-02-2009, 08:29 PM
chào mọi người !theo em nhận thấy tại sao chúng ta không một dự án nhỏ từ a đến z giống như tụi nước ngoài luôn !Em thấy các cứ post kiểu em thấy xưa cũ quá rồi !nhai đi nhai lại hoài chán lắm !phải có cái gì mới lạ hơn và khó hơn để cùng nhau mổ xẻ !..........
Đây là luồng căn bản về PIC mà bạn. Bạn có thể mở luồng PIC nâng cao .
Quyết định vậy đi. Hẹn bạn ở luồng nâng cao

robinson4u
23-02-2009, 06:32 PM
các anh cho em hỏi với.Nếu muốn thêm bộ nhớ ram cho vi điều khiển PIC 16F877A thì làm thế nào nhỉ.em chưa biết sao,các anh giúp em với nhé.

namqn
24-02-2009, 12:30 AM
các anh cho em hỏi với.Nếu muốn thêm bộ nhớ ram cho vi điều khiển PIC 16F877A thì làm thế nào nhỉ.em chưa biết sao,các anh giúp em với nhé.
PIC16F877A (và các vi điều khiển PIC nói chung) không được thiết kế để sử dụng RAM ngoài. Bạn vẫn có thể nối PIC16F877A với RAM ngoài thông qua các port I/O của PIC, nhưng tốc độ truy xuất RAM sẽ không cao hơn tốc độ vào ra dữ liệu của các port I/O này.

Bạn nên cho biết cần thêm bao nhiêu RAM, và tốt hơn nữa thì cho biết vì sao bạn cần bổ sung thêm RAM.

Thân,

lexuantien
24-02-2009, 09:05 AM
anh ntc sao a không post bài tiếp đi . E đang theo dõi luồng này , nó rất hay với lại e cũng mới tiềm hiểu con 16f877A thôi. Nên rất cần tài liệu về con này mong a giúp đỡ.

tung_bk02
26-02-2009, 03:35 PM
cho em hỏi vấn đề dùng 16f877A để giao tiếp pc qua ethernet, từ đó có thể nối ứng dụng điều khiển đo, hiển thị nhiệt độ, điều khiển tốc độ động cơ...

vtuan274
26-02-2009, 04:00 PM
anh nào có thể cho tư liệu về hình ảnh encoder va nguyên lí hoạt động của nó vớ

thienthan611
27-02-2009, 07:06 AM
anh ơi anh có thể giúp em thiết kế mạch sử dụng pic 16f877a (tính năng là dùng đề chạy chữ)giúp em lam zoi nha anh ntc,hoac ai làm được chỉ mình với nha.thanks nhiu

electronic
28-02-2009, 12:31 AM
Mình mới bắt đầu học Pic. Cũng đọc qua một số tài liệu. Viết xuất I/O cho 1 Led bằng cách khác thì chạy, còn cách này thì không. Mong các anh em chỉ giáo. Biết sai để hiểu hơn. Cảm ơn anh em.

#include <16F877A.h>
#use delay (clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
int1 x;
void main()
{ while(1)
{output_bit(pin_B1,!x);
delay_ms(250);
}
}

namqn
28-02-2009, 01:35 AM
Mình mới bắt đầu học Pic. Cũng đọc qua một số tài liệu. Viết xuất I/O cho 1 Led bằng cách khác thì chạy, còn cách này thì không. Mong các anh em chỉ giáo. Biết sai để hiểu hơn. Cảm ơn anh em.

#include <16F877A.h>
#use delay (clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
int1 x;
void main()
{ while(1)
{output_bit(pin_B1,!x);
delay_ms(250);
}
}
Theo tài liệu hướng dẫn của CCS C, cú pháp của hàm output_bit() như sau: output_bit(pin, value). Tham số pin có thể là biến, nhưng tham số value là hằng số (0 hay 1). Bạn đã dùng một biểu thức có chứa biến cho tham số thứ hai của hàm trong đoạn code của bạn.

Nếu bạn muốn lật trạng thái của chân B1, bạn có thể dùng hàm output_toggle() đã được CCS C cung cấp.

Thân,

electronic
28-02-2009, 02:31 AM
Cảm ơn anh namqn nhé. Anh cho em hỏi. Em muốn xoay bit ở 8 led đơn. Code em viết như sau:

#include <16F877A.h>
#fuses HS,NOLVP,NOWDT,PUT
#use delay(clock=4000000)
void main()
{ int16 i,count;

while(1)
{
count=1;
for (i=0;i<=8;i++)
{
output_A(count);
delay_ms(100);
count=count>>1;
}
}

}
Không hiểu sao chỉ chạy 6 led. Mong anh em chỉ dùm. Có cách nào để lưu 1 giá trị vào 1 thanh ghi rồi cho xoay k anh? Chẳng hạn lưu: b10000000 vào rồi cho rotate sang phải để dịch?

electronic
28-02-2009, 02:47 AM
Ah. Mình hiểu rồi. Port A chi có I/O từ RA0-RA5 thôi. Cám ơn anh em.

phandinh
28-02-2009, 05:38 PM
bác namqn chỉ cho em cách dùng timer được không?
.khởi tạo
.thiết lập giá trị ban đầu.

electronic
01-03-2009, 12:01 AM
Các anh trong dien đàn chỉ em phần này với. Em lập code cho chương trình led sáng dồn, nếu dùng xuất ra portB 0x01,0x02... thì dài quá nên em viết theo 1 kiểu khác. Không hiểu sai chỗ nào mà lại chạy sai, nhờ mấy anh chỉ giúp.

#include <16F877A.h>
#fuses HS,NOWDT,NOPUT,NOPROTECT, NOWRT
#use delay(clock=20000000)

void main()
{ byte i,led;
led=0x00;
while(1)
{ for(i=0; i<=8; i++)
{ led=led+2^i;
output_B(led);
delay_ms(200);
}
}
}

Xin cảm ơn.

namqn
01-03-2009, 01:24 AM
bác namqn chỉ cho em cách dùng timer được không?
.khởi tạo
.thiết lập giá trị ban đầu.
PIC16F877A có nhiều loại timer, tôi chỉ lấy ví dụ về Timer 1 ở đây. Giả sử tần số xung clock là 4 MHz, có nghĩa là mỗi chu kỳ máy (bao gồm 4 chu kỳ xung clock) sẽ kéo dài 1 us. Lại giả sử cần định thời 100 ms.

Nếu chọn xung clock thực thi lệnh là nguồn xung clock cho Timer 1, thì chúng ta cần đếm đủ 100000 chu kỳ máy (= 100000 us) để định khoảng thời gian 100 ms. Vì bộ đếm của Timer 1 chỉ có độ dài 16-bit, giá trị lớn nhất mà Timer 1 có thể đếm được mà không bị tràn là 65535. Do đó, chúng ta cần giảm tần số xung đi vào Timer 1 để có thể đạt được mục đích. Điều này có thể thực hiện bằng cách sử dụng bộ chia (tần) trước (prescaler). Bộ chia trước của Timer 1 trong PIC16F877A có thể chia 1, 2, 4, hay 8 tần số clock trước khi đưa vào Timer 1. Ở ví dụ này, tôi chọn hệ số chia là 8. Như vậy, số đếm mà Timer 1 sẽ đếm được ứng với 100 ms sẽ là 100000/8 = 12500. Vì Timer 1 chỉ tràn từ 0xFFFF về 0x0000, cần thiết lập trước giá trị của các thanh ghi TMR1H và TMR1L để sẽ tràn trong 12500 lần đếm, tức là giá trị TMR1 = 65536 - 12500 = 53026 = 0xCF2C. Xem thêm hình 6-2 trong datasheet của PIC16F877A để hiểu rõ hơn phần trình bày trên.

Code để thiết lập Timer 1 như sau:
T1CON = 0x30; // Prescale = 1:8, dung clock thuc thi lenh
TMR1H = 0xCF // TMR1 = 0xCF2C
TMR1L = 0x2C
T1CON = T1CON | 0x01; // Bat Timer 1


Trong chương trình chính, người dùng có thể xét trạng thái của bit TMR1IF (bit 0 của thanh ghi PIR1) để kiểm tra xem đã hết thời gian cần chờ hay chưa. Người dùng cần xóa bit TMR1IF này sau khi đã sử dụng xong để dùng cho lần định thời tiếp theo.

Một nhắc nhở nhỏ: Bạn nên tránh nêu đích danh người được hỏi, và chú ý là những câu hỏi loại này không phải chỉ có một vài người có thể trả lời.

Thân,

namqn
01-03-2009, 10:03 PM
Các anh trong dien đàn chỉ em phần này với. Em lập code cho chương trình led sáng dồn, nếu dùng xuất ra portB 0x01,0x02... thì dài quá nên em viết theo 1 kiểu khác. Không hiểu sai chỗ nào mà lại chạy sai, nhờ mấy anh chỉ giúp.

#include <16F877A.h>
#fuses HS,NOWDT,NOPUT,NOPROTECT, NOWRT
#use delay(clock=20000000)

void main()
{ byte i,led;
led=0x00;
while(1)
{ for(i=0; i<=8; i++)
{ led=led+2^i;
output_B(led);
delay_ms(200);
}
}
}

Xin cảm ơn.
Bạn thử lại với code sau xem:
#include <16F877A.h>
#fuses HS,NOWDT,NOPUT,NOPROTECT, NOWRT
#use delay(clock=20000000)

void main()
{ byte i,led;
led=0x00;
while(1)
{ for(i=0; i<=8; i++)
{ led = (led << 1) + 1;
output_B(led);
delay_ms(200);
}
}
}

Thân,

135246357
02-03-2009, 10:30 AM
chào các bác em mới bắt đầu học về vi điều khiển pic nên rất mong bác ntc sớm post bài lên kèm thêm giải thích câu lệnh thì hay quá

135246357
02-03-2009, 10:37 AM
ở đây có bác nào biết viết lập trình cho pic bằng ngôn ngữ ccs không?bảo em với có ví dụ minh họa thì tốt quá

lexuantien
02-03-2009, 11:42 PM
Bạn vào luồng này :
http://www.picvietnam.com/forum/showthread.php?p=2113#post2113.
Link download trình biên dịch CCS C ở đây: http://www.tailieuvietnam.net/downlo...CCSC_3.249.rar
Hiện nay đã có phiên bản mới hơn 4.0 rùi đó.
mình cũng mới học về nó thôi , chủ yếu là học trong phần Help của nó đó , có ví dụ rõ ràng lắm.

dhbk3i
03-03-2009, 12:09 AM
chào các bạn, mình đang làm đề tài về đo khoảng cách 5-10m kết hợp với vi xử lý, mình đang băn khoăn không biết trọn con cảm biến nào cho phù hợp, mong được sự góp ý từ các bạn, mình xin cảm ơn trước

kiwi
03-03-2009, 02:19 AM
Tôi đã làm được mạch điều khiển tốc độ động cơ DC, sử dụng pwm của 16f877a, tốc độ được điều khiển bằng biến trở thay đổi điện áp đưa vào chân RA1 (dùng chức năng ADC). Bây tôi giờ muốn khi nhập giá trị tốc độ trên máy tính thì tốc độ động cơ sẽ thay đổi theo, vậy phần mạch và phần chương trình phải cần có những gì, mong các bạn giúp đỡ.
(Trình độ diễn đạt hơi kém, các bạn thông cảm nhé)

phandinh
06-03-2009, 04:12 PM
anh em cho mình hỏi khi sử dụng Port B để xuất dữ liệu thì có chú ý gì đặc biệt
tới chân RB3 ko? hay chỉ cần thiết lập nó thành chân Output là đủ.( ASM)

phandinh
06-03-2009, 04:16 PM
Tôi đã làm được mạch điều khiển tốc độ động cơ DC, sử dụng pwm của 16f877a, tốc độ được điều khiển bằng biến trở thay đổi điện áp đưa vào chân RA1 (dùng chức năng ADC). Bây tôi giờ muốn khi nhập giá trị tốc độ trên máy tính thì tốc độ động cơ sẽ thay đổi theo, vậy phần mạch và phần chương trình phải cần có những gì, mong các bạn giúp đỡ.
(Trình độ diễn đạt hơi kém, các bạn thông cảm nhé)
Bạn xem luồng giao tiếp cổng COM,LPT của pác Ngohoaibac ấy

trananhpro
22-03-2009, 09:55 PM
Mình mới tìm đc một mạch nguyên lý điều khiển 3 động cơ bước dùng PIC16F877 nhưng mình có nhờ một người chuyên điện tử thiết kế lại thì anh đó lại dùng PIC16F887. Mình không biết 2 con đó có giống nhau không. Và xin được hỏi mọi người, trong 2 con đó thì con nào mới hơn, nhiều chức năng hơn. Cảm ơn

phandinh
22-03-2009, 11:43 PM
bạn search trên google là ra thôi. như mình thấy thì 2 con chức năng như nhau.
Thường thì xài F877 không à

nhanndt
23-03-2009, 10:35 AM
Mình có vấn đề muốn hỏi. khi mình viết xong chương trình trong MPLAB và build nó thì có 1 lỗi liên quan tới _config là "Error[126] E:\DOCUMENTS\HOC KY 8\DA THUC NGHIEM\TEST.ASM 3 : Argument out of range (not a valid config register address)"
Một vấn đề nữa là.Cũng file.asm đó trước đây mình build thì SUCCEEDED. Mà giờ build lại thì bị lỗi trên.Mình thử bỏ phần khai báo config thì build được mà file.hex đó thì lại chạy mô phỏng không được.Mong được chỉ dẫn!

phandinh
23-03-2009, 03:50 PM
bạn post bài lên đi

nhanndt
23-03-2009, 11:48 PM
cảm ơn! Mình đã chỉnh lại được rồi.Lý do là trong MPLAB mình chưa select device đúng loại PIC.

phudu1088
03-04-2009, 11:22 PM
anh ơi anh có mạch lịch vạn niên không anh giúp em với. anh post cho em được không

phudu1088
03-04-2009, 11:25 PM
ai có mạch lịch vạn niên không cho mình đi, mình đang làm đồ án.

thanhctdt07
08-04-2009, 12:34 PM
các bác ơi xin giúp đở cho em với em mới vào luống này và cảm nhận được sự nhiệt tình của các bác ở đây nhiều lắm !

Em có một vấn đề ở đây rất cần sự giúp đở của các bác!
em mới học môn vxl về viết chương trình cho pic
em tìm được một đề tài về con pic là dùng pic để điều khiển cái CD_ROM
có được đoạn chương trình để chạy no nhưng em muốn viết lại theo ý của mình là dùng các key nút nhấn để điếu khiển nó
trước tiên là dùng các lệnh kiểm tra trục tiếp xem nút nào ở trạng thái được nhấn và xuất dử liệu ra cổng IDE của CD_ROM
VD: kiểm tra thấy trạng thái của nút nhấn play đang ở mưc thấp (đang nhấn) thì phải xuất dữ liệu ra chân số mấy ở cổng IDE của CD_ROM là mức cao hay mức thấp (chẳng hạn như lệnh để cho CD_ROM play thì cần cáu trúc lệnh xuất ra cổng IDE là: IDE1=0,IDE0=1,IDE2=1,IDE3=1,IDE4=0.......)nói chung là cấu trúc ngỏ ra của nó là dạng số nhị phân (xuất ra các port của pic)
đây là các tài liệu mà em tìm được nhưng khi ngâm cứu thì gặp phải quá nhiều khó khăn vì trình độ em còn quá thấp ko thể hiểu hết được cấu trúc lệnh của chương trình mong các bác chỉ bảo thêm cho.vị trí các chân của pic nối với cổng IDE em lấy giống như trong hình vẽ cho dể kiểm tra còn phần chương trình của LCD thì em ko dám đụng tới chỉ làm phấn điều khiển thôi (gà mà hjx hjx)mong các bác tận tình giúp đở cảm ơn rất nhiều!!!!!!!

thanhctdt07
14-04-2009, 10:34 AM
hix hix anh em trên diễn đàn đâu hết rùi!!!!!!!!!!!
hix có người tải mà ko có người trả lời kỳ zậy ta??????????

luongnhut
14-04-2009, 12:15 PM
e đang xài thạch anh 20Mhz,2 tụ 33p cho con 16f877a, mạch chay tốt mà không hiểu tại sao khi e lấy tay chạm vào 1 chân thạch anh nối vào chân OSC1/CLK(13) thi mạch bị đứng lại, thả tay ra lại hoạt động binh thường, mấy pác giúp e khắc phục lỗi này của e với

phandinh
14-04-2009, 01:23 PM
không chạm vào nữa

laka
16-04-2009, 11:40 AM
có bạn nào chỉ giúp mình cách thiết lập interrupt serial port của pic16f877a được không?
cảm ơn nhiều...!

laka
16-04-2009, 11:42 AM
mình dùng mikroc.

namlong782004
17-04-2009, 11:47 AM
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,

Xin lổi vì có một thac mắc nhỏ:
Trong 8051, thường câu lệnh này để khai báo biến count1 bằng giá trị 0X20. Để khai báo byte nhớ : Count1 DB 0X20. Không biết lời giải thích trên có chính xác or là trong PIC nó khác.

namqn
17-04-2009, 05:35 PM
Xin lổi vì có một thac mắc nhỏ:
Trong 8051, thường câu lệnh này để khai báo biến count1 bằng giá trị 0X20. Để khai báo byte nhớ : Count1 DB 0X20. Không biết lời giải thích trên có chính xác or là trong PIC nó khác.
Với 8051, count1 trong "count1 equ 0x20" vẫn không phải là biến, mà chỉ là một giá trị hằng (0x20). count1 trong "count1: DB 0x20" là một nhãn để truy xuất giá trị hằng 0x20 trong vùng bộ nhớ chương trình hay vùng bộ nhớ cho const (giá trị của count1 lúc này không thể xác định trước, vì nó do trình hợp dịch cấp phát).

Thân,

tienc14
20-04-2009, 10:52 AM
Em mới nghiên cứu Về Pic, đọc bài viết của bác Chính rất hay và dễ hiểu. Rât mong bác Chính tiếp tục post bài thường xuyên.

ducbinh
21-04-2009, 10:30 AM
Em cũng mới học PIC ,thử viết một đoạn chương trình gửi tín hiệu từ bộ chuyển đổi ADC có sẵn trong PIC lên máy tính nhưng mô phỏng bằng Protues mà chưa thấy chạy,mọi người xem xét chỉnh sửa lại đoạn code cho mình với ,Thanks

#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC = 10
#fuses NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP, NOCPD,NOWRT
#use delay(clock = 20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=9)
#int_ad

conversion_isr()
{
char c;
float value;
value = read_adc();
c=(char)value;
putc(c);
}
void main()
{
trisa=0xff;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(10);

enable_interrupts(int_ad);
enable_interrupts(GLOBAL);
while(1);
}

ducbinh
21-04-2009, 10:37 AM
có bạn nào chỉ giúp mình cách thiết lập interrupt serial port của pic16f877a được không?
cảm ơn nhiều...!

enable_interrupts(int_rda); //thiết lập ngặt nhận
enable_interrupts(int_tbe); //thiết lập ngặt truyền
enable_interrupts(GLOBAL);

#INT_RDA //Hàm xử lí ngắt truyền
Receive_isr() {};
#INT_TBE //Hàm xử lí ngắt nhận
Tranmit_isr() {};

laka
22-04-2009, 10:40 PM
cảm ơn bạn ducbinh.

laka
22-04-2009, 10:53 PM
có anh em nào chỉ giúp mình thật đơn giản về cách thiết lập chức năng counter của 16f877a được không? mình có tìm hiểu rồi, nhưng còn rất mơ hồ về vấn đề đếm đồng độ và không đồng bộ.
cảm ơn nhiều...!

hoangquan_d
23-04-2009, 08:41 PM
các bác giúp với, em đang tìm sơ đồ mạch điều khiển động cơ step dùng pic 16f877a sử dụng nút nhấn( đièu khiển thuận nghịch) mà chưa có. bác nào có thi post lên cho em xin. cảm ơn nhiều

newboystylew
06-05-2009, 09:20 PM
anh nct oi cho em hỏi: trên broad điều khiển của mạch đồng hồ thời gian thục RTC thì J2,J3,J5,J6 được nối đi đâu

phamgon
15-05-2009, 12:16 AM
Chào tất cả mọi người!Em là người mới bắt đầu tìm hiểu về Pic! Mong sau này sẽ được sự chỉ giáo nhiệt tình của mọi người!
Cho em hỏi đã có những bài tiếp theo Pic16f877a TỪ DỄ TỚi KhÓ chưa ah!
Cảm ơn Bác Chính đã viết ra làm tài liệu cho anh em tham học hỏi! mong bác viết chi tiết nuă để những người tự tìm hiểu về Pic như em có thể hiểu được!
thân!!

the_duyet
23-05-2009, 09:03 PM
e đang xài thạch anh 20Mhz,2 tụ 33p cho con 16f877a, mạch chay tốt mà không hiểu tại sao khi e lấy tay chạm vào 1 chân thạch anh nối vào chân OSC1/CLK(13) thi mạch bị đứng lại, thả tay ra lại hoạt động binh thường, mấy pác giúp e khắc phục lỗi này của e với

sao giống mình thế.mình cũng hỏi nhưng ko có ai trả lời.mỗi tội cái của mình nó chạy ko ổn định.chứ ko như bạn là chạy tốt.đi hỏi ngoài thì có người bảo thay tụ 33p=22p(đã thay nhưng vẫn vậy).còn bản chất ở đâu thì mình chịu chết.

bk_bfp
23-05-2009, 09:10 PM
cảm ơn anh ntc đã viết bài này, em đang nghiên cứu về pic để làm mạch robot. em cũng chỉ là beginner nên sẽ rất nhiều nhũng bài viết như thế này của anh. Thanks

falleaf
23-05-2009, 10:24 PM
Đề tài này đã cũ, nên chúng tôi khóa lại.

Hiện nay tất cả các sản phẩm sử dụng PIC16F877A đều có thể thay thế bằng PIC16F887 với giá thành thấp hơn nhiều, vì vậy, chúng ta sẽ không phân tích phát triển PIC16F877A nữa mà chuyển qua sử dụng PIC16F887 hết các bạn ạ.

Những kỹ thuật và nội dung sử dụng cho 877A đều có thể thay thế và sử dụng trên 887. Tuy nhiên, cứ thảo luận về 877A thì sẽ làm cho những người đi sau hiểu sai về PIC và sẽ không phát triển đúng hướng.

Chúc vui.