Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Membre à l'essai
    Profil pro Philippe
    Inscrit en
    octobre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Nom : Philippe
    Âge : 31

    Informations forums :
    Inscription : octobre 2009
    Messages : 44
    Points : 21
    Points
    21

    Par défaut Soucis sur carte Explorer 16 de Microchip

    Bonsoir à tous chers programmeurs,

    Je viens vers vous pour des soucis avec un DSPic et la carte Explorer 16 de Microchip que je viens d’acquérir.

    La carte fonctionne avec le code démo fournis avec la carte, j'ai même modifié les variables pour afficher des informations sur l'affichage pour voir si tout était en ordre au niveau de la compilation --> Ok

    Voici quelques infos sur le matériel utilisé :
    1x Carte explorer 16 avec un DSPic33FJ256GP710
    IDE : Mplab 8.76 avec compilateur C30
    Emulateur : ICD3

    Mon problème c'est que je ne suis pas sur de bien configurer mes différents fusibles, voir mes différents registres pour la partie oscillateur ; donc c'est pour cela que j'ai besoin d'un coup de main de gens experts en la matière... vous !!!

    J'ai repris les codes fournis dans le code démo pour la gestion de l'affichage, voir fichiers en annexe : lcd.c/h et delay.c/h

    Ce que j'aimerai déja configurer c'est d'avoir une horloge (fréquence de cycle de 40Mhz) avec une horloge externe 8Mhz, en utilisant justement la PLL du PIC
    En suivant la doc de chez microchip avec ces différentes sections, j'ai essayé de configurer mes registres pour l'oscillateur,... tout compile --> cool, mais quand j’implémente le code sur la carte c'est tout de suite moin cool... Au lieu d'avoir un affichage instantané, je me retrouve avec une affichage qui affichage caractère par caractère à la minute et encore je suis gentil, je pense que je ne dois pas avoir bien configurer mes registres.

    Je vous mets en annexe, le tout est zipé :
    Mon code (main) + code de l'affichage

    en tout cas je vous remercie déjà de me lire et si vous avez la moindre infos pour me dépatouiller n'hésiter je suis dans les starting blocs... Par avance un grand MERCI

    Amicalement le cht'y Philou

    PS: voici le lien de pour la doc de microchip http://www.microchip.com/wwwproducts...cName=en546064
    Fichiers attachés Fichiers attachés
    • Type de fichier : c main.c (14,0 Ko, 9 affichages)
    • Type de fichier : c lcd.c (5,4 Ko, 5 affichages)
    • Type de fichier : c delay.c (2,5 Ko, 2 affichages)
    • Type de fichier : h delay.h (418 octets, 2 affichages)
    • Type de fichier : h lcd.h (2,2 Ko, 3 affichages)

  2. #2
    Membre à l'essai
    Profil pro Philippe
    Inscrit en
    octobre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Nom : Philippe
    Âge : 31

    Informations forums :
    Inscription : octobre 2009
    Messages : 44
    Points : 21
    Points
    21

    Par défaut

    Bonsoir à tous,

    je viens encore à vous... je me replonge sur le DSPic avec un programme simple on va dire : faire clignoter une led à l'aide d'un timer (timer1) qui doit me créer une interruption toutes les 500ms, je crois que la configuration de celui-ci et des fusibles n'ont pas posé de problèmes, enfin on verra plus tard si la led clignote

    Ma question cette fois-ci est plus générale : dans le datasheet du composant (PDF_DSPIC 33Fxxx) page 163 - chapitre 11, on parle de la configuration des entrées - sorties avec les différents registres...

    J'ai compris que le registre TRISx permet de définir soit les pins en entrée ou en sortie, ca c'est ok (1: entrée - 0: sortie), maintenant on a 2 registres PORTx et LATx. De ce que je comprends c'est que le registre LATx permet de lire ou d'écrire une valeur logique, tandis que le registre PORTx lui permet de lire ou écrire une valeur (tension) que nous avons sur la pin... Premièrement avez-vous compris la même chose ? deuxièment : si je veux allumer ou éteindre ma la led j'utilise quel registre ?

    Je dois dire que j'ai pas bien compris la différence
    Alors comme d'hab, si vous avez des suggestions, remarques, liens ou autres, je me ferai un plaisir de vous lire

    Amicalement le cht'y Philou

  3. #3
    Membre actif Avatar de Livegen
    Homme Profil pro
    Ingénieur logiciel embarqué Franco-allemand
    Inscrit en
    avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur logiciel embarqué Franco-allemand
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2008
    Messages : 69
    Points : 184
    Points
    184

    Par défaut

    C est pas vraiment sa. Si tu regardes la figure 11-1, cela est assez explicite, si tu arrive à lire le schéma.

    Pour une écriture, utiliser LATx ou PORTx revient à la même chose, c est ce qui est indiqué par la "data latch" sur le schéma.

    Par contre, pour une lecture, c est relativement différent. Je m explique, read Lat est placé juste derrière la data latch, en conséquence cela te retournera la dernière valeur écrite sur le port en question.

    Ensuite read port est directement placé sur I/O PIN, le composant à gauche de I/O est un comparateur, il est la pour connaitre le niveau logique correspondant à la tension de I/O PIN.

    Concrètement, qu’est ce que cela change ? Imaginons que tu as une très grosse capacité derrière ta sortie. Si tu écris un "1" (avec write lat ou write port) et que tu fais une lecture juste derrière, read lat te retournera un "1" alors que read port te retournera un "0".

  4. #4
    Membre confirmé
    Avatar de deletme
    Homme Profil pro Vincent
    Inscrit en
    janvier 2011
    Messages
    174
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2011
    Messages : 174
    Points : 287
    Points
    287

    Par défaut

    Salut,

    Une petite piste pour la configuration des pragma pour atteindre la fréquence de travail souhaitée : Manuel de référence de ton PIC, Section 07 : Oscillator dont voici le lien : http://ww1.microchip.com/downloads/e...Doc/70186E.pdf

    Tu pourras apprécier sur la figure 7-1 les différentes opérations appliquées sur ton horloge externe en fonction des pragma.

    N'hésites pas à revenir poser des questions si toutefois cela reste flou.

    Cdlt, deletMe

  5. #5
    Membre chevronné
    Inscrit en
    juin 2008
    Messages
    477
    Détails du profil
    Informations forums :
    Inscription : juin 2008
    Messages : 477
    Points : 681
    Points
    681

    Par défaut

    Salut
    -----

    Pour une écriture, utiliser LATx ou PORTx revient à la même chose, c est ce qui est indiqué par la "data latch" sur le schéma.
    Pas dans tous les cas, c'est justement pour l'écriture qu'on a créé LATx. Je vais expliquer.

    maintenant on a 2 registres PORTx et LATx. De ce que je comprends c'est que le registre LATx permet de lire ou d'écrire une valeur logique, tandis que le registre PORTx lui permet de lire ou écrire une valeur (tension) que nous avons sur la pin... Premièrement avez-vous compris la même chose ? deuxièment : si je veux allumer ou éteindre ma la led j'utilise quel registre ?
    Les registres LATx sur les PIC ont été créés afin d'éviter des ennuis lors de certaines opérations d'écritures, suite au fonctionnement du PIC lorsqu'il accède à une pin, qui est READ/MODIFY/WRITE.

    Imaginons que tu veuilles forcer une pin à un niveau 1 (par exemple) sur un port donné. Tu écris l'opération en une seule ligne, mais le PIC, lui, procède en plusieurs sous-étapes:

    1) Il va lire le port concerné en entier (toutes les pins)
    2) Il modifie le bit correspondant à la pin concernée dans la valeur lue
    3) Il remet la valeur modifiée sur le port de sortie

    Jusque là, il semble n'y avoir aucun problème à première vue, puisque ce qu'on lit sur le port est ce qu'on y remet (sauf la pin modifiée).

    MAIS cette façon de faire comporte deux pièges classiques :

    Premier piège:

    Admettons que sur le port concerné il y ait une pin fonctionnant en collecteur ouvert. Cette pin ne peut pas imposer un niveau 1, elle ne peut qu'imposer un niveau 0.

    Admettons que cette ligne pilote un signal relié à plusieurs sorties de plusieurs composants. Genre pilotage d'une ligne I²C de façon logicielle. Le niveau du signal (donc de la pin) peut être à 0 soit si le PIC sort une valeur 0 sur cette pin, soit si c'est un autre composant externe qui force la dite ligne à 0.

    Dans ce dernier cas, la ligne peut être forcée à 0 alors même que le PIC renseigne un niveau 1 (qu'il ne peut hardwarement pas imposer).

    Si donc tu modifies une pin quelconque de ce port, le PIC va opérer comme suit :
    - Il va lire le port, et donc lire la pin en collecteur ouvert comme valant 0.
    - Il va modifier la pin quelconque
    - Il va ré-écrire le tout

    Et donc, à partir de ce moment, le signal est bloqué à 0 par le PIC lui-même. Même si le composant externe libère la ligne elle reste bloquée, alors même que nulle part dans ton programme tu n'as forcé cette ligne à 0 explicitement.

    Second piège:

    Imagine que tu modifies deux pins du même port consécutivement. Imagine en outre que la première pin pilote une charge capacitive.

    Tu modifies la première pin, le cycle read/write/modify fonctionne sans problème. Tu modifies immédiatement après la seconde pin. Le pic va donc relire le port, et donc la pin que tu viens juste de modifier. Si la charge est suffisamment capacitive que pour avoir un temps de montée plus long que le temps séparant les deux opérations d'écriture, la pin qu'on vient de modifier risque d'être lue à son ancienne valeur (nouvelle valeur pas encore atteinte), et donc la nouvelle écriture annule de fait la précédente, et seule la seconde pin se retrouve modifiée.

    Pour résoudre le cas n° 1 sans la présence de LATx, il faut maintenir en mémoire dans une variable l'état qu'on veut imposer à la pin en collecteur ouvert, et utiliser cette valeur à chaque modification d'une pin du port en question.

    Pour résoudre le cas n° 2 sans la présence de LATx il faut ajouter un ou plusieurs nop entre les modifications successives de façon à laisser à la pin chargée capacitivement d'atteindre sa valeur imposée.

    Du coup Microchip a ajouté dans les PIC après les 16F des registres complémentaires, les LATx. Ces registres contiennent non pas la valeur qu'on lit sur les ports, mais bien la valeur du buffer du port, et donc la valeur qu'on a demandé à écrire sur le port.

    LATX est donc intéressant pour les opérations d'écriture, sachant qu'en général on sait à un endroit donné du programme ce qu'on a écrit sur les ports et donc il n'y a aucun intérêt à créer un registre pour relire ce qu'on a théoriquement écrit (et qu'on pouvait de plus sauver dans une simple variable si besoin était). LATx est donc un registre mis en place à cause du cycle interne Read/Modifiy/Write des PIC.

    De fait, en utilisant LATX pour chaque opération d'écriture concernant une pin d'un port on évite les deux problèmes décrits car on utilise la valeur devant se trouver sur le port d'après le programme écrit plutôt que la valeur réellement présente sur les pins au moment de la modification.

    Autrement dit: utiliser LATx ou PORTx pour une opération d'écriture peut mener à un résultat différent, c'est justement le but de ce registre. Utilise donc LATx pour toutes tes écritures sur les PORTs, ça te met à l'abri d'un problème sournois tel que décrit, et ça fonctionne dans toutes les situations (il n'y a pas de contre-indication).

    A+
    Claude

  6. #6
    Membre confirmé
    Avatar de deletme
    Homme Profil pro Vincent
    Inscrit en
    janvier 2011
    Messages
    174
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2011
    Messages : 174
    Points : 287
    Points
    287

    Par défaut

    Je ne sais pas si cette explication lui a été bénéfique, mais pour moi c'est le cas, je n'utiliserai plus l'écriture avec LATx juste en prétextant que "l'usage" le veut, merci.

  7. #7
    Modérateur
    Avatar de Bktero
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 645
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 645
    Points : 6 325
    Points
    6 325

    Par défaut

    Je me coucherai moins bête ce soir après avoir lu ce topic ^^
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •