Eproma değişken veri kaydı

Başlatan eprom_20, 09 Temmuz 2012, 13:52:44

eprom_20

Ete hocam ; Tuş takımından girilen verilerin pic epromunda kaydedilmesinde sorun yaşıyorum,daha önce de bu proje hakkında yardımınızı almıştım o zamandan bu güne değişikler yaptım ama program bir noktada kalıyor ve tepki vermiyor hocam,acaba nerde hata yapıyorum yardımcı olabilirmisiniz...? Şimdiden çok Teşekkür ederim hocam

ete

Programında gördüğüm hatalar şunlar.
1. 10Mhz de çalışan bir programda OSC ayarı XT değiş HS_OSC şeklinde seçilmelidir.
2.TRISA=%111000  tris registerleri 8 bitliktir. eksik bit girilmez. TRISA=%11100000 şeklinde düzeltiniz.
3. Her program bir açılış gecikmesi ister. Değişken tanımlamadan sonra yaklaşık 250 ms lik bir gecikme evrilmelidir.
    LCD kullanılan programlarda ayrıca LCDOUT $fe,1  şeklinde LCD açılış komutu verilip  ardından açılış gecikmesinin verilmesi uygun olur. Programa bunları ilave ediniz.
4. IF HAFIZA_NO1=255 THEN HAFIZA_NO1=HAFIZA_NO1+1  satırının ne anlama geldiğini bir türlü anlamadım. Mantık yürütürsek;
    Önce hafıza okunuyor. SOnra okunan hafıza 255 ise değeri bir artırılıyor yani değeri sıfır oluyor. Neden direk IF HAFIZA=255 THEN HAFIZA=0 denilmemiş acaba? 
    Byte cinsinden sayıların en büyüğü 255 dir. Eproma bir bilgi yazılmamış ise değeri 255 olarak okunur. Bu boş demektir. Okunan değer 255 ise değeri direk sıfır yap şeklinde komut koyulmamış değer bir artılarak sıfırlanmış. Kulağı tersten göstermek gibi bir şey bu.

5. Call komutu asm kodlarını çağırmak için kullanılan bir komutdur. Normal alt programlar için GOSUB kullanılır. Her nedense bazı kişiler Gosub yerine Call kullanmayı seviyor. Program açısından sorun olmayan ancak işin esası açısından yanlış bir uygulama. Derleyici buna itiraz etmiyor ama siz yinede Call yerine Gosub şeklinde kullanın derim.

Başkada bir kusur göremedim.

Ete

eprom_20

İlginiz ve yardımlarınız için çok teşekkür ederim hocam,uyarılarınız doğrultusunda programı yeniden düzenleyeceğim,,,Allaha emanet olun...Saygılar

eprom_20

Hocam forumda yanıtlayıp kodunu verdiğiniz "TUŞ TAKIMI" konusunda yardım edebilirmisiniz?

Hocam , soruyu doğru sormak anlamında (programdan da anlayacaksınız) tuş takımından girilen 11 haneli rakamın (LCD 'den de görülen) ENTER tuşuna basıldıktan sonra ; eğer tuşlanan rakamlar epromun ilgili adresine doğru kayıt edildiyse ekranda kaydedildi yazısının görülmesi,bir de hocam tuş takımındaki enter tuşunu aktif yapamadım ,ancak ters olarak silme tuşuna basılınca kaydedildi yazısı çıkıyor,

Hocam bir de merak ettiğim program daki SAYI değişkenini WORD olarak atadık,ancak  diğer değişkenler (KAYIT VE HAFIZA) BYTE onlarında WORD değişkeni olması gerekiyormu?

Hocam affınıza sığınarak son sorum, devreye bir buton eklesem veya tuş takımındaki bir tuşa bu komutu atasam acaba pic'e  hafızaya kaydettiği rakamları LCD de göster desem bunu gerçekleştirebilirmiyim hocam? Yardım ederseniz çok sevinirim,,,,Selametle

greatgonzo

eeproma veri kaydetmek için kullanman gereken komut; write adres,değişken şeklinde. Adres kısmı eeprom hafıza boyutu ile belli olur ki kullandığın pic in data sheetinde yazar. Bayt cinsinden adreslenir.. Mesela 16f88 de  256 byte tır ve 0 dan başlar 255 e kadar adreslenir. Doğal olarak her hücre bir bytetır. Word yazarken de byte lere bölmelisin. Şöyle ki;

write 0,veri.byte0:pause 10
write 1,veri.byte1:pause 10     şeklinde yada

write 0,veri.lowbyte:pause 10
write 1,veri.highbyte:pause 10   şeklinde word leri bytelara bölersin.

Veri çekerkende kullanman gereken aynı mantıkla okumandır.

read 0,veri.byte0
read 1,veri.byte1  şeklinde yada

read 0,veri.lowbyte
read 1,veri.highbyte şeklinde.

Dikkat etmen gereken 2 husus var. Biri lowbyte ile hıgh byte karıştırma. Diğeride yazma işlemi 10 ms kadar sürebilir ki gecikme vermelisin.Okuma da gecikme süresi yoktur. Ete hocamın derslerinde de bunları bulabilirsin.

Bir tuşla bunları lcd de göstermek içinde ilgili tuşu bir etiketle ilişkilendirip okuma yapıp kolayca lcd de görüntüleyebilirsin.

İyi çalışmalar....

Mucit23

Alıntı yapılan: eprom_20 - 13 Ağustos 2012, 02:43:21
Hocam forumda yanıtlayıp kodunu verdiğiniz "TUŞ TAKIMI" konusunda yardım edebilirmisiniz?

Hocam , soruyu doğru sormak anlamında (programdan da anlayacaksınız) tuş takımından girilen 11 haneli rakamın (LCD 'den de görülen) ENTER tuşuna basıldıktan sonra ; eğer tuşlanan rakamlar epromun ilgili adresine doğru kayıt edildiyse ekranda kaydedildi yazısının görülmesi,bir de hocam tuş takımındaki enter tuşunu aktif yapamadım ,ancak ters olarak silme tuşuna basılınca kaydedildi yazısı çıkıyor,

Hocam bir de merak ettiğim program daki SAYI değişkenini WORD olarak atadık,ancak  diğer değişkenler (KAYIT VE HAFIZA) BYTE onlarında WORD değişkeni olması gerekiyormu?

Hocam affınıza sığınarak son sorum, devreye bir buton eklesem veya tuş takımındaki bir tuşa bu komutu atasam acaba pic'e  hafızaya kaydettiği rakamları LCD de göster desem bunu gerçekleştirebilirmiyim hocam? Yardım ederseniz çok sevinirim,,,,Selametle

Programdan açıkçası pek fazla birşey anlamadım ama yinede gördüklerimi söyliyeyim. 4.Satır ve 4. sütüna denk gelen tuş hiç işleme alınmıyor. Kullanmıyacaksın galiba.

Programın Gerçekten ne iş yapıyor anlamakta zorlanıyorum. Bazı tavsiyelerim olacak.
Programın birçok yerinde etiketler kullanmışsın. Kaydet1;  Kaydet2 vs..  Bu etiketleri kullanıyorsun ama etiketleri sonlandırmıyorsun. Eğer Etikette nerden geldiysen tekrar dönmen için Return komutunu kullanmalısın. Böyle yapmazsan program akışı gereği yukarıdan aşağı doğru önüne gelen tüm komutlar icra eder.
Pek vaktim yok bu yüzden şimdilik ilgilenemeyeceğim ama ne yapmak istediğini programın ne iş göreceğini anlatırsan belki senin için birşeyler yapabilirim. Ayrıca Bu tür bariz hataları düzeltmen gerekir.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Programa baktım. Epeyce sorun var gibi.
Öncelikle tuş takımından elde ettiğin sayıları hangi formatta kayıt edeceksin o bana kalırsa belli değil.
Basılan tuşları KAYIT[INDEX] şeklinde kayda aldığına göre bana kalırsa en doğrusu bunları her biri bir hafızaya denk gelecek şekilde kayıt etmek olacaktır.
Kayıt isimli değişkeni index değişknei olarak kullanmana rağmen program içinde normal byte değişkeni gibi de kullanmışsın ki bu yanlış . Örnek vereyim.
KAYIT[X]=TUS şeklinde kullanım doğru.
Ancak
HAFIZA1=KAYIT
şeklindeki kullanım ise yanlıştır. HAFIZA1 in hangi Kayıt (index) değişkenine eşitleneceğinide belirlemen gerekiyor.  BU tür kullanımın amacınıda belirleyemedim. Neyi amaçladın acaba.

Her neyse,
Ben önerimi yapayım gerisini sen halletmeye çalış. Yinede içinden çıkamaz isen yeniden sor takıldığın yeri.

Basılan 11 adet tuşu Kayıt[Index]=TUS şeklinde kayda aldığına göre bunları kayıt etmende yarar var.
Kayıt1 için,
FOR I=0 to 10
TEMP=KAYIT[I]
  WRITE 10+I,TEMP:PAUSE 10
Next

Kayıt2 için;
FOR I=0 to 10
   TEMP=KAYIT[I]
   WRITE 30+I,TEMP:PAUSE 10
Next
şeklinde kayıt etmen gerekir.

Bunları okuman gerekirse
For I=0 to 10
  Read 10+I,TEMP:KAYIT[I]=TEMP
Next
şeklinde okursun.

ENTER tuşu olarak 14 nolu tuşu kast ediyorsun sanırım.
Bunu aktif edebilmek için, aşağıdaki kodlara dikkat etmen gerekiyor. Zira Kayıt1 için Tusları Tara isimli alt programa geliyorsun ama oradan çıkacak komutu vermemişsin. Çıkma komutu elbette 14 nolu tuşa basılması ile olacaktır.
O halde;
     IF DIKEY_4=1 THEN
      TUS=14:GOSUB EKRAN :RETURN 'BU RETURN ÇIKMANI SAĞLAYACAKTIR
      WHILE DIKEY_4=1:WEND
    ENDIF
Şeklinde tuş tarama kısmından RETURN ile çıkacak ve 2 nolu Kayıt işlemine geçeceksin.
Aynı şekilde yukarıda yazdığımız ilave RETURN komutu buradan da çıkışını sağlayacaktır. Yeri gelmişken hemen belirteyim.
Kayıt2 etiketi tamamlandığında program bir komut satırı olmadığından alt programlara (GOSUB ile gidilen etiketlere) atlamaktadır. Bu bir hatadır. O halde burasını aşağıdaki şekilde değiştirmen gerekir.
KAYIT2:
      Lcdout $fe, 1,"KAYIT=>2"
    GOSUB TUSLARI_TARA
    IF SAYI>10 AND TUS=14 THEN
    GOSUB KAYDET2
    ENDIF
    goto basla '******************************************eksik olan bu satırı ilave ettik***************** 

Değişkenlerin kayıt konusuna geri dönersek,
Basılan tuşları birer word değişkeninden toplarsan;
SAYI=SAYI*10+TUS  Şeklinde bir komut verirsen SAYI değişkeni (word) içinde basılan 5 adet tuşu toplayabilirsin. Ancak sayı değeri 65535'i aşmaması gerekir. Zira Word değişkeni en büyük bu sayıyı tutabilir. İşi garantiye almak bakımından 4 adet tuş sayar ve 4 den sonra ikinci bir değişkene geçersin. Böylece her değişken 9999 sayısına kadar olan değerleri tutabilir.
Böylece 2 adet word ve 1 adet byte değişkeni ile 10 adte sayıyı hafızaya kayıt edebilirsin.
Kayıt formatı,
WRITE adres,    SAYI1.byte1,SAYI1.Byte0:pause 10
WRITE adres+2,SAYI2.byte1,SAYI2.Byte0:pause 10
WRITE adres+4,SAYI3.byte0 veya SAYI3.Byte1,SAYI3.Byte0:pause 10
şeklinde olacaktır.
Ete


eprom_20

Hocam değerli katkılarınızdan dolayı çok teşekkür ederim,Allah razı olsun,,,,
Hocam uyarılarınız doğrultusunda programda elimden geldiğinde birşeyler yapmaya çalışıyorum ama eksiklerimin çok olduğununda farkındayım,belki sizce çok basit şeyleri yapamadığım içinde ayrıca özür dilerim,,
Hocam programdan önce devrede ne yapmak istediğimi kısaca anlatmak istiyorum.. ETE hocam işin özü devredeki Tuş takımından girilen 11 haneli telefon numarasının LCD ekranda görülmesi ve görülen numara doğruysa Enter (TUS=14) tuşuna basılmak suretiyle pic epromun adresine kaydedilmesi,,Örn: ilk 11 haneli tel No'nun (TELEFON NO UZUNLUĞU MAX. 11 KARAKTER OLACAK; EEPROM 4-14 ARASI ;WRITE 15,HAFIZA_NO1:PAUSE 10) gibi
Hocam ilk önce söylediğiniz gibi SAYI=SAYI*10+TUS  komutunu kullanmıştım ama Tuş takımından girilen her rakamın ard arda LCD de görünebilmesi amacıyla:
FOR I=0 to 11
lcdout $fe,$c0+I,KAYIT [I]
NEXT
komutunu kullandım
eklediğim Tuş Takımı dosyası içinde de bahsettiğim devre ve  program var.programın kayıt kısmını çözebilirsem hocam devamında pic'e gelecek bir ihbarla pic'in hafızasında kayıtlı telefon numaralarını
TEL_1_CEVIR:
   READ HAFIZA_NO1,DEGER
   DTMFOUT TEL_AUDIO, [DEGER]
   FOR I=0 TO 30
                 ,,,,,,,,,,,,,,,,,,,,,
komutlarını kullanarak sırayla aratmayı düşünmüştüm  tabi başarabilirsem,,,Hocam ne kadarı olur bilmiyorum ama ilk önce LCD ekranda görülen numaraları pic eprama kaydetmem gerek tabi,,,değerli vaktinizi aldığım için özür dilerim,Şimdiden Bayramınız Kutlu olsun Hocam,,,,selametle

eprom_20

Hocam programı bu şekilde çalıştırdığımda isiste debug menüsündeki eprom alanında kaydedilmiş veri göremiyorum,,,
Hocam tel1 değişkenini word olarak atadığımda dediğiniz gibi

Write 10,tel1byte1:pause 10
Write 11,tel1byte0:pause 10
kaydediyorum,okurkende yine aynı okuyorum ama programı  kaydedilmiş veriyi (numarayı) ara dediğimde aramıyor.Hatayı nerde yapıyorum hocam bir bakabilirmisiniz

ete

Aslında kolay bir işi çok zor bir yoldan halletmeye çalışıyorsun. Program alt yapında zayıf olduğu için anlattıklarımıda anlayamamışsın. Böyle oluncada ortada kocaman bir hiç var başka bir şey yok maalesef.
Bir daha anlatacağım.
Eprom denilen birimi bir 256 daireli bir apartmanın posta kutusu olarak düşün. Her daire için bir posta kutusu mevcut. Oturanlar kendi kutularını nasıl ayırt ediyorlar kutu üzerindeki numaradan elbet. Apartmandaki daire numaralarının sıfırdanbaşladığını ve 255'e kadar gittiğini varsayalım. O halde kutular üzerindeki numaralarda sıfırdan başlamak zorunda ve 255 de bitmek zorunda öyle değilmi.
Ben postacı olsam ve 10 nolu daireye bir mektup gelse onu nereye koymam lazım? tabiiki üzerinde 10 yazan kutuya.
Peki üzerinde hiç numara olmayan bir mektup olsa onu nereye koyarım ? hiç bir yere koyamam çünkü nereye koyalacağı belli değil. Senin kayıt yönteminde bu şekilde olmuş. Yada şöyle söyleyeyim elimde 10 ayrı daireye yollanan mektup var ama ben bunları getirip sıfır nolu kutuya koysam ne olur. ? tabiiki iş çorba olur.
Her neyse posta kutusu örneğimizle devam edelim. Telefon numarası yerine mektup tabirini kullanmaya devam edeceğim.
elimde 11 tane mektup var ve bunları sıfır nolu kutudan itibaren sırası ile kutulara yerleştirmem gerekiyor ne yapmalıyım?. İş kolay. Sırası ile şunları yapmak gerekecek.
- Önce sıfır nolu kutuyu bul ve ilk mektubu oraya bırak.  ....................................................WRITE 0, TEL_NO[0]
- Kutu sayısını bir artır yani 0+1=1 nolu kutuya gel ve ikinci mektubu oraya bırak, ............WRITE 1, TEL_NO[1]
- Kutu sayısını bir artır yani 1+1=2 nolu kutuya gel ve üçüncü mektubu oraya bırak..........WRITE 2, TEL_NO[2]
- bu şekilde son kutuya kadar gel ve son mektubu oraya bırak. ....................................... WRITE 10, TEL_NO[10]

Benzer şekilde örneğimizi devam ettirelim. Bu seferde sıfır nolu kutudan itibaren kutular içinde bulunan mektupları alıp sahiplerine vereceğiz.
- Önce sıfır nolu kutuyu bul ve içindekini al elindeki çantanın sıfır nolu gözüne koy  ...........READ 0, TEL_NO[0]
- Sonra bir nolu kutuya gel mektubu al ve çantanın 1 nolu gözüne koy..............................READ 1, TEL_NO[1]
- Sonmektuba kadar bunu tekrarla.....................................................................................READ 10, TEL_NO[10]
Tekrar programına dönersek bu yukarıda açıkladığım işlemi yapabilmek için INDEX isimli bir değişken tanımladım. Mevcutlardan birisinide kullanabilirdik ancak karışmasın diye bunu tercih ettim.
Bu değişkeni TEL_NO kaydı başlatan  CASE 14 sonuna  INDEX=0 komutunu koydum.
Daha sonra her tuşa basılışta  çalışan " Case Is < 14" konumunda;
               TEL_NO[INDEX]=disp_key
               index=index+1
komut satırlarını ilave ederek her basılan tuş değerini TEL_NO index değişkenine kayıt ediyoruz. Her kayıttan sonra index değerini bir artırarak bir sonraki kaydın bir sonraki hafızaya yapılmasını sağlamış oluyoruz.
EN sonunda  Case 10 kısmında ise toplanan numarayı toptan hafızaya yazdırıyoruz.
         CASE 10
          FOR I=0 TO 10
          tel1=TEL_NO
          WRITE i,TEL1:PAUSE 10
          NEXT I
Geriye hafızadaki teledon numarasından arama yaptırmak kalıyor. Bunuda  CASE 15 altına ekledim.
Case 15        ' User pressed number or *# key
                 LCDOut $fe,$C0, "ARANIYOR " 
                 for index=0 to 10     
                   read index,tel1
                   IF sieze = 1 Then   ' If Off Hook, dial the digit
                    DTMFOUT sieze,[TEL1]
                    Pause 45       ' 45mS "Make" time
                    sieze = 0      ' Drop the line
                    Pause 65       ' 65mS "Break" time
                    sieze = 1      ' Sieze the line   
                    Pause 100       ' Pause 300mS between digits
                   ENDIF 
                  next
hepsi bu kadar. Eksikler olabilir. Gerisini sen halledersin artık.

Ete



eprom_20

Çok Teşekkür ederim Hocam elinize sağlık,kısa zamanda tamamlayıp forumda paylaşacağım inşallah,Allaha emanet olun,selametle

Powered by EzPortal