Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

BARKOD OKUMA MANTIĞI

Başlatan EGEHAYDAR, 20 Haziran 2012, 20:16:52

EGEHAYDAR

PICE normal PS/2 klavye bağladığımda basılan tuşların karşılığını okuyabiliyorum.
tuş değeri 8 bit olduğu için okumada sorun olmuyor.Ama barkodda bu işlemi
nasıl yapmamız gerektiğini bulamadım.Okuma mantığı nasıl olmalı.
Yardımı olan arkadaşlara şimdiden teşekkür ederim.
TOPLUMA FAYDALI OLMAK İSTİYORSAN DOĞRU BİLDİĞİNİ PAYLAŞ.

muhittin_kaplan

barkod okuyucuyu pic e mi takacaksınız?
eğer öyleyse normal klavye den farkı yok. okunan kodları klavyeden basıyor gibi gönderip sizin ayarlamanıza göre sonunda CR,LF,CRLF,TAB,SPACE gibi tuşlar gönderiyor.

EGEHAYDAR

Evet pıce takılı durumda.Yazıda belirttiğim gibi klavyedeki veri 8 bit ( max. 255) olduğu için okuma oluyor.Ama aynı programla barkod okuyucuyu bağladığımda sadece ilk rakamı okuyabiliyorum.Oysaki barkodlar sekiz dokuz haneli rakamlar.herbir rakamı ayrı ayrı nasıl okuyabilirim.sorun orada.Araştırmalarıma göre barkod okuyucudan 10110100..... gibi 2 lik tabanda data geliyor.Bunu nasıl ayrıştırabilirim.
Benim öğrenmek istediğim mesele bu.Teşekkür ederim.
TOPLUMA FAYDALI OLMAK İSTİYORSAN DOĞRU BİLDİĞİNİ PAYLAŞ.

necati

Zebex Z-3100 CCD Barcode Scanner
http://www.bilkur.com.tr/turkce/urunler/Zebex_Z-3100.htm
ben bu okuyucuyu kullandım rs232 kablolu
once alete besleme verip
klavuzdzki kodlari okutarak programlamalısınız
rs232
9600 baud
8bit
stx etx

vs
sonra usb 232 conv ile pc ye bağlayın
seri port monitor den bilgileri gorun
sonra nasil alacağinizi ve değerlendireceğinizi dusunun

ccs compiler da seri port monitor var
kolay gelsin
[email]entegreterbiyecisi@yahoo.com[/email]

muhittin_kaplan

arkadaşdaki ps2 muhtemel. ps2 protokolünü öğrenmek gerek.
barkod lar ean8 ean13 g,b, kodlarla adlandırılırlar.

HT

 Selam,

   input(barcoddata); //  gerekli olan port isimlerini veriniz ps2 portlarınız nereye baglı ise
   input(barcodclock); //  gerekli olan port isimlerini veriniz ps2 portlarınız nereye baglı ise

   unsigned char get_byte(void)  // ps2 den barcod üzerinden veri almak için rutin.
   {
   char i;
   unsigned char veri=0;
   
   for(i=0;i<11;i++)           
   {
      while(barcodclock);           
      if( (i<9) && (i>0))         
      {
         veri=veri>>1;
         if(barcoddata==1)
            veri=veri | 0x80;
      }
      while(!barcodclock);           
   }
   return veri;               
}

Gelen veriler ascii olarak gelecektir. Fakat su anda tam aklımda bulunmuyor, yanlıs hatırlamıyorsam crc olarak 1 byte crc ile birlikte 3 byte olarak gelmekte idi benim kullandığım barcod okuyucuda. sizin kullandığınız barcod okuyucuda verinin nasıl geldiğini açıklamıs olması gerekli.

İyi çalışmalar. / HT

alayli

Alıntı yapılan: EGEHAYDAR - 21 Haziran 2012, 22:15:28
Evet pıce takılı durumda.Yazıda belirttiğim gibi klavyedeki veri 8 bit ( max. 255) olduğu için okuma oluyor.Ama aynı programla barkod okuyucuyu bağladığımda sadece ilk rakamı okuyabiliyorum.Oysaki barkodlar sekiz dokuz haneli rakamlar.herbir rakamı ayrı ayrı nasıl okuyabilirim.sorun orada.Araştırmalarıma göre barkod okuyucudan 10110100..... gibi 2 lik tabanda data geliyor.Bunu nasıl ayrıştırabilirim.
Benim öğrenmek istediğim mesele bu.Teşekkür ederim.

Sadece ilk rakamı okuyup diğerlerini kaçırıyor olmanız normal. Klavyede karakterler arası bekleme süresi çoktur. Sıradan bir insanın <=50ms arayla tuşlara basması olası değildir. Ama PS/2 barkod okuyucular karakterler arasına ya hiç gecikme koymaz yada maksimum 50 ms kadar arayla tüm karakterleri gönderir. Bu sebeple okumayı interrupt ile yapmalısınız. Barkod okuyucunun clk bacağını portb.0 a bağlayıp interrupt ile okuyun.
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

EGEHAYDAR

Sayın alaylı ben programda barkod okuyucudan gelen datayı hazırda bekliyorum.
Benim sorunum 1010000100011110110..... gibi gelen bıt lerin hepsini okuyup ayrıştırarak 10 luk tabana çevirmek.
Bu konuda sıkıntılıyım.

rx:
gosub clock:
if reg=1 then goto rx
if reg<10 then
veri=veri>>1
veri.7=kdata
endif
if reg>10 then
pause 10
lcdout $FE,1
lcdout $FE,$C0," SAYI: ",#VERI
reg=0
endif
goto rx

clock:
if clk=1 then dvm=0:goto clock
if dvm=1 then clock
if clk=0 then
reg=reg+1
dvm=1
endif
return

Bu program sayesinde klavyeden basılan tuşu okuyabiliyorum.
Barkod için nasıl bir ekleme yapmam gerekli.Bunun mantığını çözebilmiş değilim.

İYİ AKŞAMLAR.

TOPLUMA FAYDALI OLMAK İSTİYORSAN DOĞRU BİLDİĞİNİ PAYLAŞ.

alayli

@EGEHAYDAR

Önceki mesajımda da belirttiğim gibi barkod için portb change interrupt eklemeniz gerekli. Ayrıca bir dizi değişken tanımlayıp, her bir karakteri dizide ilgili yerlere atayıp, tüm karakterleri aldıktan sonra lcd'de yazdırma yaptırmanız daha sağlıklı olur. (bu dizi değişkenin boyutu okuyacağınız barkodun maksimum karakter sayısı kadar olmalı) Siz her bir karakteri aldıktan hemen sonra "pause 10" satırında 10ms bekleme yapıyor ve ardından lcd'ye yazdırma işlemi ile uğraşıyorsunuz. Bu 10ms+ sürede barkod ukuyucu diğer karakterleri göndermeye devam eder ve siz de kaçırırsınız bunları. Bir de kullandığınız pbp derleyici donanımsal interrupt kullanabilmeniz için uygun değil. İmkanınız varsa Proton+ derleyiciye geçin. Bu durumda size örnek bir kaç satır çalışan kod sağlayabilirim.
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

EGEHAYDAR

Sayın alayli proton da kullanıyorum.Örnek bir program gönderirseniz memnun olurum.Şimdiden teşekkür ederim
TOPLUMA FAYDALI OLMAK İSTİYORSAN DOĞRU BİLDİĞİNİ PAYLAŞ.

alayli

Kodu daha iyi anlayabilmek için http://www.jkmicro.com/PS2Keyboard_EN.pdf linkindeki dökümanı incele. Kodda klavyenin veya barkod okuyucunun gönderdiği parite biti gözardı edilmiştir. Fakat başarılı şekilde okuma yapar yine de... Takıldığın yer olursa yardımcı olurum.

Device 16F876A
Xtal = 20
Config HS_OSC , WDT_ON , PWRTE_ON , BODEN_OFF , LVP_OFF ,  DEBUG_OFF , CP_ALL

Watchdog      = On
PortB_Pullups = On
All_Digital   = On
LCD_DTPin     = PORTB.4	
LCD_RSPin     = PORTB.2
LCD_ENPin     = PORTB.3
LCD_Interface = 4
LCD_Lines     = 2
LCD_Type      = 0
'----------------------------------------------- Alias INTERRUPT_REG bits
Symbol	RBIF	 = INTCON.0 ' PortB change flag
Symbol	INTF	 = INTCON.1	' PORTB.0 external interrupt flag
Symbol	T0IF	 = INTCON.2	' Timer 0 overflow flag
Symbol	RBIE	 = INTCON.3	' Port B change interrupt enable
Symbol	INTE	 = INTCON.4	' PortB.0 external interrupt enable
Symbol	T0IE	 = INTCON.5	' Timer 0 interrupt enable
Symbol	PEIE	 = INTCON.6	' Peripheral interrupt enable
Symbol	GIE	 = INTCON.7	' All interrupts ON or OFF

' ------------------------------------------ Alias OPTION_REG bits
Symbol  PS0      = OPTION_REG.0  ' Prescaler select bit 0
Symbol  PS1      = OPTION_REG.1  ' Prescaler select bit 1
Symbol  PS2      = OPTION_REG.2  ' Prescaler select bit 2
Symbol  PSA      = OPTION_REG.3  ' Prescaler source, 1 = WDT, 0 = xtal/4
Symbol  T0SE     = OPTION_REG.4  ' Timer 0 edge select
Symbol  T0CS     = OPTION_REG.5  ' Timer 0 clock source
Symbol  INTEDG   = OPTION_REG.6  ' 0 = falling edge of Port B.0
Symbol  NOT_RBPU = OPTION_REG.7  ' 0 = Port B pullup resistors = ON
' ------------------------------------------ Variables
Dim BPF            As Byte System
Dim CHR[16]      As Byte
Dim ZAMAN_SAY      As Byte
Dim ASCII      As Byte           
Dim BIT_SAYAC      As Byte
Dim BYTE_SAYAC      As Byte
Dim RX_BYTE      As Byte		   
Dim X      As Byte	         
Dim FLAGS            As Word
Dim I                    As Bit
Dim BARKOD_OK  As Bit
Dim PASS             As Bit

' ------------------------------------------ 
Symbol Clk_pin     = PORTB.0
Symbol Dat_pin    = PORTB.1
' -------------------------------------------
Clear
   
TRISA = %11111111
TRISB = %00000011
TRISC = %11101101
INTCON = %00000000
DelayMS 500   
On_Interrupt GoTo Barcode_Interrupt

BYTE_SAYAC = 0 : BIT_SAYAC = 0 : RX_BYTE = 0 : BARKOD_OK = 0
Str CHR = 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
GoSub LCD_TAZELE
Print At 1,1," BARCODE READER "
Print At 2,1,"RECOGNIZER  v1.0"
DelayMS 1000

INTEDG = 0                     '0 = Düşen kenarda Port B.0 kesmesi
INTCON = 208                 'Global, peripheral, PORTB.0 external interrupt açık
'INTCON = %00000000   'Global, peripheral, PORTB.0 external intterrupt kapalı

MAIN:
If BARKOD_OK = 1 Then   'Eğer tüm karakterler alınmışsa yani 16 bayt karakter alınmışsa veya $5A (klavyede enter) karakteri alınmışsa
     GoSub LCD_TAZELE
     For X = 0 To BYTE_SAYAC
     I = GetBit FLAGS,BYTE_SAYAC
        If I = 0 Then
           ASCII = LRead KEY_TO_ASCII_3 + (CHR[X] - 21)   'PS/2 den ASCII ye dönüştür.
           CHR[X] = ASCII
        Else
           ASCII = LRead KEY_TO_ASCII_1 + (CHR[X] - 21)   'PS/2 den ASCII ye dönüştür.
           CHR[X] = ASCII
        EndIf      
     Next 
     
Print At 1,1,CHR#0,CHR#1,CHR#2,CHR#3,CHR#4,CHR#5,CHR#6,CHR#7,CHR#8,CHR#9,CHR#10,CHR#11,CHR#12,CHR#13,CHR#14,CHR#15
     Str CHR = 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
     FLAGS = 0 : BYTE_SAYAC = 0 : BARKOD_OK = 0 : INTCON = 208
EndIf
clrwdt
DelayMS 100
Inc ZAMAN_SAY 
If ZAMAN_SAY >= 5 Then ZAMAN_SAY = 0 : FLAGS = 0 : BYTE_SAYAC = 0
GoTo MAIN


'Interrupt rutini
Barcode_Interrupt:
Context Save
clrwdt
Inc BIT_SAYAC
If BIT_SAYAC = 1 And Dat_pin = 0 Then CIK ' START BİTİ GELDİ 
If BIT_SAYAC < 10 Then
   RX_BYTE = RX_BYTE >> 1
   RX_BYTE.7 = Dat_pin
EndIf 
If BIT_SAYAC >= 11 Then 
   BIT_SAYAC = 0
   If PASS = 1 Then PASS = 0 : GoTo CIK   
   If RX_BYTE = $F0 Then PASS = 1 : GoTo CIK
   If RX_BYTE = $12 Or RX_BYTE = $59 Then SetBit FLAGS,BYTE_SAYAC : GoTo CIK 
   If RX_BYTE = $5A Or BYTE_SAYAC = 16 Then BARKOD_OK = 1 : INTCON = 0 : GoTo CIK
   CHR[BYTE_SAYAC] = RX_BYTE : Inc BYTE_SAYAC      
EndIf             
CIK:  
INTF = 0
Context Restore

LCD_TAZELE:
Clear BPF.1 : Cls : DelayMS 30
Return				
End
KEY_TO_ASCII_1:	LData "q1",0,0,0,"zsaw2",0,0,"cxde43",0,0," vftr5",0,0,"nbhgy6",0,0,",mju78",0,0,",kio09",0,0,".?l:p-=",0
'KEY_TO_ASCII_2:   LData "Q!",0,0,0,"ZSAW",34,0,0,"CXDE$#",0,0," VFTR%",0,0,"NBHGY^",0,0,",MJU&*",0,0,",KIO)(",0,0,"./L;P_+",0
KEY_TO_ASCII_3:   LData "Q1",0,0,0,"ZSAW2",0,0,"CXDE43",0,0," VFTR5",0,0,"NBHGY6",0,0,",MJU78",0,0,",KIO09",0,0,"./L;P-=",0
'KEY_TO_ASCII_4:	LData "q!",0,0,0,"zsaw",34,0,0,"cxde$#",0,0," vftr%",0,0,"nbhgy^",0,0,",mju&*",0,0,",kio)(",0,0,".?l:p_+",0
'KEY_TO_ASCII_1 = normal
'KEY_TO_ASCII_2 = shift.  DEC 34 is ASCII for " key
'KEY_TO_ASCII_3 = caps lock on
'KEY_TO_ASCII_4 = Caps lock on, shift key down, is same as SET1 except number keys
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

EGEHAYDAR

Sayın alayli.Verdiğiniz örnek için teşekkür ederim.Verdiğiniz örneği denedim.Barkodu okuyabiliyorum.
Peki PIC'ten barkod yazıcıya veri göndermek için nasıl bir program yapmalıyız.Bu konuda örnek vermeniz mümkün mü?
TOPLUMA FAYDALI OLMAK İSTİYORSAN DOĞRU BİLDİĞİNİ PAYLAŞ.