Help lecteur de cartes T2G/bancaire avec un PIC
Répondre à la discussion
Affichage des résultats 1 à 20 sur 20

Help lecteur de cartes T2G/bancaire avec un PIC



  1. #1
    invite40805967

    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:
    #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:
    #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:
    #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
    invite40805967

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    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

  3. #3
    RISC

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    Salut,

    Utilises-tu un quartz ?
    Il y a à la base un problème de conception dans ton logiciel, même si ce n'est peut-être pas la source de ton PB actuel...
    Tu fais des traitements trop lourds dans les interruptions (string LCD,...) au lieu de les faire dans le programme principal.
    Tu vas avoir des problèmes de temps-réel...
    Je te recommande de changer tes interruptions et de faire la partie affichage dans le programme principal.

    a+

  4. #4
    invite40805967

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    oui un quartz de 4 Mhz (donc cycle d'instruction de 1micro seconde) j'ai essayer de regarder la bande passante max d'une carte a puce mais j'ai pas trouver mais je suppose qu'une simple logique cablée peut supporter du 1 Mhz.
    De toute facon même avec des tempo a droite a gauche je garde toujours le meme probleme.

    Oui c'est clair et net mes traitements d'interruptions sont lourd mais de toute facon le temps d'attente entre 2 interruptions est de minimum 5 à 10 secondes pour la présentation du projet donc ca n'est pas réellement un probleme même si c'est clair que ca fait plus propre de traiter l'interruption dans le main et de vite degager de l'interrupt.

    Enfin j'ai essayer de faire un while (!INTF); histoire d'attendre l'interruption mais le soft marche pas si tu sais comment attendre une interruption dans un main via une boucle infini et qu'une fois l'interruption traiter je passe au step d'apres la boucle je suis preneur.Comme j'ai pas reussi j'ai justement traiter l'interruption dans le programme d'interrupt même si c'est lourd.

    J'ai remarquer qu'apres un reset de mplab, le soft fonctionne niquel pour la premiere lecture.
    Ensuite toutes les autres lectures merdent sait tu ce que fait ce reset de si particulier ?

    Merci de ta repondre en tout cas

  5. A voir en vidéo sur Futura
  6. #5
    RISC

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    Salut,

    Quel compilateur utilises-tu ?
    Quel outil de programmation / debug ?
    As-tu essayé de déboguer et de voir l'état de tes variables ?
    Mets un point d'arrêt dans ton interruption pour voir si elle vient régulièrement

    a+

  7. #6
    invite40805967

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    j'utilise HI-TECH comme compilateur c.

    Mplab avec un ICD3 et un pic 16f877a sur une picdem2+ avec quartz a 4mhz.

    Oui les variables jles ai suivis de tres pret pendant 2 jours non stop en fait j'ai rien trouver qui clochait au niveau des variables.j'ai mis des break points un peu partout suivi mon tableau a la loupe...

    En fait le tableau contient les 512 bits de la mémoire de la carte telephonique T2G.A chaque impulsion sur CLK, le compteur d'adresse de la T2G augmente d'une unite et envoie la data sur IO .Arrive a 512, le compteur revient a 0et c'est reparti.

    Mon tableau contient donc tout les octets de la T2G.

    Si lors de la premiere lecture mon tableau est exacte, lors des lectures suivantes il prend une valeur differente (valeur qui reste la même pendant toutes les autres lectures).

    Il semblerait que ce soit lors du premiere/deuxieme bit generer le compteur d'adresse saute un bit lors de la 2 eme lecture et plus.Va savoir j'ai penser a un defaut de la carte telephonique T2G mais pourtant entre l'etat 7 et l'etat 1 je coupe l'alim de la puce et je la réactive (afin justement de simuler le reset de mplab).

    Seul le reset de mplab parvient a me remettre en mode "premiere lecture" et a m'afficher les bonnes valeurs.
    C'est pour ca je cherche a comprendre ce que fait ce reset de si special? j'ai pourtant couper l'alim et reactiver l'alim de la puce,et effacer mon tableau entre l'etape 7 et l'etape 1.

  8. #7
    RISC

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    Salut,

    Le RESET ne fait rien de special ou tout du moins il fait toujours la même chose.
    Le problème est très certanement dans ton programme...

    Quel version du compilateur HiTech utilises-tu ?
    La dernière est la v9.83 que tu peux télécharger ici : http://www.microchip.com

    Si certaines de tes variables sont des non signés il vaut mieux les déclarer en unsigned char ou unsigned int...

    a+

  9. #8
    invite40805967

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    oui j'utilise la v9.83 .

    Pourquoi vaut il mieux declarer unsigned char plutot que juste char par curiosite?

    Jsais pas c'est un bug bizare si ya un specialiste des cartes a puce synchrones sur le forum jsuis preneur lol

  10. #9
    RISC

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    Salut,

    Il va te falloir plus que de la curiosité....

    ATTENTION au types par défaut en langage C : http://www.commentcamarche.net/contents/c/ctype.php3

    Les types par défaut sont signés...donc 0x80 est < à 0x7F (exemple pour un char)

    Cela peut provoquer des bugs sans fin...

    a+

  11. #10
    invite40805967

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    O oui je sais qu'ils sont signés de base mais je resonne en binaire le fait que ce soit signé ne pose de probleme que lorsque l'on fait une addition, une soustraction ou bien une conversion vers decimal je me trompe.

    Mais de toute facon j'ai tout declarer en unsigned char maintenant c'est mieux tu as raison

    Deuxieme chose sait tu pourquoi l'on dit que la carte bancaire est une carte a puce asynchrone?non parce que ya une entrée CLK sur la puce jme demande ce que ca vient foutre la si c'est asynchrone!

    Merci en tout cas

  12. #11
    invite40805967

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    Merci enormement RISC c'etait ca le probleme qui provoquait comme tu dis un bug sans fin il fallait que je declare mes variables unsigned char c'etait vraiment con justement comme je faisais une addition avec une variable signée ca a du foutre la m...

    Bon le probleme apparait quand meme dans 1% des cas maintenant mais tres franchement c'est deja un grand pas.

    Merci encore

  13. #12
    invite40805967

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    Ben non toujours le même probleme c'est un defaut intermittent jsuis convaincu que le PIC est mort (a la base la pic dem et le PIC sont preter par la fac donc ont ete beaucoup utilisés) enfin merci quand meme

  14. #13
    RISC

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    Salut,

    Les défauts intermittents sont...très rare dans les microcontrôleurs...Le problème est très très certainement logiciel.
    Un PIC ne marche pas à moitié... Soit il est grillé soit il fonctionne.

    Il est également possible que tu fasses fonctionner ton PIC à trop basse fréquence pour le logiciel que tu as écrit...
    Je ne comprends d'ailleurs pas bien pourquoi tu le fais tourner si lentement...
    Essaye un quartz plus rapide (8MHz ou même 20MHz)

    a+

  15. #14
    invite40805967

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    Ben le truc c'est que j'ai essayer mon soft des centaines de fois aujourdhui : un coup ca me fou toujours les bonnes valeurs.Puis une cinquantaine de fois dapres ca me fou les mauvaises valeurs puis ensuite ca alterne lol serieux j'en peuxplus

    4Mhz parce que c'est un truc de fac le quartz est deja installer sur la picdem mais peux tu expliciter un peu plus le "je fais fonctionner le PIC à trop basse frequence par rapport au logiciel" stp?

    Pareil autre souci quand je met la broche IO censer recevoir les données de la puce T2G sur toutes les ports B ou C (sauf RC7) ca passe...mais des que je le met sur RC7 (broche TX) ca merde pourtant je desactive bien lUSART et je met le registre TRISC bit 7 en entree...

    J'ai racheter un PIC et non toujours ces deux memes problemes lol

  16. #15
    invite33379c3e

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    Bonjour,

    Puis-je voire ton fichier lcd.h?

  17. #16
    invite40805967

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    oui bien sur :

    Code:
    #define VCC RD7
    #define E RD6
    #define RW RD5
    #define RS RD4
    #define BUSY_FLAG 0x80
    
    void tempo_1_ms();
    void tempo_N_ms(int N);
    void init_LCD();
    void cmd_LCD(char cmd);
    void char_LCD(char data);
    void string_LCD(char* chaine);
    int LCD_busy();
    int read_LCD();
    void goto_line1();
    void goto_line2();
    void goto_n(int n);   //n allant de 1 à 16 (ligne 1)et de 17 à 32 (ligne 2)
    void shift_right(int n); //deplacement de n cases puis retour a la case 1
    void shift_left(int n);  //same
    Mais le code du LCD marche niquel

  18. #17
    invite0e5af214

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    Ca me semble classique comme comportement PIC -> L'ADC activé par defaut n'est pas désactivé.

    Ajoute ADCON1 = 0xFF; dans ta fonction initPic()

  19. #18
    invite40805967

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    ADCON ne concerne que le port A et E or mon LCD est brancher entièrement (control + data) sur le port D et la puce est brancher sur un mix port C et B.

    Donc à priori je n'utilise que des entrées/sorties entièrement digitales.

    Et ca fonctionne toujours lors de la première lecture c'est lors des lectures suivantes que ca merde.

    Pourtant j'initialise le compteur d'adresse de la puce à 0 puis je lis une à une les data contenu dans l'EEPROM de la puce au fur et à mesure que j'incrémente mon compteur d'adresse.Il semblerait qu'après la lecture de la première case mémoire de la puce, le compteur d'adresse saute une adresse pour une raison inconnue.

    Il faudrait que j'ai acces a un programme en C qui fonctionne à 100% pour comparer et voir mon erreur (si j'ai le code ASM je suis quand même preneur lol)

    Enfin merci quand même!

  20. #19
    RISC

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    Salut,

    Avant de continuer à tourner en rond, on va revérifier ton circuit.
    Peux-tu poster ton schéma électrique (même fait à la main).
    tu as une carte PICDEM 2 PLUS verte ou rouge ?
    Ton quartz est-il un boitier vertical à 2 broches ou un boitier horizontal à 4 broches dans les coins sur un support tulipe 14 broches.
    Sur cette carte il y a des cavaliers autour du quartz ? comment sont-il positionnés ?

    a+

  21. #20
    invite40805967

    Re : Help lecteur de cartes T2G/bancaire avec un PIC

    Bien sur le schém éléctrique rien de bien transcendant j'ai directement relié le PIC a la puce :

    img106.jpg

    carte pic dem 2 + verte quartz 4 Mhz boitier vertical (dans mes souvenirs) ya 3 cavaliers : le cavalier des leds je l'ai enlever.Le cavalier du quartz je l'ai enlever (pour activer le quartz externe) et le cavalier du buzzer pareil enlever.

    Le PIC lit niquel toute l'EEPROM de la puce sauf que lors de la seconde lecture MINIMUM il semblerait que le compteur d'adresse saute une case mémoire de la puce aprés la lecture de la première case mémoire.(la seconde case est sauté vraisemblablement je sais c'est tordu).

    Je peux vous mettre un screen de mon tableau contenant toutes les données de L EEPROM de la puce si vous voulez.

    Enfin merci de votre aide
    Images attachées Images attachées  

Discussions similaires

  1. lecteur de cartes
    Par sepp dans le forum Matériel - Hardware
    Réponses: 4
    Dernier message: 09/10/2008, 10h23
  2. Probleme lecteur de cartes
    Par invite8c79efb5 dans le forum Matériel - Hardware
    Réponses: 2
    Dernier message: 09/02/2006, 21h24
  3. Lecteur de cartes magnétiques ...
    Par invite5cfe9b8f dans le forum Électronique
    Réponses: 0
    Dernier message: 18/11/2004, 12h13
  4. 2 cartes reseau dans un PC en reseau avec un lecteur KISS
    Par invite217f5e77 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 1
    Dernier message: 19/07/2004, 23h16
  5. lecteur T2G
    Par invite1d0787d6 dans le forum Électronique
    Réponses: 1
    Dernier message: 18/03/2004, 14h45
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...