View Full Version : PIC16F877 và bài toán đo nhiệt độ hiển thị LCD, có realtime-clock và eeprom.
Vinh3i
09-03-2009, 03:46 PM
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:
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
09-03-2009, 04:08 PM
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ể:
http://quangvinh3ik47.googlepages.com/temp1307.jpg
File mạch nguyên lý (DXP): http://quangvinh3ik47.googlepages.com/TEMP1307.SchDoc
Tiếp đến là vẽ mạch in
http://quangvinh3ik47.googlepages.com/temp1307_pcb.jpg
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.
http://quangvinh3ik47.googlepages.com/temp1307_proteus.jpg
File proteus: http://quangvinh3ik47.googlepages.com/temp1307.dsn
Vinh3i
10-03-2009, 08:45 AM
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
10-03-2009, 09:00 AM
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
10-03-2009, 09:06 AM
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
10-03-2009, 10:47 AM
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:
///////////////////////////////////////////////////////////////////////////
//// 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ì:
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!!!!
mtuankct
10-03-2009, 12:40 PM
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à
Vinh3i
10-03-2009, 03:55 PM
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
#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...
mtuankct
10-03-2009, 07:55 PM
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
10-03-2009, 07:57 PM
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ỏ à
lexuantien
10-03-2009, 09:41 PM
Bạn cho mình hỏi EEPROM24C256 để làm gì vậy ?
lexuantien
10-03-2009, 11:24 PM
chẳng lẻ bộ nhớ EEPROM trong chip không đủ để lưu hả bạn?
Vinh3i
11-03-2009, 08:58 AM
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ỏ à
ở chỗ Đức Việt Hà có nhiều option lắm: 1-2-3-4 ngày :D
Vinh3i
11-03-2009, 09:01 AM
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 :D
Vinh3i
13-03-2009, 04:02 PM
Hjx, code cho LCD cuối cùng đã có!
Test trên proteus - ok.
Nhưng nạp vào mạch vẫn ko chạy.
Tôi đã kiểm tra chân nguồn, gnd, chỉnh ligh -> ok
chân enable->A2
chân reset ->A3
chân R/W -> A1
4 đường data D4-D7 nối với chân B1-B4
Test thử bằng cách xuất output_high và output_low qua từng chân trên đều ok.
nhưng nạp chương trình vào thì vẫn ko chạy. Có ai giúp tôi vụ này với!
tưởng có vấn đề với chân 15, 16 nên đã cắt bỏ đường mạch nối tới 2 chân này. Nhưng nó vẫn chưa thèm chạy!
Cái LCD này nó cứ ngủ mãi ko chịu dậy. Bực quá đi mất.....
#include <16F877A.h>
#FUSES NOWDT
#FUSES XT
#FUSES PUT
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES BROWNOUT
#FUSES NOLVP
#FUSES NOCPD
#FUSES NOWRT
#use delay(clock=8000000)
//----Dinh nghia cho LCD-------
#define LCD_D0 PIN_B1
#define LCD_D1 PIN_B2
#define LCD_D2 PIN_B3
#define LCD_D3 PIN_B4
#define LCD_EN PIN_A2
#define LCD_RS PIN_A3
#define LCD_RW PIN_A1
#define FIRST_LINE 0x00
#define SECOND_LINE 0x40
#define CLEAR_DISP 0x01
//----end dinh nghia LCD--------
//----driver cho LCD -----------
void LCD_Init ( void );
void LCD_SetPosition ( unsigned int cX );
void LCD_PutChar ( unsigned int cX );
void LCD_PutCmd ( unsigned int cX );
void LCD_PulseEnable ( void );
void LCD_SetData ( unsigned int cX );
void LCD_Init ( void )
{
LCD_SetData ( 0x00 );
delay_ms ( 200 );
output_low(LCD_RW);
output_low ( LCD_RS );
LCD_SetData ( 0x03 );
LCD_PulseEnable();
LCD_PulseEnable();
LCD_PulseEnable();
LCD_SetData ( 0x02 );
LCD_PulseEnable();
LCD_PutCmd ( 0x2C );
LCD_PutCmd ( 0x0C );
LCD_PutCmd ( 0x01 );
LCD_PutCmd ( 0x06 );
}
void LCD_SetPosition ( unsigned int cX )
{
LCD_SetData ( swap ( cX ) | 0x08 );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
}
void LCD_PutChar ( unsigned int cX )
{
output_low ( LCD_RW );
output_high ( LCD_RS );
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
output_low ( LCD_RS );
}
void LCD_PutCmd ( unsigned int cX )
{
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
}
void LCD_PulseEnable ( void )
{
output_high ( LCD_EN );
delay_us ( 10 );
output_low ( LCD_EN );
delay_ms ( 5 );
}
void LCD_SetData ( unsigned int cX )
{
output_bit ( LCD_D0, cX & 0x01 );
output_bit ( LCD_D1, cX & 0x02 );
output_bit ( LCD_D2, cX & 0x04 );
output_bit ( LCD_D3, cX & 0x08 );
}
//------end driver cho LCD---------------
void main()
{
LCD_Init();
LCD_PutChar("V");
LCD_PutChar(" ");
LCD_PutChar("K");
LCD_PutChar("I");
LCD_PutChar("L");
LCD_PutChar("L");
LCD_PutChar(" ");
LCD_PutChar("H");
LCD_PutChar("I");
LCD_PutChar("M");
}
Vinh3i
13-03-2009, 04:17 PM
Loay hoay với cái này mất gần 2 ngày trời rồi. Có ai xem giúp tôi với. Chứ thấy cái LCD này lì quá!!!!!
namqn
13-03-2009, 05:36 PM
Loay hoay với cái này mất gần 2 ngày trời rồi. Có ai xem giúp tôi với. Chứ thấy cái LCD này lì quá!!!!!
Không ít người gặp vấn đề với LCD (đặc biệt là LCD mới), vì họ không dùng quy trình khởi tạo LCD đầy đủ. Tôi đã nhiều lần nói đến quy trình này ở picvietnam, bạn có thể tham khảo ở post #268 của luồng sau chẳng hạn:
http://www.picvietnam.com/forum/showthread.php?t=357
Thân,
Vinh3i
19-03-2009, 04:22 PM
tôi viết code để test lcd như sau:
#include <16F877A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=10000000)
/* LCD STUFF */
#define LCD_D0 PIN_B1
#define LCD_D1 PIN_B2
#define LCD_D2 PIN_B3
#define LCD_D3 PIN_B4
#define LCD_EN PIN_A1
#define LCD_RS PIN_A2
#define FIRST_LINE 0x00
#define SECOND_LINE 0x40
#define CLEAR_DISP 0x01
#int_EXT
void EXT_isr(void)
{
}
#int_TBE
void TBE_isr(void)
{
}
#int_RDA
void RDA_isr(void)
{
}
void LCD_Init ( void );
void LCD_SetPosition ( unsigned int cX );
void LCD_PutChar ( unsigned int cX );
void LCD_PutCmd ( unsigned int cX );
void LCD_PulseEnable ( void );
void LCD_SetData ( unsigned int cX );
void main()
{
Output_high(PIN_B5);
Output_high(PIN_B5);
LCD_Init();
LCD_PutChar("O");
LCD_PutChar("K");
}
/************************************************** ****************************/
void LCD_Init ( void )
{
LCD_SetData ( 0x00 );
delay_ms ( 200 ); /* wait enough time after Vdd rise */
output_low ( LCD_RS );
LCD_SetData ( 0x03 ); /* init with specific nibbles to start 4-bit mode */
LCD_PulseEnable();
LCD_PulseEnable();
LCD_PulseEnable();
LCD_SetData ( 0x02 ); /* set 4-bit interface */
LCD_PulseEnable(); /* send dual nibbles hereafter, MSN first */
LCD_PutCmd ( 0x2C ); /* function set (all lines, 5x7 characters) */
LCD_PutCmd ( 0x0C ); /* display ON, cursor off, no blink */
LCD_PutCmd ( 0x01 ); /* clear display */
LCD_PutCmd ( 0x06 ); /* entry mode set, increment */
}
void LCD_SetPosition ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData ( swap ( cX ) | 0x08 );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
}
void LCD_PutChar ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
output_high ( LCD_RS );
LCD_SetData ( swap ( cX ) ); /* send high nibble */
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) ); /* send low nibble */
LCD_PulseEnable();
output_low ( LCD_RS );
}
void LCD_PutCmd ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData ( swap ( cX ) ); /* send high nibble */
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) ); /* send low nibble */
LCD_PulseEnable();
}
void LCD_PulseEnable ( void )
{
output_high ( LCD_EN );
delay_us ( 10 );
output_low ( LCD_EN );
delay_ms ( 5 );
}
void LCD_SetData ( unsigned int cX )
{
output_bit ( LCD_D0, cX & 0x01 );
output_bit ( LCD_D1, cX & 0x02 );
output_bit ( LCD_D2, cX & 0x04 );
output_bit ( LCD_D3, cX & 0x08 );
}
dùng CCS để build và nạp vào PIC trên
Tuy nhiên, mô phỏng với proteus thì chạy tốtt, còn nạp lên mạch thì LCD chỉ hiện một dòng đen xì.
(với code trên, tôi đã nối châm RW của LCD với đất)
kiểm tra điện áp trên lcd thì có
D0,1,2,3,4,5,7 = 5v
D6 = 0V
rs,e,rw = 0v
chỉnh điện áp chân VEE vẫn thấy thay đổi đậm nhạt của dòng đen xì trên
Help me!!!!
namqn
19-03-2009, 05:01 PM
...
Tuy nhiên, mô phỏng với proteus thì chạy tốtt, còn nạp lên mạch thì LCD chỉ hiện một dòng đen xì.
(với code trên, tôi đã nối châm RW của LCD với đất)
kiểm tra điện áp trên lcd thì có
Help me!!!!
LCD trong Proteus là LCD lý tưởng, còn những LCD thực tế thì có đôi chút khác biệt.
Theo thông tin của bạn, phần cứng của bạn đang có vấn đề, vì chân D6 có trạng thái bất thường so với các chân còn lại. Bạn nên đưa sơ đồ mạch đã dùng lên diễn đàn, vì code chỉ có nghĩa khi dùng với một thiết kế phần cứng cụ thể.
Thân,
Vinh3i
19-03-2009, 11:01 PM
LCD trong Proteus là LCD lý tưởng, còn những LCD thực tế thì có đôi chút khác biệt.
Theo thông tin của bạn, phần cứng của bạn đang có vấn đề, vì chân D6 có trạng thái bất thường so với các chân còn lại. Bạn nên đưa sơ đồ mạch đã dùng lên diễn đàn, vì code chỉ có nghĩa khi dùng với một thiết kế phần cứng cụ thể.
Thân,
Đó là code tôi viết cho mạch ở post #1
Vinh3i
19-03-2009, 11:07 PM
Hjx, hóa ra chip PIC bị hỏng.
Nhưng ko phát hiện ra hỏng bởi vì dùng Pickit2 vẫn nạp và tẩy ngon lành.
Test bằng cách nhấp nháy pin_b5 vẫn ok.
Sau đó, tôi đã đo thông mạch của pic (gỡ pic ra khỏi mạch). Thấy chân 3-4-12-31 của PIC bị thông mạch.
Bác cho hỏi, hỏng kiểu đó có chữa được ko... tiếc con pic quá!
namqn
20-03-2009, 12:44 AM
Đó là code tôi viết cho mạch ở post #1
Ok, sơ đồ của bạn thì không có vấn đề, nhưng code của bạn có vấn đề, dẫn đến LCD chưa được khởi tạo.
Trong post #268 của luồng http://www.picvietnam.com/forum/showthread.php?t=357, tôi đã trình bày quy trình khởi tạo đầy đủ. Đối chiếu với code của bạn thì thấy dữ liệu để khởi tạo của bạn bị sai (0x03 thay vì một trong các giá trị 0x30 - 0x3F).
Thân,
namqn
20-03-2009, 12:46 AM
Hjx, hóa ra chip PIC bị hỏng.
Nhưng ko phát hiện ra hỏng bởi vì dùng Pickit2 vẫn nạp và tẩy ngon lành.
Test bằng cách nhấp nháy pin_b5 vẫn ok.
Sau đó, tôi đã đo thông mạch của pic (gỡ pic ra khỏi mạch). Thấy chân 3-4-12-31 của PIC bị thông mạch.
Bác cho hỏi, hỏng kiểu đó có chữa được ko... tiếc con pic quá!
PICkit 2 chỉ giao tiếp với PIC bằng các chân ICSP, và bản thân nó cũng không được thiết kế để phát hiện một chân nào đó bị hỏng.
Tôi không nghĩ rằng bạn có thể chữa được nó, nhưng dùng cho các mạch khác thì vẫn được (chỉ cần không dùng hai chân đó, và thiết lập các chân đó là ngõ vào thôi).
Thân,
anhtrainguyen
19-10-2009, 02:47 AM
gởi Vinh3i tiền bối!!
em đang làm đề tài vi điều khiển gần giống như anh vậy!!!
em học ĐTĐ khoa điện BKDN,mới vào nghề điện tử này không lâu như mấy huynh! nên gà trong lập trình !!! híc....
mong anh Vinh3i có thể up luôn cả code C về đề tài này cho mọi người cùng tham khảo!!
cảm ơn đã đọc tin này!!
Nhân tiện hỏi luôn ma trận phím của anh lập trình như thế nào!! thank!!
Vinh3i
08-12-2009, 11:57 AM
gởi Vinh3i tiền bối!!
em đang làm đề tài vi điều khiển gần giống như anh vậy!!!
em học ĐTĐ khoa điện BKDN,mới vào nghề điện tử này không lâu như mấy huynh! nên gà trong lập trình !!! híc....
mong anh Vinh3i có thể up luôn cả code C về đề tài này cho mọi người cùng tham khảo!!
cảm ơn đã đọc tin này!!
Nhân tiện hỏi luôn ma trận phím của anh lập trình như thế nào!! thank!!
Xin lỗi bạn nhé, vì bây giờ mình mới đọc bài này. Thời gian vừa rồi, mình bận làm tốt nghiệp Cao học nên ko ghé vào diễn đàn.
sakura_utehy
30-01-2010, 06:43 PM
Chào anh Vinh3i!
1.Anh cho em hỏi là chân D0-D3 của LCD anh không sử dụng thì khi hiển thị lên LCD sẽ như thế nào?
2. Ma trận phím anh cho qua cổng AND thì khi thay đổi hay cài đặt thông số thời gian hay đặt ngưỡng cho nhiệt độ thì phải nhấn cả một tổ hợp phím à?
Mong anh chỉ bảo!
macthanhan
23-02-2010, 09:53 AM
Thanks bài viết rất bổ ích cho những người đang làm đồ án về Pic
macthanhan
26-02-2010, 11:41 AM
Anh có thể up file code của toàn bộ đề tài này ko? Em đang làm đồ án về Pic,nhưng phần lập trình gà wa.
vinjuii
30-03-2010, 10:22 PM
chào các a.. e là thành viên mới...
e đang nghiên cứu làm đồng hồ vạn niên hiển thị lên LCD..dùng PIC6f877a viết code bằng ngôn ngữ asm ..chân thành. vinhjuri2310@yahoo.com
pdkxlily
06-04-2011, 10:27 PM
share mình cái này mình nguyên cứu cái bạn . link die rồi
dangthieuhoi
11-04-2011, 02:47 PM
Anh chị nào có driver cho thằng 18B20 không? xài cho HTPIC hoặc CCS cũng dc?
em dang tìm mà chưa thấy.
Thanks
Anh chị nào có driver cho thằng 18B20 không? xài cho HTPIC hoặc CCS cũng dc?
em dang tìm mà chưa thấy.
Thanks
bạn tham khảo ở đây:http://www.picvietnam.com/forum/showthread.php?t=5847
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.