|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
hahalolek Član
Pridružen-a: Sob 29 Maj 2010 11:49 Prispevkov: 199 Aktiv.: 1.17 Kraj: Domžale
|
Objavljeno: Ned Feb 03, 2013 5:50 pm Naslov sporočila: RFID problem |
|
|
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;
} |
Opis: |
|
Velikost datoteke: |
105.54 KB |
Pogledana: |
49 krat |
|
_________________ 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 |
|
|
matjazkariz Član
Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.60
|
Objavljeno: Ned Feb 03, 2013 11:06 pm Naslov sporočila: |
|
|
Č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 |
|
|
hahalolek Član
Pridružen-a: Sob 29 Maj 2010 11:49 Prispevkov: 199 Aktiv.: 1.17 Kraj: Domžale
|
Objavljeno: Pon Feb 04, 2013 10:52 am Naslov sporočila: |
|
|
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 |
|
|
matjazkariz Član
Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.60
|
Objavljeno: Pon Feb 04, 2013 11:36 am Naslov sporočila: |
|
|
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 |
|
|
hahalolek Član
Pridružen-a: Sob 29 Maj 2010 11:49 Prispevkov: 199 Aktiv.: 1.17 Kraj: Domžale
|
Objavljeno: Pon Feb 04, 2013 10:47 pm Naslov sporočila: |
|
|
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
_________________ 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 |
|
|
sraka Član
Pridružen-a: Čet 20 Nov 2008 23:52 Prispevkov: 481 Aktiv.: 2.56 Kraj: PMAVs
|
Objavljeno: Tor Feb 05, 2013 1:15 am Naslov sporočila: |
|
|
hahalolek je napisal/a: |
Sem našel problem. |
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 |
|
|
|
|
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
|