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
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 "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 }
et lecteur.h histoire de savoir un peu ce que font mes fonctions :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; } }
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
-----