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
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
----
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ış :)
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.
Konunu nereye gideceğini biliyor ve kestirip atıyorum :D
basic C yi döver :D
şöyle izah edeyim o zaman ;D
hocam ellerine sağlık
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 :)
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 :)
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 .
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
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 :)
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
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.
olayı çözdüm. muhittin ustama teşekkür ederim. ilk pic e yazılımı yüklediğimizde eprom daki değerler $ff bu da float değişkende sorun yaratıyor.
başka bir değişken ayarlayarak epromdaki değerleri sıfır yaptım.
Dim isi_deger As Float
Dim isi_deger_hafiza As Byte
Dim ilk As Byte
isi_deger_hafiza = ERead 0
If isi_deger_hafiza = $ff Then GoTo ILKCALISMA
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
ILKCALISMA:
EWrite 0,[ilk]
EWrite 1,[ilk]
EWrite 2,[ilk]
EWrite 3,[ilk]
EWrite 4,[ilk]
DURUM=1
GoTo BASLA
Disable
KESME:
Inc DURUM
If DURUM = 4 Then DURUM = 0
INTF = 0
Resume
Enable
End
EWrite komutunu kullanırken Byte değişkeni için 1 ara Word için 2 ara Dword veya Float değişkenler için 4 ara bırakılarak aderslenir. sanırım sorununuz bundan kaynaklanıyor ..
ayrıca birçok parametreyi tek satırda yazabilirsiniz
EWrite 0,[a ,b ,c ,d,]
Merhaba arkadaşlar
LPG olayına bende kafayı bozdum.
sistem sorunsuz bir şekilde çalışıyor, ama eread ve ewrite kodunu halledemedim. bu konuda eksik bişeymi yapıyorum..
menu:
Print At 1,1,"GAZ FIYATI "
Print At 2,1,Dec2 gazfiyati,"TL "
If PORTC.1=1 Then
DelayMS 40
gazfiyati = gazfiyati + 0.01
End If
If PORTC.2=1 Then
DelayMS 40
gazfiyati = gazfiyati - 0.01
End If
If PORTC.0=1 Then
EWrite 10,[gazfiyati]
DelayMS 300
GoTo menu1
End If
GoTo menu
buraya kadar normalmi?
normal görünüyor.
gazfiyati= eread 10
sehirici=eread 14
sehirdisi=eread 18 KAYITLI OLAN VERİLERİ SİSTEM ÇALIŞTIĞI ANDA GÖREBİLMESİ İÇİN NEREYE EKLEMEM GEREKİYOR
litre=eread 22
oranfiyat=eread 26
----------------------------------------------------------------------------------------------------------
Device 16F877
Xtal 4
Input PORTC.0
Input PORTC.1
Input PORTC.2
Input PORTD.0
Output PORTD.1
PORTD.1=0
Adin_Res = 10
Adin_Tad = FRC
Adin_Stime = 50
Dim deg1 As Word ' analog gaz ölçme değişkeni
Dim depo As Word
Dim gazfiyati As Float
gazfiyati=0
Dim sehirici As Float
sehirici=0
Dim sehirdisi As Float
sehirdisi=0
Dim litre As Float
litre=0
Dim oranfiyat As Float
oranfiyat=0
Dim sicikm As Word
sicikm=0
Dim sdisikm As Word
sdisikm=0
Dim yasar As Float
yasar=0
TRISA = %00000001
ADCON1 = %10000000
Declare LCD_DTPin PORTD.4
Declare LCD_ENPin PORTD.3
Declare LCD_RSPin PORTD.2
DelayMS 10
basla:
goto basla
end
"başla" nın hemen üstüne
Device 16F877
Xtal 4
Input PORTC.0
Input PORTC.1
Input PORTC.2
Input PORTD.0
Output PORTD.1
PORTD.1=0
Adin_Res = 10
Adin_Tad = FRC
Adin_Stime = 50
Dim deg1 As Word ' analog gaz ölçme değişkeni
Dim depo As Word
Dim gazfiyati As Float
gazfiyati=0
Dim sehirici As Float
sehirici=0
Dim sehirdisi As Float
sehirdisi=0
Dim litre As Float
litre=0
Dim oranfiyat As Float
oranfiyat=0
Dim sicikm As Word
sicikm=0
Dim sdisikm As Word
sdisikm=0
Dim yasar As Float
yasar=0
TRISA = %00000001
ADCON1 = %10000000
Declare LCD_DTPin PORTD.4
Declare LCD_ENPin PORTD.3
Declare LCD_RSPin PORTD.2
DelayMS 10
gazfiyati= eread 10
sehirici=eread 14
sehirdisi=eread 18
litre=eread 22
oranfiyat=eread 26
basla:
goto basla
end
pic i programlama alanındaki ayarlar doğrumu acaba.
eread ve ewrite kodunu kullandığımda arttıracağım veya eksilteceğim değerleri değiştiremiyorum.
(http://c1212.hizliresim.com/14/4/glb56.jpg) (http://bit.ly/c25MCx)
hocam önce sadece yazmayı, sonra okumayı deneyin.
http://muhittinkaplan.com/2012/10/proton-plus-ve-mikrodenetleyici/ (http://muhittinkaplan.com/2012/10/proton-plus-ve-mikrodenetleyici/) de kodları felan vermiştim.
Asıl sorunu buldum.
örnek kod----
Device 16F877
Xtal 4
Input PORTC.0
Input PORTC.1
Input PORTC.2
Declare LCD_DTPin PORTD.4
Declare LCD_ENPin PORTD.3
Declare LCD_RSPin PORTD.2
Dim mehmet As Float
mehmet=0
DelayMS 10
mehmet = ERead 10
DelayMS 50
basla:
If PORTC.1=1 Then
mehmet=mehmet + 0.01
DelayMS 100
End If
If PORTC.2=1 Then
mehmet=mehmet - 0.01
DelayMS 100
End If
If PORTC.0=1 Then
EWrite 10, [mehmet]
DelayMS 50
End If
Print At 1,1,Dec5 mehmet , " 1"
GoTo basla
Mehmet adında tanımlı değişken Float büyüklüğünde ise değeri arttırma yada eksiltme yapmıyor. Mehmet değişkenini Word olarak yaptığımda çok güzel sorunsuz çalışıyor.
Benim asıl istediğim ekrandaki değeri (0.00) olacak şekilde yapmak istiyorum.
Dim mehmet as Word ( bu tanımlama ekranda küsüratlı olarak en düşük 0.01 ile 9.99 arası olacak. ekranda bu şekilde görülebilirmi.)
Merhaba
Bende bir termostat yapmak istiyorum set değerini aşağıdaki gibi eproma yazdırıyorum fakak aynı adresten okutmak istediğimde değer herzaman 55 gözüküyor sizce nerede yanlış yapıyorum? Değişkenim Byte
İkinci Ewrite, epromda daha önceden değişiklik yapıp yapmadığımı işaretlemek için eklediğim bir satır
Print At 1,1,"PLEASE WAIT..."
Print At 2,1,"SAVING..."
DelayMS 1500
EWrite 10,[SETTEMPERATURE]:DelayMS 10
EWrite 20,[0]:DelayMS 10
Cls
GoTo START
Okutma komutu
SETTEMPERATURE=ERead 10
OFFSETTEMP=ERead 30
Teşekkürler
ısıyı DS18B20 ile ölçüyorsaneğer. bu eleman ilk açılışta 50 derecenin üzerinde sanırım 68 dereceydi, bir değer gönderiyor pic e.
ölçüm yapmıyorum sadece set edilen değeri bir sonraki güç kesintisinden sonrada aynı kalmasını istiyorum ayrıca ADC çevrimi için normal pot kullanıyorum kod yazmayı yeni öğreniyorum..
Aklınıza başka bir şey geliyor mu?
Teşekkürler
yanlış anlamadıysam,
değişken bir değer giriyorsun pice, yada değişken bir değer okuyor pic.
bu okuduğu değer elektrik kesilme anında eproma yazılacak, ve elektrik geldiğinde eprom dan okuyacak. ve ekranda gösterecek.
ISIK= ERead 1 'ISIK DEĞERİ BASLANGIÇTA OKUNUR
If ISIK=255 or ıISIK=0 Then ISIK=1 'ISIK DEĞERİ İLK YUKLEMEDE 255 VEYA 0 GELİRSE 1 OLARAK AYARLANSIN
'--------------------------ANA PROGRAM----------------------------------------------------------------------------------------------------------
BASLA:
EWrite 1,[ ISIK ] 'ISIK AYARLANIR VE KAYDEDİLİR
Aynen öyle hocam
set menüsü var girip ayar yaptıktan sonra store düğmesine basılınca set edilen değeri hafızaya alıp oradan okuyacak..
Nasıl yapabilirim? eprom yazdırma komutlarımda hata var gibi geliyor ama nasıl yapmam gerektiğini bilgim dahilinde çözebilmiş değilim
Teşekkürler
Device 16F877
Xtal 4
Input PORTC.0
Input PORTC.1
Input PORTC.2
Declare LCD_DTPin PORTD.4
Declare LCD_ENPin PORTD.3
Declare LCD_RSPin PORTD.2
Dim mehmet As word
mehmet=0
DelayMS 10
mehmet = ERead 10
DelayMS 50
basla:
If PORTC.1=1 Then
mehmet=mehmet + 1
DelayMS 100
End If
If PORTC.2=1 Then
mehmet=mehmet - 1
DelayMS 100
End If
If PORTC.0=1 Then
EWrite 10, [mehmet]
DelayMS 50
End If
Print At 1,1,Dec5 mehmet , " 1"
GoTo basla
önemli noktaları kalın olarak gösterdim. bende bu konuda yardım almıştım arkadaşlardan. aslında basit biryerdeymiş sorun. örneği incelersen faydası olacaktır.
Hocalarımdan ricam olacak.
SerIn PORTC.7 , 16468 , [Str SerString] ' 15 karakter seri bir veriyi okuyup lcd de görebiliyorum
'-----------------------------------------------------------------------------------------------------------------
bu okuduğum değeri hafızaya alıp daha sonra tekrardan görmek istiyorum. Şöyle bir kod
EWrite 10, [SerString[0] ,SerString[1],SerString[2],SerString [3] , SerString [4] ,SerString [5],SerString [6],SerString [7],SerString [8] , SerString [9] ,SerString [10],SerString [11],SerString [12],SerString [13],SerString [14]]
bu şekilde hafızaya kayıt olayı problemli olabilirmi. Seri porttan okunan değerleri 10 adet farklı Ewrite kullanarak yapmam gerekiyor.