PBP de write/read komutu kullanımı

Başlatan acemipicci, 24 Ocak 2015, 11:02:29

acemipicci

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.

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

acemipicci

@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




ete

#3
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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

acemipicci

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.

acemipicci

@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





acemipicci

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

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

acemipicci

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.





ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

acemipicci

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