PICBASIC'de eeprom belleğe yazma (İlk 16 adrese yazılıyor, 17. ye yazılmıyor)

Başlatan hamityanik, 27 Aralık 2010, 18:16:35

hamityanik

Merhaba arkadaşlar,

PIC programlamada yeniyim. PICBASIC PRO kullanıyorum. 16F877'nin eeprom belleğine veri yazdırıp, sonra o veriyi kullanmaya çalışıyorum. Küçük bir problem yaşıyorum.

BILGI değişkeninde 1 BYTE'lık bilgi var.

WRITE 0, BILGI
WRITE 1, BILGI
...
WRITE 14, BILGI
WRITE 15, BILGI


Yukarıdaki gibi WRITE komutuyla 0. adresten 15. adrese kadar sorunsuz bir şekilde 1'er BYTE'lık bilgileri yazabiliyorum. Ancak 16, 17. ve daha yukarı adreslere veriyi yazdıramıyorum.

Örneğin şu kod ile BILGI'yi 16. adrese yazdıramıyorum;
WRITE 16, BILGI


Küçük bir noktayı kaçırıyorum ama internetteki araştırmalarıma rağmen çözüm bulamadım. Yardımlarınızı rica ediyorum, gerçekten çok memnun olacağım.

Şimdiden teşekkür ederim.

hamityanik

18 görüntülenme olmuş, kimse bir cevap yazmamış. :s Yok mu bir çözüm önerisi olan?

Ruzgarbey

merhaba pic eeproma bilgi yazarken 2 adres arasında datasheetinde belirtilen değer kadar beklme yapılması gerekiyor.siz değer yazarken bekleme işlemi yaptınızmı acaba?

kod:

@ DEVICE pic16F877A 
@ DEVICE pic16F877A, WDT_OFF
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, XT_OSC

DEFINE OSC  4

PortA=0:TrisA=0 'portA yı sıfırladık ve pinleri çıkış olarak ayarladık
PortB=0:TrisB=0 'portB yi sıfırladık ve pinleri çıkış olarak ayarladık
PortC=0:TrisC=%10000000 'portC yi sıfırladık ve c7 GİRİŞ OLARAK AYARLANDI
PortD=0:TrisD=0 'portD yi sıfırladık ve pinleri giriş olarak ayarladık
PortE=0:TRisE=0 'portE yi sıfırladık ve pinleri çıkış olarak ayarladık

CMCON = 7
ADCON1=7

BILGI VAR BYTE
I VAR BYTE

CLEAR
BILGI=65
PAUSE 3000
BASLA:
FOR I=0 TO 100
WRITE I,BILGI
PAUSE 5
NEXT



END

##############################

kolay gelsin
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

Tagli

WRITE komutu gerekli beklemeyi içinde yapıyor olsa gerek. Ancak resmi dökümantasyonda işlem sırasında kesmelerin maskelenmiş olması gerektiği yazıyor, bunu bir okumakta fayda var.

Ayrıca sanki daha önce buna benzer bir konu tartışılmış ve cihazda bozukluk olabileceği fikri öne sürülmüştü. Sen bence 16'yı atlayarak 17'den devam etmeyi bir dene.
Gökçe Tağlıoğlu

omereliusuk

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [omer eliusuk...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 28.12.2010                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 16F877A
TRISA=0
TRISB=0
TRISC=0
TRISD=0
TRISE=0
ALL_DIGITAL TRUE
Declare LCD_DTPIN PORTA.0     '
Declare LCD_ENPIN PORTA.4    '
Declare LCD_RSPIN PORTB.2
Declare LCD_INTERFACE 4
Declare LCD_LINES 4
Declare LCD_DATAUS 10
Cls
Dim W As Byte
Dim X As byte
BASLA:
For W=$0 To $64
EWrite W,[W+1]
DelayMS 100
Print $FE,$80, HEX2 W,"         ",HEX2 X
Next
GoSub OKU
Stop
End
OKU:
For W=$0 To $64
X =ERead W
DelayMS 500
Print $FE,$80, HEX2 W,"         ",HEX2 X
Next
Return

ŞUNA BİR BAK belki hatalarını bulabilirsin. "tabi hatam varsa onu da "

hamityanik

Tekrar merhaba, öncelikle cevaplarınız için teşekkür ederim.

Alıntı yapılan: Ruzgarbey - 28 Aralık 2010, 11:09:07
merhaba pic eeproma bilgi yazarken 2 adres arasında datasheetinde belirtilen değer kadar beklme yapılması gerekiyor.siz değer yazarken bekleme işlemi yaptınızmı acaba?

Bilgiyi aslında BASLA: ... GOTO BASLA döngüsü içinde yazdırıyorum. Döngünün içine PAUSE 20 işlemi koymuştum. Ancak BILGI'yi yazdırmadan önce READ ile adresin boş olup olmadığını kontrol ediyorum. READ ile WRITE komutları arasına PAUSE koymadım. Okul dönüşü evde bunu deneyeceğim.

Alıntı yapılan: Tagli - 28 Aralık 2010, 11:53:22Ayrıca sanki daha önce buna benzer bir konu tartışılmış ve cihazda bozukluk olabileceği fikri öne sürülmüştü. Sen bence 16'yı atlayarak 17'den devam etmeyi bir dene.

Elimde 2 tane 16F877 var. İkisinde de aynı problemi yaşıyorum. Tavsiyenizi deneyip sonuçları tekrar bu konu altına yazacağım.

İyi çalışmalar diliyorum.

ete

Normalde böyle bir sorun olmaması gerek. İlk defa böyle bir sorunla karşılaşıyorum.
Eeprom da yazma işlemi yaklaşık 10 ms lik bir süre gerektirir. Bu nedenle ya her write komutundan sonra Pause 10 koymanız gerekir.
Aslında bazen deneme yapıyorum ve toplu bilgi yazdıktan sonra tek bir pause 10 koyuyorum sorun çıkmıyor. Ama sen şimdilik her komut peşine bir pause 10 koy bakalım sonuç ne olacak.
Genelde bu tür hatalar programlama mantığından da kaynaklanabiliyor. Olaya yalnızca eproma bilgi yazılmıyor diye bakmamak gerek. BU nedenle kodların ilgili kısımlarının tamamını buraya koymanda yarar görüyoruz. Gözden kaçan bir şart komutu yazma işini sonlandırabilir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Tagli

Alıntı yapılan: ete - 28 Aralık 2010, 14:34:51Aslında bazen deneme yapıyorum ve toplu bilgi yazdıktan sonra tek bir pause 10 koyuyorum sorun çıkmıyor.
Hocam benim hatırladığım da buydu sanırım. Ancak bunun sebebi aklımda kalmamış. Nerede okuduğumu da hatırlamıyorum, başka bir forumda bile olabilir. Hatta bir miktar toplu yazımdan sonra bekleme yapılması gerekliliğinin silikon hatası olabileceği söylenmişti.

Bence bu işin en garanti yolu yazım komutundan sonra bir döngü içinde EECON1 içindeki WR bitinin (1. bit) 0 olmasını beklemek.
Gökçe Tağlıoğlu

hamityanik

Merhabalar,

Şöyle bir program yazdım, eeprom yazma ve okuma başarılı oldu: (Yani PIC'te problem yok.)

EEPROM test programı:
TRISA=0
TRISB=0
TRISC=0
TRISD=0
'-------------------------------------------------------------------------------
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
'-------------------------------------------------------------------------------
DEFINE LCD_DREG		PORTC
DEFINE LCD_DBIT		4
DEFINE LCD_EREG		PORTD
DEFINE LCD_EBIT		7
DEFINE LCD RWREG    PORTD
DEFINE LCD_RWBIT    6
DEFINE LCD_RSREG	PORTD
DEFINE LCD_RSBIT	5
DEFINE LCD_BITS		4
DEFINE LCD_LINES	2

ADCON1=7

i VAR BYTE
OKU VAR WORD
KONT VAR BYTE
LED VAR PORTA.1
LED2 VAR PORTA.2

SYMBOL LCD_RW=PORTD.6

LOW LCD_RW

PAUSE 200
LCDOUT $FE,1
LCDOUT $FE,$0E
LCDOUT $FE,$0F

HIGH LED
HIGH LED2
PAUSE 1000       
LOW LED
LOW LED2

i=0

BASLA:
    IF i = 0 THEN
        READ 0, KONT
        IF KONT = 1 THEN GOTO LCDYAZ 'eğer 0. adrese daha önceden yazılmışsa, LCDYAZ'a git
    ENDIF
    
    HIGH LED
    WRITE i, i+1
    PAUSE 20 'BU PAUSE'u kaldırdığımda da başarıyla eeprom'a yazılabiliyor.
    LOW LED
    
    IF i = 254 THEN i=0 : GOTO LCDYAZ
    
    i = i + 1
GOTO BASLA

LCDYAZ:
    HIGH LED2
    READ i, OKU
    PAUSE 50 ' Bu PAUSE kalktığında başarıyla eeprom'dan veriyi okunabiliyor
    LOW LED2
    
    LCDOUT $FE,$80,DEC i,":", DEC OKU
    
    IF OKU = 254 THEN STOP
    
    i = i + 1
GOTO LCDYAZ

END


Problem yaşadığım diğer programı kodlarını inceliyorum. Son durumu bildireceğim.

Her şey için teşekkürler.

Tagli

EEPROM'dan okuma işlemi herhangi bir bekleme gerekmeksizin yapılabilir. Yani bu işlem yazmanın aksine fazladan süre harcamaz.
Gökçe Tağlıoğlu