Bonjour,
Je vais commencer par une mise en contexte, je suis alternant auprès d'une entreprise, mon travail consiste
en la réparation et la conception de divers cartes électroniques.
Je travaille actuellement sur la conception d'une carte donc l'objectif est de lire une communication en Wiegand une méthode de branchement relativement utilisé en sécurité, celui-ci peut être décrit simplement, on retrouve deux fils de communication (+ la masse)
que l'on appelle DATA_0 et DATA_1 leur état au repos (pas de communication) est à 1 (dans mon cas +12V) lorsque l'on cherche à envoyer 1 on
va faire passer DATA_1 à 0 (0V) est maintenir DATA_0 à 1 (donc +12V) pour 0 on répète le même processus mais on inverse ( DATA_0 =0V et DATA_1= +12V).
Cette communication en Wiegand est ni plus ni moins que le code d'un badge RFID lu par un lecteur de badge, ce genre d'équipement tombant souvent en panne je me suis lancer dans le projet de la conception d'un outil de test portable pour les postés ayant besoin de diagnostiquer rapidement les lecteurs. En bref le projet peut se présenter comme ceci, on viens brancher un lecteur de carte sur notre outils, le lecteur est alimenter par celui-ci, notre outil est muni d'un écran LCD qui au passage d'un badge auprès du lecteur vient envoyer le numéro de badge sur nos deux câbles DATA_0 et DATA_1, ce code est un code à 6 chiffres chaque chiffre étant en hexa cela nous fait 3 octets de données que je dois venir récupérer mais je dois aussi vérifier le code entreprise et les bits de parité ce qui nous fait le joli nombre de 86 bits.
Pour mon projet j'utilise un PIC16F1827, je compile mon programme avec XC8 2.0, mon problème et la lecture, je viens attendre un changement sur les pins RB0 (où est branché DATA_0) et RB1 (où est branché DATA_1) puis je vérifie qu'elle FLAG est à 1 après quoi viens le point qui pose problème je cherche à stocker cette valeur au sain d'un tableau de char or je travaille avec des valeurs binaire je ne vais donc pas créer un tableau de 86 char (de plus le micro ne peut pas c'est trop pour lui) je dois donc venir lire ma valeur et la stocker dans une case de ma colonne puis venir la décaler d'un rang, cela me permettra de transférer 8 valeurs dans une case de tableau, enfin c'est ce que je veux faire mais reste à voir si c'est possible car jusqu'à présent je n'y arrive pas.
Cela serait mentir de dire que je suis expert en C je dois avour avoir du mal avec mes opérateurs, je ne suis pas là pour demander à ce que l'on fasse le projet à ma place mais en l'absence d'avancer je me retourne vers vous afin de me corriger quant à mes erreurs de débutants, désolé pour le pavé ceci dit.Code://DEBUT DU PROGRAMME /* Main.c file generated by New Project wizard * * Created: mer. juin 19 2024 * Processor: PIC16F1827 * Compiler: MPLAB XC8 */ // CONFIG1 // PIC16F1827 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FOSC = XT // Oscillator Selection (XT Oscillator, Crystal/resonator connected between OSC1 and OSC2 pins) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is enabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = OFF // PLL Enable (4x PLL enabled) #pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = OFF // Low-Voltage Programming Enable (Low-voltage programming enabled) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #define _XTAL_FREQ 4000000 //Définition de nos macros #define E PORTAbits.RA7 #define RS PORTAbits.RA6 #define D4 PORTAbits.RA0 #define D5 PORTAbits.RA1 #define D6 PORTAbits.RA2 #define D7 PORTAbits.RA3 #define LCD_EN_Delay 500 //Variables globalesvoid Init() char i=0; char Wieg[]; char display=0; char erreur[] = {"ERREUR"}; void interrupt PORTBChange() { Wieg[] << 1; //Je viens décaller mon bit if (IOCBF == 0x01) //DATA_0 envoie un 0 { Wieg[i] | 0; i++; IOCBF = 0x00; TMR1L = 0x00; //Je remets le TMR1H = 0x00; TMR1ON = 1; } else if (IOCBF == 0x02) //DATA_1 envoie un 1 { Wieg[i] | 1; i++; IOCBF = 0x00; TMR1L = 0x00; TMR1H = 0x00; TMR1ON = 1; } else if (TMR1IF == 1) { TMR1IF = 0; display=1; TMR1ON = 0; TMR1L = 0x00; TMR1H = 0x00; } } void Init() //J'initialise mes différents registre { ANSELB = 0x08; TRISB = 0xFF; IOCBP = 0x03; IOCBN = 0x00; IOCBF = 0x00; ANSELA = 0x00; TRISA = 0x00; OSCCON = 0x6A; OPTION_REG = 0x88; INTCON = 0xC8; PIE1 = 0x01; PIR1 = 0x00; T1CON = 0x34; } void main(void) { Init(); LCD_Init(); LCD_Clear(); LCD_Set_Cursor(0,0); while (1) { } } //FIN DU PROGRAMME
(Simple info j'ai retirer la majorité du programme pour ne pas perdre de vue le plus important).
Si besoin je peux rajouter le schéma Proteus du circuit partiel.
Merci d'avance pour vos réponse, Cordialement.
-----