24c64 harici eeprom veri okuma sorunu

Başlatan husam881, 19 Ekim 2011, 20:59:03

husam881

Selam arkadaşlar;

Bir konu hakkında sizlerin görüşüne ihtiyacım var. PIC16F877 ile 24c64 harici eeproma veri yazmak ve yazılmış olan veriyi okumak istiyorum.Kullandığım komutlar I2C write ve I2C read komutlarıdır. Hafızaya veri yazma kısmında bir sorun yok. Okuma yaparken bir sorunla karşılasıyorum. Eğer hafızadan okuyacağım veri 07h ten büyük ise yine sıkıntı yok.  Ancak veri 07h ten küçükse hafızadaki verileri şu şekilde okuyor;

Hafızadaki veri   00h       Okunan veri     01h
Hafızadaki veri   01h       Okunan veri     03h
Hafızadaki veri   02h       Okunan veri     05h
Hafızadaki veri   03h       Okunan veri     07h
Hafızadaki veri   04h       Okunan veri     01h
Hafızadaki veri   05h       Okunan veri     03h
Hafızadaki veri   06h       Okunan veri     05h
Hafızadaki veri   07h       Okunan veri     07h

(1 den fazla veri arka arkaya okunuyorsa 1. veriyi yukarıdaki gibi okuyor. Daha sonraki verileri FFh şeklinde okuyor). Acaba sizlerde böyle bir problemle karşılaştınız mı? Sorunun nedeni ne olabilir?

Yazmış olduğum kodları aşağıya ekliyorum .
----------------------------------------------------------------------------------------------------------------------------------------------------------
INCLUDE "MODEDEFS.BAS"
DEFINE  OSC 4
DEFINE LCD_DREG PORTD        ' Set LCD Data port
DEFINE LCD_DBIT 4            ' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_RSREG PORTA       ' Set LCD Register Select port
DEFINE LCD_RSBIT 2           ' Set LCD Register Select bit
DEFINE LCD_EREG PORTA        ' Set LCD Enable port
DEFINE LCD_EBIT 0            ' Set LCD Enable bit
DEFINE LCD_BITS 4            ' Set LCD bus size (4 or 8 bits)
DEFINE LCD_LINES 2           ' Set number of lines on LCD
DEFINE LCD_COMMANDUS 2000    ' Set command delay time in us
DEFINE LCD_DATAUS 50         ' Set data delay time in us

    TRISA=%00000000
    TRISB=%11111111
    TRISC=%00000000
    TRISD=%00000000
    TRISE=%000
    ADCON1=7    

'***************    I2C BAĞLANTI PİNLERİ    *******************************
SYMBOL  SCL=PORTC.3
SYMBOL  SDA=PORTC.4

'**************     DEĞİŞKEN TANIMLAMALARI  *******************************
RD1  VAR BYTE
RD2  VAR BYTE
RD3  VAR BYTE
RD4  VAR BYTE
RD0  VAR BYTE
RD  VAR BYTE
W  VAR BYTE[4]
WD  VAR BYTE[4]
WD1  VAR BYTE
WD2  VAR BYTE
WD3  VAR BYTE
ADRS   VAR WORD

'***************
SYMBOL  B0=RD.0
SYMBOL  B1=RD.1
SYMBOL  B2=RD.2
SYMBOL  B3=RD.3
SYMBOL  TUS1=PORTB.0
SYMBOL  TUS2=PORTB.1
CD  VAR BYTE
CQ  VAR BYTE
C0  VAR BIT
C1  VAR BIT
C2  VAR BIT
C3  VAR BIT
'***************
YEDI    VAR BYTE
YEDI=%00000111
DORT    VAR BYTE
DORT=%00000100
CR1 VAR BYTE
CR1=%10100001
CR2 CON %10100011
CR3 CON %10100101
CR4 CON %10100111

CW1 VAR BYTE
CW1=%10100000
CW2 CON %10100010
CW3 CON %10100100
CW4 CON %10100110

KYT   VAR BYTE
SGN VAR BYTE
'**************     ATAMALAR                *******************************
ADRS=%0000000000000000

WD[0]=%00000000 
WD[1]=%00000000 
WD[2]=%00000000 
WD[3]=%00000000
KYT=0
SGN=0
'***************************************************************************
BASLA:
        GOSUB EEPR1
        PAUSE   10
        GOSUB   OKU
        PAUSE   50
        CQ=CW2
        ADRS=0
        GOSUB   YAZ2
SON:END  
'**************  EEPROM İÇİN AYARLAMA YAPILIYOR   ****************************
EEPR1:
    CD=CR1             'OKUMA KONTROL BİLGİSİ AYARLANIYOR
    CQ=CW1             'YAZMA KONTROL BİLGİSİ AYARLANIYOR
    GOSUB    DONGU
    RETURN
DONGU:
    WD=1
    GOSUB   YAZ
    PAUSE   10
    RETURN
'************** EEPROMA BİLGİ YAZILIYOR    *************************************     
YAZ:
    I2CWRITE   SDA,SCL,CQ,ADRS,[WD,WD,WD,WD,WD,WD,WD,WD,WD,WD]
    pause   10
    RETURN
'************** EEPROMDAN BİLGİ OKUNUYOR    ************************************
OKU:
    I2CREAD    SDA,SCL,CD,ADRS,[RD[0],RD[1],RD[2],RD[3],RD[4],RD[5],RD[6],RD[7],RD[8],RD[9]]
    pauSE   10
    RETURN