PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 09-03-2009, 03:46 PM   #1
Vinh3i
Đệ tử 1 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 25
:
Thumbs up PIC16F877 và bài toán đo nhiệt độ hiển thị LCD, có realtime-clock và eeprom.

Tôi là tham gia là thành viên của picvietnam cũng khá lâu rùi, nhưng ít khi post bài. Lâu lâu ko thực hành mảng điện tử này thấy nhớ quá. Tiện thể, thầy cho bài tập. Tôi lôi ra làm, mong các anh em trên diễn đàn giúp đỡ.

Ở đây, tôi sẽ đi giải quyết một bài toán khá cơ bản. Nội dụng như sau:
Trích:
Thiết kế mạch đo và hiển thị nhiệt độ.
Tính năng :
• Đo nhiệt độ môi trường 0 độ đến 80 độ C, độ chính xác 1 độ C
• Hiển thị kết quả đo thông qua màn hình LCD loại 16 ký tự, 2 hàng
• Có khả năng lưu giữ kết quả đo : lưu giữ 1000 mẫu đo
• Có đồng hồ thời gian thực
• Có phím bấm cho phép : đặt lại thời gian của đồng hồ, đặt được thời gian bắt đầu lưu trữ.
• Cho phép xem lại các kết quả đo (trong số 1000 mẫu đã được lưu trữ)
Yêu cầu
• Sử dụng vi điều khiển PIC
• LCD loại ký tự : 16 ký tự x 2 hàng
• Sensor đo nhiệt độ : sử dụng DS18B20
• Có đồng hồ thời gian thực : DS1307
Vinh3i vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-03-2009, 04:08 PM   #2
Vinh3i
Đệ tử 1 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 25
:
Yêu cầu của bài toán là khá rõ ràng. Trước tiên, dùng Protel vẽ cái mạch nguyên lý cái nhể:



File mạch nguyên lý (DXP): http://quangvinh3ik47.googlepages.com/TEMP1307.SchDoc

Tiếp đến là vẽ mạch in



File PCB: http://quangvinh3ik47.googlepages.com/TEMP1307.PchDoc

Hơi xấu, và hơi tiết kiệm, có một số dây phải đi bằng tay.

Rồi, xong. Giờ đến phần gì nhỉ? Tìm hiểu datasheet của các linh kiện và vẽ cái proteus cho nó hoành tráng.



File proteus: http://quangvinh3ik47.googlepages.com/temp1307.dsn

thay đổi nội dung bởi: Vinh3i, 10-03-2009 lúc 08:27 AM.
Vinh3i vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-03-2009, 11:04 PM   #3
Nin
Đệ tử 1 túi
 
Tham gia ngày: Nov 2007
Bài gửi: 16
:
ko thấy hình ji cả >_<,
Nin vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2009, 08:45 AM   #4
Vinh3i
Đệ tử 1 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 25
:
I. Vấn đề đầu tiên cần giải quyết là linh kiện của mạch này tìm mua ở đâu? Hà hà, mấy cái này coi bộ dễ kiếm đây. Nhưng tui cũng vẫn đi lục trong diễn đàn dientuvietnam xem các anh em đánh giá thía nào?

1. Chợ trời: --> tạp phí lù
2. 17A Hàn Thuyên: 04.39721934 (Hàng Trống bán tool: 04.38265495) --> có nhiều hàng, nhân viên xinh.
3. 149 Đội cấn
4. 269 Đội cấn
5. 419 Đội cấn: 04.39180234
6. Lê Dương Electronic: ic-vn.com
7. Nguyễn Công Trứ
8. Cty RMT B10 ngõ 42 Giang Văn Minh - 04.2162596
9. Cửa hàng Loan - Giang - Tú 21 Trần Cao Vân - 048211037 --> anh em khen cửa hàng này lắm
10. Làm vỏ hộp - a Cường Cổ Nhuế - 0903227476
11. Thành viên có nick VNarmy - 0982083106

.....

Ui nhiều quá, ha ha...
Vinh3i vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2009, 09:00 AM   #5
Vinh3i
Đệ tử 1 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 25
:
II. Giờ đi đặt mạch, lâu quá rùi ko làm nên giờ lại lục tìm xem ở HN này có chỗ nào đặt mạch tốt:

1. 485 Trần Khát Chân - 04 6227470
2. Thành Long - thanhlongpcb.com.vn - số 7 ngõ 100 Tây Sơn
3. Sao Kim - nhà 14 ngõ 11 Vương Thừa Vũ - Chú Công: 0903276367
4. M2 -> ko biết là gì, địa chỉ ở đâu
5. P105/Z9 ngõ 1 Tạ Quang Bửu 048684617 - 0904103179
6. Nhà 9 ngách 30 Thông Phong - Tôn Đức Thắng
7. LongPCB 0904277576
8. 27 Hoàng Sâm - Cầu Giấy (từ Hoàng Quốc Việt rẽ vào) - 047564591
9. GTH - 46 gác 3 Hàng Chuối - 0904253568
10. Viện Điện tử tin học - 156a Quán Thánh
11. Đức Việt Hà - số 868 ngõ 850 Đường Láng.

....

Đặt ở đâu nhỉ?
Vinh3i vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2009, 09:06 AM   #6
Vinh3i
Đệ tử 1 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 25
:
Trích:
Nguyên văn bởi Vinh3i View Post
II. Giờ đi đặt mạch, lâu quá rùi ko làm nên giờ lại lục tìm xem ở HN này có chỗ nào đặt mạch tốt:

1. 485 Trần Khát Chân - 04 6227470
2. Thành Long - thanhlongpcb.com.vn - số 7 ngõ 100 Tây Sơn
3. Sao Kim - nhà 14 ngõ 11 Vương Thừa Vũ - Chú Công: 0903276367
4. M2 -> ko biết là gì, địa chỉ ở đâu
5. P105/Z9 ngõ 1 Tạ Quang Bửu 048684617 - 0904103179
6. Nhà 9 ngách 30 Thông Phong - Tôn Đức Thắng
7. LongPCB 0904277576
8. 27 Hoàng Sâm - Cầu Giấy (từ Hoàng Quốc Việt rẽ vào) - 047564591
9. GTH - 46 gác 3 Hàng Chuối - 0904253568
10. Viện Điện tử tin học - 156a Quán Thánh
11. Đức Việt Hà - số 868 ngõ 850 Đường Láng.

....

Đặt ở đâu nhỉ?
Sau một hồi loanh quanh check thử một số nơi. Thấy hơi củ chuối ở chỗ toàn nhận đặt số lượng lớn. Cuối cùng quay về Đức - Việt - Hà

Cái mạch trên, đặt từ thứ 6 tuần trc đến thứ tư tuần này mới lấy đc, thế mà chém mình 152K.

Nhưng điều đó ko quan trọng.

Nhờ anh em xem giúp xem tớ thiết kế thế có đc ko? dùng thạch anh 10M có vấn đề gì ko?
Vinh3i vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2009, 10:47 AM   #7
Vinh3i
Đệ tử 1 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 25
:
Unhappy

III. Hiển thị lên LCD:

Như thiết kế, ở đây sử dụng LCD 16x2 kiểu truy nhập 4bit.
Trong CCS có file mẫu lcd.c như sau:

Trích:
///////////////////////////////////////////////////////////////////////////
//// LCDD.C ////
//// Driver for common LCD modules ////
//// ////
//// lcd_init() Must be called before any other function. ////
//// ////
//// lcd_putc(c) Will display c on the next position of the LCD. ////
//// The following have special meaning: ////
//// \f Clear display ////
//// \n Go to start of second line ////
//// \b Move back one position ////
//// ////
//// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) ////
//// ////
//// lcd_getc(x,y) Returns character at position x,y on LCD ////
//// ////
///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
//
// LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
// #define use_portb_lcd TRUE


struct lcd_pin_map { // This structure is overlayed
BOOLEAN enable; // on to an I/O port to gain
BOOLEAN rs; // access to the LCD pins.
BOOLEAN rw; // The bits are allocated from
BOOLEAN unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;


#if defined use_portb_lcd
//#locate lcd = getenv("sfr:PORTB") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf81
#else
#locate lcd = 6
#endif
#define set_tris_lcd(x) set_tris_b(x)
#else
//#locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf83
#else
#locate lcd = 8
#endif
#define set_tris_lcd(x) set_tris_d(x)
#endif


#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
// These bytes need to be sent to the LCD
// to start it up.


// The following are used for setting
// the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in



BYTE lcd_read_byte() {
BYTE low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}


void lcd_init() {
BYTE i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}


void lcd_gotoxy( BYTE x, BYTE y) {
BYTE address;

if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}

char lcd_getc( BYTE x, BYTE y) {
char value;

lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}
Cái này dùng cho cổng D của Pic877.

Trong thiết kế của mình thì:
Trích:
Chân Enable=A1
Chân RS=A2
Chân R/W=A3
4 đường data nối vào: B1, B2, B3, B4 theo thứ tự của D4, D5, D6, D7
Vậy phải sửa thế nào để có thể sử dụng được? Pls Help!!!!
Vinh3i vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2009, 12:40 PM   #8
mtuankct
Đệ tử 6 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 125
:
Theo em thì anh define lai mấy cái chân enable, rs, rw rồi sửa lại cái hàm lcd_send_nibble là ok mà
mtuankct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2009, 03:55 PM   #9
Vinh3i
Đệ tử 1 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 25
:
Trích:
Nguyên văn bởi mtuankct View Post
Theo em thì anh define lai mấy cái chân enable, rs, rw rồi sửa lại cái hàm lcd_send_nibble là ok mà
Hì, cách này ko được rồi.

Cần phải sửa được lệnh
Trích:
#locate lcd 8
8 là địa chỉ của portD, phải sửa sao cho các bit tương ứng của nó phù hợp với các chân...
Vinh3i vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2009, 07:55 PM   #10
mtuankct
Đệ tử 6 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 125
:
em thấy anh không sử dụng một port chung cho LCD nên theo em cần phải sửa lại chỗ struct lcd_pin_map và sửa lại cái hàm lcd_send_nibble để gửi dữ liệu ra đúng cổng
mtuankct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2009, 07:57 PM   #11
mtuankct
Đệ tử 6 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 125
:
ah cho em hỏi, mấy chỗ đặt mạch anh kể thì có chỗ nào làm lấy luôn được không, em đang cần làm cái mạch test cho máy con ic chân dán kiểu SOIC, kích thước mạch cũng nhỏ à
mtuankct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2009, 09:41 PM   #12
lexuantien
Đệ tử 2 túi
 
Tham gia ngày: Feb 2009
Nơi Cư Ngụ: Qui Nhon - Binh Dinh
Bài gửi: 37
:
Send a message via Yahoo to lexuantien
Bạn cho mình hỏi EEPROM24C256 để làm gì vậy ?
lexuantien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2009, 10:05 PM   #13
Nin
Đệ tử 1 túi
 
Tham gia ngày: Nov 2007
Bài gửi: 16
:
để lưu số mẫu đo đó....
Nin vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2009, 11:24 PM   #14
lexuantien
Đệ tử 2 túi
 
Tham gia ngày: Feb 2009
Nơi Cư Ngụ: Qui Nhon - Binh Dinh
Bài gửi: 37
:
Send a message via Yahoo to lexuantien
chẳng lẻ bộ nhớ EEPROM trong chip không đủ để lưu hả bạn?

thay đổi nội dung bởi: lexuantien, 10-03-2009 lúc 11:38 PM.
lexuantien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-03-2009, 09:01 AM   #15
Vinh3i
Đệ tử 1 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 25
:
Trích:
Nguyên văn bởi lexuantien View Post
chẳng lẻ bộ nhớ EEPROM trong chip không đủ để lưu hả bạn?
Ở đây, mình định lưu số liệu đo cùng với thời điểm đo, vì thế với mỗi số liệu lưu cần khoảng 8byte, như vậy 1000 điểm đo cần 8KB. Vậy dùng EEPROM ngoài cho thoải mái.
Hơn nữa, đây là yêu cầu của bài tập
Vinh3i vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Tags
lcd, nhietdo, pic6f877, realtime-clock


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 05:32 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam