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 :

Soucis sur carte Explorer 16 de Microchip


Sujet :

Embarqué

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2009
    Messages : 44
    Points : 50
    Points
    50
    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, 1488 affichages)
    • Type de fichier : c lcd.c (5,4 Ko, 297 affichages)
    • Type de fichier : c delay.c (2,5 Ko, 206 affichages)
    • Type de fichier : h delay.h (418 octets, 113 affichages)
    • Type de fichier : h lcd.h (2,2 Ko, 80 affichages)

  2. #2
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2009
    Messages : 44
    Points : 50
    Points
    50
    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
    83
    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 : 83
    Points : 255
    Points
    255
    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
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    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
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    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
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    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.
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je me coucherai moins bête ce soir après avoir lu ce topic ^^

Discussions similaires

  1. Souci avec carte geoportail sur iPad
    Par hispanus dans le forum IGN API Géoportail
    Réponses: 7
    Dernier message: 26/03/2014, 14h44
  2. Souci de déplacement sur carte
    Par Unusual dans le forum IGN API Géoportail
    Réponses: 6
    Dernier message: 16/09/2009, 16h23
  3. souci sur ajout de données de zone de liste
    Par Tierisa dans le forum IHM
    Réponses: 6
    Dernier message: 27/09/2005, 08h30
  4. Comment lire sur Carte/Interface PCI
    Par Philippe299 dans le forum MFC
    Réponses: 4
    Dernier message: 12/07/2005, 10h40
  5. EXTENSIONS XML, XSL, XSLT, sur internet explorer 6 pack 2
    Par superjeanpi dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 08/12/2004, 12h11

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