avatar_efeworld

24c32 problem

Başlatan efeworld, 06 Eylül 2015, 17:52:34

efeworld

Selam arkadaşlar ben  eeprom un 16.adresinden sonrada yazdırmak ve okumak istiyorum fakat bir türlü işin içinden çıkamadım bilgilerini esirgemeyen arkadaşlarıma teşekkür ederim
DEFINE LCD_DREG PORTB 
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
define LCD RWREG PORTB
define LCD_RWBIT 2
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

SCL var portc.3
SDA var portc.4
B0 VAR WORD
BP VAR WORD
B1 VAR BYTE
B2 VAR BYTE
B3 VAR BYTE

PAUSE 100


I2CWRITE SDA,SCL,$A0,B0,["ABCDEFGHIiJKLMNO"]
pause 100
I2CWRITE SDA,SCL,$A0,BP,["PRSTUVYZ"]
PAUSE 100
DONGU:
LCDOUT $FE,1
FOR B0 =0 TO 15
I2CREAD SDA,SCL,$A0,B0,[B1]

LCDOUT $FE,$06,B1
PAUSE 100
NEXT B0
B3=16
FOR B3 =16 TO 22
I2CREAD SDA,SCL,$A0,BP,[B2]

LCDOUT $FE,$C0,$06,B2
PAUSE 100
NEXT B3

end

Bahri Bilir

Alıntı yapılan: efeworld - 06 Eylül 2015, 17:52:34
Selam arkadaşlar ben  eeprom un 16.adresinden sonrada yazdırmak ve okumak istiyorum fakat bir türlü işin içinden çıkamadım.

efeworld sorunu pek anlayamadım."eeprom un 16.adresinden sonrada yazdırmak ve okumak" burada eğer demek istediğin "eeprom un 16.adresinden sonra yazdırmak ve okumak istiyorum" ise picin eeprom hafızasını dikkate alarak write 16,17,18... ve read 16,17,18 gibi komutlarla yapabilirsin.

Ayrıntılar:
Bkz.:http://320volt.com/picbasic-dersleri-pic-basic-pro-ile-pic-programlama-9/

Yukarıdaki linkte eeprom kullanımı adına kafanızdaki çoğu sorunun aydınlanacağını düşünüyorum.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

efeworld

cevabınız için teşekkür ederim.write ve read kullanımını biliyorum fakat harici epromun 16.adresinden sonra yazdıramıyorum yani acayip acayip şeyler çıkıyor.mesela 72.adresinden itibaren etepic yazdırıp okumak istiyorum ama beceremedim

Bahri Bilir

Dediğim gibi bu kullandığınız Picin eeprom hafızasından kaynaklanıyor olabilir.İng varsa datasheetinden eeprom hafızasını kontrol ederek bu doğrultuda eepromu kullanmalısınız.Eğer ing datashheft okuyacak kadar iyi değilse kullandığınız pici paylaşırsanız konu hakkınada bilgisi olan arkadaşlar pic hakkındaki bildiklerini sizinle paylaşacaklardır.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

efeworld

kullandığım pic 16f877a fakat ben pic in içindeki epromu kullanmıyorum.harici bir eproma mesala 72. adrese etepic yazdırmak ve okumak istiyorum fakat beceremiyorum.ilginiz için teşekkür ederim

Bahri Bilir

#5
Alıntı yapılan: efeworld - 06 Eylül 2015, 22:13:11
kullandığım pic 16f877a fakat ben pic in içindeki epromu kullanmıyorum.harici bir eproma mesala 72. adrese etepic yazdırmak ve okumak istiyorum fakat beceremiyorum.ilginiz için teşekkür ederim
Kusura bakmayın kodlarınızı incelemeden yanıt yazdım.Hatta sadece kodlarınıza değil konu başlığına bile bakmamışım :(
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

Bahri Bilir

#6
Daha önce I2C harici eepromla bir çalışmam olmadı.Ama kodlarını incelerken farkettiğim küçük bir detay,

B0 VAR WORD
BP VAR WORD
B1 VAR BYTE
B2 VAR BYTE
B3 VAR BYTE


anladığım kadarıyla siz word tipinde değişkeni eeproma yazıyor ve byte tipi bir değişkenine eepromdan okuma yapıyorsunuz.Ki eğer öyleyse hatanın bundan kaynaklanabileceğini düşünüyorum.Yani B1,B2,B3 değişkenlerini word tipi olarak değiştirerek denemenin faydalı olacağını düşünüyorum.

Dediğim gibi sadece fark ettiğim basit bir detay.Ama emin olduğum bir çözüm yöntemi değil.Varsa bir yanlışım bilen arkadaşların düzeltmesinden mutlu olurum.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

ete

#7
Sorunun kaynağı şu,
Nasıl çalıştığını anlamadan öğrenmeden bir komutu kullanmaya çalışmanız.
Çözüm nedir dersen I2CWrite ve I2CRead komutlarını parametreleri ile birlikte iyice öğrenmek. Önce Write komutuna bir bakalım.
I2CWRITE Data,Clk,Kontrol,ADres,[Veri]
Data hattı hangi pine bağlı ise Data yerine onu kullanıyoruz. Genelde SYMBOL DTA=PORTC.2 (herhangi bir pin olabilir) tanımlama yapıp komutta pin belirtmek yerine yalnızca DTA kullanıyoruz.
CLK aynı şekilde adı üzerinde CLK pini veya onun sembol ismi oluyor.
KOntrol I2C sisteminde cihaz numarası olarak geçiyor. Her bir cihazın bir numarası bulunuyor. Data sheet de epromun cihaz numarası da verilmiştir . Epromlar için kullanılan numara genelde $A0 dır ki bu doğru kullanılmış zaten.
Adres ise yazma yada okuma yapılacak adresin değeridir. 1K lık yada 1K lık banklardan oluşan epromlarda maksimum adres $FF olacağı için adres değişkeni Byte cinsinden olur. Ama hafıza olarak daha büyük epromlarda Adres değeri Word cinsinden seçilmektedir.
Burada sözkonusu olan 24C32 eprom olduğuna göre adres bilgisi WORD tipinde olmalıdır.

I2CWRITE SDA,SCL,$A0,B0,["ABCDEFGHIiJKLMNO"]  komut satırı ne iş yapıyor bir bakalım. Komut ilk açılışta verilmiş. O halde B0 değişken değeri sıfırdır. Ama bazen açılışta değişkenler rastgele değerde alabilir bunda unutmamak gerekir. Sıfır olduğunu varsayarsak,
epromun ilk adresinden itibaren sırası ile ABCDEFGHIiJKLMNO harflerin ASCII karşılıkları eproma yazılıyor.
Hemen ardından,

I2CWRITE SDA,SCL,$A0,BP,["PRSTUVYZ"]
komutu ile yine epromun ilk adresinden itibaren ve bir önceki yazılanların üzerine gelecek şekilde PRSTUVYZ harf değerleri de yazılıyor.
Burada amaç bir birinin peşine yazılmaları olsa gerek ama dediğim gibi komutun nasıl kullanıldığını bilmeden yapınca böyle oluyor işte.
Neden üzerine derseniz BP değişkenide başlangıçta sıfır değerini alacak ve böyle epromun sıfır nolu adresinden itibaren değerler yazılacaktır.

Birinci komutun doğru çalışacağını varsayarsak ikincii komut şöyle verilmeli idi,
BP=16 : I2CWRITE SDA,SCL,$A0,BP,["PRSTUVYZ"]
Böylece yeni gelenler 16. adresten itibaren yazılacaklardı.
Bu sorunun asıl cevabı yukarıdaki açıklamalarda mevcut. Bir eproma kayıt yapmak için adres bilgisi verilmelidir. Hangi adresi verirsen epromun o adresine kayıt yapılır.
Okuma komutu I2CREAD, DTA, CLK, KONTROL, ADRES,[Değişken] bu tek byte okuma komutudur. Sıralı olarak birden fazla byte okumak için ya değişken adedini artırmak yada sürekli olarak okuma adresini bir artırarak okuma yapmak gerekir.

Son bir hatırlatma adres değişkeni epromun cinsine göre byte yada word tipi olmaktadır. Ne olacağını data sheet den öğreniyoruz.

Ete

efeworld

hocam ALLAH sizden bin kere razı olsun çok teşekkür ederim

efeworld

hocam ben yinede prstuvyz yi okuyamıyorum alt satırda sadece p yazıyor öyle kalıyor

efeworld

#10
böyle yapınca çalıştı teşekkürler hocam

DEFINE LCD_DREG PORTB 
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
define LCD RWREG PORTB
define LCD_RWBIT 2
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

SCL var portc.3
SDA var portc.4
B0 VAR WORD
BP VAR WORD
B1 VAR BYTE
B2 VAR BYTE
B3 VAR BYTE
B4 VAR BYTE
i VAR BYTE

I2CWRITE SDA,SCL,$A0,B0,["ABCDEFGHIiJKLMNO"]
pause 100
bp=16
I2CWRITE SDA,SCL,$A0,BP,["PRSTUVYZ"]
PAUSE 100
DONGU:
LCDOUT $FE,1
FOR B0 =0 TO 15
I2CREAD SDA,SCL,$A0,B0,[B1]

LCDOUT $FE,$06,B1
PAUSE 100
NEXT B0
i=0
bp=0
FOR i =0 TO 7
I2CREAD SDA,SCL,$A0,BP+16,[B1]

LCDOUT $FE,$C0+i,B1
bp=bp+1
PAUSE 100
NEXT i

ete

Sonunda anlattıklarımı dikkate alıp doğru yolu bulmuşsun ama yinede sağ el ile sol kulak tutuluyor.
PRSTUVYZ gurubunu yazarken başlangıç adresini 16 olarak verip yazıyorsun. Yazılacakları ard arda yazdığın için her bir karekter için derleyici eprom adresini otomatik bir artırarak karekterleri 16-23 adresler arasına yerleştiriyor.

Bu karekterleri okumak için yine 16 dan başlayıp ya tek komutta 8 değişkenle okuman yada teker teker okuyup her seferinde adresi bir artırman gerekir. Sen ikinci metodu kullanmışsın ama şöyle olsa daha akıllıca olurdu.
BP=16
FOR I =0 TO 7
I2CREAD SDA,SCL,$A0,BP+I,[B1]
LCDOUT $FE,$C0+i,B1
PAUSE 100
NEXT i

Burada BP eprom başlangıç adresini belirliyor. I döngüsüde her seferinde adresi bir artırmanı sağlıyor. Çünki her seferinde I sayısı BP ye ekleniyor adresi belirlemek için.
Gördüğün gibi daha az kod ve daha anlaşılır çalışma.
Ete

efeworld

hocam I yerine i olmalımıydı acaba anlayamadım

efeworld

#13
SİLEMEDİM

efeworld

böyle yapınca çalıştı hocam


DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
define LCD RWREG PORTB
define LCD_RWBIT 2
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

SCL var portc.3
SDA var portc.4
B0 VAR WORD
BP VAR WORD
B1 VAR BYTE
i VAR BYTE

I2CWRITE SDA,SCL,$A0,B0,["ABCDEFGHIiJKLMNO"]
pause 100
b0=16
I2CWRITE SDA,SCL,$A0,B0,["PRSTUVYZ"]
PAUSE 100
b0=24
I2CWRITE SDA,SCL,$A0,B0,["etepic"]
PAUSE 100
LCDOUT $FE,1
FOR B0 =0 TO 15
I2CREAD SDA,SCL,$A0,B0,[B1]

LCDOUT $FE,$06,B1
PAUSE 100
NEXT B0
i=0
b0=16
FOR i =0 TO 7
I2CREAD SDA,SCL,$A0,B0+i,[B1]

LCDOUT $FE,$C0+i,B1
PAUSE 100
NEXT i
lcdout $fe,1

i=0
b0=24
FOR i =0 TO 5
I2CREAD SDA,SCL,$A0,B0+i,[B1]

LCDOUT $FE,$C0+i,B1
PAUSE 100
NEXT i


Powered by EzPortal