PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Học PIC16F877A qua đề tài Lịch Vạn Niên (http://www.picvietnam.com/forum/showthread.php?t=1437)

daikaka 14-05-2008 02:33 AM

Anh tinhthanthep oi!
- Em đang nghiên cứu về PIC8F877
- Anh co crack của MikroC ver 6 không? Nếu có gửi cho e với (soft và crack luôn nha a )
- Cho em xin mạch nguyên lý và chương trình lịch vạn niên
Cảm ơn anh rất nhiều !
Email : jindo1287@yahoo.com
Topic của arất hữu ích với tất cả mọi người.

Son Hien 27-05-2008 12:37 PM

có anh nao giup minh với sao mình tạo Project bằng mikroc nhu file hướng dẩn của bac tinh thần thép nhưng lúc biên dịch nó k dich ra file hex , dó là pic 16F877A, còn nữa nếu muon tạo Project dể khi viết xong cho biên dịch ra file hex cho pic 18F452 thì làm thế nào có bác nào biết xin giup em

Son Hien 27-05-2008 01:15 PM

Do nhiet do hien thi LCD dung DS1820 pic6F877A
 
có bài viet nay em không hiểu và sau khi viết xong em dịch nó không ra file hex co anh nào biết nhờ chỉ giúp em cảm ơn nhiều
unsigned temp;
unsigned short j;

void Display_Temperature(unsigned int temp) {
//...
}
Void main() {
ADCON1 = 0xFF;
PORTA = 0xFF;
TRISA = 0xFF;
PORB = 0;
TRISB = 0;
do {
ow_Reset(&PORTA,5);
ow_write(&PORTA,5,0xCC);
ow_write(&PORTA,5,0x44);
Delay_us(120);

ow_Reset(&PORTA,5);
ow_write(&PORTA,5,0xCC);
ow_write(&PORTA,5,0xBE);
Delay_us(400);

j = ow_Read(&PORTA,5);
temp = ow_Read(&PORTA,5);
temp <<= 8;
temp +=j;
Display_Temperature(temp);
Delay_ms(500);
}
while (1);
}//~!

tdaminh 17-07-2008 08:40 AM

Bác tinhthanthep cho minh hỏi:
- ROM ngoài chỉ chứa giờ phút giây alarm phải không ?
- Nếu thay bằng ROM của PIC luôn, thì làm thế nào ?
Cảm ơn.

tallht 17-07-2008 11:31 AM

Code:

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

mấy thông số của mấy hàm trên mình làm sao mà biết được hả bác?còn LCD bác dùng là loại nào vậy? mình thấy nó có tới 16 chân>?

tallht 17-07-2008 11:56 AM

????
 
1 Attachment(s)
Trích:

Nguyên văn bởi tinhthanthep (Post 11309)
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.


bác ơi ! mình đã tìm được thư viện lệnh của LCD gòy! nhưng sao viết như bác chỉ mà nó chẳng xuất ra chữ nào hết
có file kèm theo đây:

tallht 17-07-2008 12:50 PM

????
 
Trích:

Nguyên văn bởi tinhthanthep (Post 10926)
Chào các bạn!
Hiện mình đã làm xong mạch Lịch Vạn niên sử dụng PIC16F877A. Mình sẽ lần lượt post các chương trình thử nghiệm trên mạch này. Qua Project này các bạn sẽ làm chủ được con PIC16F877A và trình dịch MikroC, một trình biên dịch rất dễ sử dụng cho người mới bắt đầu học.
Đây là sơ đồ mạch nguyên lý:

bác ơi! trong sơ đồ của bác có cái ICSP-BLD là cái gì vậy? trong proteus mình chẳng thấy đâu cả? nó dùng làm gì trong sơ đồ mạch này?
ah còn con 24c04 của bác,trong proteus chỉ có 2 chân A1,A2 thôi ,đâu có tới 3 chân như của bác đâu? bác giải thích rõ chút ah! cảm ơn bác nha!

minhsondaklak 18-07-2008 10:30 AM

Khởi tạo ds1307
 
Trích:

Nguyên văn bởi tinhthanthep (Post 11447)
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();
}


Chào các huynh !
Theo "lịch vạn niên" của Bác Thép, mình còn thắc mắc 1 điều, nhờ các Huynh xem giúp:
Trong hàm INIT_MAIN() có đoạn khởi tạo cho ds1307 như trên. Như thế cứ mỗi lần con PIC được cấp điện lại (mất điện lưới rồi có lại ấy !) thi đồng hồ lại bị Reset theo giá trị mình khởi tạo ban đầu cho nó. Thế hoá ra mỗi lần như vậy phải đi chỉnh lại giờ cho đồng hồ à !
Hay phải xử lý thế nào đây ? mong các Huynh chỉ giúp, xin cám ơn !

nguyenthinho 19-07-2008 01:53 PM

bác Tinhthanthep có thể gửi cho mình cái software và crack của Mickro C với nha. Cảm ơn bác nhiều lắm.Mail của mình là ghetnguoithu3@yahoo.com

david 19-07-2008 01:57 PM

http://www.picvietnam.com/forum//showthread.php?t=2505
tìm trong diễn đàn trước rồi hãy hỏi nhé bạn ! :)

minhsondaklak 19-07-2008 05:57 PM

Mô phỏng "Lịch vạn niên" với proteus
 
1 Attachment(s)
Cùng thực hành với "lịch vạn niên"

minhsondaklak 20-07-2008 12:33 AM

Khởi tạo ds1307
 
Hôm nay mình đã cho chạy trên mạch thực nghiệm, kết quả:
- Phần code khởi tạo cho ds1307 chỉ cho chạy 1 lần, để khởi tạo cho IC ds1307
- Sau đó phải xoá đoạn code này đi, biên dịch lại và nạp lại cho PIC thì OK !!!

meishun 20-07-2008 04:01 PM

con DS1307 có vùng ram cho người dùng tùy ý sử dụng, sao ta không đặt 1 giá trị bất kì (ví dụ 0xff) tại 1 ô nhớ nào đó (chẳng hạn tại 0x09). Trong hàm main, ta kiểm tra giá trị tại 0x09 của DS1307, nếu = 0xff thì nhảy đến vòng lặp chính, nếu khác thì gọi hàm thiết lập giá trị cho DS1307. Đây là cách mà tôi bẫy DS mỗi khi cúp điện.

minhsondaklak 20-07-2008 06:02 PM

???
 
Chào meishun !
Bạn có thể nói rõ hơn được không: Lệnh ghi giá trị 0xff vào địa chỉ 0x09 cho DS thì đặt ở đâu được ?

meishun 21-07-2008 03:33 PM

ví dụ hàm khởi tạo cho DS1307 tôi trích ra trong 1 project trước kia của tôi (do ưu tiên giao tiếp SPI cho MMC nên tôi thiết lập giao tiếp I2C bằng phần mềm, trình biên dịch MikroC)
Code:

void RTC_init()
{
    unsigned char i,RTC_flag;
    // dat ba^~y DS1307
    RTC_flag = RTC_get(0x08);        // doc gia tri tại địa chỉ 0x08 của DS1307 .
    if(RTCflag!=0xFF)                    // neu ko phai 0xFF
    {
        RTC_setdate(0x21,0x07,0x08);        // thi khoi tao gia tri cho DS1307
        RTC_settime(0x14,0x30,0x00);
        Soft_I2C_Start();                // dat cau hinh cho DS
        Soft_I2C_Write(RTC_ID);
        Soft_I2C_Write(0x07);                //dat con tro tai vi tri nay
        Soft_I2C_Write(0x10);                // tao xung 1Hz tai chan so 7.
        Soft_I2C_Write(0xFF);          // ghi giá trị 0xFF vào ô nhớ có địa chỉ 0x08;
        Soft_I2C_Stop();
    }
}

- với các hàm do người dùng tự định nghĩa (nếu nắm được nguyên tắc I2C thì thật dễ dàng):
unsigned char RTC_get(unsigned char addr);
RTC_settime(unsigned char hh, unsigned char mm, unsigned char ss);
RTC_setdate(unsigned char dd, unsigned char mm, unsigned char yy);
- khi đó, trong hàm main():
Code:

void main()
{
  // thiet lap PORT cho PIC
  // thiet lap gia tri cho cac thanh ghi chuc nang khac, v.v...
  RTC_init();  // goi ham khoi tao DS1307 - da co "trap".
  // cac ham khac ....
  while (1)
  {
      // hien thi hoac cac cong viec khac....
  }
}

như vậy, khi được cấp điện lại, đầu tiên con PIC sẽ lấy giá trị trong ô nhớ 0x08 của 1307 để kiểm tra, nếu là 0xFF thì bỏ qua việc khởi tạo.
Thực tình, việc bẫy này cũng chỉ "khá" hiệu quả thôi. Tôi cung ko hiểu tại sao lâu lâu con DS1307 bị treo (?), một ngày mà cúp điện chừng 3-4 lần là nó chạy "tào lao" thôi. Có lẽ bị sốc nguồn chăng??


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam