Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

Binary to Hex

Başlatan xoom, 12 Kasım 2012, 20:55:35

xoom

Herkese merhaba..
arkadaşlar Rfid Modül üzerinden kart okutulunca  gönderilen 32bitlik Seri bilgiyi Hex'e nasıl dönüştürebilirim??
gelen 32bitlik bilgiyi 16f877'nin Rx (C7) pinine bağladım..

kudretuzuner

Merhaba
RFID'nin çalışması hakkında bilgim yok fakat seri iletişim hakkında size şöyle bir açıklama yapabilirim.16F877A'nın RX pinine giren 32 bitlik data 4 byte eder.PIC tarafındaki yazılımınızı öyle bir ayarlamalısınız ki her gelen bir byte  lık bilgiyi pinlerde led olarak okuyabilmelisiniz.Aşağıdaki linkte sizin için basit bir çalışma yaptım.RFID yerine PIC kullandım butona bastığınızda 32 bit 4 byte data(hex'31'-hex'32'-hex'33'-hex'34')yollar siz de diğer PIC'te okursunuz.Umarım size fikir verebilmişimdir.Kolay gelsin.
https://www.dropbox.com/s/j4xopssc7bwq6ek/xoom_serl_pcproje.rar?m
Amatör

xoom

Kudret bey yanıt için tskler.. cevabı görünce telefondan girdim fakat ttelefonla baglandigimdan mi bilmiyorum kodlar Ccs c değil sanırım. Ben asm den hiç anlamam:(

Murat Mert

#3
Alıntı yapılan: xoom - 12 Kasım 2012, 20:55:35
Herkese merhaba..
arkadaşlar Rfid Modül üzerinden kart okutulunca  gönderilen 32bitlik Seri bilgiyi Hex'e nasıl dönüştürebilirim??
gelen 32bitlik bilgiyi 16f877'nin Rx (C7) pinine bağladım..

S.A.
Uarttan gelen bilgiler zaten bayt olarak gelir. sana bu baytları alıp 32 bite çevirip lcd de hex göstermek kalıyor. Birşeyler karaladım ama :) kolay gelsin.
int32 gelen=0;
int8 veri[]={0,0,0,0,0,0,0,0};
int8 a=0;
int8 i=0;

#int_RDA
void  RDA_isr(void)
{
disable_interrupts(INT_RDA);
veri[i]=getc();
i++;
if( i >=4){i=0;a=1} 

enable_interrupts(INT_RDA);
}

void main ()
{

if (a==1) {a=0; gelen = make32(veri[0],veri[1],veri[2],veri[3]);}

gotoxy(1,1)
printf(lcd_putc"gelen=%LX",gelen);

}
mert07

z

Bir veri, birden fazla byte ile ifade ediliyorsa ve siz bunu seri iletişim kanalları üzerinden yolluyorsanız dikkatli olmanız gerekir.

Örneğin  0x1234 sayısını peşpeşe 0x12 ve 0x34 şeklinde periyodik olarak yolladığımızı varsayalım.

Karşı taraf, pek ala bu veriyi 0x34 0x12 şeklinde alıp  0x3412 sonucunu elde edebilir. İletişimde oluşabilecek kısa süreli bir kesinti, gürültü vs bu tip hatalara neden olur.

Buna engel olmak için verinin başına ve sonuna bazı tanımlayıcı ekler getirilebilir.

Örneğin

0xAA 0x02 Data1 Data2 0x55

Burada 0xAA veri katarı başladı demek.
0x02 sana 2 byte yolluyorum demek
Data1 1. Data demek
Data2 2. Data demek
0x55 veri katarının son bilgisi demek

Bunlara ilave olarak check sum gibi hata denetleme verileri de ekleyebilirsiniz.

Benzer yapılarla veri iletişim güvenliğini artırabilirsiniz.

Yukarıdaki örnekteki gibi bir yapıda 0xAA alıncaya kadar gelen herşey çöpe atılır.
Daha sonra veri uzunluğu beklenir.
Ardından veri uzunluğu kadar veri alınır.
En son 0x55 beklenir.

Eğer bu sıralama doğru ise gelen veri büyük olasılıkla doğru alınmış demektir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

xoom

#5
Mert07 hocam yanıt için teşekkürlr. Fakat program kesmeden nasıl kurtulacak anlamadım.  Z hocam bilgilendirme için teşekkürler.  Acaba mert07 arkadaşımızın koduna bahsettiğiniz ek kontrol kodlarını nasıl ilave ederim.
veya başka Bir örnek yazabilir misiniz (CCS C ile )

Murat Mert

#6
S.A.
Normalde size göstermek için öyle birşey yazmıştım seri iletişimde aldımı ? yoksa verdimi? gibi şeyleri kontrol etmek tabiki lazım. Umarım durumu sana kavratmışımdır.

Denediğim minik bir alıcı kod:

#include <18F452.h>
#device adc=16
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(clock=10000000)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)
#include "2x16_4x20_LCD.c"

int8 veri[]={0,0,0,0,0,0,0,0};
int sayac=0;
int16 time_out=0;
int8 i=0,a=0,b=0;
unsigned int16 isi=0,deger=0,karsi=0;

#int_RDA
void  RDA_isr(void)
{
disable_interrupts(INT_RDA);
veri[i]=getc();
i++;
if(veri[0]!=1){i=0;} else{time_out=0;a=0;}
if((i>=6)){i=0;}
enable_interrupts(INT_RDA);
}

#int_TIMER0
void  TIMER0_isr(void)
{ 
++time_out;
if(time_out>10000){a=1;}
if((veri[0]==1)&(veri[1]==3)&(veri[4]==13)&(veri[5]==10))
{isi=make16(veri[2],veri[3]);}
}

void main() {
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
   enable_interrupts(INT_RDA);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_bit);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
     lcd_init();

   while(TRUE)
   {
     if(a==1)
     {
      lcd_gotoxy(1,2);
      printf(lcd_putc,"BILGI YOK   ");
      lcd_gotoxy(1,1);
      printf(lcd_putc,"SON ISI=%2.1f  ",(float) isi/10); 
     } 
     else
     {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"ISI=%2.1f    ",(float) isi/10);
      lcd_gotoxy(11,1);
      printf(lcd_putc,"%lu  ",time_out);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"             ");
    
     } 
      
   }

}


mesaj birleştirme:: 13 Kasım 2012, 12:02:12

buda vericisi:

#include <16F877.h>
#device adc=10
#FUSES NOWDT                      //Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED 
#use delay(clock=10000000)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#define Buton       pin_c5  // Yön_1
#define Led         pin_b0  // Yön_1
char tus;       //char tipinde tus değişkeni tanımladık.
int i=0;
int8 veri[]={0,0,0,0,0,0,0,0};
int kontrol=0;
unsigned long int temperature,temperature1;
float value,sicaklik;

void ISI_OKU()
{
    set_adc_channel(0);   // RA0/AN0 ucundaki sinyal A/D işlemine tabi tutulacak
    delay_us(20);
   temperature = read_adc();
   
    sicaklik = temperature*0.488;
    //printf("%2.1f\r\n",sicaklik);
    temperature1 =sicaklik*10;
    
}  
void yolla()
{
    veri[2]=make8(temperature1,1);
    veri[3]=make8(temperature1,0);
    veri[0]=1;
    veri[1]=3;
    veri[4]=13;
    veri[5]=10;
    for(i=0;i<6;i++)putc(veri[i]);

}

void main()

{ 
      setup_adc_ports(AN0_AN1_AN3);
   setup_adc(adc_clock_div_32);   // ADC clock frekansı fosc/32
   setup_adc_ports(AN0); //RA0/AN0 girişi analog
   
 
   
  while(true)             // Sonsuz döngü
  {
  
    isi_oku();
    delay_ms(1000);
    yolla();
                      
      
  }
}
mert07

xoom

Örnek Kod için tşk ederim..  aşağıdaki kodda da belirttiğim gibi kesme içinde neden kesmeyi aktif yapıyoruz?
void  RDA_isr(void)
{
disable_interrupts(INT_RDA);
veri[i]=getc();
i++;
if(veri[0]!=1){i=0;} else{time_out=0;a=0;}
if((i>=6)){i=0;}
enable_interrupts(INT_RDA); // KESME FONKSİYONUNDA KESMEYİ NEDEN AKTİF YAPIYORUZ? 
}

serhat1990

Kesme fonksiyonuna girerken kesmeyi pasif ettiğin için çıkarken kesmeyi tekrar aktif ediyorsun başka türlü program bir kere kesmeye girer sonrasında girmez ...

xoom

Serhat1990 ve Mert07 Çok tşk ederim. Eğer yukarıdki örnek kodlarla çalıştırabilirsem benim için yeterlidir. fakat Z hocamızın söylediği gibi
Alıntı Yap
Örneğin  0x1234 sayısını peşpeşe 0x12 ve 0x34 şeklinde periyodik olarak yolladığımızı varsayalım.
Karşı taraf, pek ala bu veriyi 0x34 0x12 şeklinde alıp  0x3412 sonucunu elde edebilir. İletişimde oluşabilecek kısa süreli bir kesinti, gürültü vs bu tip hatalara neden olur.
Buna çözüm için nasıl bir kod yazmalıyız? öğrenmişken ustalarımdan  bunuda öğrenmemin zararı olmaz diye düşünüyorum..

serhat1990

Tam anlayamadım demek istediğin 2 byte' ı birleştirip 16 bit datayı elde etmektenmi bahsediyorsun . Elimde bir iş var kafam karışık sorunu tam algılayamadım ... :)

xoom

#11
Yok. benim amacım ilk mesajdaki gibi.. elimde bir rfid modül var..
Modül: http://www.istanbulyazilim.com/index.php?islem=__URUN__30&parent_id=85
Bu Modül   TTL UART   : TX (TTL, 9600) olarak 32bitlik binary kod gönderiyor ( Kartin ID'sini)
Ben Bu ID'yi daha okunaklı Hex formuna dönüştürüp.. LCD 'de yazmak istiyorum.. Sağolsun Mert07 arkadaşımız birşeyler paylaştı yarın deneme yapacağım umarım sonuç elde ederim..
Sizin Anlayamadığınız/benim anlatamadığım ise:
Bu arada konu içinde Z arkadaşımızın bahsettiği önlemi nasıl alırız diye merak ettim..




mesaj birleştirme:: 13 Kasım 2012, 13:41:11

Edit:
#int_RDA
void  RDA_isr(void)
{
disable_interrupts(INT_RDA);
veri[i]=getc();
i++;
if( i >=4){i=0;a=1}  //------------> BU i>=4 neyi kontrol ediyor?

enable_interrupts(INT_RDA);
}


Yukaridaki Kodla gelen veriyi nasıl hex'e çevirdiğimizi anlamadım

z

Gönderen taraftada yazılımı sen yazacaksan ID numarasının 4 byte ını yollamadan önce örneğin 0x50 yolla.
Sonra sıra ile ID nin 4 Byteını yolla. En sonda da mesela 0x60 yolla.

Bu durumda alıcı tarafta veri geldikçe gelen datayı bir array içine yaz veri sayısı 6 olduğunda en baştaki 0x50 mi, en sondaki 0x60 mı diye test et.

Evet ise ortadaki 4 Byte ID dir dersin. Eğer 0x50 0x60 testi başarısız ise en baştaki veriyi çöpe at verileri array içinde 1 kaydır, bu şekilde devam et.

Bu dediklerimi kodlara dökemezmisin?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

xoom

#13
O dediklerini kod'a dökebilirim ama veriyi ben göndermiyorum Modül kendisi gönderiyor.. Modüle sadece enerji verip kart yaklaştırıyorum..Modül üzerindeki TX portundan 32bit (Binary) TTL 9600 Baut Hızın veri geliyor..

Aşağıdaki Kesmede açıklamanın olduğu satırın amacını anlamadım..
#int_RDA
void  RDA_isr(void)
{
disable_interrupts(INT_RDA);
veri[i]=getc();
i++;
if( i >=4){i=0;a=1}  //-------> BU i>=4 le neyi kontrol ediyoruz? nasıl 32biti almış oluyoruz anlamadım..

enable_interrupts(INT_RDA);
}

Klein

Haberleşme işi tamam, tek sorunum binary bilgiyi HEX formatında stringe çevirmek diyorsan:

Basitçe şöyle yapabilirsin.

char dispbuf[20];
const char hex_lookup[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}

bin_to_hex(char adr, char bindata){
      dispbuf[adr] = hex_lookup[bindata & 0x0F);
       dispbuf[adr+1] =  hex_lookup[(bindata >>4)& 0x0F);
}