www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

RFID problem

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
hahalolek
Član
Član



Pridružen-a: Sob 29 Maj 2010 11:49
Prispevkov: 199
Aktiv.: 1.17
Kraj: Domžale

PrispevekObjavljeno: Ned Feb 03, 2013 5:50 pm    Naslov sporočila:  RFID problem Odgovori s citatom

Za maturitetni izdelek sem se odločil narediti alarmni sistem z RFID.
Dobil sem od mikroelektronike knjižnico za RFID ploščico in jo malo priredil za PIC 18F45K22.
Koda dela normalno ampak dobivam pa čudne podatke preko UARTA.
Imam 3 različne RFID kartice in z vsako je isto.
Iz kartice naj bi dobil 8 baytov podatkov ampak so vsi isti.

Že vnaprej se zahvaljujem za odgovore.
Knjižnica za RFID:

Koda:

extern sfr sbit OUT_ ;
extern sfr sbit RDY_ ;
extern sfr sbit SHD ;
extern sfr sbit MOD_ ;

extern sfr sbit OUT_Direction ;
extern sfr sbit RDY_CLK_Direction ;
extern sfr sbit SHD_Direction ;
extern sfr sbit MOD_Direction ;




static unsigned short sync_flag,     // In the sync routine if this flag is set
               one_seq,              // Counts the number of 'logic one' in series
               data_in,              // Gets data bit depending on data_in_1st and data_in_2nd
               cnt,                  // Interrupt counter
               cnt1, cnt2;           // Auxiliary counters
static unsigned short data_index;    // Marks position in data arrey
static char i;
static char _data[256];
static char data_valid[64];
static char bad_synch;               // Variable for detecting bad synchronization


void RFid_Init(){

  OUT_Direction = 1;
  RDY_CLK_Direction = 1;
  SHD_Direction = 0;
  MOD_Direction = 0;

  INTEDG0_bit = 0;                   // Interrupt on falling edge on RB0
  INTEDG1_bit = 1;                   // Interrupt on rising edge on RB1

  SHD = 0;
  MOD_ = 0;
}

void RFid_Interrupt_Proc(){
// This is external INT1 interrupt (for sync and sample)
// It is enabled until we get 128 data bits
  if (INT1IF_bit && INT1IE_bit) {
      cnt++;                         // count interrupts on INT1 pin (RB1)
      INT1IF_bit = 0;
     }

// This is external INT0 interrupt (for sync start)
// Once we get falling edge on RB0 we are disabling INT0 interrupt
  else if (INT0IF_bit && INT0IE_bit) {
     cnt = 0;
     sync_flag = 1;
     INT0IF_bit = 0;
     INT0IE_bit = 0;
     INT1IF_bit = 0;
     INT1IE_bit = 1;
   }
}

// Performs CRC
static char RFid_CRC_Check(char *bit_array) {

char row_count, row_bit, column_count;
char row_sum, column_sum;
char row_check[5];
char column_check[11];

   // Row parity check:
   row_count = 9;               // Count rows
   while (row_count < 59) {
     column_count = 0;          // Count columns
     while (column_count < 5) {
       row_check[column_count] = bit_array[row_count+column_count];
       column_count++;
     }
     row_bit = 0;               // Count row bits
     row_sum = 0;
     while (row_bit < 4) {
       row_sum = row_sum + row_check[row_bit];
       row_bit++;
     }

     if (row_sum.B0 != row_check[4].B0) {
       return 0;
     }
     row_count = row_count + 5;
   }
   // End row parity check

   // Column parity check
   column_count = 9;            // Count columns
   while (column_count < 13) {
     row_bit = 0;               // Count column bits
     row_count = 0;             // Count rows
     while (row_bit < 11) {
       column_check[row_bit] = bit_array[column_count+row_count];
       row_bit++;
       row_count = row_count + 5;
     }

     row_bit = 0;               // Count column bits
     column_sum = 0;
     while (row_bit < 10) {
       column_sum = column_sum + column_check[row_bit];
       row_bit++;
     }

     if (column_sum.B0 != column_check[10].B0) {
       return 0;
     }
     column_count++;
   }
   // End column parity check
   if (bit_array[63] == 1) {
     return 0;
   }
   return  1;
}



// Scans in while loop until it detects the valid RFid
void RFid_GetID(){
  sync_flag = 0;                // Sync_flag is set when falling edge on RB0 is detected
  one_seq = 0;                  // Counts the number of 'logic one' in series
  data_in = 0;                  // Gets data bit
  data_index = 0;               // Marks position in data arrey
  cnt = 0;                      // Interrupt counter
  cnt1 = 0;                     // Auxiliary counter
  cnt2 = 0;                     // Auxiliary counter

  INTEDG0_bit = 0;              // Interrupt on falling edge on RB0
  INTEDG1_bit = 1;              // Interrupt on rising edge on RB1

  INT0IF_bit = 0;               // Clear INT0IF
  INT1IF_bit = 0;               // Clear INT1IF

  INT0IE_bit = 0;               // Turn OFF interrupt on INT0
  INT1IE_bit = 0;               // Turn OFF interrupt on INT1
  GIE_bit = 1;                  // Enable GIE


  while (1) {
    bad_synch = 0;              // Set bad synchronization variable to zero
    cnt = 0;                    // Reseting interrupt counter
    sync_flag = 0;              // Reseting sync flag
    INT1IF_bit = 0;
    INT1IE_bit = 0;             // Disable external interrupt on RB1 (for sync and sample)
    INT0IF_bit = 0;
    INT0IE_bit = 1;             // Enable external interrupt on RB0 (start sync procedure)

    while (sync_flag == 0) {    // Waiting for falling edge on RB0
     asm nop
    }

    while (cnt != 16) {         // Waiting 16 clocks on RB1 (positioning for sampling)
     asm nop
    }

    cnt = 0;
    _data[0] = OUT_ & 1;

    for (data_index = 1; data_index != 0; data_index++) {   // Getting 128 bits of data from RB0
      while (cnt != 32) {                                   // Getting bit from RB0 every 32 clocks on RB1
        asm nop
      }
      cnt = 0;                                              // Reseting interrupt counter
      _data[data_index] = OUT_ & 1;                         // Getting bit
      if(data_index & 1)
      if (!(_data[data_index] ^ _data[data_index-1]))
         {
            bad_synch = 1;
            break;                                          // Bad synchronisation
         }
    }

    INT1IE_bit = 0;                         // Disable external interrupt on RB1 (for sync and sample)
    if (bad_synch)
     continue;                              // Try again
    cnt1 = 0;
    one_seq = 0;
    for(cnt1 = 0; cnt1 <= 127; cnt1++) {    // We are counting 'logic one' in the data array
      if (_data[cnt1 << 1] == 1) {
        one_seq++;
        }
      else {
        one_seq = 0;
        }

      if (one_seq == 9) {                   // If we get 9 'logic one' we break from the loop
          break;
    }
    }                                       // (the position of the last  'logic one' is in the cnt1)
    if ((one_seq == 9) && (cnt1 < 73)) {    // If we got 9 'logic one' before cnt1 position 73
                                            // we write that data into data_valid array
       data_valid[0] = 1;                   // (it has to be before cnt1 position 73 in order
       data_valid[1] = 1;                   // to have all 64 bits available in data array)
       data_valid[2] = 1;
       data_valid[3] = 1;
       data_valid[4] = 1;
       data_valid[5] = 1;
       data_valid[6] = 1;
       data_valid[7] = 1;
       data_valid[8] = 1;
       for(cnt2 = 9; cnt2 <= 63; cnt2++) {  // Copying the rest of data from the data array into data_valid array
          cnt1++;
          data_valid[cnt2] = _data[cnt1 << 1];
        }
       if (RFid_CRC_Check(data_valid) == 1){     // If data in data_valid array pass the CRC check
         GIE_bit = 0;
         return;
       }

     }
  }

}

// Store the retreived RFid in EEPROM starting from eeprom_address. RFid is 8 bytes in size.
void RFid_Store_ID2EEPROM(char eeprom_address){
char i, tmp = 0;

    for (i = 0; i <= 63; i++){

        tmp |= data_valid[i] << (i%8);

        if (!((i+1)%8)){
          EEPROM_Write(eeprom_address++, tmp);
          tmp = 0;
        }
    }
}

// Reads RFid from EEPROM and stores it in RAM
void RFid_LoadFromEEPROM(char eeprom_address, char* start_address){
char i;

for(i=0; i< 8; i++) *(start_address + i) = EEPROM_Read(eeprom_address + i);
}

// Returns 1 if the IDs are equal else returns 0!
// Comaparision is done between the last read RFid and the one pointed by "rfid"
char RFid_Check_ID(char *rfid){
char i, cmp = 0;
//cmp = 0;

    for (i = 0; i <= 63; i++){
            if (data_valid[i].B0 != (*(rfid  + (i/8))  >>  (i%8)).B0){
              cmp++;
              break;
            }
    }
   if (!cmp) return 1;
   else return 0;
}



rfid11.png
 Opis:
 Velikost datoteke:  105.54 KB
 Pogledana:  49 krat

rfid11.png



_________________
Lp Blaž

Prvi poklic na svetu je bil električar. Še preden je bog rekel naj bo luč, so oni že kable napeljevali.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.60

PrispevekObjavljeno: Ned Feb 03, 2013 11:06 pm    Naslov sporočila:   Odgovori s citatom

Čemu pripenjaš knjižnico RFID? Misliš, da je knjižnica kriva za napako? Močno dvomim.
Tam na sliki vidim, da za funkcijo RFIDget kličeš rutine za vpis in branje iz eeproma. Ali na uart izpisuješ vrednost, ki si jo prebral iz eeproma? Poskusi izpisati direktno, kar ti vrne funkcija RFIDget....

_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
hahalolek
Član
Član



Pridružen-a: Sob 29 Maj 2010 11:49
Prispevkov: 199
Aktiv.: 1.17
Kraj: Domžale

PrispevekObjavljeno: Pon Feb 04, 2013 10:52 am    Naslov sporočila:   Odgovori s citatom

Preko UART-a izpisujem vrednost, ki jo berem iz EEPROM-a.
Mi lahko poveš iz česa naj berem. Mogoče iz data_valid??

_________________
Lp Blaž

Prvi poklic na svetu je bil električar. Še preden je bog rekel naj bo luč, so oni že kable napeljevali.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.60

PrispevekObjavljeno: Pon Feb 04, 2013 11:36 am    Naslov sporočila:   Odgovori s citatom

Zakaj sprašuješ? A ne bi bilo hitreje poskusiti? Bi takoj izvedel. In če bi se na uart izpisala pravilna koda, bi tudi že vedel, da je nekaj narobe okrog vpisa ali branja iz eeproma. Če ne pa iščeš razloge drugje.
_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
hahalolek
Član
Član



Pridružen-a: Sob 29 Maj 2010 11:49
Prispevkov: 199
Aktiv.: 1.17
Kraj: Domžale

PrispevekObjavljeno: Pon Feb 04, 2013 10:47 pm    Naslov sporočila:   Odgovori s citatom

Sem našel problem.
Ko sem iskal kaj bi poslal preko UARTA sem našel da rabiš določit pri kateremu bytu se začne vpisovati v spremenljivko pri tem ukazu: RFid_LoadFromEEPROM(0x00, RFID) bi moralo biti RFid_LoadFromEEPROM(0x00, RFID[0])

Hvala vseeno Smile

_________________
Lp Blaž

Prvi poklic na svetu je bil električar. Še preden je bog rekel naj bo luč, so oni že kable napeljevali.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
sraka
Član
Član



Pridružen-a: Čet 20 Nov 2008 23:52
Prispevkov: 481
Aktiv.: 2.56
Kraj: PMAVs

PrispevekObjavljeno: Tor Feb 05, 2013 1:15 am    Naslov sporočila:   Odgovori s citatom

hahalolek je napisal/a:
Sem našel problem.
d'oh! Applause

Pray A ti jih iščeš ??? Meni se pa kar sami pojavljajo.

_________________
Danes je težko biti budala, konkurenca je velika, pa še dokazovati se moraš večkrat na dan.
Sem ogledalo: Nisem kriv, če v meni vidite nekaj kar vam ni všeč.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 82 dni


Powered by phpBB © 2001, 2005 phpBB Group