IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Help lecteur de cartes T2G/bancaire avec un PIC


Sujet :

Embarqué

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Help lecteur de cartes T2G/bancaire avec un PIC
    Bonjour a tous voila j'ai un projet pour ma licence : celui de realiser un soft permettant de lire une carte T2G ou une carte bancaire avec l'aide d'une carte picdem 2+.

    Si j'ai bien compris, il faut envoyer mini 7 pulses de CLK sur la puce lorsque RST est 1 pour reset son compteur d'adresse.
    Puis CLk++ incremente ce compteur d'adresse, et CLK-- envoie la data sur le port IO.

    Si l'algo fonctionne bien, j'ai un bug plutot agacant : lors de la premiere lecture tout fonctionne bien pour la T2G.Mais lors des lectures qui suivent, cette fois les valeurs changent, ne sont plus les bonnes mais restent stables.Il semblerait que le compteur d'adresse saute une adresse apres la lecture du premier bit dans la T2G.

    Je pete les plombs pour savoir d'ou vient le probleme pourtant un reset sous MPLAB et il me ressort les bonnes valeurs.Puis quand j'enchaine les lectures, la les valeurs se bloquent a un autre chiffre.

    Voici mon main : a chaque appui sur INT,ca switch sur les differents etats : inserer carte,lecture carte,afficher valeur1,afficher valeur2...., enlever carte, puis retour a inserer carte etc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include "pic16f877a.h"
    #include "LCD.h"
    #include "lecteur.h"
    void init_PIC();
    char tableau[64]={0};
    char temp;
    int etat=1;
    
    void interrupt it()
    {
    	if(INTF && (etat==0))
    	{
    		cmd_LCD(0x01);
    		string_LCD("inserez carte");
    		
    	}
    	if(INTF && (etat==1))
    	{
    		init_lecteur();
    		lecture_carte();
    		cmd_LCD(0x01);
    		string_LCD("lecture ok");		 
    	}
    		
    	if(INTF && (etat==2))
    	{
    		affiche_id_circuit();		
    	}
    	if(INTF && (etat==3))
    	{
    		affiche_id_card();
    		
    	}
    	if(INTF && (etat==4))
    	{
    		affiche_code_service();
    		
    	}
    	if(INTF && (etat==5))
    	{
    		affiche_pouvoir_financier();
    		
    	}
    	if(INTF && (etat==6))
    	{
    		affiche_certificat();
    	}
    	if(INTF && (etat==7))
    	{
    		RC5=0;
    		cmd_LCD(0x01);
    		string_LCD("c good");
    		etat=-1;
    	}
    	etat++;
    	INTF=0;
    }
    
    void main ()
    {
    	init_PIC();
    	init_LCD();
    	string_LCD("inserez carte carte");
    	while(1);
    }
    
    
    
    void init_PIC()
    {
    	TRISD=0x00;     //le port D est reserver au LCD il fonctionne niquel      
    	PORTD=0x00; 
    	TRISC=0x00;//RC0=RW sur puce (ISO4) RC1=RESET RC5=VCC+VPP puce
    	TRISB=0b11101111;//RB4=CLK RB5 = IO
    	RST=0;
    	RWC=1; //reset
    	CLK=0;//front montant : AC++ front decendant : data output
    	INTCON=INTCON|0b10010000;
    	INTF=0;
    	RC5=0;  //on deconnecte la puce
    }
    voici lecteur.c avec notamment la fonction lecture_carte() qui semble fonctionner lors du reset sous mplab mais qui bug lors des prochaines lectures.Pourtant j'initialise mon tableau dans la ram juste avant chaque lectures...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    #include "lecteur.h"
    #include "pic16f877a.h"
    #include "LCD.h"
    extern char tableau[64];
    extern char temp;
    
    void init_lecteur()
    {
    	RC5=1;
    	int i;
    	RST=1;
    	for(i=0;i<20;i++)
    	{
    		CLK=1;
    		CLK=0;
    	}	
    	RST=0;
    }
    
    void lecture_carte()
    {	
    	init_tableau(tableau,64);
    	int i,j;
    	for(i=0;i<64;i++)
    	{
    		
    		for(j=0;j<8;j++)
    		{	
    			CLK=0;
    			temp=IO; //bug sa mere?
    			temp=temp<<(7-j);
    			tableau[i]=tableau[i]+temp;
    			CLK=1;
    		}
    	
    	}
    }
    
    char toASCII(char nombre)
    {
    	if(nombre<10)
    		return nombre+48;
    	else switch(nombre)
    			{
    				case 10 : return 'A';
    				break;
    				case 11 : return 'B';
    				break;
    				case 12: return 'C';
    				break;
    				case 13 : return 'D';
    				break;
    				case 14 : return 'E';
    				break;
    				case 15 : return 'F';
    				break;
    				default : return ' ';
    				break;
    			}
    }
    
    void affiche(int debut,int duree,char* string)
    {
    	cmd_LCD(0x01);
    	string_LCD(string);
    	goto_line2();
    	while(duree!=0)
    	{
    		temp=tableau[debut++];
    		char_LCD(toASCII((temp>>4)&0x0F));
    		duree--;
    		if(duree!=0)
    		{
    			char_LCD(toASCII(temp&0x0F));
    			duree--;
    		}
    	}
    }
    
    void affiche2(int debut,char* string,int id)
    {
    	cmd_LCD(0x01);
    	string_LCD(string);
    	goto_line2();
    	switch(id)
    	{
    		case 1 : char_LCD(toASCII(tableau[debut]&0x0F));
    			     ((tableau[debut]&0x0F)==0x00) ? string_LCD(" T2G standard") : string_LCD(" T2G eurostar");
    		break;
    		case 2 : switch(tableau[debut]&0x0F)
    				 {
    					case 12 : string_LCD("120 unites");
    					break;
    					case 5 : string_LCD("50 unites");
    					break;
    					case 3 : string_LCD("25 unites");
    					break;
    					case 1 : string_LCD("5 unites");
    					break;
    				 } 
    		break;
    	}
    }
    
    void init_tableau(char tableau[],int nombre)
    {
    	int i;
    	for(i=0;i<nombre;i++)
    	{
    		tableau[i]=0;
    	}
    }
    et lecteur.h histoire de savoir un peu ce que font mes fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #define affiche_id_circuit(); affiche(0,4,"id circuit :");
    #define affiche_id_card(); affiche(2,9,"id carte :");
    #define affiche_code_service(); affiche2(6,"Code service :",1);
    #define affiche_pouvoir_financier(); affiche2(7,"pouvoir financier :",2);
    #define affiche_certificat(); affiche(14,4,"certificat :");
    #define RWC RC0
    #define RST RC1
    #define CLK RB4
    #define IO RB5
    
    void init_lecteur();
    void lecture_carte();
    char toASCII(char nombre);
    void init_tableau(char tableau[],int nombre);
    void affiche(int debut,int duree,char* string); //string : la string a affiche en ligne 1
    											  //debut : case x du tableau (1case = 2nombres);
    											  //duree : nombre de chiffres hex demande
    void affiche2(int debut,char* string,int id);//pareil qu'au dessus mais s'occupe des deuxieme case 
    												//affiche 1 ne permet pas de s'affranchir de la premiere case
                                                    //ex code service utilise le 2eme quarter de l'octet 6 (7eme octet)
                                                    //permet donc d'afficher seulement la deuxieme case d'un octet
                                                    //id permet de savoir quelle affiche a appeler la fonction afin de personnaliser l'affichage
    //affiche : affiche le tableau en hexadecimal du debut pendant toute la duree
    //affiche2 : affiche le deuxieme quartet d'un octet du tableau
    Voila si vous avez des pistes je suis carrement prenneur j'arrive pas a cerner d'ou peut venir le probleme.

    Merci

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Techniquement mon tableau lors du reset et de la premiere lecture me donne les bonnes valeurs : 81 40 38 91 33 67 ...
    Lors de la deuxieme et de toutes les lectures suivantes, mon tableau contient ca : 82 00 71 22 66 CE...

    La transition de l'un à l'autre se fait en enlevant un bit '0' apres le premier bit lu lors de la deuxieme lecture : tout les bits suivants le premier bit sont decales sur la gauche donc je pense que le compteur de la puce saute la lecture d'un bit apres le premier bit lu.

    Pourquoi?mystere

    Ou sinon que fait le reset de mplab de si special? pour moi simplement mettre le PC à 0x00 et effectuer un clear de la RAM

Discussions similaires

  1. Soucis avec lecteur de carte à puce sous linux
    Par Maisondouf dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 20/02/2012, 14h53
  2. Réponses: 1
    Dernier message: 04/01/2012, 14h39
  3. [WD14] Communication avec un lecteur de carte magnétique
    Par cyclopsnet dans le forum WinDev
    Réponses: 4
    Dernier message: 07/03/2011, 10h14
  4. Problème avec lecteur de carte d'identité
    Par adrien954 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 24/12/2010, 15h47
  5. Gestion lecteurs de cartes bancaires
    Par Trunks dans le forum C++
    Réponses: 18
    Dernier message: 22/04/2009, 14h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo