PIC18f452 + MCP2200 - Page 4
Répondre à la discussion
Page 4 sur 5 PremièrePremière 4 DernièreDernière
Affichage des résultats 91 à 120 sur 121

PIC18f452 + MCP2200



  1. #91
    gautyy5

    Re : PIC18f452 + MCP2200


    ------

    Et pourtant chez moi ça marche nikel, sauf pour l'affichage des secondes que je n'arrive pas à avoir correctement...

    -----

  2. #92
    paulfjujo

    Re : PIC18f452 + MCP2200

    sauf pour l'affichage des secondes
    nota:
    j'avais remarqué des aleas aussi avec printf
    j'ai donc plutot utilisé fprint-_H_USART,.. pour la mise en forme
    et le format 5u au lieu de 5d car UNSIGNED...

    voici l'exemple de mon code utilisé

    Code:
    
    
    while(1)
     {
        if  (seconde==1)
         { 
             secs++;
              seconde=0;
         }
        if  (received==1)                 
    	{	
    		n1++;
    		if (n1>5)
    		{		
        k=fprintf(_H_USART,(const rom unsigned char *)"CYCLE_ANALYST: %s  COMPTE_TOUR: %05u    Secs=%05u \r\n  ",buffer,compteur,secs );
    		n1=0;
    		}
    		received=0;  // raz drapeau rx uart
      		Index1=0;
      		i1=0;
      		buffer[0]=0;
    		RCREG=0;
    	}
    	else
    	{
    
       readDS1307();
       Transform_Time_BCD_To_Binary(sec,  min,  hr,  week_day, day,  mn, year);
          
       addr=LCD_ADDR; 
       k=fprintf(_H_USART,(const rom unsigned char *)"Time is %02d:%02d:%02d  ",hr,min,sec); 
       LCD_putcmd(LCD_LINE1,1);  
       txt=&Texte[0];
       k=sprintf(txt,(const rom unsigned char *)"Time is %02dH %02d %02ds  ",hr,min,sec); 
       LCD_puts(txt);
          
        txt=&Texte[0];
       LCD_putcmd(LCD_LINE2,1);  
       k=sprintf(txt,(const rom unsigned char *)"Date is  %02d/%02d/20%02d  ",day,mn,year); 
       LCD_puts(txt);
      
    	 
       LCD_putcmd(LCD_LINE3,1);
       txt=&Texte[0];
       k=sprintf(txt,(const rom unsigned char *)"Secs=%05d ",secs); 
       LCD_puts(txt);   
       LCD_putcmd(LCD_LINE4,1);
       txt=&Texte[0];
       k=sprintf(txt,(const rom unsigned char *)"Tour=%05d ",compteur); 
       LCD_puts(txt);   // 10-Bit ADC Value for DAC	 
     
         } 
    }
    et le script terminal VBRAY qui envoi la trame cycle toutes les 200mS

    Code:
    program CycleAnalyst;
    
    var msg: string;
    var j: integer;
    
    
    //
    begin
    msg:='159.59	50.79	0.1	0.00	0.0000;'+chr(13)+chr(10);
    ShowMessage('Send Cycle Analyst msg'+chr(10)+chr(13));
    Delay(1400);
    begin
    j:=0;
    while (j<10000) do
    begin  
       ComSendStr(msg);
       Delay(200);
    j:=j+1;
    end;
    end;
    end.
    Dernière modification par paulfjujo ; 12/06/2014 à 09h10.

  3. #93
    gautyy5

    Re : PIC18f452 + MCP2200

    Ca ne marche toujours pas, en fait c'est la fin de la trame d'affichage qui a un problème à chaque fois.
    Les caractères sont corrects jusqu'à la fin de chaque ligne, quoi que j'écrive dans le printf (ou fprintf)...

  4. #94
    gautyy5

    Re : PIC18f452 + MCP2200

    Pour tester, j'ai échangé la place de compteur et de secs dans l'affichage comme ceci:
    Code:
    k=fprintf(_H_USART,"CYCLE_ANALYST: %s ;	  COMPTE_TOUR: %05u ;	SECS: %05u\r\n",buffer,secs,compteur);
    Je constate que là, l'affichage des secondes est nikel, mais encore une fois ça ne marche plus après le deuxième paramètre (en rouge)
    Code:
    CYCLE_ANALYST: -159.46	50.62	0.1	0.00	0.0000 ;	  COMPTE_TOUR: 00012 ;‰û®¨*'‚j
    CYCLE_ANALYST: -159.46	50.61	0.1	0.00	0.0000 ;	  COMPTE_TOUR: 00013 ;KïÔMé 0
    De base, j'avais cet affichage:
    Code:
    k=fprintf(_H_USART,"CYCLE_ANALYST: %s ;	  COMPTE_TOUR: %05u ;	SECS: %05u\r\n",buffer,compteur,secs);
    Avec ce résultat:
    Code:
    JCYCLE_ANALYST: -159.45	50.63	0.9	0.00	0.0000 ;	  COMPTE_TOUR: 00870 ;I[W¨*'’Êj
    CYCLE_ANALYST: -159.45	50.68	0.1	0.00	0.0000 ;	  COMPTE_TOUR: 00450 ;KïÔMé 30

  5. #95
    paulfjujo

    Re : PIC18f452 + MCP2200

    Ce comportement erratique est tout à fait anormal
    et l'ordre n'a aucune importance (en theorie)

    En pratique, je ne sais pas trop comment le compliateur gere le printf
    et la memoire RAM intermediare indispensable
    et je supose qu'il doit y avoir un probleme de chevauchement de BANK RAM
    j'ai deja rencontré ce genre d'incident, resolu en deplacant l'ordre de decalaration de variable
    ou en modifiant le linker pour accoler des BANK RAM

    mes tests sont realisés avec un 18F26K22 qui a >3,8Ko de ram et 65K de ROM
    de plus j'ai declaré le buffer dans une zone bien specifique et reservée de 512 bytes

    Code:
    #define MAXLEN 40
    #define MAXLEN1 128
    
    #pragma udata GrossBank
    static unsigned char bufferMAXLEN1];
    #pragma udata
    avec un fichier linker modifié pour.

    Dans ce genre de probleme il faut analyser le fichier de sortie asm
    pour verifier s'il peut y avoir des probleme de changement de page ou bank RAM.

    poste le resultat de compilation pour voir les warnings residuels ....

  6. #96
    gautyy5

    Re : PIC18f452 + MCP2200

    Je t'avouerai que je n'ai pas tout compris...
    Tu veux que je poste le résultat de compilation de MPLAB?

    Code:
    Clean: Deleting intermediary and output files.
    Clean: Done.
    Executing: "C:\mcc18\bin\mcc18.exe" -p=18F452 "fonctionne.c" -fo="fonctionne.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
    G:\Stage\Compte-tour\MPLAB\fonctionne\fonctionne.c:202:Warning [2066] type qualifier mismatch in assignment
    G:\Stage\Compte-tour\MPLAB\fonctionne\fonctionne.c:212:Warning [2066] type qualifier mismatch in assignment
    Executing: "C:\mcc18\bin\mplink.exe" /l"C:\mcc18\lib" /k"C:\MCC18\lkr" "C:\MCC18\lkr\18f452.lkr" "fonctionne.o" /m"fonctionne.map" /w /o"fonctionne.cof"
    MPLINK 3.90, Linker
    Copyright (c) 2004 Microchip Technology Inc.
    Errors    : 0
    
    MP2HEX 3.90, COFF to HEX File Converter
    Copyright (c) 2004 Microchip Technology Inc.
    Errors    : 0
    Ces warnings proviennent des printf que j'ai dans le programme:
    Code:
    k=fprintf(_H_USART,"CYCLE_ANALYST: %s ;	  COMPTE_TOUR: %05u ;	SECS: %05u",buffer,compteur,secs);
    		  printf("\r\n");

  7. #97
    paulfjujo

    Re : PIC18f452 + MCP2200

    ton resultat de compil n'est pas tres bavard
    seulement 2 warning !

    et ta version MPLAB est obsolete !
    j'utilise la derniere version MPLAB V 8.92
    et derniere version C18


    Code:
    ----------------------------------------------------------------------
    Release build of project `C:\_C18\_MesProjets_C18\_18F26K22\18F26K22_LCD4x20_I2C_For_Tests.mcp' started.
    Language tool versions: MPASMWIN.exe v5.47, mplink.exe v4.45, mcc18.exe v3.44, mplib.exe v4.45
    Thu Jun 12 11:23:41 2014
    
    
    MPLINK 4.45, Linker
    Device Database Version 1.10
    Copyright (c) 1998-2011 Microchip Technology Inc.
    Errors    : 0
    
    MP2HEX 4.45, COFF to HEX File Converter
    Copyright (c) 1998-2011 Microchip Technology Inc.
    Errors    : 0

  8. #98
    gautyy5

    Re : PIC18f452 + MCP2200

    Je vais essayer de mettre à jour le logiciel ainsi que le compiler alors, je vous tiens au courant dès que je l'ai testé sous ce logiciel.

  9. #99
    gautyy5

    Re : PIC18f452 + MCP2200

    J'ai installé MPLAB + le compiler C18, mais quand je compile j'ai ceci:
    Code:
    Error - Device not specified. Use /p option to specify a device.
    Errors    : 1
    Je ne comprends pas ce que c'est...

  10. #100
    paulfjujo

    Re : PIC18f452 + MCP2200

    il faut verifier que tous les chemins soient bien precises:
    projet
    Build options for project
    output directory ex: C:\_C18\_MesProjets_C18\_18F26 K22
    intermediate directory ex: C:\_C18\tmp
    include search path ex: C:\Program Files\Microchip\mplabc18\h
    librairie Search path ex:C:\Program Files\Microchip\mplabc18\lib
    linker search path ex: C:\Program Files\Microchip\mplabc18\bin\L KR
    il va sans dire, que les chemins peuvent etres differents que
    ceux que j'utilise..

    et aussi
    set langage tools suite
    Active tools suite ex: Microchip C18 toolsuite
    Location ex: C:\Program Files\Microchip\mplabc18\bin\m cc18.exe
    et dans le programme
    #include <p18f452.h>
    Dernière modification par paulfjujo ; 12/06/2014 à 13h33.

  11. #101
    gautyy5

    Re : PIC18f452 + MCP2200

    J'ai gardé ma version actuelle de MPLAB, j'ai juste mis à jour le C18.

    J'ai modifié les affichages:
    Dans le void juste avant la boucle FOREVER:

    Code:
    putrsUSART("\r\n");
    putrsUSART("    		CYCLE_ANALYST		   COMPTEUR 		SEC\r\n");
    Dans la boucle FOREVER:
    Code:
    putrsUSART("\r\n");
    		  k=fprintf(_H_USART,"%s   |	 %05u |	%05u",buffer,compteur,secs);
    Et j'ai comme affichage:
    Code:
    CYCLE_ANALYST			                 COMPTEUR	SEC
    
    -159.40	50.55	0.2	0.00	0.0000 ;	  00000 ;	00003
    -159.40	50.55	0.2	0.00	0.0000 ;	  00000 ;	00004
    -159.40	50.56	0.3	0.00	0.0000 ;	  00000 ;	00005
    -159.40	50.56	0.3	0.00	0.0000 ;	  00000 ;	00006
    -159.40	50.56	0.3	0.00	0.0000 ;	  00000 ;	00007
    -159.40	50.56	0.3	0.00	0.0000 ;	  00000 ;	00008
    -159.40	50.53	0.8	0.00	0.0000 ;	  00000 ;	00009
    -159.40	50.47	2.2	0.00	0.0000 ;	  00120 ;	00010
    -159.40	50.39	5.1	0.00	0.0000 ;	  01080 ;	00011
    -159.40	50.40	5.4	0.00	0.0000 ;	  01245 ;	00012
    -159.40	50.33	7.2	0.00	0.0000 ;	  02055 ;	00013
    -159.40	50.29	8.0	0.00	0.0000 ;	  02535 ;	00014
    -159.39	50.33	6.2	0.00	0.0000 ;	  03135 ;	00015
    -159.39	50.41	3.7	0.00	0.0000 ;	  03465 ;	00016
    -159.39	50.46	2.7	0.00	0.0000 ;	  02850 ;	00017
    -159.39	50.47	1.4	0.00	0.0000 ;	  02100 ;	00018
    -159.39	50.51	0.4	0.00	0.0000 ;	  01395 ;	00019
    -159.39	50.49	0.2	0.00	0.0000 ;	  00600 ;	00020
    -159.39	50.51	0.1	0.00	0.0000 ;	  00525 ;	00021
    -159.39	50.49	0.3	0.00	0.0000 ;	  00600 ;	00022
    -159.39	50.49	0.3	0.00	0.0000 ;	  00000 ;	00023
    -159.39	50.49	0.2	0.00	0.0000 ;	  00000 ;	00024
    Ca m'a l'air nikel comme ceci!!

  12. #102
    paulfjujo

    Re : PIC18f452 + MCP2200

    Nickel-chrome!

    les warning 2006 ont disparu ?

    Code:
     k=fprintf(_H_USART,"%s   |	 %05u |	%05u",buffer,compteur,secs);
    je ne savais pas que | generait un point virgule !

    juste pour verifier la contre-mesure :

    Est-ce çà fonctionne pareil lorsque tout est dans le meme
    Code:
    k=fprintf(_H_USART,"...
    avec melange de constantes TEXTE et de variables ..

  13. #103
    gautyy5

    Re : PIC18f452 + MCP2200

    Citation Envoyé par paulfjujo Voir le message
    Nickel-chrome!

    les warning 2006 ont disparu ?

    Code:
     k=fprintf(_H_USART,"%s   |	 %05u |	%05u",buffer,compteur,secs);
    je ne savais pas que | generait un point virgule !
    Les warnings sont toujours présents oui...

    Oups, j'ai modifié les ; en | entre temps j'avais pas fait attention!
    Au final j'ai même supprimé les démarcations, puisqu'au final je transfère ce fichier dans un fichier excel, du coup les démarcations se font automatiquement!

    En plus je me rends compte que de mettre le texte au tout début rend la lecture plus pratique, comme un tableau!

    Et pour le fprintf, ça fonctionne comme tout à l'heure, vraiment bizarre...
    Dernière modification par gautyy5 ; 12/06/2014 à 15h54.

  14. #104
    gautyy5

    Re : PIC18f452 + MCP2200

    Y a-t-il moyen de remplacer les points par les virgules dans le programme pour les données du Cycle Analyst ou il faut forcément le faire via Excel?

  15. #105
    gautyy5

    Re : PIC18f452 + MCP2200

    Et dernier problème:
    J'aimerais utiliser un mini PC qui pourrait supporter le MCP2200 et avoir un hyperterminal pour pouvoir l'emmener facilement sur la moto pour faire les mesures.
    Est-ce que ceci pourrait convenir (je ne m'y connais pas vraiment...):
    Ou encore celui ci

    Le MCP2200 peut-il fonctionner sur android? Et existe-t-il un hyperterminal convenable?

    Sinon, y a t il une autre solution pour pouvoir continuer avec windows 7?

  16. #106
    paulfjujo

    Re : PIC18f452 + MCP2200

    les soluces Mini PC Android .. c'est tres petit ,pas emcombrant, pas cher,
    mais il faut racorder dessus un clavier et un ecran !
    As tu regardé coté tablette Android ..
    tu envoie les donnees en BlueTooth via un module BT HC06 connecté sur le TX
    de l'UART PIC au lieu du MCP200.
    et tu trouve un appli simili excel
    tu peux aussi developper ton programme en RFO BASIC ! ou avec Appinventor.


    ou un EEPC (avec clavier ecran) , mais plus encombrant et autonomie ...?..

  17. #107
    gautyy5

    Re : PIC18f452 + MCP2200

    Je n'ai pas assez de temps pour ça, mon stage se termine la semaine prochaine... Je dois finir ceci avec ce que j'ai fait, c'est à dire programme sur MPLAB, MCP2200 etc..
    Les mini PC android peuvent se brancher en HDMI. Il suffirait de configurer les connexions via l'hyperterminal lorsque le PC est branché à un écran, de lancer l'enregistrement, de le débrancher pour le mettre sur la moto et ça enregistrera automatiquement lorsque le contact est effectué non?
    Mais je sais pas si le MCP2200 est compatible avec android

    Sinon y a-t-il d'autres solutions?

  18. #108
    paulfjujo

    Re : PIC18f452 + MCP2200

    de le débrancher pour le mettre sur la moto
    en supposant donc que son alim n'est JAMAIS coupée dans la manoeuvre
    init sur ecran TV via HDMI + clavier , transfert sur la moto, retour sur ecran TV HDMI + clavier..
    que le debranchement /rebranchement du clavier ne le perturbe pas (le programme terminal)
    à moins d'emmener le clavier connecté au mini PC, sur la moto ?

  19. #109
    gautyy5

    Re : PIC18f452 + MCP2200

    Je ne sais pas, on peut trouver un autre mini PC pour cela, mais je ne sais pas si mon montage fonctionnerait correctement avec android.
    Aucune idée si le MCP2200 est compatible, s'il y a un hyperterminal qui me permettrai d'enregistrer les informations sur un bloc note.
    Si déjà ça c'est possible, alors je verrai le PC qui correspondrait le mieux.

    Sinon, sous windows et pas cher, je trouve pas pour le moment..

  20. #110
    paulfjujo

    Re : PIC18f452 + MCP2200

    sinon,il te reste le stockage via ton PIC, sur des EEPROM 24LC256 ou 512
    et depouiller sur PC apres coup..
    ou via une carte SD 1go , mais ce PIC sera un peu trop juste en RAM et ROM..

  21. #111
    gautyy5

    Re : PIC18f452 + MCP2200

    Sur une cartr SD? Je vais devoir regarder alors parce que je n'ai aucune idée de savoir comment faire

  22. #112
    paulfjujo

    Re : PIC18f452 + MCP2200

    déja testé ICI
    Dernière modification par paulfjujo ; 13/06/2014 à 17h24.

  23. #113
    gautyy5

    Re : PIC18f452 + MCP2200

    Bonjour!

    Je reviens après quelques jours d'absence, et une question:
    Est-il possible d'utiliser un data logger pour enregistrer ces informations sur la moto?

  24. #114
    gautyy5

    Re : PIC18f452 + MCP2200

    Citation Envoyé par paulfjujo Voir le message
    déja testé ICI
    Avec ce test, il suffit de connecter les broches comme indiquées sur le schéma?
    Et niveau programmation, cela entraînerait de grosse modifications dans mon programme?
    Je suis désolé de ces questions, je n'ai jamais traité la mémoire du PIC 18f452 et l'enregistrement via le PORTC, c'est la première fois que je le vois :/

    Et comment faire la conversion ensuite pour récupérer correctement les données? Parce que j'imagine que les données ne vont pas s'enregistrer comme si j'utilisais le MCP2200
    Dernière modification par gautyy5 ; 19/06/2014 à 11h30.

  25. #115
    gautyy5

    Re : PIC18f452 + MCP2200

    Avant de faire cela, je dois récupérer une dernière valeur (on vient de me le dire à l'instant).
    Il s'agit d'une valeur de résistance d'un capteur de température.
    Pour la récupérer et l'inclure dans mon UART, je dois utiliser le PORTA pour cela non?

  26. #116
    paulfjujo

    Re : PIC18f452 + MCP2200

    bonjour,



    Avec ce test, il suffit de connecter les broches comme indiquées sur le schéma?

    Le schema proposé est ici pour çà, mais tu peux tres bien envisager d'autres combinaison d'entree sortie affectée
    du moment que le programme s'y retrouve.


    Et niveau programmation, cela entraînerait de grosse modifications dans mon programme?
    Le rajout de cette fonctionalité ne modifiera pas ton application déja presente,
    mais necessite des ressources en RAM et ROM relativement importantes
    et je ne sais pas si ce PIC peut le supporter..
    Consulte le source C18 fournit dans mon exemple , ... et propose nous quelque chose en retour..

    Et comment faire la conversion ensuite pour récupérer correctement les données?
    Parce que j'imagine que les données ne vont pas s'enregistrer comme si j'utilisais le MCP2200
    Et si, tu peux l'imaginer !.. en stockant la trame ascii envoyée sur l'EEPROM
    au lieu (ou en meme temps) que l'UART.
    stockage en texte ..terminateur <CR> <LF>
    ou eventuellement en separant les champs de chaque donnee , par un ";" , tu as alors un fichier au format CSV ,
    exploitable directement via excel.
    (nota: ; est preferable pour nous les francais .. vu que le separateur decimal est deja une virgule..)


    Il s'agit d'une valeur de résistance d'un capteur de température.
    Pour la récupérer et l'inclure dans mon UART, je dois utiliser le PORTA pour cela non?
    il faudrait etre plus precis.. une CTN, une CTP, une PT100 ou 1000 ou ?
    Quelle gamme de mesure ?
    Dans tous les cas ,il faudra faire une adaptation hardware.,pour mettre à niveau
    la mesure analogique resultante. de ton delta R. pour un delta Temperature donné.

  27. #117
    gautyy5

    Re : PIC18f452 + MCP2200

    Écoute, on va faciliter les choses, j'ai commandé le PIC dont vous vous êtes servis pour l'exemple de la carte SD!
    Par contre j'ai pas exactement compris l'organisation du programme, donc je vais essayer de voir comment envoyer ces données facilement sur la carte SD avec ce nouveau PIC, qui apparemment semble similaire au 18f452 au niveau des broches et de la programmation. Donc pas de soucis pour adapter mon programme à celui ci.

    PS: désolé pour le manque de précision pour le capteur de température, mais j'ai réussi à récupérer ce que je souhaite! Donc c'est réglé de ce côté. Il me manque plus qu'à stocker tout cela dans la carte SD

  28. #118
    paulfjujo

    Re : PIC18f452 + MCP2200

    ....pour l'exemple de la carte SD!
    Par contre j'ai pas exactement compris l'organisation du programme,..
    il n'y pas d'ordinogramme,mais les nombreux commentaires concernant
    l'historique du developpement et les deboires rencontres, devraient t' etre profitables.

    De plus le resultat sur le terminal en montre les differentes etapes :

    Code:
     Test Petite FAT  rev 13/12/2013  Mplab C18
     PIC18F26k22 Q=10Mhz x 4 (PLL) 
    Init SD-card Sandisk 2GB.
     SD-card initialisee.
     Essai de monter le system de fichier
     Montage systeme de fichier OK
      Liste des fichiers : 
    /SAUVE001.TXT
    /TRAME___.TXT
    /SAUVE002.TXT
    /TESTFILE.TXT
    /SAUVE003.TXT
     Ouverture fichier TESTFILE.TXT  OK 
     Lecture OK de 31 bytes.. reste=   32 OK 
    Hello,Ceci est un texte de tst d
    Essai Ouverture fichier SAUVE003.TXT   
     Ouverture fichier SAUVE003.TXT  OK 
     FResult = 0 Deplace pointer au debut
     buffer initialisé
      FResult = 0 Ecriture effective de   512 bytes sur SAUVE003.TXT 
     Nouveau pointer de fichier = 512 
     FResult = 0 Ecriture effective de   512 bytes sur SAUVE003.TXT 
     Nouveau pointer de fichier = 1024 
     FResult = 0 Ecriture effective de   512 bytes sur SAUVE003.TXT 
     Nouveau pointer de fichier = 1536 
     FResult = 0 Ecriture effective de   512 bytes sur SAUVE003.TXT 
     Nouveau pointer de fichier = 2048 
     FResult = 0 Ecriture effective de   512 bytes sur SAUVE003.TXT 
     Nouveau pointer de fichier = 2560 
     FResult = 0 Ecriture effective de   512 bytes sur SAUVE003.TXT 
     Nouveau pointer de fichier = 3072 
     FResult = 0 Ecriture effective de   512 bytes sur SAUVE003.TXT 
     Nouveau pointer de fichier = 3584 
     FResult = 0 Ecriture effective de   512 bytes sur SAUVE003.TXT 
     Nouveau pointer de fichier = 4096 
    
     Finalise ecriture = 4096 
    
     FResult = 0  inscription de     0 zeros 
     Demontage du system de fichier...OK .
    nota 1: l'usage de l'UART comme debugger ,me semble indispensable
    pour tracer l'evolution du programme..
    quitte à tout mettre hors service ,ce tracage ,une fois le programme certifié OK.

    nota 2: je n'ai pas de pin me donnant l'info presence card SD .. sur ma breakboard MiniInTheBox
    je saute donc par dessus ce test..!
    n'importe comment , si la carte n'est pas là.. çà bloque d'office apres coup.
    Dernière modification par paulfjujo ; 25/06/2014 à 11h08.

  29. #119
    gautyy5

    Re : PIC18f452 + MCP2200

    Avant m'occuper de la carte SD, je viens d'avoir d'autres problèmes...
    Je n'arrive pas à écrire sur l'UART avec mon code sur ce pic (ça me met des points d'interrogations au démarrage du programme et c'est tout), et l'affichage sur le LCD est mauvais.
    Il y a des différences de programmation entre le 18f452 et le 18f46k22?
    Code:
    #include <p18cxxx.h>
    #include <p18f46k22.h>	 // d?claration SFR pour ICD2
    #include <delays.h>	 // d?claration prototype fonctions delay
    #include <usart.h>   // pour fonctions UART
    #include <string.h>  // pour strmcp
    #include <stdio.h>  // pour printf
    #include <stdlib.h> // pour atoi
    #include <math.h>
    #define	FOREVER	 while(1)
    #define MAXLEN 40
    #define NBsecondes 4  // (n*5)-1 , n étant le nb de secondes souhaité.
    #define Aimant 4	  // nb d'aimant pour un tour
    
    // D?finir des nouveaux types donn?es
    
    typedef unsigned char BYTE;
    typedef unsigned int WORD;
    
    // **** configuration du circuit *************
    
    // configuration avec quartz
    #ifdef OSCILLATEUR_INTERNE
    #pragma config FOSC = INTIO67, FCMEN = OFF, PLLCFG=OFF            // CONFIG1H
    #else
    #pragma config FOSC = HSMP, PLLCFG=ON, PRICLKEN=ON ,FCMEN=OFF
    #endif
    #pragma config IESO=OFF,PWRTEN=OFF,BOREN=OFF,WDTEN=OFF,CCP2MX=PORTC1
    #pragma config PBADEN=OFF,T3CMX=PORTC0,P2BMX=PORTC0
    #pragma config MCLRE=EXTMCLR,STVREN=OFF,LVP=ON,XINST=OFF,DEBUG=OFF
    #pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF                    // CONFIG5L
    #pragma config CPB = OFF, CPD = OFF                                          // CONFIG5H
    #pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF                // CONFIG6L
    #pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF                            // CONFIG6H
    #pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF            // CONFIG7L
    #pragma config EBTRB = OFF     
    
    // d?finitions LCD
    
    
    #define LCD_D4	LATBbits.LATB4 // data afficheur bit ? bits
    #define LCD_D5	LATBbits.LATB1 // data afficheur bit ? bits
    #define LCD_D6	LATBbits.LATB2 // data afficheur bit ? bits
    #define LCD_D7	LATBbits.LATB3 // data afficheur bit ? bits
    
    #define LCD_D4_DIR TRISBbits.TRISB4 // data direction afficheur bit ? bits
    #define LCD_D5_DIR TRISBbits.TRISB1 // data direction afficheur bit ? bits
    #define LCD_D6_DIR TRISBbits.TRISB2 // data direction afficheur bit ? bits
    #define LCD_D7_DIR TRISBbits.TRISB3 // data direction afficheur bit ? bits
    
    #define LCD_E	LATAbits.LATA2 // cde afficheur E
    //#define LCD_RW	PORTAbits.RA2 // cde afficheur RW
    #define LCD_RS	LATAbits.LATA5 // cde afficheur RS
    
    
    #define LCD_E_DIR TRISAbits.TRISA2 // cde direction afficheur E
    //#define LCD_RW_DIR TRISAbits.TRISA2 // cde direction afficheur RW
    #define LCD_RS_DIR TRISAbits.TRISA5 // cde direction afficheur RS
    
    
    //*****	prototypes de fonctions ********************
    char k;
    unsigned int temp,i,j;
    unsigned char rotation_brute;
    unsigned short int sequence;
    int n1;
    float a;
    
    void Init_CAN (void);
    unsigned char convertir (void);
    void Init_LCD (void);
    void Init_Interrupt (void);
    void Init_UART (void);
    
    void Affiche_Compteur (void);   // <-- integree dans la main boucle FOREVER
    //void Affiche_USART (void);
    
    void w_cde_nibble( unsigned char ); // ?crit le quartet fort du char x en mode cde
    void w_cde_octet( unsigned char ) ;// ?crit le quartet fort du char x en mode cde puis le quartet faible
    void w_data_octet( unsigned char ) ;// ?crit le quartet fort du char x en mode data puis le quartet faible
    
    //volatile unsigned double temperature, bits;
    volatile unsigned char result, temperature;
    volatile unsigned double vTemp, rTemp;
    volatile char str[20] = "";
    
    volatile unsigned int  tour;
    volatile unsigned int compteur,seconde,secs;
    volatile char buffer[MAXLEN];
    volatile int Index1;
    volatile int received; // flag reception trame
    
    
    //sous prog d'int
    void Interrupt_B0(void);
    
    // on déclare que lors d'une interruption
    #pragma code highVector=0x08
    void atInterrupthigh(void)
    {
    // on doit éxecuter le code de la fonction MyHighInterrupt
    _asm GOTO Interrupt_B0 _endasm		
    }
    #pragma code // retour à la zone de code
    
    
    // ************************
    //  Interruptions 
    // ************************
    #pragma interrupt Interrupt_B0
    
    void Interrupt_B0(void)
    {
      static char C ;
      static char i;
     if ((INTCONbits.INT0IE==1) && (INTCONbits.INT0IF==1)) 
    {             // Si une interruption du port B0 est détectée
                tour++;            // incrémenter la variable de tour
    	 INTCONbits.INT0IF=0;
    }
    
    //========= IT Timer0 ==============
      if ((INTCONbits.TMR0IE==1) && (INTCONbits.TMR0IF ==1))
      {
    	 j=60/Aimant;
         compteur = tour*j;         // Multiplier le nombre de tour/seconde par 60 (pour tour/min)
         TMR0H=0x67;
         TMR0L=0x68;
         tour=0;
         seconde=1;  // drapeau seconde ecoulee
    	 secs++;
         INTCONbits.TMR0IF = 0;		
     }				
    
    //=== IT Serial UART RX =================
    if ((PIE1bits.RCIE==1) && (PIR1bits.RCIF)) // si un car arrive
    {
       C =RCREG ; // le lire => RAZ  RCIF
      if(RCSTAbits.FERR || RCSTAbits.OERR)
       {
          RCSTAbits.CREN = 0 ; RCSTAbits.CREN= 1 ;
       }
      if ((C==10) || (i>=MAXLEN-1)) 
      {
       buffer[i]=0; // fin de chaîne si LF recu
       if (buffer[i-1]==13)    
        {
            received=1;    // si caractere precedent=13=CR
            buffer[i-1]=0;  // optionnel si on veut eliminer le CR resideul dans le buffer
            Index1=i;
             i=0;
             PIE1bits.RCIE=0;  // on stoppe les IT reception jusqu'à ce qu'on lise le buffer
         }
          else   // on annule tout
         {
           received=0;    // caractere precedent different de 13=CR
            Index1=0;
             i=0;
            buffer[0]=0;
          }  
        }   
         else
        {
    	if (C==0x2E)			// Si caractère reçu = '.'
    	{						// On va le modifier par ','
    		C=0x2C;				// Pour faciliter Excel
    	}
        buffer[i]=C ; // stockage
        i++;
        Index1++;
        received=0;
         }
      }
    }
    
    
    //fin interruption
    //*************	Programme principal *******************/
    void main(void)
    {
    
    //*****	init variables ****************************
     TRISA=0;                          // PORTA configuré en sortie
     TRISB=0b00000001;                 // PORTB configuré en sortie sauf port0
     TRISC=0b10000000;
     
     vTemp=0.0;
     rTemp=0.0;
     result=0;
     temperature=0.0;
     compteur=0;
     temp=0;
     seconde=0;
     tour=0;
     secs=0;
     i=0;
     j=0;
     received=0;
     buffer[0]=0;
     Index1=0;
     n1=0;
     
     a=2.45;
    
    Init_CAN();
    //*****	init Ports ****************************
    Init_LCD();
    //*****	init Ports ****************************
    Init_UART();
    //*****	init Interrupt ****************************
    Init_Interrupt();
    //*****	boucle forever ****************************
    k=fprintf(_H_USART,"\r\n\r\n");
    k=fprintf(_H_USART,"    		CYCLE_ANALYST		   	\r\n");
    k=fprintf(_H_USART,"Ah	V	A	Vitmax	Vit	Compte_tour	SEC");
    FOREVER
     {	
    	result=convertir();
    	vTemp = (((unsigned int)result*5.0)/255.0);
    	rTemp = (820.0*vTemp)/(5.0-vTemp);
    	temperature=(unsigned char)((rTemp-444.0)/5.56);
    
        if  (received==1)                 
    	{	
    	     n1++;
    		
                  if (n1>NBsecondes)
                    {
    		  k=fprintf(_H_USART,"\r\n");
    		  k=fprintf(_H_USART,"%s    	 %05u  	%05u	%d",buffer,compteur,secs, temperature);
                    n1=0;
                   }
    		seconde=0;  // raz drapeau secondes ecoulees
      		received=0;  // raz drapeau rx uart
      		Index1=0;
    		RCREG=0;
    		PIE1bits.RCIE=1; // re-enable interrupt USART
    	}
    	else
    	{
    	 Affiche_Compteur ();
        }
    }
    
    }
     //***** ecriture des fonctions ****************************
    void Init_CAN(void)
    {
        ADCON1 = 0b00000100;     /* Justifié à gauche Fosc/8 RA0=AN0 analogique */
        ADCON0 = 0b01000001;     /* Fosc/8 AN0 CAN=activé */
        TRISAbits.RA0 = 1;       /* RA0 = AN0 en entrée */
    }
    
    unsigned char convertir(void)
    {
        Delay10TCYx( 5 );         /* attente 5x10x1=50us */
        ADCON0bits.GO = 1;        /* lancement conversion */
        while(ADCON0bits.GO);     /* attente fin de conversion */
        return (ADRESH);          /* retour du resultat */
    }
    
    void Init_LCD (void)
    {
    		// LCD
    		ADCON1=0x0E;	 // RA1,2,3 en logique (port A analogique par d?faut)
    		LATA=0xF1;	 // RA1,2,3 ? 0 force par le LATCH (pour pas de glitch sur E !)
    		PORTA=0xF1;	 // RA1,2,3 ? 0 force par le port (pour pas de glitch sur E !) par securit? ! bof !
    		LCD_E_DIR=0;	 // ports en sortie
    		// LCD_RW_DIR=0;	 // ports en sortie
    		LCD_RS_DIR=0;	 // ports en sortie
    		LCD_D4_DIR=0;	 // ports en sortie
    		LCD_D5_DIR=0;	 // ports en sortie
    		LCD_D6_DIR=0;	 // ports en sortie
    		LCD_D7_DIR=0;	 // ports en sortie
    		
    		//*****	init LCD      ****************************
    		w_cde_nibble( 0x30 ); // 3 control
    		Delay10KTCYx(150);	// delay = 15mS
    		w_cde_nibble( 0x30 ); // 3 control
    		Delay10KTCYx(50);	// delay = 5mS
    		w_cde_nibble( 0x30 ); // 3 control
    		Delay10TCYx(50);	// delay = 100?S
    		w_cde_nibble( 0x20 ); // 2 mode 4 bits
    		
    		w_cde_octet( 0x28 ) ;// fonction set attention si 2F il ecrit en bas a droite ? l'envers avec  4 caracteres de masques (affiche a partir du 5eme car ecrit !)
    		  w_cde_octet( 0x0F ) ;// display on
    		w_cde_octet( 0x06 ) ;// mode d'entree
    		w_cde_octet( 0x01 ) ;// clear display (facultatif)
    		w_cde_octet( 0x80 ) ;// DDRAM 0000 (facultatif)
    		w_cde_octet( 0x02 ) ;// home (facultatif)
    		Delay1KTCYx(250);	// delay = 5mS INDISPENSABLE pour CDE HOME !
    		
    		w_cde_octet( 0x83 )  ;// 4eme case de la 1ère ligne
    		w_data_octet( 0x54 ) ;// T
    		w_data_octet( 0x41 ) ;// A
    		w_data_octet( 0x43 ) ;// C
    		w_data_octet( 0x48 ) ;// H
    		w_data_octet( 0x59 ) ;// Y
    		w_data_octet( 0x4D ) ;// M
    		w_data_octet( 0x45 ) ;// E
    		w_data_octet( 0x54 ) ;// T
    		w_data_octet( 0x52 ) ;// R
    		w_data_octet( 0x45 ) ;// E
    		
    		w_cde_octet( 0xC0 ) ;// passage seconde ligne
    		w_cde_octet( 0xC8 ) ;// passage milieu seconde ligne
    		
    		w_data_octet( 0x54 ) ;// T
    		w_data_octet( 0x52 ) ;// R
    		w_data_octet( 0x2F ) ;// /
    		w_data_octet( 0x4D ) ;// M
    		w_data_octet( 0x4E ) ;// N
    }
    
    void Init_Interrupt (void)
    {
    		T0CON =0b00000110;    		    // Config T0CON pour avoir prescaler 128 et le timer sur 16bits.
    		TMR0H=0x67;
    		TMR0L=0x68;
    		T0CONbits.TMR0ON = 1; 			// Timer 0 marche (debut du comptage)
    		RCONbits.IPEN=0;
    
    		INTCON2bits.INTEDG0=1;		    // front montant RB0
    		INTCON2bits.TMR0IP=1; 		    // high level
    		INTCON2bits.RBIP=0; 
    
    		INTCONbits.PEIE = 1; 
    		INTCONbits.INT0IF=0; 
    		INTCONbits.INT0IE=1;  			// autorise RB0 interrupt
    		INTCONbits.TMR0IE = 1; 			// Autorise TMR0 interrupt
    		INTCONbits.PEIE = 1;   			// autorisation des IT des périphériques
    		INTCONbits.GIE = 1;    			// active global interrupt
    		PIE1bits.RCIE=1;
    
    
    }
    
    void Init_UART (void)
    {
    		Open1USART( USART_TX_INT_OFF &
    		USART_RX_INT_ON &
    		USART_ASYNCH_MODE &
    		USART_EIGHT_BIT &
    		USART_CONT_RX &
    		USART_BRGH_HIGH,
    		129 );
    }
    
    void Affiche_Compteur (void) // fonction d'affichage de nombre sur plusieurs digits
    
    	{           
    		unsigned int temp;
    		unsigned char rotation_brute;
    		rotation_brute = (compteur/1000)+48;
    		temp = compteur % 1000;
    		w_cde_octet( 0xC0 ) ;						   // passage seconde ligne
    		w_cde_octet( 0xC3 )	;						   // passage à la 4eme case de la seconde ligne
    		w_data_octet( rotation_brute ) ;			   // Afficher les milliers
    		rotation_brute = (temp/100)+48;
    		temp = temp % 100;
    		w_data_octet( rotation_brute ) ;//             // Afficher les centaines
    		rotation_brute = (temp/10)+48;
    		w_data_octet( rotation_brute ) ;//             // Afficher les dizaines
    		rotation_brute = (temp % 10)+48;
    		w_data_octet( rotation_brute ) ;//             // Afficher les unités
    	
    	}
    
    
    
    void w_cde_nibble( unsigned char x) // écrit le quartet fort du char x en mode cde
        {
            LCD_RS=0;   // mode cde
            LCD_E=1;    // monte enable
            if (x&0x80)  LCD_D7=1; else LCD_D7=0;   // écriture des bits
            if (x&0x40)  LCD_D6=1; else LCD_D6=0;   // écriture des bits
            if (x&0x20)  LCD_D5=1; else LCD_D5=0;   // écriture des bits
            if (x&0x10)  LCD_D4=1; else LCD_D4=0;   // écriture des bits
            LCD_E=0;    // descends enable
            Delay10TCYx(50); // delay = 100µS
        }
    
    
    void w_cde_octet( unsigned char x) // écrit le quartet fort du char x en mode cde puis le quartet faible
        {
            LCD_RS=0;   // mode cde
            LCD_E=1;    // monte enable
            if (x&0x80)  LCD_D7=1; else LCD_D7=0;   // écriture des bits
            if (x&0x40)  LCD_D6=1; else LCD_D6=0;   // écriture des bits
            if (x&0x20)  LCD_D5=1; else LCD_D5=0;   // écriture des bits
            if (x&0x10)  LCD_D4=1; else LCD_D4=0;   // écriture des bits
            LCD_E=0;    // descends enable
            Delay10TCYx(5); // delay = 10µS
            LCD_E=1;    // monte enable
            if (x&0x08)  LCD_D7=1; else LCD_D7=0;   // écriture des bits
            if (x&0x04)  LCD_D6=1; else LCD_D6=0;   // écriture des bits
            if (x&0x02)  LCD_D5=1; else LCD_D5=0;   // écriture des bits
            if (x&0x01)  LCD_D4=1; else LCD_D4=0;   // écriture des bits
            LCD_E=0;    // descends enable
            Delay10TCYx(50); // delay = 100µS
        }
    
    void w_data_octet( unsigned char x ) // écrit le quartet fort du char x en mode data puis le quartet faible
    
        {
            LCD_RS=1;   // mode data
            LCD_E=1;    // monte enable
            if (x&0x80)  LCD_D7=1; else LCD_D7=0;   // écriture des bits
            if (x&0x40)  LCD_D6=1; else LCD_D6=0;   // écriture des bits
            if (x&0x20)  LCD_D5=1; else LCD_D5=0;   // écriture des bits
            if (x&0x10)  LCD_D4=1; else LCD_D4=0;   // écriture des bits
            LCD_E=0;    // descends enable
            Delay10TCYx(5); // delay = 10µS
            LCD_E=1;    // monte enable
            if (x&0x08)  LCD_D7=1; else LCD_D7=0;   // écriture des bits
            if (x&0x04)  LCD_D6=1; else LCD_D6=0;   // écriture des bits
            if (x&0x02)  LCD_D5=1; else LCD_D5=0;   // écriture des bits
            if (x&0x01)  LCD_D4=1; else LCD_D4=0;   // écriture des bits
            LCD_E=0;    // descends enable
            Delay10TCYx(50); // delay = 100µS
        }

  30. #120
    gautyy5

    Re : PIC18f452 + MCP2200

    J'ai reglé le problème du LCD, manque plus que l'UART à configurer.

    J'ai modifié l'interruption avec les nouveaux registres de ce PIC (UART1 et plus UART) comme ceci:
    Code:
    if ((PIE1bits.RC1IE==1) && (PIR1bits.RC1IF==1))    // si un car arrive
    {
       C =RCREG1 ; // le lire => RAZ  RCIF
      if(RCSTA1bits.FERR || RCSTA1bits.OERR)
       {
          RCSTA1bits.CREN = 0 ; RCSTA1bits.CREN= 1 ;
       }
      if ((C==10) || (i>=MAXLEN-1)) 
      {
       buffer[i]=0; // fin de chaîne si LF recu
       if (buffer[i-1]==13)    
        {
            received=1;    // si caractere precedent=13=CR
            buffer[i-1]=0;  // optionnel si on veut eliminer le CR resideul dans le buffer
            Index1=i;
             i=0;
             PIE1bits.RC1IE=0;  // on stoppe les IT reception jusqu'à ce qu'on lise le buffer
         }
          else   // on annule tout
         {
           received=0;    // caractere precedent different de 13=CR
            Index1=0;
             i=0;
            buffer[0]=0;
          }  
        }   
         else
        {
    	if (C==0x2E)			// Si caractère reçu = '.'
    	{						// On va le modifier par ','
    		C=0x2C;				// Pour faciliter Excel
    	}
        buffer[i]=C ; // stockage
        i++;
        Index1++;
        received=0;
         }
      }
    }
    Mais PIR1bits.RC1IF ne passe jamais à 1, donc je ne rentre jamais dans l'interruption.
    De toutes façon, je remarque aussi que RCSTA1bits.FERR et RCSTA1bits.OERR restent sans arrêt à 0...

Page 4 sur 5 PremièrePremière 4 DernièreDernière

Discussions similaires

  1. Probléme avec le convertisseur UART/USB MCP2200
    Par Tevz dans le forum Électronique
    Réponses: 0
    Dernier message: 18/02/2011, 17h45
  2. PWM sur Pic18f452 en C
    Par invite2a7ab739 dans le forum Électronique
    Réponses: 8
    Dernier message: 21/02/2010, 17h51
  3. pic18F452
    Par jltthierry dans le forum Électronique
    Réponses: 4
    Dernier message: 05/08/2007, 12h35
  4. Pic18f452
    Par invite29283208 dans le forum Électronique
    Réponses: 1
    Dernier message: 31/03/2007, 22h10
  5. Can Pic18f452
    Par invite9f8cba25 dans le forum Électronique
    Réponses: 1
    Dernier message: 15/05/2006, 15h17
Découvrez nos comparatifs produits sur l'informatique et les technologies.