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 Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc 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 24-03-2009, 11:47 AM   #1
thientaisodo
Đệ tử 4 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Tĩnh - Hà Nội
Bài gửi: 61
:
Send a message via Yahoo to thientaisodo
Ghi một chuỗi ký tự vào ROM ngoài

Chào các bạn, mình làm giao tiếp I2C giữa 16F877A và 24C64 (sơ đồ mạch và code trong file đính kèm).
Mình đã làm mạch thật, đầy đủ các chân kết nối, sau một hồi loay hoay thì mạch cũng đã chạy, đọc data từ một chuỗi địa chỉ liên tiếp trong ROM ngoài hiển thị lên LCD hay ghi một giá trị vào ROM ngoài ở một địa chỉ thì được. Nhưng sau khi ghi xong, mình tăng địa chỉ lên và ghi tiếp thì chương trình dừng lại, đọc dữ liệu từ 24C64 (qua mạch nạp) thì đúng là có ghi vào địa chỉ đầu tiên, nó không ghi tiếp vào điạ chỉ tiếp theo trong ROM? Kể cả mình đã không chờ ACK, trên LCD báo ghi sang địa chỉ thứ 2 nhưng thực tế thì nó chỉ ghi mỗi một giá trị vào địa chỉ đầu tiên trên ROM.
Bó tay, nhờ các bạn giúp đỡ ? :s

Hic hic, mạng ở cti không cho up files, các bạn nhìn code thì mường tượng ra mạch vậy (


Code:
#include <16F877A.h>
#include <def_877a.h>
//#include <pic.h>
#device *=16 ADC=10
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP,
#use delay(clock=20000000)
#use i2c(master,sda=PIN_C4,scl=PIN_C3,force_hw,Slow)
#include <lcd_lib_4bit.c>

int16 add;
int8 data,redata,buffer,low,high,count;

void write_ext_eeprom(int16 add, BYTE data)
{
   short int status;
   i2c_start(); // bao hieu bat dau giao tiep i2c
   i2c_write(0xa0);  // dia chi thiet bi nhan
   i2c_write(add>>8); // gui den dia chi cao cua thiet bi nhan (dia chi cot)
   i2c_write(add);  // gui den dia chi thap cua thiet bi nhan (dia chi hang)
   i2c_write(data);  // ghi data vao dia chi tren cua thiet bi nhan
   i2c_stop();    // bao hieu ngung ghi
   i2c_start();   // bao hieu bat dau giao tiep
   status=i2c_write(0xa0); // kiem tra trang thai cua thiet bi nhan
   while(status==1)  // lap lai cho den khi thiet bi da nhan xong (No Ack)
   {
      i2c_start();
      status=i2c_write(0xa0);
   }
   
   delay_us(10);
}

BYTE read_ext_eeprom(int16 add)
{
   BYTE data;
   i2c_start();
   i2c_write(0xa0);
   i2c_write(add>>8);
   i2c_write(add);
   i2c_start();
   i2c_write(0xa1);
   data=i2c_read(0); // No Ack
   i2c_stop();
   return(data);
}

void convert_to_bcd(int8 x)
  {
   low=x%10;  //chia lay phan du, so hang don vi
   high=x/10;   //tach hang tram va hang chuc
   low = low + 0x30;
   high = high + 0x30;
  }

main()
{
   LCD_init();           // Khoi tao LCD
   printf(LCD_putchar," Dieu Nhat Tuan ");
   lcd_putcmd(0xC0);
   printf(lcd_putchar, " thientai_sodo ");
   delay_ms(2000);
   
   add=0x00;
   count=0x00;
   data=99;

  while(1)
   {  

      write_ext_eeprom(add,data);
      lcd_putcmd(0xC0);      
      printf(lcd_putchar, "Write Data: ");
      LCD_putchar(count);
      printf(lcd_putchar, "-");
      LCD_putchar(data);
      //convert_to_bcd(data);
      //LCD_putchar(high);
      //LCD_putchar(low);
      delay_ms(500);
      ++add;
      ++count;
      
   }
   
}
thientaisodo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-03-2009, 02:42 PM   #2
thientaisodo
Đệ tử 4 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Tĩnh - Hà Nội
Bài gửi: 61
:
Send a message via Yahoo to thientaisodo
HIC HIC , chẳng có ai trả lời, nhưng mà may là tìm ra cách rùi , sau khi ghi và trước khi tăng địa chỉ kế tiếp để ghi, mình cho đọc lại dữ liệu tại địa chỉ ROM ngoài vừa ghi xong một lần nữa là ok > amen
thientaisodo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-03-2009, 03:07 PM   #3
cskiller
Đệ tử 4 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 89
:
Code:
void write_ext_eeprom(long int address, BYTE data)
{
   short int status;
   i2c_start();
   i2c_write(0xa0);
   i2c_write((address>>8)&0x1f);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
   i2c_start();
   status=i2c_write(0xa0);
   while(status==1)
   {
      i2c_start();
      status=i2c_write(0xa0);
   }
   i2c_stop();
}

BYTE read_ext_eeprom(long int address) {
   BYTE data;
   i2c_start();
   i2c_write(0xa0);
   i2c_write((address>>8)&0x1f);
   i2c_write(address);
   i2c_start();
   i2c_write(0xa1);
   data=i2c_read(0);
   i2c_stop();
   return(data);
}
__________________
Quang báo RG/RGB 6/8/12/16 bits màu
Phone No: 0905.034.086
Email: lmquyen@gmail.com
cskiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-03-2009, 03:19 PM   #4
thientaisodo
Đệ tử 4 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Tĩnh - Hà Nội
Bài gửi: 61
:
Send a message via Yahoo to thientaisodo
Cảm ơn bạn , nhưng cái này có khác gì code mình đã test đâu ? :s
thientaisodo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-03-2009, 02:09 PM   #5
cskiller
Đệ tử 4 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 89
:
delay_us(10); <==> i2c_stop();
__________________
Quang báo RG/RGB 6/8/12/16 bits màu
Phone No: 0905.034.086
Email: lmquyen@gmail.com
cskiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-03-2009, 05:08 PM   #6
thientaisodo
Đệ tử 4 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Tĩnh - Hà Nội
Bài gửi: 61
:
Send a message via Yahoo to thientaisodo
Hì hì, thank, mình phát hiện ra rùi, do chưa tạo tín hiệu Stop
thientaisodo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bà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à 05:13 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