PIC EEPROM'a yazılan ile okunan farkı

Başlatan ryan, 10 Temmuz 2008, 00:13:28

ryan

Selam Arkadaşlar,

Şimdiye kadar pic'de karşılaştığım en ilginç sorun ile karşı karşıyayım.

PicBasic Pro ile programladigim 877'nin eepromuna WRITE komutu ile veri yaziyorum.
Doğrulama için veriyi okuduğumda yazdığım bazen yazdığım değerden farklı bir değer görebiliyorum.
Nedenini anlamak için gönderdiğim ve gelen verileri binary'ye çevirdim ve 5. bitteki 0'ların 1 olduğunu gördüm.
Yani 236 yazdığımda 252 okuyorum.
128 yazdığım 144 okuyorum.
1 yazdığımda 17 okuyorum.

Program ana döngüye gelmeden önce eepromun kullandığım bölümüne "0" değerini yazan küçük bir döngü çalıştırıyorum. Pic'i çıkarıp programlama kartıyla okuttuğumda 0 yazdığım adreslerdeki 0 değerini görüyorum. Yani bir setli kalma durumu yok.

Bu arada programın ilgili bölümleri:

....
Duty=500
....
KayitAdresi = 0
.....
gosub CleanEEPROM
PreMain:
Hserout ["Program Calisiyor "]
LCDOUT cmd, row1, "Calisiyor..."
Main:
toggle led
pause 50
IF portd.0 = 1 THEN GOSUB Button1
IF portd.1 = 1 THEN GOSUB Button2
IF portd.2 = 1 THEN GOSUB kaydet
If portd.3 = 1 THEN GOSUB Git
goto main
......

Kaydet:
disable
bekle:if portd.2 = 1 then goto bekle

WRITE KayitAdresi, duty.byte0
pause 1000
read KayitAdresi, validation.byte0
lcdout cmd, cls, "d:",#duty.byte0," v:",#validation.byte0
lcdout cmd, row2, "Adres: ",#kayitadresi
pause 1500

KayitAdresi = KayitAdresi + 1

WRITE KayitAdresi, 128 'duty.byte1
pause 1000
read KayitAdresi, validation.byte1
lcdout cmd, cls, "d:",#duty.byte1," v:",#validation.byte1
lcdout cmd, row2, "Adres: ",#kayitadresi
pause 1500

KayitAdresi = KayitAdresi + 1

enable
RETURN

.........

CleanEEPROM:
for adres = 1 to adres= 30
lcdout cmd,right, "."
write adres, 0
pause 50
next adres
return
[/color]

Bir de dikkatimi çeken bişey var.
Pic'i bilgisayardan okuttuğumda EEPROM'un kullanılmayan tüm değerlerinde EF yazılı olduğunu gördüm. Bu da 11101111 ediyor. 5.bit diğerlerinden farklı ve"0". Nedenini merak ettim oldukça doğrusu. FF yazması gerekiyor sanırım.

Daha önce de bu write fonksiyonunu aynı mikroişlemci üzerinde aynı dille (PBP) kullanmıştım ama hiç sorun çıkmamıştı.
Anlayamıyorum şuandaki problemi. Bir de şuan Bootloader kullanıyorum.
Bootloader programını değiştirdim.
tamamen farklı bir program kurdum ve hata hala devam ediyor.

"Pic'le ilgili karşılaştığım en ilginç sorun" başlığı editlenmiştir. Anlam içeren başlıklar kullanınız. Aksi halde konu çöpe gönderilecektir.

microcozmoz

Şu an tam hatırlayamadığım bir nedenden dolayı PBP kullandığım bir projede eeprom'a ( 16F628 ) yazarken birer atlayarak yazmışım değerleri.

Örnek olarak ;
a var byte 
b var byte

yaz:
write 1,a
write 3,b
oku:
read 1,a
read 3,b

Umarım faydası olur..
"Bütün bu şerâitten daha elîm ve daha vahim olmak üzere, memleketin dahilinde, iktidara sahip olanlar gaflet ve dalâlet ve hattâ hıyanet içinde bulunabilirler."

ryan

atlayarak yazmanın faydası olmadı ama EEPROM komutuyla ile yazmanın faydası oldu.
EEPROM komutuyla ile yazdığımda doğru şekilde okuyabiliyorum ama EEPROM ile variable yazamıyorum. Sadece const. yazılabiliyor.

Gurkan-Demirbas

Hocam;
Write komutunu Interrupt içerisinde kullanmışsın !!....;
PBP'nin hazreti Help'i (Allah başımızdan eksik etmesin) şöyle buyurur:
Alıntı YapIf interrupts are used in a program, they must be turned off (masked, not DISABLEd) before executing a WRITE, and turned back on (if desired) after the write instruction is complete. An interrupt occurring during a WRITE may cause it to fail
Yani dediği şey şu: Write komutu işletilirken bir interrupt oluşması, write'ın işletilmesini sekteye uğratabilir.
Çok emin olmamakla birlikte :  Write komutunu Kesme hizmet programından çıkarıp ana programa yazarsan problemin çözülebilir gibi.

GürkaN

ryan

Yazdığın satırları pbp dökümanı içerisinde ben de okudum.
Write komutunu kesme hizmet programı içerisinde kullanmıyorum.
Ayrıca dökümanda da söylediği gibi write komutunu işletmeden önce, hatta rutine girer girmez DISABLE ile kesmeyi kapatıyorum, kodlardan da görüldüğü gibi.

Gurkan-Demirbas

Programı tam vermemişsin, dolayısı ile Disable ve enable komutları komutları genelde ISR'de kullanıldığı için ISR zannediliyor.
Alıntı Yaphatta rutine girer girmez DISABLE ile kesmeyi kapatıyorum, kodlardan da görüldüğü gibi.
Alıntı Yapthey must be turned off (masked, not DISABLEd)
==> Türkçesi; interruptları maskeleyin, DISABLE komutunu kullanmayın !...
Alıntı YapDISABLE both debug and interrupt processing following this instruction. Interrupts can still occur but the BASIC interrupt handler in the PicBasic Pro program and the debug monitor will not be executed until an ENABLE is encountered
==> Türkçesi; Disable ve de Enable Interrupt handler'larda kullanılır !....

Şunu dene
Disable yerine GIE=0 (sıfır) yap ve Enable yerine GIE=1 yap dene; Disable ve de Enable'ı da kaldır ordan; bakalım çalışacakmı


iyi çalışmalar

Gürkan

ryan

bişey değişmedi.
pbp 2.47 kullanıyorum, 2.46 denedim yine olmadı.
EEPROM komutuyla yaptığımda sorun çıkmıyor.
Daha önceki devrede WRITE ile de çıkmıyodu.

erkan614

bu problemin benzeri 2 gun önce başıma geldi benimki adc de dorun çıkarıyordu interrupttan dolayı ben çozumu Gurkan-Demirbas nin de dediği gibi çozdum
adcislem:
INTCON=%00100000
high alarm           
low heatbit
ADCIN 0,acu1  '0 nolu kanaldan Analog değeri oku ve acu1 değişkenine aktar.
acu=6000
INTCON=%10100000
return

papsukkal

dostum byte.1 lerde 1. byte yerine hep 128 değerini yazdırmışsın
muhtemelen sorunu çözecek

neticeyi merak ediyorum 8O