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

C Discussion :

Utiliser le module usart de PIC16F876A


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Par défaut Utiliser le module usart de PIC16F876A
    bonjour

    j'utilise le module usart de pic16f876a en réception avec interruption et l'émission sans interruption, pour la réception je reçois bien les trames envoyé par PC j'ai seulement le problème avec l'émission le PC ne reçoit que le premier octet (0x44) et les autres octets me les remplacer par (0x44,0xa6,0xf5)

    merci d'avance pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    /******************************************************************************
    *                                                                             *
    *                                                                             *
    *                                                                             *
    *                                                                             * 
    ******************************************************************************/
    #include <htc.h>
    #define _XTAL_FREQ 4000000
    __CONFIG (XT & WDTDIS & PWRTEN & BORDIS & WRTEN & LVPDIS & DUNPROT & DEBUGDIS);
    unsigned char PR = 0;
    void Init_port(void);
    void Emet_Car(unsigned char caractere);
    unsigned char inBuffer[32];
    /******************************************************************************
    *                                                                             *
    *                                                                             *
    *                                                                             * 
    ******************************************************************************/
    int main(void)
    {
        int i;
        int LOOP = 1;
        Init_port();
        while(LOOP)
        {
           for(i = 0;i < 4;i ++)
           {
                __delay_ms(100);
                PORTB = inBuffer[i];
                __delay_ms(100);
           }
           PR = 0;
           Emet_Car(0x44);
           Emet_Car(0x33);
           Emet_Car(0x55);
     
        }  
        return 0;
    }
    /******************************************************************************
    *                                                                             *
    *                                                                             *
    *                                                                             *
    ******************************************************************************/
    void Init_port(void)
    {
        TRISC = 0b10000000;
        TRISB = 0x00;
        PORTB = 0x00;
     
        SPBRG = 25;       
        TXSTA = 0b00100110; 
        RCSTA = 0b10010000;
     
        RCIE = 1;       
        PEIE = 1;
        GIE  = 1;       
    }
    /******************************************************************************
    *                                                                             *
    *                                                                             * 
    *                                                                             *
    ******************************************************************************/
    void Emet_Car(unsigned char caractere)
    {
            while(!TRMT) continue;
            TXREG = caractere;
     
    }
    /******************************************************************************
    *                                                                             *
    *                                                                             *
    *                                                                             * 
    ******************************************************************************/
    static void interrupt isr(void)
    {
     
        if(RCIF)
        {
            inBuffer[PR++] = RCREG;
            RCIF = 0;
        }
     
    }

  2. #2
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Je n'ai pas de hardware sous la main, je vois quand même deux petites pistes:

    - Le return dans le main (tu n'as pas OS où retourner, sauf erreur): ça coupe peut-être le dernier caractère. Tu peux t'en tirer en mettant une boucle infinie ou temporisée juste avant le return.

    - J'ai vu que pour la réception tu mets à zéro l'indicateur de réception à la main dans l'interruption... Peut-être faut-il faire le même genre de chose pour l'émission?

    Bonne chance.

    A+

    Pfeuh

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Par défaut
    merci pour ta réponse

    l'instruction return ne sera jamais exécuter car mon programme tourne dans boucle infinie , j'ai trouvé mon problème mais je ne sais pas comment le corriger
    j'ai fixé une tempo de 2ms entre chaque octet envoyé et mon programme marche bien je cherche maintenant le quel flag a tester pour savoir que l'émission de premier octet est terminé pour puisse envoyer le reste sans utiliser des tempos

    et merci d'avance

  4. #4
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Citation Envoyé par PIC16F877A Voir le message
    l'instruction return ne sera jamais exécuter car mon programme tourne dans boucle infinie
    Autant pour moi, j'ai effectivement lu en diagonale.

    Citation Envoyé par PIC16F877A Voir le message
    je cherche maintenant le quel flag a tester pour savoir que l'émission de premier octet est terminé
    C'est TRMT, non? transmission terminated ou quelquechose du genre. D'après la doc, ce bit est en read-only, il va falloir effectivement chercher ailleurs. Tout est dans la page 117.

    http://ww1.microchip.com/downloads/e...doc/39582b.pdf

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Par défaut
    salut et merci pour ta reponse

    j'ai lis bien la doc de la pic et j'ai trouvé rien que le bit TRMT a tester mais je me demande pour quoi le bit TRMT ne m'évite pas d'écraser les octets suivant ?

Discussions similaires

  1. Decompression d'un fichier sans utiliser les modules du CPAN
    Par choubiroute dans le forum Modules
    Réponses: 6
    Dernier message: 10/03/2006, 14h20
  2. [VB]utilisation des modules en vb
    Par zidenne dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/01/2006, 11h19
  3. erreur lorsque j'utilise le module session
    Par vbcasimir dans le forum Modules
    Réponses: 13
    Dernier message: 14/10/2005, 13h41
  4. utilisation du module WWW::Hotmail
    Par mouette_fstt dans le forum Modules
    Réponses: 2
    Dernier message: 22/07/2005, 16h58
  5. [web] Probleme de passe de variable qd j utilise un module TK
    Par Slippers dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 19/04/2005, 17h48

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