Merhaba herkese,
Ben aşağıdaki gibi bir kod yazıp proteus da kurduğum devrede kodları derleyip programı çalıştırmaya çalıştım fakat beklemediğim şeyler oldu. Asıl amacım bir şifreli kilit yapmak ve bu kodu yazmamdaki asıl amacımda şifreli kilidime default şifre tanımlamak. forumlardaki araştırmalarımdan öğrendiğim kadarıyla bu kodu yazdım.
ana:
Read 0,sifre.lowbyte
read 1,sifre.highbyte
if sifre.lowbyte = 255 and sifre.highbyte = 255 then
sifre = 1111
write 0,sifre
pause 50
endif
read 0,sifre1.lowbyte
read 1,sifre1.highbyte
lcdout $FE,1,#sifre1.lowbyte
pause 30
LCDOUT $FE,$C0,#sifre1.highbyte
pause 30
goto ana
Bu kodun LCD ekrandaki çıktısının
sifre1.lowbyte = 87
sifre1.highbyte = 4
olması gerekiyorken, sifre1.lowbyte = 87 ve sifre1.highbyte = 255 oluyor.
devreyi proteusta kurdum sonrasında programı ilk çalıştırdığımda Proteustaki Pic'i resetlemek için Debug- Reset persistent model data yaparak çalıştırıyorum ama hiçbir şekilde düzeltemedim nerede yanlış yapıyorum yardımlarınıza ihtiyacım var.
Eprom dan okur iken 2 byte halinde okuma yapıyorsun.
Read 0,Byte0
Read 1,Byte1 şeklinde.
Ama eproma yazarken tek adrese word tipi değişkeni yazmaya çalışıyorsun. Write 0, Sifre şeklinde.
Eprom adresleri yalnızca byte cinsinden değerleri saklayabilir. Bu nedenle Sifre=1111 iken sen bunu sıfır nolu adrese yazmaya kalkarsan yalnızca lowbyte kısmı eproma yazılır. 1111 değerini byte'larına ayırırsak HIGHBYTE=1111/256=4
LOWBYTE =1111-(4*256)=87 şeklinde bulunur. Bu durumda WRITE 0,Sifre şeklinde komut verdiğin zaman sıfır adresine yalnızca 87 rakamı yazılır. Doğru komut, Write 0, Sifre.byte0,Sifre.byte1 şeklinde dir. Böyle yaz sorunun düzelir.
Ete
@Ete hocam verdiğiniz cevap için çok teşekkür ederim. Yalnız aşağıdaki gibi kodu değiştirdim. Sizin dediğiniz şekilde yaptım. Ekte devreyi de yolluyorum. Ama yine aynı şey oldu bir türlü anlayamadım nedenini. Ayrıca write komutu ile write 0,sifre şeklinde komut yazınca sifre adlı word tipi değişkeni kendisi otomatik olarak iki byte lık kısma ayırıp EEprom un 0 ve 1. adreslerine yazmıyor mu? Yani forumda incelerken sanırım sizin notlarınızdan yada başka bir arkadaşa cevabınızdan aklımda böyle kalmış yanlışta olabilir. Proteus simulasyon programının bir açığı filan olabilir mi yada derleyicinin?
ana:
Read 0,sifre.lowbyte
read 1,sifre.highbyte
if sifre.lowbyte = 255 and sifre.highbyte = 255 then
sifre = 1111
Write 0, Sifre.byte0,Sifre.byte1
pause 50
endif
read 0,sifre1.lowbyte
read 1,sifre1.highbyte
lcdout $FE,1,#sifre1.lowbyte
pause 30
LCDOUT $FE,$C0,#sifre1.highbyte
pause 30
goto ana
(http://s13.postimg.cc/yebq52w43/isis.jpg) (http://postimg.cc/image/yebq52w43/)
Bir tavsiyede bulunayım.
Bir komut kullanırken format değiştirmemeye çalış.
Komutun birinde sifre.lowbyte diğerinde sifre.byte0 şeklinde kullanıyorsun. Her ikisi aynı kapıya çıksada sen bir şekil kullan. Karışıklığı önelersin.
Eproma word tipi değişken direk yazılamıyor. En azından benim gördüğüm versiyonlarda bu mümkün değil.
Yazılabilse okunabilirdi de zaten.
Neden çalışmadığı konusunda bir fikrim yok. Değişken tanımlamadan tutun da sigorta ayarlarına kadar bir çok konuda kusur olabilir . Bas dosyası ve dsn dosyasını koyarsan bakar söylerim.
Sonradan düşündüm de sorun muhtemelen 0 ve 1 nolu adreslerde 255 den birinde farklı bir değer kayıtı olduğu için bu sorun ortaya çıkıyor.
Programda değişken tanımlamalarından hemen sonra şu satırı ilave et ve yeniden bak.
Data @0,255,255
Bu komut ilk iki adrese 255 değerini program açılırken yazar. Böylece ilk okumada yeni programlanmış bir işlemci gibi program değerlendirilir.
Ete
Hocam teşekkür ederim cevaplarınız için. Cevaplarınız doğrultusunda biraz daha uğraşayım daha başaramazsam tekrar size fikir danışırım izninizle. saygılar.
@Ete hocam tekrar merhaba,
bir iki gündür konuyla ilgili çalıştım ama işin içinden çıkamadım. öncelikle ben ilk başta proteus 6.7 sp3 kullanıyordum. sorunum konuda da belirttiğim gibi Eeproma read write konusuydu. ne yaptıysam düzeltemedim. daha sonra proteus un 8.1 sp1 sürümünü yükledim. bu durumda sifre.lowbyte = 210 ve sifre.highbyte = 4 elde ettim. tam hallettim diye sevindim bu seferde tuş okuma yani tarama bölümünde sorun yaşamaya başladım. bu sorun proteus 6.7 kullanırken yoktu aşağıda yolldığım programı compile ediyorum hex dosyasını 6.7 de çalıştırıyorum write , read konusunda problem yaşıyorım ama keypad tarafı çalışıyor. şimdi de 8.1 de keypad tarafı çalışmıyor. devre çizimini ve kodu yolluyorum. yorumlarınızı rica ediyorum. ayrıca proteus simulasyon programıyla ilgili hangi versiyonu kullanmamı tavsiye edersiniz.
8.1 de yaşadığım problem tam olarak şu, mesela 1 tuşuna basıyorum sırasıyla ekrana 1147 yazıyor ve ana etiketine geri dönüyor sutun1 ve satır3 high de kalıyor. sonrasında çıkış butonuna her bastığımda sütun1 high de kalıyor ve satır taraması olduğu için ekrana 147* , 1147 gibi sütun1 in ilgili rakamları yazılıp duruyor. aynı şey eğerki ilk olarak 2. veya 3. sütunla alakalı bir giriş yaptıysam orada da oluyor. bilgisayarımın işletim sistemi 64 bit win7 eğer önemliyse
saygılarımla teşekkür ederim.
@ __config _XT_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF & _CP_OFF
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 5
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
ADCON1=7 ' analog cıkıslar djital oldu
TRISB=1
TRISA=0
TRISC=%10000111
TRISD=%11000000
SAY var byte
TUS VAR BYTE
TUSDEGER var word 'ekrana gelecek sayı değeri
j var byte
b var byte
c var bytE
sifre var word
sifre1 var word
symbol SATIR1=PORTC.3
symbol SATIR2=PORTC.4
symbol SATIR3=PORTC.5
symbol SATIR4=PORTC.6
symbol SUTUN1=PORTC.0
symbol SUTUN2=PORTC.1
symbol SUTUN3=PORTC.2
symbol buzzer = porta.2
symbol sensor = portd.6
SAY = 0
TUs= 0
b = 0
c = 0
TUSDEGER = 0
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PAUSE 500
LCDOUT $FE,1
Data @0,255,255 ' EEprom 0 ve 1 adresleri boşaltılıyor
ana:
Read 0,sifre.lowbyte 'eeprom 0 nolu adresi okunuyor sifre değişkeninin düşük byte'ına atanıyor
read 1,sifre.highbyte 'eeprom 1 nolu adresi okunuyor sifre değişkeninin yüksek byte'ına atanıyor
if sifre = 65535 then ' eeprom boş ise
sifre1 =1234 ' sifre1 değişkenine 1234 sayısı atanıyor
write 0,sifre1.lowbyte:pause 30 ' 0 nolu adrese sifre1'in düşük baytı yazılıyor(210)
write 1,sifre1.highbyte:pause 30 ' 1 nolu adrese sifre1'in yüksek baytı yazılıyor(4)
endif
SAY = 0
TUs= 0
c = 0
TUSDEGER = 0
lcdout $FE,1,"Cikisa bas"
pause 30
if portb.7 = 1 then
pause 30
gosub tarama
endif
goto ana
TARAMA:
HIGH SATIR1
IF SUTUN1=1 THEN
TUS=1
pause 100
GOSUB EKRAN
endif
IF SUTUN2=1 THEN
TUS=2
pause 100
GOSUB EKRAN
endif
IF SUTUN3=1 THEN
TUS=3
pause 100
GOSUB EKRAN
endif
LOW SATIR1
HIGH SATIR2
IF SUTUN1=1 THEN
TUS=4
pause 100
GOSUB EKRAN
endif
IF SUTUN2=1 THEN
TUS=5
pause 100
GOSUB EKRAN
endif
IF SUTUN3=1 THEN
TUS=6
pause 100
GOSUB EKRAN
endif
LOW SATIR2
HIGH SATIR3
IF SUTUN1=1 THEN
TUS=7
pause 100
GOSUB EKRAN
endif
IF SUTUN2=1 THEN
TUS=8
pause 100
GOSUB EKRAN
endif
IF SUTUN3=1 THEN
TUS=9
pause 100
GOSUB EKRAN
endif
LOW SATIR3
HIGH SATIR4
IF SUTUN1=1 THEN
LCDOUT $FE,1,"*"
pause 100
GOSUB EKRAN
endif
IF SUTUN2=1 THEN
TUS=0
pause 100
GOSUB EKRAN
endif
IF SUTUN3=1 THEN
LCDOUT $FE,1,"#"
pause 100
GOSUB EKRAN
endif
LOW SATIR4
GOTO TARAMA
EKRAN:
if SAY = 0 then
tusdeger = TUS
LCDOUT $FE,1,#TUS
LCDOUT $FE,$C0,#tusdeger
PAUSE 50
endif
if SAY =1 THEN
tusdeger = tusdeger*10 + tus
LCDOUT $FE,1,#TUS
LCDOUT $FE,$C0,#tusdeger
PAUSE 50
ENDIF
if SAY =2 THEN
tusdeger= tusdeger*10 + tus
LCDOUT $FE,1,#TUS
LCDOUT $FE,$C0,#tusdeger
PAUSE 40
ENDIF
if SAY =3 THEN
tusdeger= tusdeger*10 + tus
LCDOUT $FE,1,#TUS
LCDOUT $FE,$C0,#tusdeger
PAUSE 50
ENDIF
SAY = SAY +1
if say = 4 then dogrula
return
dogrula:
Read 0,sifre.lowbyte
read 1,sifre.highbyte
IF tusdeger = sifre then
lcdout,$fe,1,"dogru sifre"
pause 1000
else
lcdout,$fe,1,"yanlis sifre"
endif
goto ana
end
(http://s27.postimg.cc/nqiy9vsu7/Proteusresim.jpg) (http://postimg.cc/image/nqiy9vsu7/)
Alıntı yapılan: ete - 24 Ocak 2015, 19:02:49
Bir tavsiyede bulunayım.
Bir komut kullanırken format değiştirmemeye çalış.
Komutun birinde sifre.lowbyte diğerinde sifre.byte0 şeklinde kullanıyorsun. Her ikisi aynı kapıya çıksada sen bir şekil kullan. Karışıklığı önelersin.
Eproma word tipi değişken direk yazılamıyor. En azından benim gördüğüm versiyonlarda bu mümkün değil.
Yazılabilse okunabilirdi de zaten.
Neden çalışmadığı konusunda bir fikrim yok. Değişken tanımlamadan tutun da sigorta ayarlarına kadar bir çok konuda kusur olabilir . Bas dosyası ve dsn dosyasını koyarsan bakar söylerim.
Sonradan düşündüm de sorun muhtemelen 0 ve 1 nolu adreslerde 255 den birinde farklı bir değer kayıtı olduğu için bu sorun ortaya çıkıyor.
Programda değişken tanımlamalarından hemen sonra şu satırı ilave et ve yeniden bak.
Data @0,255,255
Bu komut ilk iki adrese 255 değerini program açılırken yazar. Böylece ilk okumada yeni programlanmış bir işlemci gibi program değerlendirilir.
Ete
@Ete hocam tekrar merhaba,
bir iki gündür konuyla ilgili çalıştım ama işin içinden çıkamadım. öncelikle ben ilk başta proteus 6.7 sp3 kullanıyordum. sorunum konuda da belirttiğim gibi Eeproma read write konusuydu. ne yaptıysam düzeltemedim. daha sonra proteus un 8.1 sp1 sürümünü yükledim. bu durumda sifre.lowbyte = 210 ve sifre.highbyte = 4 elde ettim. tam hallettim diye sevindim bu seferde tuş okuma yani tarama bölümünde sorun yaşamaya başladım. bu sorun proteus 6.7 kullanırken yoktu aşağıda yolldığım programı compile ediyorum hex dosyasını 6.7 de çalıştırıyorum write , read konusunda problem yaşıyorım ama keypad tarafı çalışıyor. şimdi de 8.1 de keypad tarafı çalışmıyor. devre çizimini ve kodu yolluyorum. yorumlarınızı rica ediyorum. ayrıca proteus simulasyon programıyla ilgili hangi versiyonu kullanmamı tavsiye edersiniz.
8.1 de yaşadığım problem tam olarak şu, mesela 1 tuşuna basıyorum sırasıyla ekrana 1147 yazıyor ve ana etiketine geri dönüyor sutun1 ve satır3 high de kalıyor. sonrasında çıkış butonuna her bastığımda sütun1 high de kalıyor ve satır taraması olduğu için ekrana 147* , 1147 gibi sütun1 in ilgili rakamları yazılıp duruyor. aynı şey eğerki ilk olarak 2. veya 3. sütunla alakalı bir giriş yaptıysam orada da oluyor. bilgisayarımın işletim sistemi 64 bit win7 eğer önemliyse
saygılarımla teşekkür ederim.
@ __config _XT_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF & _CP_OFF
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 5
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
ADCON1=7 ' analog cıkıslar djital oldu
TRISB=1
TRISA=0
TRISC=%10000111
TRISD=%11000000
SAY var byte
TUS VAR BYTE
TUSDEGER var word 'ekrana gelecek sayı değeri
j var byte
b var byte
c var bytE
sifre var word
sifre1 var word
symbol SATIR1=PORTC.3
symbol SATIR2=PORTC.4
symbol SATIR3=PORTC.5
symbol SATIR4=PORTC.6
symbol SUTUN1=PORTC.0
symbol SUTUN2=PORTC.1
symbol SUTUN3=PORTC.2
symbol buzzer = porta.2
symbol sensor = portd.6
SAY = 0
TUs= 0
b = 0
c = 0
TUSDEGER = 0
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PAUSE 500
LCDOUT $FE,1
Data @0,255,255 ' EEprom 0 ve 1 adresleri boşaltılıyor
ana:
Read 0,sifre.lowbyte 'eeprom 0 nolu adresi okunuyor sifre değişkeninin düşük byte'ına atanıyor
read 1,sifre.highbyte 'eeprom 1 nolu adresi okunuyor sifre değişkeninin yüksek byte'ına atanıyor
if sifre = 65535 then ' eeprom boş ise
sifre1 =1234 ' sifre1 değişkenine 1234 sayısı atanıyor
write 0,sifre1.lowbyte:pause 30 ' 0 nolu adrese sifre1'in düşük baytı yazılıyor(210)
write 1,sifre1.highbyte:pause 30 ' 1 nolu adrese sifre1'in yüksek baytı yazılıyor(4)
endif
SAY = 0
TUs= 0
c = 0
TUSDEGER = 0
lcdout $FE,1,"Cikisa bas"
pause 30
if portb.7 = 1 then
pause 30
gosub tarama
endif
goto ana
TARAMA:
HIGH SATIR1
IF SUTUN1=1 THEN
TUS=1
pause 100
GOSUB EKRAN
endif
IF SUTUN2=1 THEN
TUS=2
pause 100
GOSUB EKRAN
endif
IF SUTUN3=1 THEN
TUS=3
pause 100
GOSUB EKRAN
endif
LOW SATIR1
HIGH SATIR2
IF SUTUN1=1 THEN
TUS=4
pause 100
GOSUB EKRAN
endif
IF SUTUN2=1 THEN
TUS=5
pause 100
GOSUB EKRAN
endif
IF SUTUN3=1 THEN
TUS=6
pause 100
GOSUB EKRAN
endif
LOW SATIR2
HIGH SATIR3
IF SUTUN1=1 THEN
TUS=7
pause 100
GOSUB EKRAN
endif
IF SUTUN2=1 THEN
TUS=8
pause 100
GOSUB EKRAN
endif
IF SUTUN3=1 THEN
TUS=9
pause 100
GOSUB EKRAN
endif
LOW SATIR3
HIGH SATIR4
IF SUTUN1=1 THEN
LCDOUT $FE,1,"*"
pause 100
GOSUB EKRAN
endif
IF SUTUN2=1 THEN
TUS=0
pause 100
GOSUB EKRAN
endif
IF SUTUN3=1 THEN
LCDOUT $FE,1,"#"
pause 100
GOSUB EKRAN
endif
LOW SATIR4
GOTO TARAMA
EKRAN:
if SAY = 0 then
tusdeger = TUS
LCDOUT $FE,1,#TUS
LCDOUT $FE,$C0,#tusdeger
PAUSE 50
endif
if SAY =1 THEN
tusdeger = tusdeger*10 + tus
LCDOUT $FE,1,#TUS
LCDOUT $FE,$C0,#tusdeger
PAUSE 50
ENDIF
if SAY =2 THEN
tusdeger= tusdeger*10 + tus
LCDOUT $FE,1,#TUS
LCDOUT $FE,$C0,#tusdeger
PAUSE 40
ENDIF
if SAY =3 THEN
tusdeger= tusdeger*10 + tus
LCDOUT $FE,1,#TUS
LCDOUT $FE,$C0,#tusdeger
PAUSE 50
ENDIF
SAY = SAY +1
if say = 4 then dogrula
return
dogrula:
Read 0,sifre.lowbyte
read 1,sifre.highbyte
IF tusdeger = sifre then
lcdout,$fe,1,"dogru sifre"
pause 1000
else
lcdout,$fe,1,"yanlis sifre"
endif
goto ana
end
Programda çok büyük hata yok yada ben göremiyorum. Bazen denemeden hatayı göremezsiniz. Bir hata varsa deneyince ortaya çıkar.
Benim mantığıma uymayan yerler var ama programın çalışmasını engelleyecek şeyler değil.
Program kodu verirken KOD TAG (yukarıda üzerinde # olan buton) kullanın. Ayrıca şema yada sim dosyası ile destekleyin.
Bak programında ne işlemcin belli neden şeman var. Mümkünse bunları dosya içinde RAR şeklinde sıkıştırılmış olarak ver.
Tuş taramada bir tuşa basılmış ise basıldığı andan itibaren tuşun bırakılmasını beklemek doğru olur. Aksi halde elin biraz fazla tuşta kalırsa ki bunu önlemek için pause 100 leri koymuşsun yine aynı tuş basılmış gibi değerlendirilir ve iki defa o tuş değerlendirilir.
Programları simulasyonda 7.10 ile çalıştır.
Ete
Alıntı yapılan: ete - 02 Şubat 2015, 09:04:51
Programda çok büyük hata yok yada ben göremiyorum. Bazen denemeden hatayı göremezsiniz. Bir hata varsa deneyince ortaya çıkar.
Benim mantığıma uymayan yerler var ama programın çalışmasını engelleyecek şeyler değil.
Program kodu verirken KOD TAG (yukarıda üzerinde # olan buton) kullanın. Ayrıca şema yada sim dosyası ile destekleyin.
Bak programında ne işlemcin belli neden şeman var. Mümkünse bunları dosya içinde RAR şeklinde sıkıştırılmış olarak ver.
Tuş taramada bir tuşa basılmış ise basıldığı andan itibaren tuşun bırakılmasını beklemek doğru olur. Aksi halde elin biraz fazla tuşta kalırsa ki bunu önlemek için pause 100 leri koymuşsun yine aynı tuş basılmış gibi değerlendirilir ve iki defa o tuş değerlendirilir.
Programları simulasyonda 7.10 ile çalıştır.
Ete
@Ete hocam , teşekkür ederim. devre şemasını resim formatında tekrar yolluyorum. dosya ekle diye bir sekme göremediğim için resim ekleyebildim sadece. ayrıca "Tuş taramada bir tuşa basılmış ise basıldığı andan itibaren tuşun bırakılmasını beklemek doğru olur." demişsiniz. bunu pause komutu ile yapmayacakmıyız. örnek vermeniz mümkün mü herhangi bir buton için. saygılarımla.
(http://s30.postimg.cc/hkcb1hx3h/isis.jpg) (http://postimg.cc/image/hkcb1hx3h/)
Dosyaları bir yere yükleyip link verebilir yada mail ile göderebilirsin.
Bir tuşun bırakılıp bırakılmadığı pause ile çözülemez.
Yatay pinleri sırası ile HIGH yapıp karşılığında dikey pinlerden birisi HIGH olmuşmu diye bakıyorsun.
Bu durumda dikey pinlerden birisi HIGH ise low oluncaya kadar bekle demen yeterli. Bunu yapacak komut,
WHILE (PORTC & %00000111)>0 :wend
şeklindedir. Bu satırı, LOW SATIR1 komut satırından öncesine yerleştirmen yeterli. Benzer şekilde LOW SATIR2 ve LOW SATIR3 komut satırlarından öncesinede aynı satırı eklemen gerekiyor.
Ete
Alıntı yapılan: ete - 02 Şubat 2015, 14:33:57
Dosyaları bir yere yükleyip link verebilir yada mail ile göderebilirsin.
Bir tuşun bırakılıp bırakılmadığı pause ile çözülemez.
Yatay pinleri sırası ile HIGH yapıp karşılığında dikey pinlerden birisi HIGH olmuşmu diye bakıyorsun.
Bu durumda dikey pinlerden birisi HIGH ise low oluncaya kadar bekle demen yeterli. Bunu yapacak komut,
WHILE (PORTC & %00000111)>0 :wend
şeklindedir. Bu satırı, LOW SATIR1 komut satırından öncesine yerleştirmen yeterli. Benzer şekilde LOW SATIR2 ve LOW SATIR3 komut satırlarından öncesinede aynı satırı eklemen gerekiyor.
Ete
@Ete hocam öncelikle önerileriniz için çok teşekkürle. Önerilerinizi uyguladım kurduğum devre de 4x3 keypad 'de sorun varmış. sanırım simulasyondan kaynaklanıyor sorun. Keypad'i butonlarla yapınca sorun çözüldü. şu an simulasyonda çalışıyor. Şimdi devreyi board a kuruyorum umarım orada da çalıştırabilirim.saygılar