Proton + Eeprom'a Veri Kaydetme Ve Çağırma

Başlatan ercan_wrc, 10 Mart 2011, 20:55:52

ercan_wrc

Arkadaşlar merhaba;

şimdi elimde bir hazır devre var ve yapmak istediğim şu;
pic 16F877
Proton +
bir menü oluşturdum ve her menüde birer değişkene değer giriliyor bu değerler değişkenin hafızasında
bu değişkenleri 16F877'nin hafızasına yazıp kaydetmek istiyorum (elektrik kesilse bile hafızada kalacak şekilde)
sonra tekrar menüdeki ayarlara girdiğimde bu değerleri kaydedilmiş şekilyle menüdeki yerlerine yazmak istiyorum
fakat Eepromda veri kaydetmeyi bir türlü bulamadım ERead ve EWrite komutları ile diyorlar ama ben yapamadım derleyici hata veriyor

Birde aklıma takılan eproma yazılırken float değerlerde farklılık varmı?

örneğin

değişken1=7,12
değişken2=22
değişken3=123
değişken4=4321

bu değerleri eproma yazıp tekrar menüden ayarlara girdiğimde bu değerli ilgili yerlerde görmek ve güncelleyebilmek istiyorum...
Cevap yazan arkadaşlara şimdiden teşekkür ederim...Saygılar

Maxim

DIM DEGER1 AS FLOAT
DEGER1=7.12


7.12 değerini 10 adresine yazar.
EWrite 10 ,[DEGER1]

10 ADRESINDEKİ DEĞERİ DEGER1 E ATAR
DEGER1 = ERead 10






omereliusuk

#2
----

muhittin_kaplan

olmaz
dword yada float doğru 4 byte yer kaplar. PROTOn bunu biliyor ona göre 10,11,12,13 e sırasıyla yükler.
geri alma esnasında
dim Deger as float
deger=eread 10
dediğimde alınacak değerin 4byte olduğunu yine bilir. ve ona gere sırası ile 4 byte alır.
demekki neymiş Proton Kendini aşmış :)

FUNKY


sadece float değil   bak daha neleri  tek komutla   yazdırıyor.. proton  iyidir :)   

proton help den alıntı ...

EWRITE Address , [ Variable {, Variable...etc } ]


Variable is a user defined variable of type bit, byte, byte array, word, word array, dword, float or a constant value.

muhittin_kaplan

Konunu nereye gideceğini biliyor ve kestirip atıyorum :D
basic C yi döver :D

Maxim

#6
şöyle izah edeyim o zaman  ;D



muhittin_kaplan


omereliusuk

Alıntı yapılan: muhittin_kaplan - 10 Mart 2011, 22:56:58
olmaz
dword yada float doğru 4 byte yer kaplar. PROTOn bunu biliyor ona göre 10,11,12,13 e sırasıyla yükler.
geri alma esnasında
dim Deger as float
deger=eread 10
dediğimde alınacak değerin 4byte olduğunu yine bilir. ve ona gere sırası ile 4 byte alır.
demekki neymiş Proton Kendini aşmış :)
bunu yeni öğrendim...

dur hocam az daha büyüyeyim ccs i yeni yeni öğreniyorum. bu piclere takla attıracam :)

ercan_wrc

#9
Allah Razı Olsun arkadaşlar derlemede hata vermedi şimdi ilk defa yazdırıp okutmayı deneyeceğim sonucu sizlerle paylaşırım :)
gerçi hata yok Maxim hocamız videoda göstermiş hata olursa bende olur :D

Edit:

arkadaşlar yapamadım :(

şöyleki  çözüm bulamadığım bir yerde var

yapmak istediğim şudur...aracın lpg tankının ölçümünü yapmak istiyorum
tankın analog göstergesi bir nevi potansiyometre gibi çalışıyor
yani ilk değişkenlerim belli değil 712 de olabilir 215 de olabilir
ne olduğunu bilmiyorum şimdi pice elektriği verdim ve ayar menüsüne gittim
potansiyometren ölçüm yaptım atıyorum depo boşalmak üzere 73 gösterdi
sonra depoyu doldurdum tekrar ölçtüm 512 gösterdi
bu değerleri ayarlar menüsünde DepoBos ve DepoDolu değerleri olarak kaydetmek istiyorum
sonra tekrar ayarlar menüsüne girdiğimde bu 73 ve 512 değerlini butonlarla arttırıp azaltıp tekrar kaydedebilmek istiyorum
örnek kodumu yazıyorum arkadaşlar..


burada kodun herhangi bir kısmına default ayar girersem eğer elektrik kesilip tekrar geldiğinde o default ayarı değil eeproma yazılan ayarı okumalı
o nedenle hiç değer vermeden programa giriş yapıyorum absurt rakamlar çıkıyor onları butonlarla azaltıp düzeltiyorum kaydediyorum nasılsa 1 kereye mahsus absurt olacak sonrasında hep kaydettiğim hafızada kalacak diye...
sonra yeniden elektrik verince eski absurt rakamlara geri dönüyor
not: ADC den okunan değeri hesaplamada kullanacağım için burada onunla işim yok.



Dim Deger As Word  'ADC den okunan ham Digital değer.
Dim DepoLt As Byte                                                                       
Dim YDoluDepo As Word
Dim YBosDepo As Word
Dim YLitre As Byte
Dim EDoluDepo As Word
Dim EBosDepo As Word
Dim ELitre As Byte


DegerOku:

''''''''Potansiyometre Değerini Oku
   
   Deger=ADIn 0
   DelayMS 50

GoTo Acilis
   
Acilis:
 
   Print At 1,1," TOYOTA COROLLA "
   DelayMS 2000
   Print At 2,1, "  MERHABA             "
   DelayMS 2000

   Print At 1,1,"                "
   Print At 2,1,"                "

    GoTo EkranaYaz
   
End If
'''''''''''''''''''''''''''''Ayar menüsü

Ayarlar:

'ERead 0,ELitre
'ERead 1,ESici
'ERead 2,EUzunYol

GoTo DepoLit


''''''''' Depo Litre Değerleri''''''
DepoLit:

Print At 1,1,"                "
Print At 2,1,"                "
Print At 1,1,"Depo Litre Degeri"
Print At 2,1,#ELitre, " Lt"
DelayMS 1000

While PORTC.0=0

If PORTC.1=1 Then ' Çıkarma
YLitre=ELitre - 1  'Litre değerini eksiltme
    If YLitre < 1 Then YLitre = 1 ' Eğer litreyi 1den aşağı yazılırsa 1 olarak gir
    ELitre=YLitre
    Print At 2,1,"                "
    Print At 2,1,#YLitre," Lt"
    DelayMS 80
End If
             
If PORTC.2=1 Then  'Topla
    YLitre=ELitre + 1 'litreyi 1 arttır.
    ELitre=YLitre
    Print At 2,1,"                "
    Print At 2,1,#YLitre," Lt"
    DelayMS 80
End If

If PORTC.0=1 Then  'bekle
    While PORTC.0=0'bekle
        If PORTC.0=1 Then GoTo DepoDolu
    Wend
End If

Wend


''''''''' Depo Dolu Değerleri''''''
DepoDolu:

Print At 1,1,"                "
Print At 2,1,"                "
Print At 1,1,"Depo Dolu Degeri"
Print At 2,1,#EDoluDepo
DelayMS 1000

While PORTC.0=0

If PORTC.1=1 Then ' Çıkar
YDoluDepo=EDoluDepo - 1
    If YDoluDepo < 1 Then YDoluDepo = 1
    EDoluDepo=YDoluDepo
    Print At 2,1,"                "
    Print At 2,1,#YDoluDepo
    DelayMS 80
End If
             
If PORTC.2=1 Then  'Topla
    YDoluDepo=EDoluDepo + 1
    EDoluDepo=YDoluDepo
    Print At 2,1,"                "
    Print At 2,1,#YDoluDepo
    DelayMS 80
End If

If PORTC.0=1 Then  'bekle
    While PORTC.0=0'bekle
        If PORTC.0=1 Then GoTo DepoBos
    Wend
End If

Wend

''''''''' Depo Bos Değerleri''''''
DepoBos:

Print At 1,1,"                "
Print At 2,1,"                "
Print At 1,1,"Depo Bos Degeri"
Print At 2,1,#EBosDepo
DelayMS 1000

While PORTC.0=0

If PORTC.1=1 Then ' Çıkar
    YBosDepo=EBosDepo - 1
    If YBosDepo < 1 Then EBosDepo = 1
    EBosDepo=YBosDepo
    Print At 2,1,"                "
    Print At 2,1,#YBosDepo
    DelayMS 80
End If
             
If PORTC.2=1 Then  'Topla
    YBosDepo=EBosDepo + 1
    EBosDepo=YBosDepo
    Print At 2,1,"                "
    Print At 2,1,#YBosDepo
    DelayMS 80
End If

If PORTC.0=1 Then  'bekle
    While PORTC.0=0'bekle
        If PORTC.0=1 Then GoTo Kaydet
    Wend
End If

Wend



''''''''''''''Ayarları Kaydetme''''''''
Kaydet:

EWrite 10,[YLitre] ' Yeni girilen litreyi kaydet
EWrite 11,[YBosDepo] ' yeni girilen boş depo değerini kaydet
EWrite 12,[YDoluDepo] 'yeni girilen dolu depo değerini kaydet

Print At 1,1,"                "
Print At 2,1,"                "
Print At 1,1,"Ayarlar Kaydoldu."
DelayMS 2000

If PORTC.0=1 Then GoTo EkranaYaz

EkranaYaz:
Dim a As Word
Dim b As Word

a = ERead 10
b = ERead 11
c = ERead 12
d = ERead 13

Print At 1,1,"                "
Print At 2,1,"                "

Print At 1,1,#a
Print At 2,1,#b

While PORTC.0=0
Wend
DelayMS 3000
GoTo Ayarlar


not2: Visual basic 6.0 kullanıyordum arkadaşlar pic işine yeni girdim o nedenle cahillik var haliyle kusura bakmayın :)

Maxim

bu programdaki "end if" ler nedir ?
yani end boşluk if


program zaten aşağıya doğru akmaktadır,

abc
cbd

goto hhh

hhh:
fff
fff

demenin bir mantığı varmı ?


eeproma yazarken adres bilgileri arasında boşluklar olsun

10
11
12
değilde

10
25
40
55
gibi

birde eeprom yazma işleminden hemen sonra bekleme yapmak şarttır
her ewrite komutundan sonra delayms 10 kullanın .

Murat Mert

Alıntı yapılan: muhittin_kaplan - 10 Mart 2011, 22:56:58
olmaz
dword yada float doğru 4 byte yer kaplar. PROTOn bunu biliyor ona göre 10,11,12,13 e sırasıyla yükler.
geri alma esnasında
dim Deger as float
deger=eread 10
dediğimde alınacak değerin 4byte olduğunu yine bilir. ve ona gere sırası ile 4 byte alır.
demekki neymiş Proton Kendini aşmış :)

Alıntı yapılan: muhittin_kaplan - 10 Mart 2011, 23:03:58
Konunu nereye gideceğini biliyor ve kestirip atıyorum :D
basic C yi döver :D

Süpersin hocam ya :D  :D  :D
mert07

ercan_wrc

Alıntı yapılan: Maxim - 11 Mart 2011, 08:52:46
bu programdaki "end if" ler nedir ?
yani end boşluk if


program zaten aşağıya doğru akmaktadır,

abc
cbd

goto hhh

hhh:
fff
fff

demenin bir mantığı varmı ?


eeproma yazarken adres bilgileri arasında boşluklar olsun

10
11
12
değilde

10
25
40
55
gibi

birde eeprom yazma işleminden hemen sonra bekleme yapmak şarttır
her ewrite komutundan sonra delayms 10 kullanın .

Hocam şimdi oldu Allah razı olsun...ya ben kodları kısa kısa kesip yazdım buraya aralara eklenecek şeyler var öğrendikçe ekliyorum boş bırakıp o nedenle böyle saçma görüntü oldu :) neyse çok teşekkür ederim kaydedip okuyabildim elektrik kesincede silinmedi tam istediğim gibi oldu :)

ihsan_atay

bir termostat yapmaya çalışıyorum. takıldığım bir nokta var. istenilen isi değerini ayarladıktan sonra elektrikler kesildi ve termostat yeniden çalışmaya başladı. float değişkenli değeri en son haliyle nasıl alırız? ben birşeyler yazdım ama  olmuyor. yardımlarınızı bekliyorum.
Dim isi_deger As Float
BASLA:

    If DURUM = 0 Then GoTo OLCUM
    If DURUM = 1 Then GoTo MENU
    If DURUM = 2 Then GoTo ISI_AYAR
    If DURUM = 3 Then GoTo NEM_AYAR
ISI_AYAR:
    isi_deger = ERead 0
    If arti = 1 Then isi_deger = isi_deger + 0.1
    If eksi = 1 Then isi_deger = isi_deger - 0.1
    EWrite 0,[isi_deger]
    Print At 1,1,"    ISI AYAR    "
    Print At 2,1,"     ",Dec1 isi_deger," C "
    DelayMS 100
    GoTo BASLA

muhittin_kaplan

insan abi
bunu için
isi_deger=eread 0
kodunu başlangıçta biryerlere yazman gerekirir ki sistem başladığında en istenilen ayarı geri getirsin.