EEPROM kullanımı hakkında bilgi...

Başlatan . Kağan, 13 Aralık 2015, 13:00:11

. Kağan

Merhaba arkadaşlar,  ::)

Adcin1 den okuduğum değeri eğer 2 den büyükse set değeri olarak eproma yazmak ve daha sonra kullanmak istiyorum. Aşağıdaki gibi bir kod yazdım fakat 16f88 için eepromun "00" satırına nasıl gönderileceğini bilemedim.

             IF SET_BUTTON = 1 THEN   'SET_BUTTON basılıysa demek istiyorum ama burada da hata veriyor.
            GOTO SET_VALUES

            SET_VALUES:
            OLCUM_A = 0
            TETIK_SOL_ON=1
            HIGH LED_SOL_ON
            PAUSE 800
            ORTALAMA =0                         'ORTALAMA DEĞERİNİ SIFIRLA
            FOR I = 0 TO 24                     '24 KEZ AŞAĞIDAKİNİ YAP
                ADCIN 1 , OLCUM_A               'OLCUM_A'yı adcin 1'den OKU
                ORTALAMA = ORTALAMA + OLCUM_A   'ORTALAMA İÇİN HER OKUMAYI ÜST ÜSTE TOPLA
                NEXT I
                OLCUM_A = ORTALAMA/25           'TOPLADIĞIN DEĞERİ 25'e böl
           
            IF OLCUM_A < 2 THEN OLCUM_A = 0
            IF OLCUM_A = 0 THEN 'EĞER ÖLÇÜM OLCUM_A "10" DAN KÜÇÜKSE SIFIR KABUL ET
            GOTO ERROR  'ERROR'e GİT
            ELSE   'SIFIR DEĞİLSE
            OLCUM_A WRITE $00 'OLCUM_A'yı EEPROMUN "00" ına YAZ.
            ENDIF
            GOTO READY   ' HAZIR'A GİT
   
Soru1: OLCUM_A WRITE $00 'OLCUM_A'yı EEPROMUN "00" ına YAZ. satırı derleme sırasında hata veriyor.
Soru2: OLCUM_A DEĞERİNİ BAŞKA YERLERDE KULLANDIĞIMDAN BU İŞLEM SIRASINDA OLCUM_DAN OKUNAN DEĞERİ, SET_VALUE OLARAK TANIMLAMAK, ÇAĞIRMAK ve KULLANMAK İSTİYORUM.
BU DEĞERİ ÇAĞIRIRKEN SET_VALUE OLARAK NASIL KULLANIRIM?
                   
           

                read $00, SET_VALUE
                IF OLCUM_A > SET_VALUE THEN        'EĞER ÖLÇÜM_A, SET_VALUE'den BÜYÜKSE
                    HIGH LED1
                ELSE
                    HIGH LED2
                ENDIF

                IF OLCUM_B > SET_VALUE THEN        'EĞER ÖLÇÜM_B, SET_VALUE'den BÜYÜKSE
                    HIGH LED3
                ELSE
                    HIGH LED4
               ENDIF
               
               IF OLCUM_C > SET_VALUE THEN        'EĞER ÖLÇÜM_C, SET_VALUE'den BÜYÜKSE
                    HIGH LED5
                ELSE
                    HIGH LED6
               ENDIF
               


Yukarıdaki kod çalışırmı acaba?

Teşekkürler.

Atilla

OLCUM_A WRITE $00 yerine Write $00, OLCUM_A olmasi gerekiyor hocam birde $00 adresi yerine $07 adresi daha uygun gibi

ete

Basic derslerinde eprom konusunu okusanız çok daha çabuk sorunu çözersiniz.
Eproma yazma WRITE Adres,Yazılacak değişken (Byte cinsinden):Pause 10 ms gecikme
Epromdan okuma READ ADres,Okunan değerin yerleşeceği Değişken adı . Burada pausa gerek yok.
Eprom adresleri byte cinsiden değişken saklayabilir. Word tipi değişkenler için 2 adres kullanılmalıdır.
BILGI bir word değişkeni ise yazılırken WRITE 0,BILGI.Byte1,BILGI.Byte0:pause 10 şeklinde yazılır (0 ve 1 nolu adreslere yerleşmiş oldu) Okunurkende aynı sıra ile okunmalıdır. READ 0,Bılgı.Byte1,BILGI.byte0

Ete

. Kağan

"$00 adresi yerine $07 adresi daha uygun"

Niçin bir adres, bir diğerinden uygun yada değildir?

ete

Eprom adreslerinin daha iyi olması diye bir şey söz konusu değildir. Bir temele dayanmayan bilgiler verilmemesi gerekir. Yanlış anlaşılmalara sebep oluyor.
Adreslerin hepside aynı oranda iyilik detecesine sahiptir. Hepside kullanılabilir.

Ete

Atilla

benim orada oyle soylememin sebebi pic16F88 de REGISTER FILE MAP  $00 adresinde Indirect addr.(*) yer almasıydı. O yüzden veri kaydedilcekse boş bir alanın iyi olacağını düşünmüştüm. Yanlış anlaşılmaya sebep olduysam özürdilerim.

. Kağan

#6
Merhaba ETE,

Ders9' u inceledim. Fakat farklı eeprom tipleri ile ilgili bilgiler vermişsiniz gibi anladım. Bununla birlikte kodların başında hepsinde pic16F628 olduğunu gördüm. I2C, MWRE, SPI gibi eprom tipleri aynı işlemcinin içindemi oluyor? Anlamadım.

Bazı örnek kodlarda örneğin MWIRE başlangıçta aşağıdaki tanımlamayı gördüm.
EWEN	Con	%10011		' Erase/Enable kodu
EWDS Con %10000 ' Disable Kodu
ERAL Con %10010 ' Erase-All Tamamını sil Kodu
WRAL Con %10001 ' Tamamına yaz kodu
ERD Con %1100 ' Read Kodu
EWR Con %1010 ' Write Kodu
ERASE Con %1110 ' erase Kodu


Ayrıca SPI tipindede
EYAEN   Con	6		' Eprom Enable kodu
SRYAZ Con 1 ' STATUS REGISTER'e yazma kodu
EYAZ Con 2 ' Eproma yazma (WRITE) kodu
EOKU Con 3 ' Epromdan Okuma (READ) kodu
WRDI Con 4 ' Yazma iptal kodu
SROKU Con 5 ' STATUS REGISTER okuma kodu


tanımlamları gördüm. Bununla birlikte IC2 de hiçbir başlangıç tanımlaması göremedim.

Şöyle basit bir örnek yazıp programladıktan sonra pic programlayıcıda oku butonuna tıklayıp yazılıp yazılmadığı görmek istedim.

#CONFIG
  __config  _CONFIG1, _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _MCLR_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF
  __config  _CONFIG2, _FCMEN_OFF & _IESO_OFF
#ENDCONFIG

DEFINE ADC_BITS 10      ' ADCIN resolution  (Bits)   
DEFINE ADC_CLOCK 3      ' ADC clock source  (Fosc/8)   
DEFINE ADC_SAMPLEUS 20  ' ADC sampling time (uSec)

ANSEL  = %00000010  ' AN1 ANALOG, DİĞERLERİ DİJİTAL
ADCON1 = %10000000  ' 1024 (10 BİT) hesaplanacak, VREF+AVDD VREF-AVSS
'ADCON0 = %11101101  ' internal A/D module RC oscillator,  11000000
OSCCON = %01101110  ' İNTERNAL OSİLATÖRÜ 4mhz' E AYARLA
   
CMCON  = 7           ' KOMPARATÖRLER KAPALI   
TRISA  = %00000010   ' RA1 GİRİŞ DİĞERLERİ ÇIKIŞ   
TRISB  = %00000000   ' HEPSİ ÇIKIŞ
PORTA  = 0           ' PORTA SIFIRA ÇEK                                                             D
PORTB  = 0           ' PORTB SIFIRA ÇEK
CCP1CON.2=1 'bu  iki komut ile PWM sinyali açılmış olacaktır
CCP1CON.3=1
T2CON = %00000101     'Bölücü 1/1 olarak verildi ve TMR2 aktif hale  getirildi.
PR2=124                'PWM-Peryot= (124+1) x 4 x ¼ x 1 =500 us  ve F=1000/50 = 2 KHz PWM  frekansı dır.

PORTA  = 0           ' PORTA SIFIRA ÇEK   
                                                         
Pause 100 ' 100 ms AÇILIŞ GECİKMESİ

           
     
        A             VAR BYTE
       
     
MAIN:   
        READ 0,A
        if A <> 0 then
        A=255
        WRITE 0,A : PAUSE 10
        ENDIF


Pic programlayıcının EEPROM kısmında hiçbirşey okuyamadım. Tamamı FF çıkıyor.

Birde yazmadan önce okuma komutu vermek şarmıdır. Var olan verinin üzerine direkt yazamazmıyız?

Bunları nasıl anlayabilirim, anlatırmısınız?


ete

Pic ile alakalı 2 tür eprom var. Birisi dahili yani pic içinde bulunan eprom ki bu eprom için I2C - SPI gibi haberleşme protoklleri geçerli değil. Mantıken düşünürseniz dışarıda eprom bacakları olmadığına göre nasıl haberleşebilirki. Haberleşme sistemi yine dahili olarak bağlı ve tamamen komut ile geri planda çalışıyor. Bu nedenle eproma yazmak ve okumak için read ve write komutlarını kullanıyoruz.
Birde harici epromlar var ki bunlarda haberleşme tiplerine göre kendi aralarında I2C ve SPI gibi protokole göre tiplere ayrılıyorlar.
Ders notunda hem dahili hemde harici eprom konusu işlendiği için sizin dikkatinizi yalnızca harici olanlar çekmiş anlaşılan.
Harici epromlar ile çalışmak için önce o eproma ait data sheet açılır ve özellikleri oradan okunur.
Özellikle I2C epromlarda eprom cihaz numarası adres değerleri önem kazanır. Bu tür epromlar genellikle aynı data ve clk hattına birden fazla eprom bağlanabildiği için cihaz numaralarına göre birbirlerinden ayrılabilirler, örnek vereyim aynı clk ve data hattına bağlı bir eprom ile Ds1307 (RTC) yi yalnızca cihaz numaralarını vererek kullanabilirim. İstersem epromu okur veya ona yazarım istersem RTC yi okur saat bilgilerini alırım. Ayıran unsur cihaz numarasıdır.
Harici eprom kapasitesine bağlı olarak adresleme mantığıda değişir, yalnızca 256 byte adresi olan bir epromda adres bilgisi 8 bitlik verilirken 256 byte dan büyük hafızaya sahip olanlarda adres bilgisi word tipinde değişkenle belirtilir. Aksini yaparsanız çalışmaz zaten. Bazı arkadaşlar yalnızca 256 byte lık yerini kullanacağım word tipine gerek yok deyip uyguluyorlar sonra hocam bu neden çalışmıyor diyorlar. Sebep ortada adres bilgisi word olarak verilmeli bu tür epromlarda.

Bir eprom dan bilgi okumak için illaki yazmak gerekmez. Hiç bir şey yazılmamış eprom değeri $FF dir daima. Bu husus hem dahili hem harici epromlar için geçerlidir.

Ete

. Kağan

#8

MAIN:
        A  VAR word
        READ $00,A
        if A <> 0 then
        A=850
        WRITE $00, A.BIT0, A.BIT1 : PAUSE 10
        ENDIF


Ben yukarıdaki kodu hex yapıp pice yazdıktan sonra, pic programmer menüsündeki read ile okuduğumda niçin değişen birşey göremiyorum? Hepsi FF okunuyor.

ete

Word tipi olan A değişkeni de byte gibi tek komutla okunmaz.
Okuma Read 0,A.byte1,A.byte1 şeklinde olması gerekir.

Yazma kısmı ise zaten hatalı.
Write 0, A.byte1, A.byte0:Pause 10
Şeklinde olmalı.

İlk mesajımda bunların nasıl yazılacağını belirtmiştim. Ders notlarında var.
Ama sen tutup A.bit0 yazıyorsun. Acaba neden ? Gerçekten merak ediyorum.

Ete

. Kağan

    Tahir bey tekrar merhaba.

Dikkatsizliğim sonucunda " A.bit0" yazmışım. Fakat aşağıdaki gibi

        READ $00,A.BYTE0, A.BYTE1
        if A <> 0 then
        A=850
        WRITE $00, A.BYTE0, A.BYTE1 : PAUSE 10
        ENDIF


şeklinde düzelttim ama yine bir değer okuyamıyorum. Neden acaba?

Sizde bir önceki mesajınızda
Alıntı YapWord tipi olan A değişkeni de byte gibi tek komutla okunmaz.
Okuma Read 0,A.byte1,A.byte1 şeklinde olması gerekir.
Okuma Read 0,A.byte1,A.byte1 yazmışsınız. Burada "A.byte0,A.byte1" şeklinde olacak diye algılıyorum. Yanlışmı algılıyorum.

. Kağan

Aşağıdaki resimdeki ekrandan eeproma yazdığım veriyi görüp göremeyeceğimi söylermisiniz acaba?

Niçin bu kadar basit gözüken bir işlemi yapamıyorum. Anlamam için 4 satır kod yazıp eklerseniz deneyip anlamaya çalışacağım.


Bahri Bilir

#12
Ete hocam ne kadar doğru hatırlıyorum bilmiyorum ama bir eeprom hafızasına sadece bir byte veri yazılabiliyordu.Yani A.byte0 o.eeproma ve A.byte1 1. eeproma yazılıp o şekilde okunması gerekmiyor muydu?

Kağan Hocam A değişkeni 255 ten büyük olursa yine eeprom almıyor okuduğunuzda tam hatırlamıyorum ama ya 255 ten taşan değeri yada 255 değerini veriyor. O yüzden bence bir de yukarıda bahsettiğim şekilde deneyin.Ama yinede A.byte değişkenleri 255 veya 255 den küçük olmalı diye hatırlıyorum.

Bu arada kağan hocam A değişkenin Alabileceği değerler ne?
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

. Kağan

1024 den küçük değerler alacak ve 255 den büyük değerler tabii.

ETE nin dediği gibi iki adrese yazmak için
WRITE $00, A.BYTE0, A.BYTE1 : PAUSE 10 


yazdırmaya çalışsam da sonuç alamadım. Burada kaçırdığım bir nokta var ama nedir anlayamadım.

Bahri Bilir

#14
Write 0, A.byte0
Write 1, A.byte1

Ve

Read 0,A.byte0
Read 1,A.byte1

Şeklinde deneyin

Ama yinede ikisinin toplamı 65535 dan büyük olmamalı

Birde belki çok uygun olmaz ama daha önce uyguladığım bir yöntem olarak değer 255 e bölüp bölümü 0. eeproma kalanıda 1.eeproma yazıp okurkende tam tersini yaparak yazmayı deneyebilirsiniz bu şekilde en azından mantık kabul ediyo.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

Powered by EzPortal