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 01-09-2007, 06:10 PM   #16
chip_nho
Nhập môn đệ tử
 
Tham gia ngày: Jul 2007
Bài gửi: 2
:
mình cũng đang làm cái đồng hồ này hiển thị trên LED7seg .nhưng đang gặp vấn đề về cách thiết lạp giờ ,chương trinh thiết lập giờ mình cho vào ngắt ngoài . bạn có thể hướng dẫn cho minh ko. Ah cho minh hỏi thêm là chương trình đọc thời gian thi nên đưa vào ngắt timer hay dung delay.giúp mình nhé. thank
chip_nho vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-09-2007, 11:51 PM   #17
Auto_engine
Đệ tử 1 túi
 
Tham gia ngày: Aug 2006
Bài gửi: 13
:
ủa lâu lắm ko thấy bác chủ Topic viết tiếp bài nhỉ, ko bít tình hình có giống mấy topic trc, post 1 thơì gian rùi đem con bỏ chợ ko nữa. Hic...
Auto_engine vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-09-2007, 06:21 PM   #18
Tuấn Anh CVN
Đệ tử 1 túi
 
Tham gia ngày: Jul 2007
Bài gửi: 15
:
Làm kiểu này thì cũng dài hơi mới tới đích để làm xong đồng hồ lịch vạn niên đấy. Cho mình hỏi con RTC DS1307 có chức năng giống với con RTC S35180A không? Mình đã copy được một đoạn code để dùng con S35180 làm đồng hồ led matrix có chữ chạy vào các thời điểm đặt trước. Nhưng chỉ biết dùng thời gian đọc ra từ con IC này mà chưa hiểu bên trong code như thế nào. Con S35180 cũng có 8 pins dạng SPI như con DS1307.
Tuấn Anh CVN vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-09-2007, 11:00 AM   #19
picpicpic
Đệ tử 2 túi
 
picpicpic's Avatar
 
Tham gia ngày: Jan 2006
Bài gửi: 36
:
Đề tài bác tinhthanthep khởi xướng hay đây. Em cũng muốn làm 1 phát. Hình như bác tinhthanthep ở mãi ngoài Bắc, em ở trong Nam.

Xin lỗi vì hỏi ở đây. Bác nào rành ở TP.HCM, cho em hỏi chút:

- LCD 16x2 mua ở đâu cho đúng giá.
- LM335 và DS1307 giá cả thế nào, tìm thấy ở cữa hàng nào?

Ths các bác!
__________________
************************************************** **
The only wrong thing would be to deny what your heart truly feels!
************************************************** **
picpicpic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-09-2007, 03:46 PM   #20
linhnc308
Đệ tử 5 túi
 
Tham gia ngày: Oct 2005
Bài gửi: 117
:
Trích:
Nguyên văn bởi picpicpic View Post
Đề tài bác tinhthanthep khởi xướng hay đây. Em cũng muốn làm 1 phát. Hình như bác tinhthanthep ở mãi ngoài Bắc, em ở trong Nam.

Xin lỗi vì hỏi ở đây. Bác nào rành ở TP.HCM, cho em hỏi chút:

- LCD 16x2 mua ở đâu cho đúng giá.
- LM335 và DS1307 giá cả thế nào, tìm thấy ở cữa hàng nào?

Ths các bác!
Cậu ở trong HCM thì tìm mấy thứ đó phải dễ dàng chứ, ra chợ Nhật tảo hay tìm trên diễn đàn có rất nhiều cá nhân cung cấp link kiên mà ở trong HCM. Tôi cũng có đủ những link kiện cậu cần nhưng khuyên câu chân thành là tìm mua trong Nam sẽ rẻ hơn vì không mất phí chuyển phát. tôi ở HN
LCD16x2 có thể mua loại 55k ~ 60K
LM335 ngoài HN bán 12K và DS1307 là 15K

Linh kiện: TI, Maxim, Cypress, MIcrochip
__________________
CallerID, Ethernet-RS232, PICWEB, Cảnh báo BTS
Giải pháp toàn diện giám sát - điều khiển từ xa qua GSM/Internet
0988006696

http://linhnc308.blogspot.com
linhnc308@gmail.com
linhnc308 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-09-2007, 10:12 AM   #21
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Trích:
Nguyên văn bởi tinhthanthep View Post
Có 4 nút bấm Mode, Set, Up, Down dùng để cài đặt và xem thông tin của lịch vạn niên. Hiển thị bằng màn hình LCD 16x2 cắm qua hàng Jump LCDDISPLAY. Có nút gạt để chọn backlight của LCD. 3 LED đơn mắc ở cổng E dùng để chỉ thị các chế độ.
Liệu có thể bổ sung thêm Âm lịch, Alarm? Hoàn toàn được = phần mềm. Khổ nỗi cái LCD 16*2 hiển thị ít kí tự quá.
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-09-2007, 03:36 PM   #22
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Trích:
Nguyên văn bởi chip_nho View Post
mình cũng đang làm cái đồng hồ này hiển thị trên LED7seg .nhưng đang gặp vấn đề về cách thiết lạp giờ ,chương trinh thiết lập giờ mình cho vào ngắt ngoài . bạn có thể hướng dẫn cho minh ko. Ah cho minh hỏi thêm là chương trình đọc thời gian thi nên đưa vào ngắt timer hay dung delay.giúp mình nhé. thank
Trên con IC thời gian thực Ds1307 có chân SQW/INTB phát ra xung có tần số 1Hz (tức là 1s nó on 1 lần) , mắc chân này vào chân ngắt ngoài RB0 của PIC để cứ 1s thì nó kích cho ngắt ngoài hoạt động. Theo suy nghĩ thông thường các bạn hay để chương trình hiển thị trong ngắt nhưng như thế MikroC nó sẽ báo lỗi "ko được dùng chương trình con trong ngắt" nên bạn để chương trình hiển thị ở trong chương trình chính.
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-09-2007, 03:45 PM   #23
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Có một vấn để về cái nút bấm đó là hiện tượng rung phím. Cái này ai hiểu rồi ko nói làm gì , còn bạn nào chưa hiểu thì phải biết. Khi bạn ấn một nút bấm thì các lá đồng tiếp xúc trong phím bấm nó không dính vào nhau ngay lập tức mà nó bật đi bật lại vài lần mới tiếp xúc hẳn (do tính đàn hồi của vật liệu đồng lò xo). Khoảng thời gian lập bập này tuy ngắn nhưng so với tốc độ xử lý của PIC thì còn phải chạy dài. Với chương trình trứoc thì hiện tượng rung phím này không ảnh hưởng gì, nhưng với bài toán như: Bấm phím 1 Led 1 sáng, bấm phát nữa nó tắt thì sẽ có vấn đề. Nhiều khi bạn bấm 1 cái nó vẫn tắt là bởi vì phím bấm nó rung nên thực ra là pic nó tưởng bạn bấm nhiều lần nên lúc sáng lúc tắt kết quả là tắt. Để xử lý vấn đề này thì ta cho chương trình khi phát hiện có bấm nút thì trễ đi một khoảng thoài gian dài hơn hiện tượng rung phím là ok. Khi bấm nút RB1 PIC tạo trễ 1 khoảng thời gian 50ms sau đó kiểm tra xem RB1 còn được bấm không? nếu còn thì cho sáng LED.

thay đổi nội dung bởi: tinhthanthep, 11-09-2007 lúc 04:01 PM.
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-09-2007, 03:59 PM   #24
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Vậy ta làm nốt bài toán sau là xong hẳn về cái nút bấm: Bài toán là ta bấm phím RB1 thì LEd1 sáng, bấm phát nữa thì nó tắt....Chương trìng như sau:

Code:
void MAIN() {
PORTB = 0; // Xoá dữ liệu cổng B
TRISB = 0xFF; // Định nghĩa cổng B là input 

PORTE = 0; 
TRISE = 0;
ADCON1 = 0xE;

Loop:
if (PORTB.F1 == 0) {                   // Kiểm tra nút ấn RB1 có bấm không? Nếu bấm thì
if (PORTE.F0 == 0)  PORTE.F0 = 1 // kiểm tra xem đèn đang tắt không? nếu đúng thì bật lên
else PORTE.F0 = 0; // nếu sai thì tắt nó đi
Delay_ms(50);  // Tạo trễ 50ms để khử hết hiện tượng rung phím
Loop1:
if (PORTB.F1 == 0) goto Loop1;   // chạy lòng vòng đợi đến khi tay người nhá hẳn nút bấm ra
}
goto Loop; // Lặp lại vòng lặp kiểm tra nút bấm

}

thay đổi nội dung bởi: namqn, 19-09-2007 lúc 02:47 AM. Lý do: định dạng lại code
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-09-2007, 04:15 PM   #25
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Tiếp theo ta làm sang cái LCD nhé. Bạn nào mới làm quen với LCD mà viết bằng assembly thì chắc mất vài ngày quá. Nếu viết bằng MikroC bạn nào kém lắm cũng chỉ 30 phút là xong. Nói thế để các bạn thấy rằng viết ứng dụng mà dùng MikroC thì thôi rồi, viết nhanh và ứng dụng nhanh đi vào cuộc sống, chứ cứ tỉa tót bằng assem thì khi sản phẩm ra thị trường thì đối thủ cạnh tranh đã ra mấy phiên bản khác nhau mất roài.
Giờ ta viết chương trình để hiển thị dòng chữ Hello Picvietnam nhé. Chương trình như sau:

Code:
void INIT_MAIN() {
// Khoi tao cong B
  PORTB   = 0;
  TRISB   = 0xFF;
// Khoi tao cong D
  PORTD   = 0;           // Xóa dữ liệu đang tồn tại sẵn trên cổng D
  TRISD   = 0;            // Định nghĩa cổng D là digital Output
// Khoi tao cong E
  PORTE   = 0;
  TRISE   = 0;
  ADCON1  = 0xE;
// Khoi tao LCD
  Lcd_Config(&PORTD,4,7,6,3,2,1,0);     // các bạn xem sơ đồ mạch để hiểu được cách khai các tham số của hàm này
  Lcd_Cmd(Lcd_CLEAR);                // xóa màn hình 
  Lcd_Cmd(Lcd_CURSOR_OFF);         // tắt con trỏ nhấp nháy của LCD

void LCD_DISPLAY() {
  LCD_Out(1,1,"Hello");                // hiện chứ Hello bắt đầu ở dòng 1 cột 1
  LCD_Out(2,1,"Picvietnam");        // hiện chữ Picvietnam bắt đầu ở dòng 2 cột 1
}

void MAIN() {
  INIT_MAIN();
  LCD_DISPLAY();
}
Bạn nên sắp xếp các chương trình con như trên. Trong chương trình chính ta chỉ việc gọi tên các chương trình con thôi.

thay đổi nội dung bởi: namqn, 19-09-2007 lúc 02:47 AM. Lý do: định dạng lại code
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-09-2007, 09:43 AM   #26
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Hôm nay ta tiếp tục vào mục chính của bài toán đó là làm việc với con IC thời gian thực ds1307. Trước khi tiếp tục ta phải tìm hiểu qua về con IC này. ds1307 dùng một thạch anh 32.768kHz để tạo dao động tính thời gian, 1 pin V để nuôii khi mất nguồn nuôi ngoài. 1307 có tất cả 64 thanh ghi có địa chỉ từ 00h đến 3FH. 7 thanh ghi đầu tiên chứa dữ liệu về giây, phút, giờ, thứ, ngaỳ, tháng, năm dứoi dạng mã hóa BCD. thanh ghi thứ 8 là thanh ghi điều khiển. 56 thanh ghi còn lại là bộ nhớ RAM. ds1307 giao tiếp với thế giới bên ngoài bằng kiểu giao tiếp nối tiếp I2C. I2C dùng 2 đường truyền SCL và SDA. Ngoài ra ds1307 có chân SQW/OUT phát ra các xung có tần số 1Hz, 4.096kHz, 8.192kHz, 32.768 kHz. Ta sẽ sử dụng tần số 1Hz để cứ sau 1 s thì vi điều khiển phải cập nhật thông tin lại một lần và hiển thị lên màn hình. Vì vậy ta nối chân này của ds1307 vào chân ngắt ngoài INT của PIC16F877A. Việc hiểu thế nào là I2C các bạn sang luồng giao tiếp I2C đọc, nếu không hiểu cũng chẳng sao, với trình dịch MikroC này thì các bạn cứ việc viết theo mẫu sẵn có là ok. Tất nhiên chúng ta thường có tham vọng phải hiểu cái gì nó phải tận gốc rễ, nhưng cũng nên biêt rằng sức người có hạn không thể cho cả thế giới vào cái đầu nhỏ bé của mình được nên những gì mà thằng khác nó đã chuẩn hóa, môddun hóa rồi thì cứ việc dùng đừng lăn tăn xem cơ chế hoạt động của nó thế nào làm gì cho mất công. Cái đó để sau đi, đôi khi bạn làm xong rồi quay lại đọc những cái trước kia chưa hiểu lại thấy hiểu nhanh hơn. Thế nên các bạn cứ theo dõi chương trình nếu có chỗ nào ko hiểu phải phát biểu nhé.
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-09-2007, 02:21 PM   #27
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Ban đầu, ds1307 chưa có giá trị nào cả trong các thanh ghi. Vì vậy, việc đầu tiên là phải nạp một giá trị bất kỳ cho các thanh ghi. Chương trình sau sẽ thực hiện công việc này. Sau này , bạn có thể dùng 4 nút bấm để hiệu chỉnh lại thời gian cho đúng với thực tế.

Code:
void INIT_MAIN() {
// Khoi tao truyen thong I2C
  I2C_Init(100000);       // Kích hoạt môddun truyền thông i2c với tốc độ baud là 100kHz
// Khoi tao DS1307
  I2C_Start();    // điều kiện start
  I2C_Wr(0xD0); // truyền địa chỉ của ds1307 và chọn ghi dữ liệu lên ds1307
  I2C_Wr(0x00); // Truyền địa chỉ ô nhớ đầu tiên của ds1307
  I2C_Wr(0x13); // Khoi tao gia tri ban dau cho  thanh ghi giây
  I2C_Wr(0x03); // Khoi tao gia tri ban dau cho  thanh ghi phút
  I2C_Wr(0x02); // Khoi tao gia tri ban dau cho  thanh ghi giờ
  I2C_Wr(0x03); // Khoi tao gia tri ban dau cho  thanh ghi thứ
  I2C_Wr(0x05); // Khoi tao gia tri ban dau cho  thanh ghi ngày
  I2C_Wr(0x03); // Khoi tao gia tri ban dau cho  thanh ghi tháng
  I2C_Wr(0x03); // Khoi tao gia tri ban dau cho  thanh ghi năm
  I2C_Wr(0x90); // đặt cấu hình cho thanh ghi điều khiển, sử dụng xung 1Hz.
  I2C_Stop();    // Điều kiện stop
}
Chương trình chính
Code:
void MAIN() {
  INIT_MAIN();
}

thay đổi nội dung bởi: namqn, 19-09-2007 lúc 02:48 AM. Lý do: định dạng lại code
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-09-2007, 02:33 PM   #28
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Trích:
Nguyên văn bởi nhh View Post
Liệu có thể bổ sung thêm Âm lịch, Alarm? Hoàn toàn được = phần mềm. Khổ nỗi cái LCD 16*2 hiển thị ít kí tự quá.
Muốn hiển thị âm lịch thì cho sang trang màn hình tiếp theo. Sử dụng nút bấm mode để xem tiếp các thông tin khác của lịch vạn niên.
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-09-2007, 03:43 PM   #29
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
vậy là từ bây giờ con ds1307 đã bắt đầu hoạt động và tự cập nhật dữ liệu về thời gian. chỉ khi nào hết pin nó mời ngừng hoạt động. Tiếp theo ta viết một chương trình đọc dữ liệu từ ds1307 rồi xuất ra màn hình LCD. Cứ 1s thì dữ liệu được cập nhật một lần và gửi ra màn hình LCD. Chương trình sẽ như sau:

Code:
/* KHAI BAO BIEN */
unsigned short second, minute, hour, day, date, month, year, flag_time;
char *day_txt;

/* KHOI TAO */
void INIT_MAIN() {
// Khoi tao cong A
  PORTA   = 0;
  TRISA   = 0xFF;
// Khoi tao cong B
  PORTB   = 0;
  TRISB   = 0xFF;
// Khoi tao cong D
  PORTD   = 0;
  TRISD   = 0;
// Khoi tao cong E
  PORTE   = 0;
  TRISE   = 0;
  ADCON1  = 0xE;
// Khoi tao LCD
  Lcd_Config(&PORTD,4,7,6,3,2,1,0);
  Lcd_Cmd(Lcd_CLEAR);
  Lcd_Cmd(Lcd_CURSOR_OFF);
// Khoi tao truyen thong I2C
  I2C_Init(100000);
// Khoi tao ngat ngoai 
  INTCON = 0x90; // Mo ngat toan cuc, mo ngat ngoai, xoa co ngat ngoai,   OPTION_REG = 0x87; // Chon suon len cho ngat ngoai 
}

/* DOC DU LIEU RTC TU DS1307 */
void READ_RTC() {
  I2C_Start();
  I2C_Wr(0xD0);
  I2C_Wr(0x00);
  I2C_Repeated_Start();  
  I2C_Wr(0xD1);
  second = I2C_Rd(1u);
  minute = I2C_Rd(1u);
  hour   = I2C_Rd(1u);
  day    = I2C_Rd(1u);
  date   = I2C_Rd(1u);
  month  = I2C_Rd(1u);
  year   = I2C_Rd(1u);
  I2C_Stop();
}

/* XU LY DU LIEU RTC */
void TRANSFORM_RTC() {
  switch (day) {
    case 1: day_txt = "ERO"; break;
    case 2: day_txt = "T.2"; break;
    case 3: day_txt = "T.3"; break;
    case 4: day_txt = "T.4"; break;
    case 5: day_txt = "T.5"; break;
    case 6: day_txt = "T.6"; break;
    case 7: day_txt = "T.7"; break;
    case 8: day_txt = "C.N"; break;
  }
}
/* HIEN THI LCD */
void BCD(unsigned short x, unsigned short y,unsigned short var) {
unsigned short var1, var2;
  var1 = (var >> 4) + 0x30;
  LCD_Chr(x,y,var1);
  var2 = (var & 0x0F) + 0x30;
  LCD_Chr_Cp(var2);
}
void LCD_DISPLAY() {
  LCD_Out(1,1,day_txt);
  BCD(1,5,date);
  LCD_Chr_Cp('/');
  BCD(1,8,month);
  LCD_Out_Cp("/20");
  BCD(1,13,year);
  BCD(2,1,hour);
  LCD_Chr_Cp(':');
  BCD(2,4,minute);
  LCD_Chr_Cp(':');
  BCD(2,7,second);
  LCD_Out(2,10,"T=");
  BCD(2,12,temp);
  LCD_Chr_Cp(223);
  LCD_Chr_Cp('C');
}
void DISPLAY_TIME() {
  READ_RTC();
  TRANSFORM_RTC();
  LCD_DISPLAY();
  PORTE.F0 = ~PORTE.F0;
}

/* XU LY NGAT */
void interrupt() {
    flag_time = 1;
    INTCON.INTF = 0; // Xoa co ngat ngoai
}

/* CHUONG TRINH CHINH */
void MAIN() {
  INIT_MAIN();
  while(1) {
    INTCON.INTE = 1;
    if (flag_time == 1) {
      DISPLAY_TIME();
      flag_time = 0;
    }
  }
}

thay đổi nội dung bởi: namqn, 19-09-2007 lúc 02:48 AM. Lý do: định dạng lại code
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-09-2007, 07:27 PM   #30
HL2
Nhập môn đệ tử
 
Tham gia ngày: Jun 2007
Bài gửi: 6
:
Tinhthanthep cho mình xin cái software và Crack với nha. Cũng tính mượn bạn film để làm board mạch nhưng chắc là khó rồi, vì mình ở HCM. Nếu cỏ thể cho mình xin file để tập làm.
Địa chỉ mail của mình: hlhluc@yahoo.com
Cám ơn bạn nhiều, những bài viết của các bạn rất hay.
HL2 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


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à 12:45 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