PDA

View Full Version : Ứng dụng nhỏ với Pic


minhsondaklak
24-07-2008, 10:17 PM
Được học Pic thì thích rồi, nhưng mình nghĩ phải làm một cái ứng dụng thực tế với Pic thì mới khoái được (mini thôi, cho mau thấy !).
Ở nhà các bạn có chơi cá kiểng không? ở hồ cá kiểng thì thường phải có cái bơm lọc nước nho nhỏ, để lọc cho nước trong ấy mà. Nếu không có nó thì cá chẳng sống được mấy ngày, mà có nó thì sao ... tiếng ù ù nho nhỏ thôi nhưng liên tục ngày đêm không nghĩ, lắm khi mất điện một phát nghe nhẹ cả người ! Hẳn là tiếng ù ù kia cũng đã làm căng thẳng mấy sợi thần kinh chứ chẳng chơi đâu (ban đêm càng tệ).
Sẵn những kiến thức học được trên PicVietnam này, tôi làm luôn 1 cái mạch điều khiển cho cái bơm lọc nước hồ cá kiểng kia cho đỡ ù tai ! Ý tôi là cho nó chạy chừng chừng, 10 phút ON, lại OFF 10 phút, ban đêm cho nghĩ hẳn ...
Làm cái này tôi đã "nạp" cở 99% cái "Lịch vạn niên" của Bác Thép trên diễn đàn đây vào cho con Pic của mình (à mà tôi phải cám ơn và xin lỗi bác Thép cái đã !), và tôi cũng dùng MikroC. Xin mời các bác mới mày mò em PIC như tôi cùng tham khảo:
Linh kiện: Pic16F877A, thạch anh 4Mhz, IC ds1307.


unsigned short set, luu, giay, phut, gio, thu, ngay, thang, nam, flag1, flag2, delay1s = 0, delay1p = 0;
//Giai thich cac bien:
//set, luu: truy cap dia chi 0x07, 0x08 cua DS1307, xu ly khi mat nguon pin nuoi, phai set lai ds1307
//giay, phut ...nam : cac bien truy cap thoi gian tu ds1307
//flag1, flag2: cac co tin hieu; delay1s, delay1p: bien dem ngat tran, tinh chu ky giay, phut

void INIT_MAIN() // Khoi tao cac PORT, NGAT, I2C
{
/* Khoi tao cong B -----------------------------------------------------------*/
TRISB = 0xFF; // Dinh nghia cong B la Digital Input
PORTB = 0x00;
/* Khoi tao cong C Out put----------------------------------------------------*/
TRISC = 0x00;
PORTC = 0x00;
TRISD = 0x00;
PORTD = 0x00;
/* Khoi tao I2C voi toc do baud = 100khz --------------*/
I2C_Init(100000);
/* Khoi tao ngat ngoai va Timer0 ---------------------------------------------*/
INTCON= 0xB0; // Mo ngat xoa co ngat
OPTION_REG = 0x87; // Chon suon, bo ti le 1:256 Timer0
TMR0 = 0x00; //Xoa ve 0 (cho dem tu 0 den 256)
}
/*
Voi Fta=4Mhz -> Chukymay =4/4Mhz=1 us, hesochia = 256 -> T =1x256x256=65536 us =~ 65,5 ms
Vay ta can: 1000 / 65,5 =` 15 lan tran de co 1 s, 15 x 60 = 900 lan tran de co 1 phut
*/

void SET_12h() //Ghi vao ds1307, gia tri 12 gio 00 phut, khi co bam nut SET_12h (thay vi phai dung man hinh LCD)
/*Luu y: DS1307 co dia chi I2C la 0xD0, no co 7 thanh ghi thoi gian tu 0x00 -:- 0x06. cac thanh nay lam viec voi so o dang ma BCD,
Thanh ghi 0x07 la thanh ghi dieu khien DS1307. Tu thanh 0x08 tro di la RAM trong*/
{
I2C_Start(); // Phat bit STAR I2C
I2C_Wr(0xD0); // Truyen d/c cua DS1307 la 0xD0 len duong truyen I2C
I2C_Wr(0x00); // Truyen dia chi o nho dau tien cua ds1307, 0x00
I2C_Wr(0x00); // Ghi gia tri ban dau bang 0, cho thanh ghi giay tai 0x00
//I2C_Wr(0x00); //Ghi 00 cho phut
I2C_Wr(0x07); // Chay thu: Ghi Phut = 07,
I2C_Wr(0x12); // Ghi ... Gio = 12 tai 0x02
I2C_Wr(0x06); // Ghi ... Thu bay, tai 0x03
I2C_Wr(0x19); // Ghi ... Ngay 19, tai 0x04
I2C_Wr(0x07); // Ghi ... Thang 7, tai 0x05
I2C_Wr(0x08); // Ghi ... Nam 2008, tai 0x06
I2C_Wr(0x90); // Ghi cau hinh cho thanh dieu khien (tai 0x07)
I2C_Wr(0x55); // Lam dau tai d/c 0x08, theo doi nguon pin ds1307
I2C_Stop(); // Phat bit STOP I2C
}

void READ_DS() //Doc gio, phut, giay ... tu ds1307
{
I2C_Start(); // Phat bit Star I2C
I2C_Wr(0xD0); // Truyen dia chi Slave (0xD0)len duong truyen I2C
I2C_Wr(0x00); // Truyen d/c can truy cap (tai 0x00) den slave
I2C_Repeated_Start(); // Khoi dong lai I2C
I2C_Wr(0xD1); // Truyen d/c Slave+1 = 0xD0+1 = 0xD1
giay = I2C_Rd(1u); // Doc du lieu tai d/c 0x00, phat bit ACK (se doc tiep)
phut = I2C_Rd(1u); // Doc o tiep theo (0x01)
gio = I2C_Rd(1u); // tiep ....0x02
thu = I2C_Rd(1u); // Doc thu, tai d/c 0x03
ngay = I2C_Rd(1u); // Doc ngay, tai 0x04
thang = I2C_Rd(1u); // Doc thang, tai 0x05
nam = I2C_Rd(1u); // Doc nam, tai d/c 0x06
set = I2C_Rd(1u); // Doc d/c 0x07 (doc cho qua, khong dung)
luu = I2C_Rd(0u); // Doc d/c 0x08 (gia tri 0x55) phat bit NACK (thoi)
I2C_Stop(); // Phat bit STOP I2C
}

void HIEN_THI() //Dung hien thi gio phut, dang ma nhi phan BCD
{
PORTD = gio; Delay_ms(2000); PORTD = 0; Delay_ms(2000); //xem gio, dang BCD
PORTD = phut; Delay_ms(2000); PORTD = 0; //xem phut, dang BCD
}

void ON_OFF() //Kiem tra gio -> cho ON, OFF chan PORTC.F0:
/*Neu ban ngay (tu 6h den 20h) dong thoi so hang chuc cua phut la so chan thi ON, la
so le thi OFF (ON 10 phut, OFF 10 phut)
Neu ban dem (21h den 5h)thi OFF*/
{
gio = Bcd2Dec(gio); phut = Bcd2Dec(phut);
if (6 <= gio && gio <= 21) // set thoi gian ON vao ban ngay
{
if ((phut / 10) % 2 == 0) // neu chu so hang chuc cua phut là so chan
{if (PORTC.F0 == 0) PORTC.F0 = 1;} //thi ON
else
{if (PORTC.F0 == 1) PORTC.F0 = 0;} // la so le thi OFF
}
else
{if (PORTC.F0 == 1) PORTC.F0 = 0;} // ban dem cho OFF luon
}

void interrupt() //Chuong trinh NGAT
/*Luu y: MikroC chi co 1 ham ngat chung
MikroC cung khong cho goi ham trong ngat*/
{
//Xu ly cho ngat timer0:
if (INTCON.T0IF) //Neu ngat la dinh thoi timer0, co bao 1 (65,5ms)
{
delay1s++; //Tang bien dem len 1 don vi, moi khi tran timer0
if (delay1s == 15)
{
delay1p++; // 1 giay tang len 1
PORTC.F1 = ~PORTC.F1; //Lam den nhay theo nhip 1 giay
delay1s = 0;
}
if (delay1p == 60) //Neu du 900 lan tran = (60 x 15) x 65,5ms ~ 1 phut, se bat co flag1 len 1 lan, roi xoa delay1p ve 0, dem lai tu dau
{
flag1 = 1; // Tin hieu da troi qua 1 phut
PORTC.F2 = 1; Delay_ms(1000); PORTC.F2 = 0; //Den bao da qua 1 phut
delay1p = 0; // xoa ve 0, dem lai tu dau
}
INTCON.T0IF = 0; //Xoa co ngat time0
}
//Xu ly cho ngat ngoai : (khi co xung ngoai vao chan PORTB.F0)
if (INTCON.INTF) //Neu la ngat ngoai, co bao 1
{
flag2 = 1; //Tin hieu: Co bam nut SET
INTCON.INTF = 0; // Xoa co ngat ngoai
}
} //Het interrup

void MAIN() //CHUONG TRINH CHINH
{
INIT_MAIN(); //khoi tao cac PORT, NGAT, I2C
READ_DS(); //Doc ds1307
//Neu mat gia tri 0x55 tai d/c 0x08 thì set lai ds1307, truoc khi Bat dau
if (luu != 0x55) {SET_12h(); Delay_ms(100);}
HIEN_THI(); //Xemi gio, phut dang ma nhi phan BCD, xuat tren PORTD
while (1)
{
if (flag1 == 1) {READ_DS(); HIEN_THI(); ON_OFF(); flag1 = 0;} //Khi co tien hieu da qua chu ky 1 phut thi cho doc ds1307, kiem tra, xuat tin hieu ra PORTC.F0
if (flag2 == 1) {SET_12h(); flag2 = 0;} //Khi co tin hieu bam nut SET_12h, cho ds1307 ve 12 gio trua (lay gio theo dong ho, luc 12 gio trua)
}
}


Kèm theo file mô phỏng trên Proteus. Có 1 điều:
Không hiểu sao, khi chạy mô phỏng thì OK 100%
Còn chạy trên mạch thực tế thì có chuyện, mà tôi chưa lý giải được: Sau khi khởi động được 30 giây thì mạch đã nháy đèn phút rồi (đã qua 1 phút = 900 lần tràn timer0, không đúng!), từ phút thứ 2 trở đi thì vẫn đủ 60 giây. Chỗ này chắc phải nhờ đến các Sư Huynh chỉ giúp thôi !
À còn về mạch điện, vì không rành lắm nên tôi chơi thẳng chân con Pic vào cổng Triac, chắc không ổn. Có gì nhờ các Huynh luôn (về xử lý giao tiếp cách ly giữa Pic và Triac - mang điện 220v)

Lưu ý, mạch này không có LCD nên hơi kén người xem và chỉnh giờ cho nó 1 chút:
- Cứ 1 phút nó báo giờ 1 lần, nhưng ở dạng mã nhị phân BCD à nghen (xuất trên PORTD)
- Muốn chỉnh giờ theo đồng hồ thì phải đúng ngọ đó, (đúng 12 giờ trưa, nhấn vào cái nút duy nhất đó) hơi bị mê tín đó !

lion
24-07-2008, 10:58 PM
sao huynh ko dùng CCS cho dễ .
mạn phép hỏi huynh vài câu có gì ko phải huynh bỏ qua nhé :

chương trình của huynh ko có nút thiết lập : giờ ,phút, giây, thứ, ngày, tháng ,năm
ngộ nhỡ có thằng tẻ con nào táy máy nó rút mất pin 3V nuôi cho DS1307 , thế thì huynh lại phải xạc lại chương trình cho DS1307 à.

chương trình của huynh bật tằt sau 10 phút thế sao ko nấy luôn từ trong DS1307 ra mà dùng , huynh dùng time0 làm gì cho mệt mă lại con gây ra sai số nữa chứ .

minhsondaklak
24-07-2008, 11:33 PM
Xin chào Lion !
Hay quá, đằng ấy cũng đang online à !
Ừ cậu nói có lý đấy, mình xin hồi âm nhé :
- Mình lên PicVietnam mới làm quen với PIC, vớ được cái "lịch vạn niên" của bác Thép, thế là theo MikroC luôn (Tất nhiên cũng đã qua CCS để học Pic trên diễn đàn này rồi mới đọc được cái "lịch vạn niên" ấy chứ ! mà mình thấy MikroC nó hổ trợ sẵn các hàm I2C sướng quá, mần luôn).
- Không có nút chỉnh ngày, tháng, năm: Vì cái này chỉ chạy lòng vòng 24 tiếng thôi. Mạch ứng dụng không phải đem lại hiệu quả gì, chủ yếu là để học nên mình chỉ làm 1 cái nút duy nhất (để lấy giờ vào đúng 1 thời khắc trong ngày là 12 giờ trưa) cho đỡ tốn tiền mua LCD. Lỡ đứt pin lắp lại thì cứ phải chờ đúng ngọ, nhấn dùm vào cái nút. Lỡ qua ngọ rồi ...thì phải chờ đến ngọ ngày hôm sau vậy.
Bạn lưu ý đoạn xử lý tự động xạc lại cho ds1307 khi mất nguồn pin, mình mới học được của meishun đó.
- Sao không lấy 10 phút từ ds1307: Ý này hay đây, tớ phải chôm mới được (cám ơn lion nhé)
Có điều cũng chỉ hơi mệt thôi chớ sai số thì không, Timer0 chỉ canh chừng 1s thì cho nháy đèn báo giây, chừng 1 phút thì cho đọc ds1307 1 lần thôi (đọc gì cho nhiều ... cá kiểng mà), giờ phút sử dụng vẫn lấy từ ds1307 mà.
Ý mình muốn bắt con Pic phải làm đồng thời nhiều việc trong cùng 1 lúc thử coi thế nào, muốn vậy thì phải khai thác ngắt Timer của nó đó. Như thế này thì trong con Pic có 2 luồng xử lý công việc đồng thời -> về lý thuyết mạch chạy mượt hơn so với dồn hết vào đọc ds1307, Pic chỉ xử lý 1 luồng nên ì ạch hơn (nói péc !!!)
Lại nữa: nếu làm như bạn, thì đâu được chứng kiến cái cảnh "một phút chỉ có 30 giây !"

Xin cám ơn Lion nhiều nhé! Rất mong được góp ý, hẹn gặp lại.

namqn
24-07-2008, 11:35 PM
Bạn có hứng thú làm cho nó gọn nhẹ, rẻ tiền hơn nữa không? Vì chip PIC16F877A và DS1307 cũng khá tốn tiền và cồng kềnh cho cái ứng dụng nho nhỏ này.

Liệu có bạn nào có hứng thú chuyển thành thiết kế chỉ sử dụng 1 PIC 8/18 chân không?

Thân,

thaithienanh
25-07-2008, 12:16 AM
Bạn có hứng thú làm cho nó gọn nhẹ, rẻ tiền hơn nữa không? Vì chip PIC16F877A và DS1307 cũng khá tốn tiền và cồng kềnh cho cái ứng dụng nho nhỏ này.

Liệu có bạn nào có hứng thú chuyển thành thiết kế chỉ sử dụng 1 PIC 8/18 chân không?

Thân,

uhm hihi, với ứng dụng này các bạn hoàn toàn có thể chỉ dùng một con pic 8 chân, miễn là tối thiểu bên trong nó có chứa bộ định thời timer0 ;) xem như bài tập nâng cao á, bao giờ xong bài đó các bạn có thể chuyển qua bài này làm cho vui ^.^

minhsondaklak
25-07-2008, 12:25 AM
Tuyệt vời, gặp Trưởng lão đây rồi, xin bái sư phụ 1 bái thôi !
Chà chà, Sư Huynh ra đề hơi khó cho mấy đệ rồi, làm I2C bằng phần mềm thì em phải chờ Huynh chỉ thêm mới dám đụng vào.
Còn không dùng ds1307 thì em nghĩ mãi mà đành chịu, chẳng lẽ cho con Pic chạy pin được à anh Namqn ??? nếu thế thì cũng đáng thật !

namqn
25-07-2008, 12:34 AM
Tuyệt vời, gặp Trưởng lão đây rồi, xin bái sư phụ 1 bái thôi !
Chà chà, Sư Huynh ra đề hơi khó cho mấy đệ rồi, làm I2C bằng phần mềm thì em phải chờ Huynh chỉ thêm mới dám đụng vào.
Còn không dùng ds1307 thì em nghĩ mãi mà đành chịu, chẳng lẽ cho con Pic chạy pin được à anh Namqn ??? nếu thế thì cũng đáng thật !
Bạn đọc kỹ lại 2 post ngay phía trên, chỉ dùng 1 PIC thôi mà, làm gì có DS1307 ở đây mà phải viết I2C bằng phần mềm.

PIC có thể chạy ở áp nguồn 2 V, trong khi DS1307 cần pin 3 V để nuôi nó khi mất nguồn. Vậy có thể mượn cục pin của DS1307 để dùng cho PIC, nhằm duy trì đồng hồ lúc mất nguồn.

Thân,

minhsondaklak
25-07-2008, 09:45 AM
Xin cám ơn anh nhiều !

Dùng pin cho Pic thì giảm ngay được con ds1307, tốt quá ! Em sẽ làm lại, phải kiếm mấy con Pic mini đó mới được.

Tiện thể anh Namqn có thể chỉ giúp có thể kiếm con Pic 16F84 và con Pic 8 chân (không nhớ tên) ở đâu được. Em đã gởi mua ở Sài Gòn và Nha Trang rồi mà không tìm được.

dark_electron
25-07-2008, 10:04 AM
Bác này ở đâu vậy? Nếu mua ko được liên hệ tui nhé :D Tui ở Nha Trang nè. 16F84 cũng có số chân như 16F628A mà con kia lại thêm được nhiều chức năng hơn, giá cả cũng ngang nhau sao ko xài 16F628A cho nó sướng?
Có gì liên lạc qua mail: hhai.le@gmail.com

lion
25-07-2008, 11:36 PM
Con PIC16F84 tui hỏi ngoài chợ trời cũng gần = PIC16F877 thế thì thay đổi có tác dụng gí chứ các bác .
với lại mục đích chính là chúng ta là đang học chứ có phải là làm hàng loạt đâu mà tính toán làm gì phải ko các bác

namqn
25-07-2008, 11:48 PM
Xin cám ơn anh nhiều !

Dùng pin cho Pic thì giảm ngay được con ds1307, tốt quá ! Em sẽ làm lại, phải kiếm mấy con Pic mini đó mới được.

Tiện thể anh Namqn có thể chỉ giúp có thể kiếm con Pic 16F84 và con Pic 8 chân (không nhớ tên) ở đâu được. Em đã gởi mua ở Sài Gòn và Nha Trang rồi mà không tìm được.
Tôi không nắm tình hình thị trường VN ra sao (vì tôi ở nước ngoài vài năm rồi). Tuy nhiên, bạn có thể hỏi thăm ở các luồng tìm mua sản phẩm của picvietnam và dientuvietnam. Các chip đáp ứng yêu cầu là PIC12F609/629/635/675/683, PIC16F688/716, và các chip tương tự.

Không nên tìm mua PIC16F84(A).

Thân,

lion
25-07-2008, 11:51 PM
Trích dẫn ý kiến of bác minhsondaklak : " Mình lên PicVietnam mới làm quen với PIC, vớ được cái "lịch vạn niên" của bác Thép, thế là theo MikroC luôn (Tất nhiên cũng đã qua CCS để học Pic trên diễn đàn này rồi mới đọc được cái "lịch vạn niên" ấy chứ ! mà mình thấy MikroC nó hổ trợ sẵn các hàm I2C sướng quá, mần luôn). "


em chưa tìm hiểu về phần mềm MikroC nên ko biết nó hỗ trợ những hàm gì .
còn CCS bản 4.068 hỗ trợ đầy đủ các hàm thoải mái cho các bác dùng .

namqn
25-07-2008, 11:59 PM
Con PIC16F84 tui hỏi ngoài chợ trời cũng gần = PIC16F877 thế thì thay đổi có tác dụng gí chứ các bác .
với lại mục đích chính là chúng ta là đang học chứ có phải là làm hàng loạt đâu mà tính toán làm gì phải ko các bác
PIC16F84 là trường hợp đặc biệt, bạn không thể lấy nó làm minh họa cho lý luận của bạn. Microchip đã đưa PIC16F84 vào danh sách chip lỗi thời, còn PIC16F84A thì được khuyến cáo thay thế bằng PIC16F88, giá bằng khoảng 2/3 với nhiều ưu điểm hơn.

Tôi cho rằng học PIC với nhiều người là để tìm hiểu, nắm bắt thêm kiến thức. Do đó, cái được lớn nhất không phải là tiết kiệm được ít tiền, hay làm cho mạch nhỏ hơn, đẹp hơn một chút, mà chính là việc chúng ta khẳng định được khả năng cải tiến thiết kế, khẳng định được việc cải tiến là khả thi, và hơn hết là chúng ta học được điều gì đó từ những bài toán nhỏ như vậy.

Những phần mềm, hay thiết kế mà bạn có được một cách miễn phí trên mạng thường bắt nguồn từ những nhu cầu cá nhân, và sau đó tác giả không ngại chia xẻ với người khác, vì giữ riêng cho họ không có lợi bằng chia xẻ với những người khác.

Ít nhất, sau khi làm xong bài tập này, bạn biết được rằng nếu có thuê người khác làm thì mức chi phí bao nhiêu là xứng đáng.

Thân,

lion
26-07-2008, 12:10 AM
he he bác làm gì mà phê bình em ghê thế .

vandungevn
26-07-2008, 12:42 AM
Chia sẻ lên mạng thì sẽ có nhiều người được học và tham khảo, hãy cho đi để nhận được những thứ tốt đẹp hơn. mỗi người góp chút là có sự thành công lơn đó => cho nền điện tử của Việt nam.

quocanh_bmt
26-07-2008, 10:06 AM
có bạn nào co tài liệu lập trình cho pic bằng tiếng việt ko

minhsondaklak
27-07-2008, 05:12 AM
Bác này ở đâu vậy? Nếu mua ko được liên hệ tui nhé :D Tui ở Nha Trang nè. 16F84 cũng có số chân như 16F628A mà con kia lại thêm được nhiều chức năng hơn, giá cả cũng ngang nhau sao ko xài 16F628A cho nó sướng?
Có gì liên lạc qua mail: hhai.le@gmail.com

Xin chào và cám ơn Dark_electron nhé!
Từ sáng hôm qua mình đã nhờ mua ở Đà Nẵng được 2 con Pic 16F84 rồi, giá hơi cao (hàng hiếm mà) thế mới đau chứ ! Bác là nhà cung cấp hay dân chơi Pic vậy ? Em xin liên hệ Bác sau nhé.
Trao đổi với các bác mới thấy mình lạc hậu quá !!!

Mình ở Đăk Lăk, mail: minhsondaklak@yahoo.com. Hẹn gặp lại !

minhsondaklak
27-07-2008, 05:17 AM
Có Huynh nào đã làm mạch có dùng Pin dự phòng cho Pic không, chỉ giúp với, cả phần cứng lẫn phần mềm. Có gì xin cám ơn trước !
đ/c mail: minhsondaklak@yahoo.com, mong hồi âm.

lion
27-07-2008, 09:34 AM
bác tham khao mach này nhé :

mạch này sẽ tự động cấp điện = PIN khi mất nguồn cấp chính,
ngược lại khi có nguốn cấp chính thì nguồn từ PIN bị vô hiệu hóa

minhsondaklak
27-07-2008, 09:59 AM
Cám ơn Lion!
Mà file MDI mình chưa xem được, nó là file hình hay file text vậy, bạn có thể chỉ cách xem được file này với.

lion
27-07-2008, 09:12 PM
nó là file " Microsoft Office Document Image" . bạn cứ cài Microsoft Office Word 2003 (2007)
đầy đủ ra là đọc được

minhsondaklak
31-07-2008, 12:23 PM
Trích dẫn ý kiến of bác minhsondaklak : " Mình lên PicVietnam mới làm quen với PIC, vớ được cái "lịch vạn niên" của bác Thép, thế là theo MikroC luôn (Tất nhiên cũng đã qua CCS để học Pic trên diễn đàn này rồi mới đọc được cái "lịch vạn niên" ấy chứ ! mà mình thấy MikroC nó hổ trợ sẵn các hàm I2C sướng quá, mần luôn). "


em chưa tìm hiểu về phần mềm MikroC nên ko biết nó hỗ trợ những hàm gì .
còn CCS bản 4.068 hỗ trợ đầy đủ các hàm thoải mái cho các bác dùng .

Ừ nhỉ, xin lỗi mọi người vì lúc đó mình cũng chưa kịp biết rõ về trình dịch nào cả, chỉ thấy đề tài "lịch vạn niên" bác Thép trình bày dễ tiếp thu, áp dụng cho người mới bắt đầu (trong khi đó mình đang làm bài LCD, phải loay hoay tìm file cấu hình LCD đưa vào mới xong, còn I2C thì chỉ seach được toàn hợp ngữ, đọc hoa cả mắt).
Mà cơ bản cũng giống nhau: kỹ năng dùng C và cùng thao tác trên Pic

Àm mà sao cả tuần rồi mình không thể truy cập vào Picvietnam thế nhỉ, không biết có chuyện gì không ? đằng ấy có bị như thế không. Cảm ơn nhiều về mạch nguồn dự phòng cho PIC !

minhsondaklak
31-07-2008, 12:31 PM
có bạn nào co tài liệu lập trình cho pic bằng tiếng việt ko

Trên này mà không có thì ở đâu có ? bạn phải chịu khó tìm xem một tí đi. Vào được đây rồi thì cứ bình tỉnh mà nghiên cứu về Pic nhé !

minhsondaklak
04-08-2008, 07:25 AM
Theo gợi ý của anh Namqn, mình làm lại mạch điều khiển cho cái bơm nước hồ cá, dùng Pic 18 chân, chỉ dùng timer0 - vừa rẻ vừa gọn, rất cạnh tranh (he he).

http://i452.photobucket.com/albums/qq247/minhsondaklak/HenGio_Timer.png

A. Hoat dong:
- Dieu khien : Ban dem OFF. Ban ngay ON 10 phut, OFF 10 phut (PORTA.F3)
- Moi phut bao gio 1 lan, duoi dang ma nhi phan BCD, xuat tren cong B.
- Chinh gio: Dung 19 gio, nhan vao nut SET_19h de lay 19h cho dong ho, thay vi dung LCD
B.Cau hinh phan cung: Pic 16F84A (hoặc Pic 16f88/16f628A với CMCON = 0x07), Thach anh 4Mhz
- Su dung Timer0 lam dong ho, bo tri mach nguon du phong cho Pic = 3v.
- PORTA.F0 la ngo vao noi voi nut nhan SET_19h, cho dong ho ve dung 19 h
- PORTA.F1 noi voi den bao giay
- PORTA.F2 noi voi den bao phut
- PORTA.F3 la ngo ra dieu khien Relays, dong mo thiet bi may bom (ON = 0, OFF = 1)
- PORTB ngo ra 8 bit bao gio, phut dang ma nhi phan BCD
- Ngat Time0: Cung cap xung 65,5 ms cho dong ho.
Sau moi giay nhay den giay, 1 phut cho nhay led phut va xem xet ON_OFF chan PORTA.F3

C. Giai thich cac bien:
- gio, phut : cac bien luu thoi gio
- flag: co bao theo chu ky phut, dung de xu ly cong viec ngoai ham ngat mikroC
- delay1s, delay1p: bien dem ngat tran, tinh chu ky giay, phut
Trình dịch MikroC:


unsigned short tem1, tem2, phut, gio, flag, delay1s = 0, delay1p = 0;

void INIT_MAIN() // Khoi tao cac PORT, NGAT, I2C
{
/* Khoi tao cong B -----------------------------------------------------------*/
TRISB = 0x00;
PORTB = 0x00;
/* Khoi tao cong A ----------------------------------------------------*/
TRISA = 0x01;
PORTA = 0x08;
/* Khoi tao Timer0 ---------------------------------------------*/
INTCON = 0b10100000;
OPTION_REG = 0b10000111;
TMR0 = 0x00; //Xoa thanh dem Timer0 (cho dem tu 0 den 256 -> 256 chu ky may)
//Voi Fta=4Mhz -> Chukymay =4/4Mhz=1 us, hesochia = 256 -> T =1x256x256=65536 us =~ 65,5 ms
//Vay ta can: 1000 / 65,5 =` 15 lan tran de co 1 s, 15 x 60 = 900 lan tran de co 1 phut
}

void HIEN_THI() //Dung hien thi gio hien hanh, dang ma nhi phan BCD
{
PORTB = Dec2Bcd(gio); Delay_ms(5000); PORTB = 0; Delay_ms(1000);
PORTB = Dec2Bcd(phut); Delay_ms(5000); PORTB = 0; Delay_ms(1000);
}

void SET_19h() //Set dong ho ve 19 gio 00 phut, khi co nguoi bam SET_19h
{
gio = 19; phut = 0;
HIEN_THI();
}

void ON_OFF() // cho ON, OFF chan dieu khien PORTA.F3:
//Neu ban ngay (tu 6h den 20h) dong thoi so hang chuc cua phut la so chan (Mod 2 bang 0)thi ON, la so le (Mod 2 bang 1) thi OFF (ON 10 phut, OFF 10 phut)
//Neu ban dem (21h den 5h)thi OFF
{
if (6 <= gio && gio <= 21) // An dinh thoi gian ON trong ngay
{
if ((phut / 10) % 2 == 0)

{if (PORTA.F3 == 1) PORTA.F3 = 0;}
else
{if (PORTA.F3 == 0) PORTA.F3 = 1;}
}
else
{if (PORTA.F3 == 0) PORTA.F3 = 1;}
}

void SET_PHUT() //Xu ly moi chu ky 1 phut
{
PORTA.F2 = 1; Delay_ms(2000); PORTA.F2 = 0; //Lam den nhay theo nhip 1 phut
phut++ ;
if (phut == 60)
{
gio++;
if (gio == 24) gio = 0;
phut = 0;
}
}

void interrupt() //Chuong trinh NGAT
{
if (INTCON.T0IF)
{
delay1s++;
if (delay1s == 15)
{
delay1p++;
PORTA.F1 = ~PORTA.F1; //Lam den nhay theo nhip 1 giay
delay1s = 0;
}
if (delay1p == 60) //Neu du 900 lan tran = (60 x 15) x 65,5ms ~ 1 phut
{
flag = 1; //Tin hieu: Da du 1 phut -> SET_PHUT()
delay1p = 0; //Sau khi bat co, xoa ve 0, dem lai tu dau
}
INTCON.T0IF = 0; //Xoa co ngat time0
}
} //Het interrup

void MAIN() //CHUONG TRINH CHINH
{
INIT_MAIN(); //khoi tao cac PORT, NGAT, I2C
Delay_ms(100);
SET_19h();
while (1)
{
if (flag == 1) {SET_PHUT(); HIEN_THI();ON_OFF(); flag = 0;}
if (PORTA.F0 == 0) SET_19h();
}
}


Kèm theo file mô phỏng trên Proteus.
Nếu kiếm được ds1307, thì có thể khai thác thêm I2C bằng phần mềm cho em Pic 18 chân, coi như xài hết công suất (hết chân Pic) rồi nhé !
I2C mềm với MikroC đây: http://www.picvietnam.com/forum/showthread.php?t=2671

minhsondaklak
08-08-2008, 06:26 PM
Mình nạp chương trình trên (viết cho Pic 16f84A, xuất dữ liệu trên PortA) nạp cho Pic 628A, Pic 16f88 thì thấy chương trình vẫn chạy nhưng không xuất dữ liệu ra PortA được.
Loay hoay mãi thì mới ngộ ra: Riêng chân RA4 thì có thể cho xuất dữ liệu nếu có mắc thêm điện trở kéo lên, như lý thuyết đã nêu. Còn lại các chân khác có kéo lên cũng không xuất dữ liệu được.
Xem sơ đồ mạch bên trong PortA thấy cũng tương tự PortC, trong khi PortC thì xuất bình thường.
Huynh nào biết xử lý thế nào để có thể dùng các chân của PortA xuất dữ liệu, xin chỉ giúp.

namqn
08-08-2008, 09:38 PM
Mình nạp chương trình trên (viết cho Pic 16f84A, xuất dữ liệu trên PortA) nạp cho Pic 628A, Pic 16f88 thì thấy chương trình vẫn chạy nhưng không xuất dữ liệu ra PortA được.
Loay hoay mãi thì mới ngộ ra: Riêng chân RA4 thì có thể cho xuất dữ liệu nếu có mắc thêm điện trở kéo lên, như lý thuyết đã nêu. Còn lại các chân khác có kéo lên cũng không xuất dữ liệu được.
Xem sơ đồ mạch bên trong PortA thấy cũng tương tự PortC, trong khi PortC thì xuất bình thường.
Huynh nào biết xử lý thế nào để có thể dùng các chân của PortA xuất dữ liệu, xin chỉ giúp.
Ở PIC16F84A thì các chân RA0..RA3 chỉ làm nhiệm vụ xuất/nhập số (digital), còn ở PIC16F628A hay PIC16F88 thì các chân này còn làm nhiệm vụ ngõ vào tương tự (analog) cho các module so sánh. Do đó, để dùng các chân RA0..RA3 của PIC16F628A, chẳng hạn, như những ngõ vào/ra số, cần tắt các module so sánh, bằng cách đặt 3 bit thấp nhất của thanh ghi CMCON lên mức '1' (OR thanh ghi CMCON với 0x07 chẳng hạn).

Thân,

minhsondaklak
13-09-2008, 09:30 PM
Anh Nam ơi !
Theo hướng dẫn của anh, em đặt CMCON = 0x07 thì cho PORTA xuất được dữ liệu số rồi. Em nghĩ thế là xong cái vụ xuất nhập qua PORTA, ai dè hôm nay em gặp trường hợp cần nhập nhập dữ liệu số vào PORTA, đặt CMCON = 0x07 vẫn không nhập được anh à.
Vậy phải làm sao để nhập được dữ liệu số vào PORTA hả anh ?
Mong được anh hướng dẫn thêm, xin cám ơn anh rất nhiều !

----------------------------------------------------
Update 19/9/2008: Đã giải quyết bằng cách đặt ADCON1 = 0x06;

chiataytuday
14-09-2008, 10:15 AM
chào bạn!
cho mình hỏi cách dùng ngắt trong PIC mình dùng trình dịch SDCC trong LINUX, bạn có biết cách dùng SDCC hay là tài liệu không? cho mình với.
thanks

minhsondaklak
14-09-2008, 11:54 AM
Mỗi trình dịch mỗi khác, mình dùng MikroC nên không giúp được cho bạn rồi.
Bạn xem trong Hepl của nó, có thể cũng như CCS hoặc MikroC thôi.
MikroC thì chỉ có 1 hàm ngắt chung, tên hàm ngắt phải đúng theo chuẫn.
CCS thì mỗi ngắt 1 hàm, tên hàm ngắt đặt tuỳ ý nhưng trước mỗi hàm ngắt phải có dòng khai báo tương ứng, theo chuẫn.
Chúc vui !