!! ARKADAŞLAR 10 HANELİ HEX KODU PBP DE İŞLEME???

Başlatan gulbey84, 18 Kasım 2009, 23:15:28

ete

Kod örneği veririm ancak işin yalnızca o kısmını yazarsam havada kalacak ve bir sürü soru daha soracaksın.
O nedenle en iyisi yazdığın kodu bana yolla arasına kodu monte edeyimki sistemin bütünlüğü bozulmasın.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

gulbey84

INCLUDE "MODEDEFS.BAS"

'***********************DEFINITIONS***************************************
DEFINE Osc 20

@ DEVICE pic16F628a 'islemci  
@ DEVICE pic16F628a, WDT_on 'Watch Dog timer açık
@ DEVICE pic16F628a, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628a, PROTECT_OFF 'Kod Koruma kapalı

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 15  ' 19200 Baud @ 20MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

CMCON=7 '16F628 de komparatör pinleri iptal hepsi giris çıkıs
trisb=%11111111
trisa=%00000000

a var byte
b var byte
c var byte
d var byte
e var byte


ROLE VAR PORTA.0
LED VAR PORTA.2
BUZZER VAR PORTA.3
buton var portb.4

basla:
if buton=0 then normalmod
if buton=1 then kartkaydet
goto basla

normalmod:
hserin[hex2 a,hex2 b,hex2 c,hex2 d,hex2 e]
................................
.............................
.................................
................................
.................................

goto basla

kartkaydet:
hserin[hex2 a,hex2 b,hex2 c,hex2 d,hex2 e]
.............................................
..............................................
...............................................
..............................................
..............................................
..............................................
goto basla
end


ETE ABİ BURADA NORMAL MODDA SÜREKLİ KART OKUMAYI BEKLİCEK...KART OKUNDUĞUNDA EĞER BİLGİ DAHA ÖNCE TANIMLANAN İD BİLGİSİYLE AYNIYSA RÖLE ÇEKECEK...BUTON 1 İKEN İSE KART OKUMAYI BEKLİCEK VE OKUNAN HER KARTI EPROMA KAYDEDİCEK...AMA 20 KART SINIRI OLUCAK...

TEMEL OLARAK BUNU YAPMAM LAZIM HOCAM...TABİ İŞİ ÖZÜNCE BUTONLA YAPMICAM GERÇEKTE...BİR MMASTER KART BELİRLİCEM O KARTI OKUTTUKTAN SONRA 40 SANİYE İÇİNDE OKUNAN TÜM KARTLAR EPRTOMA KAYDOLUCAK...AMA BİZ BUTONLU BİR ŞEKİLDE ÇALIŞALIM ABİ....SEVGİLERLE
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

ete

Bir şeyler karaladım. Aslında işini görür bu yazdıklarım.
Düzeltme gerektirebilir. Dene bakalım.

Ete
INCLUDE "MODEDEFS.BAS"

'***********************DEFINITIONS***************************************
DEFINE Osc 20

@ DEVICE pic16F628a 'islemci
@ DEVICE pic16F628a, WDT_on 'Watch Dog timer açık
@ DEVICE pic16F628a, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628a, PROTECT_OFF 'Kod Koruma kapalı

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 15 ' 19200 Baud @ 20MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

CMCON=7 '16F628 de komparatör pinleri iptal hepsi giris çıkıs
trisb=%11111111
trisa=%00000000

a var byte
b var byte
c var byte
d var byte
e var byte
POZ VAR BIT


ROLE VAR PORTA.0
LED VAR PORTA.2
BUZZER VAR PORTA.3
buton var portb.4

basla:
if buton=0 then normalmod
if buton=1 then kartkaydet
goto basla

normalmod:
          hserin[hex2 a,hex2 b,hex2 c,hex2 d,hex2 e]
          gosub KAYITBAK
          IF POZ=1 then
            ROLE=1
            LED=1
          ELSE
            ROLE=0
            LED=0
          ENDIF    
          goto basla

kartkaydet:
          hserin[hex2 a,hex2 b,hex2 c,hex2 d,hex2 e]
          Read 0,KAYIT
          if KAYIT=255 THEN KAYIT=1
          IF KAYIT>20 then
            LCDOUT $FE,1,"KAYIT LIMITI DOLDU"
            PAUSE 1000
            GOTO BASLA
          ENDIF  
          KAYITSIRA=10+(KAYIT-1)*5 '(Kayıt=1-sıra=10),(Kayıt=2- sıra=15), Kayıt=3-Sıra=20).....(Kayıt=20-Sıra=105) 
          'Önce okunan kart eski kayıtlar içinde varmıdır bakmak gerek.
          GOSUB KAYITBAK
          IF POZ=1 then basla 'bu kayıt var başa dön kayıt yapma
          write KAYITSIRA, A :PAUSE 10
          WRITE KAYITSIRA+1,B:pAUSE 10
          WRITE KAYITSIRA+1,C:pAUSE 10
          WRITE KAYITSIRA+1,D:pAUSE 10
          WRITE KAYITSIRA+1,D:pAUSE 10
          KAYIT=KAYIT+1
          WRITE 0,KAYIT
          GOTO BASLA
'kayıt 20 adet ise 21 inci kayıt gelince program ne yapacak?. 
'iki şeyden birini yapabilir. Kayıt limiti doldu der ve yapmadan çıkar
'yada en baştan yeniden başlar eskisinin üzerine kayıt yapar. hangisini tercih edeceksin?
'Burada mevcut kayıt adedini epromun 0 nolu adresinde tutmak en akıllıcası. Oradaki değeri okuyup 20 den küçük ise
'otomatik adres belirleyip kayıt yapmak gerekir.

KAYITBAK:
        POZ=0 'KAYITLI DEĞİL
        For I=10 to 105 step 5
          read I,temp
          if TEMP=A then
             read I+1,temp
             IF TEMP=B then
                READ I+2,TEMP
                  IF TEMP=C THEN
                     READ I+3,TEMP
                       IF TEMP=d THEN
                         READ I+4,TEMP
                           IF TEMP=e THEN 
                              LCDOUT $fe,1," BU KART KAYITLI!!!"
                              pause 1000
                              POZ=1 'KAYITLI
                              RETURN
                           endif
                       endif       
                  endif 
             endif
          endif
        next
    RETURN
end
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

gulbey84

ete hocam....verdiğiniz kodlar ile biraz çalıştım fakat netice alamadım....değişkenleride ekledim...küçük bir hata vardı onuda düzelttim....fakat bir türlü başaramadım...hocam ilk kartı okuttupumda direk olarak limit dolu mesajı veriyor... (kartkayıt) sonra ki incelemelerimde ise yalnızca bir adet kart kaydedebildiği gördüm...sizce burada göremediğim birşey varmı?....yada proteusta test ediyorum acaba o farkedermi hcoam... sağlıcakla kalınız....
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

ete

Proteus yanıltıcı olabileceği gibi görmediğimiz bir husus da olabilir. Anlamak için ekrana kayıt limiti doldu mesajı gelince;
Hemen simulsayon pause butonuna bas (altta solda run butonu yanındaki)
Bu aşamada üstte bulunan debug menüsünü aç ve en altta yer alan seçeneklerden Picin eeprom bilgisini seç ve ekrana gelen bu pencerede eepromun 10 nolu adresi (hex olarak 0A) den itibaren FF den farklı bir kayıt varmıdır onları incele bakalım ne göreceksin.
Şayet gerçekten hafıza FF ler ile dolu ise programımızda hata avrdır. Ama FF den farklı değerler görüyorsan hafızayı kayıtlarla doldurmuşsun demektir.
Bu durumda programa belkide bir ilave ile mevcut kayıtları silme alternatifi ilave edilmesi gerekebilir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

gulbey84

ete abi...dediğin şekilde biraz inceleme yaptım...buraya resimleri kouyorum...ilk olarak 1.kartı kaydettikten sonrki resmi koydum...dğer resim ise birkaç kart okuttuktan sonraki hali....eprom tablosundan pek birşey anlayamadım ama sanırım bir karışıklık oluyor...resimlerden bakabilirsin abi altta..

bu 1 adet (ilk okuttuğm kart hali) kart okunduğundaki sonuç




abi buda birkaç (5) kart okuttuğumdaki sonuç...




abi birde dediğin gibi aslında silme rutini olması gerek...bir buton daha eklediğimizi düşünelim...o butonda 1 iken okunan kart eğer kayıtlı ise onu silsin...sanırım erase komutuyla olacak...abi sana zahmet silme işleminide işin içine ekleyebilirmiyiz....

sevgilerle
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

gulbey84

abi bu arada aynı kartı 20 defa okuttuktan sonra 21.de kart limiti doldu diyerek uyarı verior...birkaç harf düzelrme yaptım kayıt sayısında sorun kalmöadı....ama sanırım eproma id kayıt ve okuma kısmında bir sorunumz var? sevgilerle
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

gulbey84




ete hocam bakınız burada da yine eprom sıfırken ilk okuttuğum karttın eprom verileri var...hocam sanki 5 parça halinde değilde id nosunun ilk parçasını kaydediyor sadece? yani a,b,c,d,e değilde sadece a kaydediyor gibi geldi bana....daha doğrusu 10(0A).adreste a 11.adres,b 12.adres c,13.adres d,14.adres e olması gerekmiyormu hocam...ama burada 10.adres(0A) a (doğru) sonrasında 11.adres e oluyor...ve 14 e kadar da ff.... sanırım şu kısımda br sorun var hocam

KAYITSIRA=10+(KAYIT-1)*5 '(Kayıt=1-sıra=10),(Kayıt=2- sıra=15), Kayıt=3-Sıra=20).....(Kayıt=20-Sıra=105)
         'Önce okunan kart eski kayıtlar içinde varmıdır bakmak gerek.
         GOSUB KAYITBAK
         IF POZ=1 then basla 'bu kayıt var başa dön kayıt yapma
         write KAYITSIRA,A:PAUSE 10
         WRITE KAYITSIRA+1,B:pAUSE 10
         WRITE KAYITSIRA+1,C:pAUSE 10
         WRITE KAYITSIRA+1,D:pAUSE 10
         WRITE KAYITSIRA+1,e:pAUSE 10
         KAYIT=KAYIT+1
         WRITE 0,KAYIT
         GOTO BASLA ???????

sevgilerle

hocam mesajı düzeltiyorum...sanırım kaıt olayını çözdüm....
write kayıtsıra+1
write kayitsıra+2
write kayitsıra+3
şeklinde düzeltme yaptım yerli yerine oturdu.....
incelemeye devam ediyorum...hocam sizden ricam mevcut kodların içine buton2=1 iken okunan kart eğer kayıtlıysa onu sil işlemini ekleyebilirmisiniz..

sevgilerle

abi tekrar edit ettim! :) bahsettiğim düzenlemeden sonra sistem normal bieşekilde çalışıyor...yahu ete abi sen bu işi walla çok iyi biliyon ya! :) allah başarılarını daim etsin abi.... :) abi şimdi sadece bu kodlara silme işlemini eklemek kaldı...bunuda yaparsak süper olacak...  :)
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

ete

Biraz mantığını çalıştırınca hatanı kolaylıkla buldun.
Bir birini takip eden kayıtlarda adres değeride birer birer artmalı değilmi yoksa hep aynı yere kayıt yaparsın. Sende de öyle oluyor idi ve şimdi düzeldi.
Silme işinde benim aklıma gelen şöyle bir metod idi.
Silme yapılacak ise kartların tamamını silip yeniden kart kayıt etmek güzel olurdu diye düşünüyorum.
Ancak teker tekerde silme yapılabilir. Teker teker silme bayağı yüklü bir menü sistemi gerektirir. Senin düşündüğün ise okuttuğın kartın silinmesi şeklinde anlaşılan. Oda bir düşünce.

Okunan kartın silinmesi çok zor değil.
Ben adımları söyleyeyim sen yapmaya çalış bakalım yapabilecekmisin;
1. Önce kartı okut
2. Okunan kart mevcut kayıtlarda varmı bakılsın
3. Kart bulunursa hangi sırada olduğu tespit edilsin. (1-20) arasında hangi sırada olduğu bulunursa;  KAYITSIRA=10+(KAYIT-1)*5 formülü ile mevcut kayıdın silinmesi sağlanır.
Nasıl dersen
FOR I=0 to 4
write kayıtsıra+I,$ff
pause 10
next
komutları bu işi otomatik yapar. Ama bu konumda bir başka sorun ortaya çıkacak. Diyelimki ortadan bir kayıt sildik. Biz kayıt yaparken Kayıt değişkeninin sağladığı bilgiye göre kayıt yapıyorduk. Oda en son kayıt adresini göstereck idi. Bu durumda silinmiş kayıtlar için ayrıca bir kayıt tutmak gerekecek. Onuda şöyle düşündüm.
0 nolu adres yeni kayıt sıra numarası tutuyor
1 nolu adrese kaç tane silinmiş kayıt olduğunu yazarız.
2 nolu adresten itibaren 9 nolu adrese kadar da bu silinmişlerin adreslerini kayıt ederiz.
Bu nedenle yeni kayıt yaparken önce 1 nolu adrese bakarız. Şayet sıfır ise silinmiş kayıt yok demektir. O zaman 0 nolu adresteki kayıt sıra numarasını kullanırız. Ama 1 nolu adreste mesela 2 rakamı var ise 2 tane silinmiş kayıt var demektir. İlki 3 nolu adreste, ikinciside 4 nolu adrestedir.
Daima en sondakini alıp ona yeni kaydı koyarız. SOnrada silinmiş kayıt adedini bir azaltıp yeniden 1 nolu adrese kayıt ederiz. Olur biter.
Hadi kolları sıva sende bir şeyler düşün bakalım.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

gulbey84

FOREVER ETE HOCA DİYORUM!! HOCAM ŞİMDİ ÇALIŞMAYA BAŞLIYORUM.. :)

sevgilerle
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

gulbey84

ETE ABİ...OLAYI BİR ADIM DAHA İLERLETTİM VE DEVRE ÜZERİNDE HİÇBİR BUTON OLMADAN KAYIT VE SİLME İŞLEMLERİNİ YAPMAYA KARAR VERDİM..BU DURUMDA 1 KART KARTKAYDETME İÇİN 1 KARTTA SİLME İŞLEMİ İÇİN KULLANILACAK...HOCAM KAYIT ETME İŞLEMİNİ BELİRLEDİĞİM BİR KARTLA ÇOK GÜZEL BİR ŞEKİLDE YAPMAYI BAŞARDIM..BAKINIZ...

INCLUDE "MODEDEFS.BAS"

'***********************DEFINITIONS***************************************
DEFINE Osc 20

@ DEVICE pic16F628a 'islemci
@ DEVICE pic16F628a, WDT_on 'Watch Dog timer açık
@ DEVICE pic16F628a, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628a, PROTECT_OFF 'Kod Koruma kapalı
@ DEVICE pic16F628a, HS_OSC

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 15 ' 19200 Baud @ 20MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

CMCON=7 '16F628 de komparatör pinleri iptal hepsi giris çıkıs
trisb=%00000010
trisa=%00000010

a var byte
b var byte
c var byte
d var byte
e var byte
aa var byte
ba var byte
ca var byte
da var byte
ea var byte
ab var byte
bb var byte
cb var byte
db var byte
eb var byte

POZ VAR BIT
kayit var byte
kayitsira var byte
i var byte
temp var byte
u var byte
sayac var byte
sayac=0
aa=$1C:ba=$00:ca=$C7:da=$4F:ea=$72
ab=$1C:bb=$00:cb=$C7:db=$86:eb=$A2

ROLE VAR PORTA.0
LED VAR PORTA.2
BUZZER VAR PORTA.3
buton var porta.1
buzzer=1:pause 100:buzzer=0:pause 100:buzzer=1:pause 100:buzzer=0:pause 100:buzzer=1:pause 100:buzzer=0

basla:
led=1
sayac=0
hserin[hex2 a,hex2 b,hex2 c,hex2 d,hex2 e]
if a=aa and b=ba and c=ca and d=da and e=ea then
for u=0 to 1
pause 1000
sayac=sayac+1
if sayac<=9 then kartkaydet
next
if a<>aa or b<>ba or c<>ca or d<>da or e<>ea then
goto normalmod
endif
endif


HOCAM BURADA OKUNAN KART ÖNCEDEN TANIMLADIĞIM KART İSE KARTKAYDET LABELİNE GİDİYOR.KART KAYIT İŞLEMİDE NORMAL BİRŞEKİLDE GERÇEKLEŞİYOR.FAKAT OKUNAN KART BELİRLEDİĞİM MASTER KART İLE AYNI DEĞİLSE PROGRAM DİREK OLARAK NORMAL MODDA DEVAM EDİYOR...AMA BURADA BİR SORUNUM VARKİ SİLME İŞLEMİ İÇİN BELİRLEDİĞİM KARTI OKUTTUĞUMDA PROGRAM SİL: LABELİNE GİTMİYOR..ÇÜNKÜ O KARTI DA KAYDETME İÇİN TANIMLAIĞIM KARTİD Sİ İLE KARŞILAŞTIRIYOR HALİYLE PROGRAM NORMAL MODA GEÇİYOR...BURADA NASIL BİR TEKNİK UYGULAMALIYIM SİZCE HOCAM...AŞAĞIYA TAM KODLARI KOPYALIYORUM ABİ...

INCLUDE "MODEDEFS.BAS"

'***********************DEFINITIONS***************************************
DEFINE Osc 20

@ DEVICE pic16F628a 'islemci
@ DEVICE pic16F628a, WDT_on 'Watch Dog timer açık
@ DEVICE pic16F628a, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628a, PROTECT_OFF 'Kod Koruma kapalı
@ DEVICE pic16F628a, HS_OSC

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 15 ' 19200 Baud @ 20MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

CMCON=7 '16F628 de komparatör pinleri iptal hepsi giris çıkıs
trisb=%00000010
trisa=%00000010

a var byte
b var byte
c var byte
d var byte
e var byte
aa var byte
ba var byte
ca var byte
da var byte
ea var byte
ab var byte
bb var byte
cb var byte
db var byte
eb var byte

POZ VAR BIT
kayit var byte
kayitsira var byte
i var byte
temp var byte
u var byte
sayac var byte
sayac=0
aa=$1C:ba=$00:ca=$C7:da=$4F:ea=$72
ab=$1C:bb=$00:cb=$C7:db=$86:eb=$A2

ROLE VAR PORTA.0
LED VAR PORTA.2
BUZZER VAR PORTA.3
buton var porta.1
buzzer=1:pause 100:buzzer=0:pause 100:buzzer=1:pause 100:buzzer=0:pause 100:buzzer=1:pause 100:buzzer=0

basla:
led=1
sayac=0
hserin[hex2 a,hex2 b,hex2 c,hex2 d,hex2 e]
if a=aa and b=ba and c=ca and d=da and e=ea then
for u=0 to 1
pause 1000
sayac=sayac+1
if sayac<=9 then kartkaydet
next
if a<>aa or b<>ba or c<>ca or d<>da or e<>ea then
goto normalmod
endif
endif

normalmod:
       
         gosub KAYITBAK
         IF POZ=1 then
           ROLE=1:led=1:buzzer=1:pause 200:buzzer=0:PAUSE 700:ROLE=0
           LED=1:BUZZER=1:PAUSE 100:LED=0:BUZZER=0:PAUSE 100:LED=1:BUZZER=1:PAUSE 100:LED=0:BUZZER=0:PAUSE 100:LED=1:BUZZER=1:PAUSE 100:LED=0:BUZZER=0:PAUSE 100:LED=1:BUZZER=1:PAUSE 100:LED=0:BUZZER=0:PAUSE 100:LED=0:PAUSE 100:LED=1
         ELSE
           ROLE=0
           buzzer=1:pause 500:buzzer=1:pause 500:buzzer=1:buzzer=1:pause 500:buzzer=1:buzzer=1:pause 500:buzzer=0
           ENDIF
             
         goto basla

kartkaydet:
         hserin[hex2 a,hex2 b,hex2 c,hex2 d,hex2 e]
         Read 0,KAYIT
         if KAYIT=255 THEN KAYIT=1
         IF KAYIT>20 then
           led=1:pause 400:led=0:led=1:pause 400:led=0:led=1:pause 400:led=0:led=1:pause 400:led=0:led=1:pause 400:led=0:pause 400:led=0:led=1'KAYIT LIMITI DOLDU  
           GOTO BASLA
         ENDIF  
         KAYITSIRA=10+(KAYIT-1)*5 '(Kayıt=1-sıra=10),(Kayıt=2- sıra=15), Kayıt=3-Sıra=20).....(Kayıt=20-Sıra=105)
         'Önce okunan kart eski kayıtlar içinde varmıdır bakmak gerek.
         GOSUB KAYITBAK
         IF POZ=1 then
         pAUSE 100:led=0:pause 300:led=1:pAUSE 100:led=0:pause 300:led=1
         goto basla 'bu kayıt var başa dön kayıt yapma
         endif
         write KAYITSIRA,A:PAUSE 10
         WRITE KAYITSIRA+1,B:pAUSE 10
         WRITE KAYITSIRA+2,C:pAUSE 10
         WRITE KAYITSIRA+3,D:pAUSE 10
         WRITE KAYITSIRA+4,e:buzzer=1:pause 200:buzzer=0:pause 200:buzzer=1:pause 200:buzzer=0:pause 200:buzzer=1:pause 200:buzzer=0
         KAYIT=KAYIT+1
         WRITE 0,KAYIT
         GOTO BASLA

sil:
led=1:buzzer=1:role=1:pause 500:led=0:buzzer=0:role=0:pause 500:led=1:buzzer=1:role=1:pause 500:led=0:buzzer=0:role=0
goto basla

KAYITBAK:
       POZ=0 'KAYITLI DEĞİL
       For I=10 to 105 step 5
         read I,temp
         if TEMP=A then
            read I+1,temp
            IF TEMP=B then
               READ I+2,TEMP
                 IF TEMP=C THEN
                    READ I+3,TEMP
                      IF TEMP=d THEN
                        READ I+4,TEMP
                          IF TEMP=e THEN
                             POZ=1 'KAYITLI
                             RETURN
                          endif
                      endif        
                 endif
            endif
         endif
       next
   RETURN
End
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

gulbey84

ETE ABİ SANIRIM BİRAZ ÇÖZDÜM OLAYI...AŞAĞIDAKİ ŞEKİLDE YAPTIĞIM ZAMAN AK İLE KARA KARIŞMIYOR...YANİ KART KARDETME KARIYLA KAYIT LABELİNE SİL KARTI İLE DE SİL LABELİNE DİĞER TÜM KARTLAR OKUTULDUĞUNDA İSE NORMAL OKUMA İŞLEMİ YAPIYOR...AMA SİZDE Bİ KONTROL EDERMİSİNİZ...BELKİ ÖNERİLERİNİZ VARDIR...HOCAM BİRDE BURAYA KADAR OLAN ÇALIŞMALARIMIZ GERÇEK DEVRE ÜZERİNDE DE ÇOK İYİ ÇALIŞTI :) FAKAT NEDENSE BAZEN VOLTAJ KESİP TEKRAR VERİĞİMDE OKUNAN KARTLARIN DEĞERLERİNİ TANIMIYO...SONRA DA TEKRAR DÜZELİP GÜZEL ÇALIŞMAYA BAŞLIYO...SANIRIM 20 MHZ İ DAHA DA BÜYÜTMEM GEREK..SİZCEDE BU TESPİTİM DOĞRUMUDUR? AŞAĞIYA KODLARI ATIYORUM ABİ.

aa=$1C:ba=$00:ca=$C7:da=$4F:ea=$72
ab=$1C:bb=$00:cb=$C7:db=$86:eb=$A2

basla:
led=1

hserin[hex2 a,hex2 b,hex2 c,hex2 d,hex2 e]
if a=ab and b=bb and c=cb and d=db and e=eb then
for u=0 to 1
pause 1000
GOTO sil
next
if a<>ab or b<>bb or c<>cb or d<>db or e<>eb then normalmod
endif

if a=aa and b=ba and c=ca and d=da and e=ea then
for u=0 to 1
pause 1000
GOTO kartkaydet
next
if a<>aa or b<>ba or c<>ca or d<>da or e<>ea then normalmod
endif


normalmod:
       
         gosub KAYITBAK
         IF POZ=1 then
           ROLE=1:led=1:buzzer=1:pause 200:buzzer=0:PAUSE 700:ROLE=0
           LED=1:BUZZER=1:PAUSE 100:LED=0:BUZZER=0:PAUSE 100:LED=1:BUZZER=1:PAUSE 100:LED=0:BUZZER=0:PAUSE 100:LED=1:BUZZER=1:PAUSE 100:LED=0:BUZZER=0:PAUSE 100:LED=1:BUZZER=1:PAUSE 100:LED=0:BUZZER=0:PAUSE 100:LED=0:PAUSE 100:LED=1
         ELSE
           ROLE=0
           buzzer=1:pause 500:buzzer=1:pause 500:buzzer=1:buzzer=1:pause 500:buzzer=1:buzzer=1:pause 500:buzzer=0
           ENDIF
             
         goto basla

kartkaydet:
         hserin[hex2 a,hex2 b,hex2 c,hex2 d,hex2 e]
         Read 0,KAYIT
         if KAYIT=255 THEN KAYIT=1
         IF KAYIT>20 then
           led=1:pause 400:led=0:led=1:pause 400:led=0:led=1:pause 400:led=0:led=1:pause 400:led=0:led=1:pause 400:led=0:pause 400:led=0:led=1'KAYIT LIMITI DOLDU  
           GOTO BASLA
         ENDIF  
         KAYITSIRA=10+(KAYIT-1)*5 '(Kayıt=1-sıra=10),(Kayıt=2- sıra=15), Kayıt=3-Sıra=20).....(Kayıt=20-Sıra=105)
         'Önce okunan kart eski kayıtlar içinde varmıdır bakmak gerek.
         GOSUB KAYITBAK
         IF POZ=1 then
         pAUSE 100:led=0:pause 300:led=1:pAUSE 100:led=0:pause 300:led=1
         goto basla 'bu kayıt var başa dön kayıt yapma
         endif
         write KAYITSIRA,A:PAUSE 10
         WRITE KAYITSIRA+1,B:pAUSE 10
         WRITE KAYITSIRA+2,C:pAUSE 10
         WRITE KAYITSIRA+3,D:pAUSE 10
         WRITE KAYITSIRA+4,e:buzzer=1:pause 200:buzzer=0:pause 200:buzzer=1:pause 200:buzzer=0:pause 200:buzzer=1:pause 200:buzzer=0
         KAYIT=KAYIT+1
         WRITE 0,KAYIT
         GOTO BASLA

sil:
led=1:buzzer=1:role=1:pause 500:led=0:buzzer=0:role=0:pause 500:led=1:buzzer=1:role=1:pause 500:led=0:buzzer=0:role=0
goto basla

KAYITBAK:
       POZ=0 'KAYITLI DEĞİL
       For I=10 to 105 step 5
         read I,temp
         if TEMP=A then
            read I+1,temp
            IF TEMP=B then
               READ I+2,TEMP
                 IF TEMP=C THEN
                    READ I+3,TEMP
                      IF TEMP=d THEN
                        READ I+4,TEMP
                          IF TEMP=e THEN
                             POZ=1 'KAYITLI
                             RETURN
                          endif
                      endif        
                 endif
            endif
         endif
       next
   RETURN
End

SEVGİLERLE[/B]
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

ete

Gülbey,

Programda bazı fazlalıklar yada lüzumsuz satırlar var onları çıkardım. Biraz sadeleştirdim.

Programın baş tarafına hemen değişken tanımlamalarından sonra
Pause 1000
şeklinde bir gecikme yaz. Bu programın ilk açılışta kendine gelmesini sağlar.
Genelde elektrik verilip kesilirse pic aptallaşır ve ardından dah atoparlamadan yenidenelektrik verirsen tamamen devre dışı kalabiliyor. Teknik bir izahatı var ama çok uzun açıklama. Öyle bil yeter. Bunu önlemek için baş tarafa büyükçe bir gecikme koyalım şimdilik.
Sigorta ayarlarından da yapılabilecekler var mesela brownout timer açılabilir. Kısaca pic in belirli voltaj seviyesine gelinceye kadar çalışmamasını sağlamalıyız. MCLR bacağına direncin yanı sıra MCLR ile GND arasına 220nf kondansatör bağla.

Bir de bazen oluyor dedğin durumlarda acaba senin hserin ile almaya çalıştığın kodlarmı gelmiyor?. Zira biz rastgele yerlere Hserin yazdık. Ya o anda bu 5 byte yeni verilmiş ve bir sonraki bekleniyor ise. Bu nedenle USART kesmesi kullanmak daha mı akllıca olurdu acaba. Bunu denemek gerek. Rfid kartından yollanan bu 5 byte ne sıklıkla yollanıyor biliyormusun. Sürekli bir şey yollanıyormu yoksa yalnızca kartı yaklaştırıncamı bir şey yollanıyor bunları belirlemek lazım. Normalde sürekli 5 adet sıfır yada $FF yollar kart yaklaşınca okur ve karta ait 5 byte yollanabilir. Yada bekleme konumunda hiç bir şey yollanmaz kart yaklaşınca okunur ve 5 byte yollanır gibi. Bunların hangisi geçerlidir.?

Neyse aşağıdaki şekilde bir çalıştır bakalım ne oluyor.

aa=$1C:ba=$00:ca=$C7:da=$4F:ea=$72
ab=$1C:bb=$00:cb=$C7:db=$86:eb=$A2

basla:
      led=1
      
      hserin[hex2 a,hex2 b,hex2 c,hex2 d,hex2 e]
      if a=ab and b=bb and c=cb and d=db and e=eb then
        pause 100
        GOTO sil
      else 
        Goto Normalmod
      endif
      
      if a=aa and b=ba and c=ca and d=da and e=ea then
        pause 100
        GOTO kartkaydet
      endif

normalmod:

          gosub KAYITBAK
          IF POZ=1 then
            ROLE=1:led=1:buzzer=1
            pause 200
            BUZZER=0:PAUSE 700:ROLE=0
            For I=0 to 7
             BUZZER=1:LED=1
             PAUSE 100
             BUZZER=0:LED=0
             PAUSE 100
            NEXT            
          ELSE
            ROLE=0
            FOR I=o to 3
              Buzzer=1:pause 500
            next
            buzzer=0
          ENDIF    
          goto basla

kartkaydet:
            hserin[hex2 a,hex2 b,hex2 c,hex2 d,hex2 e]
            Read 0,KAYIT
            if KAYIT=255 THEN KAYIT=1
              IF KAYIT>20 then
              FOR I=0 to 5
                led=0:pause 400:led=1:pause 400
              NEXT 
              led=1'KAYIT LIMITI DOLDU
              GOTO BASLA
            ENDIF
            KAYITSIRA=10+(KAYIT-1)*5 '(Kayıt=1-sıra=10),(Kayıt=2- sıra=15), Kayıt=3-Sıra=20).....(Kayıt=20-Sıra=105)
            'Önce okunan kart eski kayıtlar içinde varmıdır bakmak gerek.
            GOSUB KAYITBAK
            IF POZ=1 then
              pAUSE 100:led=0:pause 300:led=1:pAUSE 100:led=0:pause 300:led=1
              goto basla 'bu kayıt var başa dön kayıt yapma
            endif
            write KAYITSIRA,  A:PAUSE 10
            WRITE KAYITSIRA+1,B:pAUSE 10
            WRITE KAYITSIRA+2,C:pAUSE 10
            WRITE KAYITSIRA+3,D:pAUSE 10
            WRITE KAYITSIRA+4,E
            buzzer=1:pause 200:buzzer=0:pause 200:buzzer=1:pause 200:buzzer=0:pause 200:buzzer=1:pause 200:buzzer=0
            KAYIT=KAYIT+1
            WRITE 0,KAYIT
            GOTO BASLA


daha hala sadeleşecek yerler var aslında bu led ve buzzer çıkışlarını bir alt programa versek lazım olunca oraya yollasak da fena olmayacak sanırım. Sıklıkla kullanılıyor. Ama bakıyorum de kullanım şekli bazen değişiyor. Mantığı anlamadığımiçin dokunmadım.
Bildiğim kendinden ses veren buzzer kullandınherhalde. O halde bir kere Buzzer=1 dedinmi buzzer ses vermeye başlar. Ardından yeniden buzzer=1 demen gerekmez. SOnradan yalnızca buzzeri kapatma komutunu buzzer=0 vermen yeterli olur.

Program satır takip eder. Çok kişinin yaptığı yanlışlığı sende yapıyorsun. Örnek vereyim.

IF A=5 then Goto Bak
IF A<>5 then Normal
Normal:
...
Şimdi burada programın çalışması açısından bir yanlışlık yok ama lüzümsuz komutlar var.
A=5 ise Bak isimli etikete gidilecek. A05 değil ise program zaten alttaki satıra atlayacak otomatikman. Orada sen bir ikinci if kullanman yersiz. Yani IF A<>5 then Normal  komutu orada son derece lüzumsuz. Bu komut olsada olmasada program zaten Norma isimili etikete geçecek.
Burada zaten iki şart vardır. Ya A=5 dir yada değildir. 5 ise Bakisimli etikete gidilecek değilse bir alttaki satır değerlendirilecektir. O halde orayada Normal isimli etiketi yazarsam kısa yoldan işim hallolur. Bu tür yanlışların var idi onları düzelttim.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

gulbey84

hocam çok teşejkkürederim..sizden çok şey öğrendim!! hemen çalışmalarıma başlıyorumm

sevgilerle

gulbey
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

gulbey84

hocam bu arada kartı bobine okuttuğunuz anda birkere yolluyo..1 saniyeden daha kısa süre kalıyo ve artık bilgi gönderilmiyo...yani 5 baytı sürekli yada uzun süre göndermiyor hocam...hocam dediğğiniz gibi programın başına pause 1000 ekliyip birazdaha üzerinde uraşıyım...ama 20 mhz zaten yeterlidir sanırım hocam...gerçi yarın için 20 mhz den büyük çeşitli değerlerde kristal sipariş ettim farklı kristallerlede deneyeceğim hocam...
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE