EEPROM yazımı

Başlatan hgungor, 16 Mart 2016, 21:19:35

hgungor

Merhaba arkadaşlar bir konuda yardım istiyorum.
Ben pic te yaptığım işlemleri yada verileri pic in elektriği kesildikten sonrada saklamak istiyorum, bu iş içinde sanırım eeprom belleğe bunları kaydetmek lazım bunu denedim aşağıda verdiğim programla fakat sanırım bir eksiğim varki sonuç alamadım yardımcı olabilirmisiniz ?

Program çok uzun olduğundan sadece önemli kısımları yazıyorum,program ilk başladığında gerekli tanımlamaları yaptıktan sonra(bunları yazmıyorum) önce okuma yapıp h10 eeprom adresindeki bilgiyi ch değişkenine alacak, ilk çalıştırmada h10 un içinde herhangi birşey olmadığından sanırım ch ın içine 0 yazacak, programın ileriki aşamalarında ch ın içine 1,2,3 rakamlarından biri kullanıcı tarafından seçilip yazılacak(bu kısmıda yazmadım) ve bir sonraki çalıştırmada (sistemin elektriği kesilip açıldıktan sonra) önceden hangi rakamda kalındıysa onu okuyup  tekrardan ch ın içine atacak.

Sanırım anlatmak istediğim anlaşılmıştır
Şimdiden teşekkürler.

list p=16f628
include <p16f628.inc>
__CONFIG _CP_OFF&_WDT_OFF&_BODEN_ON&_PWRTE_ON&_XT_OSC&_MCLRE_OFF&_LVP_OFF
.....
CH equ 0x32
.....

ORG 0x000
GOTO ANA

OKUMA
BSF STATUS,RP0   ; BANK 1
MOVLW h'10'
MOVWF EEADR
BSF EECON1,RD
NOP
MOVF EEDATA,W
MOVWF CH
BCF STATUS,RP0 ; BANK 0
return

YAZMA
BSF STATUS,RP0   ; BANK 1
MOVLW h'10'
MOVWF EEADR
MOVF CH,W
MOVWF EEDATA

BCF INTCON,GIE
BSF EECON1,WREN
MOVLW h'55'
MOVWF EECON2
MOVLW h'AA'
MOVWF EECON2
BSF EECON1,WR
NOP
BSF INTCON,GIE
BCF EECON1,WREN
BCF STATUS,RP0 ;BANK 0
RETURN

ANA
....
CALL OKUMA
CALL YAZMA
......
GOTO ANA
END

hgungor

Arkadaşlar sorunu çözdüm :) program 3 sayfaya yakın olduğundan görememişim CH ı sıfırladığımı ,ondan dolayı yapılan her kayıdı siliyormuş her açılışında,yoksa yazdığım eeprom yazma komutları doğru imiş.

hgungor

Merhaba arkadaşlar
yeni bir sorunla karşılaştım :)
devrenin elektriğini kesip 10sn içinde tekrardan açınca rakamları hatırlıyor ve ilgili ledleri yakıyor ( devrede 1000uf kondansatör var) fakat 10sn den fazla beklenip elektrik verilirse unutuyor.16f628 in datasheetinde eeproma yazılan bilgiler eğer code protected yapılmaz ise silinir diyor ve burada iki adet koruma var birisi data code protection diğeri sadece code protection , config ayarlarında DATA_CP_ON yazınca data code protectionı aktif oluyor sanırım ama sadece code protectionu hangi komut ile aktif ediyoruz.

soruna herhangi başka bir çözümü olanda arkadaşlarında yardımını bekliyorum

ete

#3
Eproma yazılan bilgi saniye ile alakalı olarak değil direk komut ile silinebilir. Data sheet de öyle bir bilgide olmaması gerek.
Nereden okudun ise yerini söyle bende bileyim. Senin bir yanlışın var. Bence sen kayıt yapamıyorsun.
Devrenin elektriği kesilinceye kadar değişkenler değerleri tutuyor ama elektrik gidince değişkenler sıfırlanıyor ve epromdan da bir şey okunamıyor olsa gerek. Her yazma işleminin ardından 10 ms bekleme yapılması gerekir.  Beklemeden yeniden yazmaya kalkışırsan hiç bir şey yazamazsın. Senin yazma komutlarında herhangi bir gecikme bölümü göremedim.

Ete

hgungor

#4
Ete bey dediğin gibi herhangi bir gecikme eklemedim, ekleyerekte deneyeceğim yarın, datasheetin ilgili bölümünün resmini koyuyorum,

yukarıdaki programı şu şekilde değiştirdim,burada enalt üç satır (WR) bitini kontrolünü yapıyor wr biti yazma tamamlanınca 0 oluyor bunun için 10ms gecikme koymamıştım.

YAZ
BSF STATUS,RP0   ; BANK 1
MOVLW h'A0'
MOVWF EEADR
MOVF CH,W
MOVWF EEDATA

BCF INTCON,GIE
BSF EECON1,WREN
MOVLW h'55'
MOVWF EECON2
MOVLW h'AA'
MOVWF EECON2
BSF EECON1,WR
NOP
NOP
NOP
NOP
JK
BTFSC EECON1,WR
GOTO JK

hgungor

Programı  10ms lik gecikme ilede yaptım fakat sonuç aynı hiçbir şey değişmedi.Konuyla ilgili hala yardım bekliyorum.


list p=16f628
include <p16f628.inc>
__CONFIG _WDT_OFF&_BODEN_ON&_PWRTE_ON&_XT_OSC&_MCLRE_OFF&_LVP_OFF&_DATA_CP_ON&_CP_OFF

.....

ORG 0x000
movlw D'7'
movwf CMCON
BCF STATUS,RP1         
BSF STATUS,RP0   ; BANK 1
BCF EECON1,WREN  ;BAŞLANGIÇTA EEPROM YAZIM İZNİNİ KAPAT
movlw b'11111111'
movwf TRISA
movlw b'00000000'
movwf TRISB
BCF STATUS,RP0   ; BANK 0
CLRF PORTA
CLRF PORTB
GOTO ANA

OKUMA;-----------------okuma----------------
BSF STATUS,RP0   ; BANK 1
MOVLW h'A0'
MOVWF EEADR
BSF EECON1,RD
NOP
NOP
MOVF EEDATA,W
MOVWF CH
BCF STATUS,RP0  ;BANK 0
RETURN

YAZ
BSF STATUS,RP0   ; BANK 1
MOVLW h'A0'
MOVWF EEADR
MOVF CH,W
MOVWF EEDATA

BCF INTCON,GIE
BSF EECON1,WREN
MOVLW h'55'
MOVWF EECON2
MOVLW h'AA'
MOVWF EECON2
BSF EECON1,WR
call GECIKME1
JK
BTFSC EECON1,WR
GOTO JK
BSF INTCON,GIE
BCF EECON1,WREN
BCF STATUS,RP0 ;BANK 0
RETURN
;---------------------------------- GECİKME----------------------------------
GECIKME1
MOVLW d'40'
MOVWF DELAY2
DONGU2
MOVLW d'250'
MOVWF DELAY1
DONGU1
DECFSZ DELAY1,1
GOTO DONGU1
DECFSZ DELAY2,1
GOTO DONGU2
RETURN

ANA
CALL OKUMA
CALL YAZ
.......
END

ete

Sanki okuma yanlış oluyor gibi geliyor bana.

Okuma kısmında;
BSF STATUS,RP0  ; komutu ile  BANK-1'i seçiyorsun
MOVLW h'A0'       ; Okunacak adresi yüklüyorsun
MOVWF EEADR    ;Adres registerine adresi veriyorsun.

Ama Data Sheet şöyle yapmış;
BCF STATUS,RP0  ;bank-0 seç
MOVLW  h'A0'      ;Okunacak adresi yükle
MOVWF EEADR    ;Adres registerine adresi veriyorsun.

Data sheet Bank-0 da yapmış sen ise Bank-1 de yapmışsın.
Data Sheet sonra Ban-1 e geçip senin yaptığın şekilde devam etmiş.
Bu değişikliği bir uygulayıp denermisin. Yada bu programı simulasyonda çalıştırıp sonra PAUSE ile simulasyonu durdurup Eprom'un A0 adresine bakarmısın bir şey yazılmışmı?

Ete

hgungor

Kulladığım entegre 16f628 bunun datasheetinde eeprom yazımıyla ilgili regiserlar bank 1 de , örnek yazılımdada hem okurken hem yazarken bank 1 i kullanmış, acaba başka bir entegreyemi baktınız 877 gibi, çünki bank 0 yaparakta denedim ama sonuç değişmedi. Simülasyon işini deneyeceğim yarın.

ete

Başka entegre değil 16F628 data sheet'ine bakıyorum.
Aynen şu şekilde yazılmış örnek kod;
EXAMPLE 13-1  DATA EEPROM READ
BCF       STATUS, RP0            ; Bank 0
MOVLW  CONFIG_ADRR         ;
MOVWF  EEADR                    ; Address to Read
BSF       STATUS, RP0            ; Bank 1
BSF       EECON1, RD             ; EE Read
BCF       STATUS, RP0            ; Bank  0
MOVF    EEDATA,  W              ;  W = EEDATA


Bu da Yazma örneği
EXAMPLE 13-2  DATA EEPROM WRITE
BSF       STATUS,   RP0          ;Bank 1
BSF       EECON1,  WREN       ;Enable Write
BCF       INTCON,   GIE          ;Disable INT's
MOVLW  55h                         ;
MOVWF  EECON2                   ; Write 55h
MOVLW  AAh                         ;
MOVWF  EECON2                   ;Write AAh
BSF       EECON1, WR            ; Set WR Bit
                                           ; Begin Write
BSF       INTCON , GIE           ; Enable INT's


Başka bir kaynakdan aldığım Okuma örneği
movf / movlw address/ADDR, w
bcf STATUS, RPO
movwf EEADR
bsf STATUS, RPO
bsf EECON1, ^ 0x08, RD
bcf STATUS, RPO
movf EEDATA, w ; w  EEPROM
[address/ADDR]


Aynı kaynakta yazma örneği
movlw /movf constant/DATA, w
bcf STATUS, RPO
movwf EEDATA
movlw /movf address/ADDR, w
movwf EEADR
bsf STATUS,RPO
bsf EECON1 ^ 0x080, WREN
bcf INTCON,GIE
movlw 0x055 ] CRITICAL SECTION
movwf EECON2 ^ 0x080 ]
movlw 0x0AA ]
movwf EECON2 ^ 0x080 ]
bsf EECON1 ^ 0x080, WR ]
bsf INTCON, GIE
btfsc EECON1 ^ 0x080, WR ] Poll for
Operation Ended
goto $ – 1 ]
bcf EECON1 ^ 0x080, WREN
bcf STATUS, RPO
bsf INTCON, GIE


Ete

hgungor

ete bey verdiğiniz önrenklerde daha önce denemediğim bank kombinasyonları var onları bir deneyeyim, ben googla 16f628 yazınca çıkan datasheete bakıyordum orada okumayla ilgili bölümün resmini aynen koyuyorum, orda herşey bank1 de yapılıyor okumada yazmada.

ete

Senin data sheet 16F628A ya ait benimki 16F628'e ait. Arada fark var demekki.
Ama diğer örnek de Bank0 da yapmış bu işi. Ancak Memory organizasyona bakarsan her şey Bank1 de gözüküyor enteresan bir durum aslında.

Ete

hgungor

#11
Ete bey bunların hepsini denedim ama sonuç alamadım, sizin verdiğiniz siyah ekranda gözüken ilk okuma örneğinde bir hata olabilirmi çünki ilk başta bank0 seçiliyor 5 satır sonra birdaha bank0 ı seçmiş ve arada bank1 hiç seçilmemiş, sanki ilk bank0 seçimi bank1 olmalı gibi, bunu söylememin sebebi 628a ve 628 in datasheetlerini inceledim birbiriyle aynı herikisindede eeprom ile ilgili registerlar bank1 de.Birönce mesajımda resim eklemiştim zaten.

Yeni farkettiğim birşey daha var, benim yazdığım programda eeprom'u yazamıyorum, buradaki WRERR bayrağı sürekli 1 konumda yani yazma işi sekteye uruyor.Bunu altta verdiğim kısımla test ettim, portb,2 deki led hiç yanmıyor yani aşa inmiyor program, wrerr kontrolü yapmazisemde , eepromu yazmadan geçiyor olmalı program.Datasheet de eeprom yazma anında  bir reset olursa  bu wrerr 1 olur ve yazma işi gerçekleşmez diyor.Buradaki reseti WDT, MCLR yada BOR yapabilir diyor.Bende MCLR kapalı ve herhangi bir direnç yok 4numaralı bacakta, bor BODEN_off ile kapattığımı düşünüyorum yine WDT_OFF ilede wdt'ı kapattım ama yinede bu wrerr 1 oluyor nedendir acaba ?

BTFSC EECON1,WRERR
GOTO YAZ
BCF STATUS,RP0 ;BANK 0
BSF PORTB,2

ete

Normalde PBP ile program yazarım. Zaman zaman ASM ye dalarım. Bazı programlarıma ASM kodları ekledim. Aslında seviyorum ASM ile uğraşmayı. Bana daha bir bilmece havasında gibi geliyor ASM ile uğraşmak. Ancak süper kod yazacak durumda değilim.
Basic'in kolaylığı bunu önlüyor maalesef.

Bu sorunu sanırım aynı işlemi basic de yazarak derleme sonucunda elde edilen program parçasının ASM kodlarına bakarak çözebiliriz.

Yarın bunu yapmaya çalışacağım.

Ete

magic_gun

okumak icin ;
               
   BANKSEL   EEADR      ;bank sec          
   MOVLW   .4            
   MOVWF   EEADR      ;boyle olması gerekiyor secilen sayfa ile ilgili bank :)         
   BANKSEL   EECON1         
   BSF   EECON1,RD         
   BANKSEL   EEDATA      
   MOVF   EEDATA,W


yazmak için;

        BANKSEL   EECON1      ;bank sec :)
   BCF   INTCON,GIE      ;disable butun interrupt
   BSF   EECON1,WREN      ;yazma izni
   MOVLW   0x55      
   MOVWF   EECON2      
   MOVLW   0xAA      
   MOVWF   EECON2      ;yazma proseduru
   BSF   EECON1,WR      ;yazma izni
int_eerom_tst            
   BTFSC   EECON1,WR    ;yazma izni ok ?
   GOTO   int_eerom_tst      
   BCF   EECON1,WREN      ;yazma kapalı
         


kolay gelsin :)
m.gunhan
hayal etemeden basaramazsınız
u cnt achieve w/out dreamin

hgungor

Yani bank 1 seçmek yerine (bsf status,rp0) , banksel  eaddr ,eedata,eecon1 mi dememiz lazım gerekli yerlerde ?

Powered by EzPortal