2017-05-08 2 views
0

J'essaye d'écrire une bibliothèque pour le lecteur de carte de Hikvision avec le clavier. Here is some information about that reader. J'ai aussi pris comme exemple la bibliothèque Arduino. Cette bibliothèque fonctionne bien pour lire des données et utilise les mêmes broches d'interruption externes: https://github.com/monkeyboard/Wiegand-Protocol-Library-for-ArduinoImplémentation de protocole de Wiegand sur Atmega328

J'ai beaucoup cherché dans Google mais il n'y a pas d'exemples C que j'ai pu trouver. J'ai écrit mon code à partir de zéro mais cela n'a pas fonctionné. Je peux voir quelques données de sortie mais cela n'a rien à voir avec les données réelles. Donc voici un exemple: J'ai mis la carte sur le lecteur qui est le protocole Wiegand 26 avec l'ID: 0x1532FC et la sortie est 0x94F8.

Peut-être que quelqu'un m'aidera à trouver une erreur.

Alors, voici mon code:

#define F_CPU 16000000 
#include <avr/io.h> 
#include "c:\users\irakli\Documents\Atmel Studio\7.0\wiegand C\wiegand C\UART.h" 
#include <avr/interrupt.h> 
#include <util/delay.h> 

`unsigned long CardID = 0; // DATA 
int bit_count= 0; //Wiegand type 

int Send; 

int DataArray[26] = {}; 
int *ptr = DataArray; 

void WiegandReadD0(void) // INT0 Port PD3 
{ 
    bit_count++; 
    CardID = CardID << 1; 
    _delay_ms(1);  
} 
void WiegandReadD1(void) // INT1 Port PD4 
{ 
    bit_count++; 
    CardID = CardID << 1; 
    CardID = CardID + 0x01; 
    _delay_ms(1); 
} 

void WiegandSendD0(void) // PD5 Send Data0 
{ 
    PORTD = (0 << 5); 
    _delay_us(20); 
    PORTD = (1 << 5); 
    _delay_ms(2); 
} 
void WiegandSendD1(void) // PD6 Send Data1 
{ 
    PORTD = (0 << 6); 
    _delay_us(20); 
    PORTD = (1 << 6); 
    _delay_ms(2); 
} 

void Send_Data() 
{ 
    unsigned long data; 
    int type; 

    data = CardID; 
    type = bit_count; 

    for(int i = 0; i <= (type - 1); i++) // Decimal To Binary Array 
    { 
    if(((1 << i) & data) != 0) 
    { 
     *(ptr + i) = 1; 
    } 
    else 
    { 
     *(ptr + i) = 0; 
    } 
    } // END Of FOR 

    for(int i = (type - 1); i >= 0; --i) //Data Send Function 
    { 
    Send = *(ptr + i); 

    if(Send == 1) 
     WiegandSendD1(); 
    if(Send == 0) 
     WiegandSendD0(); 
    } 
    } 

    int main(void) 
    { 
    Uart_init(); 
    sei(); 

    DDRD = (0 << 3) | (0 << 4); // Input Ports For Reading Wiegand 
    PORTD = (0 << 3) | (0 << 4); // No Pull-up 
    EIMSK = (1 << INT0) | (1 << INT1); // Enable External Interrupts On PD3 
             // and PD4 

    DDRD = (1 << 5) | (1 << 6); // Output Ports For Sending Wiegand. PD5 = 
           // D0, PD6 = D1. 
    PORTD = (1 << 5) | (1 << 6); // PUll-ups Enable 

    while (1) 
    { 
     _delay_ms(1000); 
     printf("Card ID = %ld\t Card HEX = %.x\t Wiegand Type = %d\t\n",CardID, CardID, bit_count); 
     _delay_ms(500); 

     Send_Data(); 

     CardID = 0; 
     bit_count = 0; 
    }  
    } 

    ISR(INT0_vect) 
    {  
     WiegandReadD0(); 
    } 
    ISR(INT1_vect) 
    {  
     WiegandReadD1(); 
    }` 

Si plus d'informations sont nécessaires s'il vous plaît écrire.

Répondre

0

Il y a une erreur stupide dans:

printf("Card ID = %ld\t Card HEX = %.x\t Wiegand Type = %d\t\n",CardID, CardID, bit_count); 

ici devrait être:

printf("Card ID = %l\t Card HEX = %.x\t Wiegand Type = %d\t\n",CardID, CardID, bit_count); 

!! MAIS si quelqu'un devait utiliser ce code, il devrait considérer que la sortie inclut des bits de parité. !!