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)
-   -   Ghi một chuỗi ký tự vào ROM ngoài (http://www.picvietnam.com/forum/showthread.php?t=3771)

thientaisodo 24-03-2009 11:47 AM

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 24-03-2009 02:42 PM

HIC HIC , chẳng có ai trả lời, nhưng mà may là tìm ra cách rùi :D, 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

cskiller 24-03-2009 03:07 PM

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);
}


thientaisodo 24-03-2009 03:19 PM

Cảm ơn bạn , nhưng cái này có khác gì code mình đã test đâu ? :s

cskiller 25-03-2009 02:09 PM

delay_us(10); <==> i2c_stop();

thientaisodo 26-03-2009 05:08 PM

Hì hì, thank, mình phát hiện ra rùi, do chưa tạo tín hiệu Stop :D


Múi giờ GMT. Hiện tại là 08:31 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