Bonjour à tous
Je me décide enfin à poster ce problème au quel je ne trouve pas de solution depuis plusieurs mois. (Je n'aime pas demander quelque chose sans avoir au préalable cherché la solution par moi même mais là, ça commence à devenir urgent !!!)
Je doit réaliser un module permettant la réception de données RFID et le traitement (simple) de ces données (je dois simplement pouvoir déterminer quelle carte à été présentée). Pour ce, J'utilise le module H1M-005P avec lequel je doit communiquer en RS232. Le pic est un 16F877A.
J'ai déjà réalisé ce code cependant, il ne reçois pas les données correctement. Toutes les cases du tableau sont remplie avec la même valeur, la première donnée reçue. Qu'ai-je bien pu oublier???
Code en C sous SourceBoost IDE:
#include <system.h>
#pragma DATA _CONFIG, _PWRTE_OFF & _BODEN_OFF & _WDT_OFF & _LVP_ON & _CPD_OFF & _DEBUG_OFF & _HS_OSC & _CP_OFF
#pragma CLOCK_FREQ 20000000
#define FOSC 20000000
#define spBAUD 9600
#define fSPBCLK (FOSC)
#define SPBRG_VAL ((fSPBCLK / (spBAUD * 16L)) - 1L)
#define VALEURBRG (20000000/16/spBAUD)-1
#define bit_time 520
int i=0, tab[10];
/******************/
/*Prototype de fonction*/
/******************/
void rs232_ini();
/*****************/
/*Fonction interruption*/
/*****************/
void interrupt( void )
{
if (pir1.RCIF)
{
tab[i]=rcreg; //mise en mémoir de la donnée présente sur le port RS232
i++;
clear_bit (pir1,RCIF);
}
}
void main()
{
adcon1 = 0x06; //port A en numérique
intcon = 0b11000000; //activation des interruptions
trise = porte = 0x00;
trisa = 0xFF;
rs232_ini(); //initialisation du pic en mode émmission RS232
while(1)
{
for(i=0; i<11; i++)
{
tab[i]=0; // initialisation du tableau
}
/****************************** *********/
/*Envoi de la demmande de lecture du transpondeur*/
/****************************** *********/
while(!TXIF); // Attente que le port RS232 soit libre
txreg=0xFF; // on envoie l'adresse du transpondeur sur le port série (FF sinifie que tous les transpondeurs peuvent répondre)
delay_ms(1); // Synchronise le pic et le module RFID
while(!TXIF); // Attente que le port RS232 soit libre
txreg=0x05; // on envoie la taille totale de la trame sur le port série
delay_ms(1); // Synchronise le pic et le module RFID
while(!TXIF); // Attente que le port RS232 soit libre
txreg=0xA2; // on envoie le code de lecture du transpondeur sur le port série
delay_ms(1); // Synchronise le pic et le module RFID
while(!TXIF); // Attente que le port RS232 soit libre
txreg=0xA5; // on envoie la premiere partie du checksum sur le port série
delay_ms(1); // Synchronise le pic et le module RFID
while(!TXIF); // Attente que le port RS232 soit libre
txreg=0x3E; // on envoie la deuxieme partie du checksum sur le port série
delay_ms(500); //Attente que toutes les données soit reçue
/**********************/
/*Teste des paramètres reçu*/
/**********************/
switch(tab[3])
{
case 0xFE : porte=0x01;break;
case 0xC9 : porte=0x02;break;
default : porte=0x04;
}
}
}
/****************************** */
/*Fonction initialisation du PIC en RS232*/
/****************************** */
void rs232_ini()
{
set_bit (pie1,RCIE); // Activer la récéption RS232
clear_bit( txsta, SYNC ); //mode asynchrone
set_bit( rcsta, SPEN ); //port série valide
clear_bit( rcsta, RX9 ); // 8 bits en réception
clear_bit( txsta, TX9 ); // 8 bits en emission
set_bit( rcsta, CREN ); //valide reception continue
set_bit( txsta, TXEN ); // valide emission
set_bit( txsta, BRGH ); //Bits/s=Fosc/(16(X+1)
spbrg=VALEURBRG; //9600 bits/s (X=71)
}
J'ai au maximum commenté le code afin qu'il soit le plus facile possible à comprendre cependant, si il y a quoi que ce soit que vous ne comprenez pas, Je suis à votre entière disposition.
Merci d'avance pour tous les renseignements que vous pourrez me donner
-----