Problème interuption UART PIC16F877
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Problème interuption UART PIC16F877



  1. #1
    invite55fe29e6

    Problème interuption UART PIC16F877


    ------

    Bonjour à tous

    Voilà, je suis entrain de travailler sur un projet,
    Hors je dois mettre l'UART en interruption, je sais faire fonctionné l'UART dans mon programme principal mais si je veux le passer en interruption cela ne fonctionne plus!! j'ai gais pourtant une lecture de la datasheet et du cours de Bigonoff mais faut croire que j'ai loupé quelque chose d'essentielle.

    Je vous explique le principe du petit programme test que j'ai mis en oeuvre.
    Le principe est simple j'envoie un caractère via le bus série de mon PC (pour cela j'utilise HyperTerminal et enssuite je demande au microcontrolleur de me le renvoier pour l'affiché sur le PC

    Sans utiliser les interruptions mon programme fonctionne mais sinon en interruption rien ne fonctionne j'envoie le caractère mais il ne doit pas rentrer dans la routine d'interruption. Si quelqu'un pouvais me mettre sur le chemin sa serai un aide précieuse pour moi parceque la je vous avoue que je ne voie pas pourquoi

    En vous remerciant d'avance
    Cordialement Paulochon

    Ci-dessous le programe (je programme sous MPLAB avc le compilateur CC5X)

    //Réception série d'une donnée via la Port Série du PC


    #pragma chip PIC16F877 //Définie le micro
    #pragma config = 0x3F3A
    #include "INT16CXX.H"
    #pragma origin 4 //Adresse du vecteur d'interutpion

    //Routine d'interruption
    interrupt uart(void)
    {
    int_save_registers // sauvegarde de W, STATUS (and PCLATH)
    char sv_FSR = FSR; // save FSR if required
    GIE=0; //désactive les interruptions
    if ( RCIF == 1)
    {
    char data;
    CREN = 1;
    while ( RCIF == 0 );
    data = RCREG ;
    PORTB = data;
    CREN = 0;

    PORTC = 0x02;
    TXEN = 1;
    TXREG = data;
    while( TRMT == 0 );
    TXEN = 0;
    }


    FSR = sv_FSR; // restore FSR if saved
    int_restore_registers // restauration W, STATUS (and PCLATH)
    GIE = 1;
    }

    //Sous-programme

    //** Initialisation de la COM
    void init_com(void)
    {
    TXSTA = 0b00000100 ; //Mode asynchrone transfert sur 8 bit
    SPBRG = 0x81; // T/R 9600 bauds/s
    RCSTA = 0b10000000 ; //Reception 8 bit et Port Série autorisé
    }

    //Initialisation des PORTs
    void init_port(void)
    {
    TRISB = 0b00000000; //PORTB en SORTIE
    TRISC = 0b10111000; //PORTC en E/S
    }

    //Initialisation des PORTs
    void init_interrupt(void)
    {
    GIE = 1; //Autorisation des interruption général
    PEIE = 1; //Autorisation des interrutpion sur les périphèrique
    RCIE = 1; //Autorisation de l'interruption en recpetion de L'UART
    }

    //Programme Principal
    void main (void)
    {
    char data,i;
    init_port();
    init_com();
    init_i2c();
    for(;
    {
    }

    }

    -----

  2. #2
    invite0e5af214

    Re : Problème interuption UART PIC16F877

    Code:
    while ( RCIF == 0 );
    Ne me dis rien.... tu avais cette commande dans ton programme qui n'utilisait pas les interruptions pour attendre une reception.....et tu as oublié de l'enlever.

    Alors enleve cette ligne.

    Sinon remarques au passage :
    on ne met jamais une boucle d'attente dans une interruption.

    Et le
    Code:
    char data;
    Il faut le déclararer au tout début de la fonction, pas en plein milieu. Ton compilateur est bien sympa d'avoir compilé un truc comme ca.

    Tiens nous au courant

    Bon courage

  3. #3
    invite55fe29e6

    Re : Problème interuption UART PIC16F877

    Merci pour ces précision

    Je modifie sa et je vous tien au courant dans l'après midi

    Cordialement Paulochon

  4. #4
    invite55fe29e6

    Re : Problème interuption UART PIC16F877

    Bonjour
    Je viens d'effectuer les modifications que tu m'avais préconisé
    hors mon programme ne fonctionne pas toujours
    Je suis entrain de cherché, si je trouve avant que quelqu'un me soumette une autres pistes je vous tiens au courant
    Merci d'avance
    Cordialement
    Paulochon

  5. A voir en vidéo sur Futura
  6. #5
    mictour

    Re : Problème interuption UART PIC16F877

    Bonjour Paulochon,

    Et si tu faisais quelques tests à partir de ceci :



    void initrs(void)
    {
    /*
    RCSTA :
    SPEN = 1; //
    RX9 = 0; // ... 8 bit
    CREN = 1; // reception en continu ...
    ADDEN = 0;

    TXSTA :
    TX9 = 0;
    TXEN = 1; // on
    SYNC = 0; // mode asynchro
    BRGH = 1; // TGV !
    */

    RCSTA = 0X90;
    TXSTA = 0X24;
    SPBRG = 51; // 9600 Baud à 8 MHz


    #pragma origin 4
    interrupt intr(void)
    {
    int_save_registers
    // char sv_FSR = FSR; // si SFR utilisé
    if (RCIE && RCIF) // USART : réception non bloquante
    {
    a = RCREG; // pour utilisation eventuelle dans main()
    while (!TXIF) ; // wait until previus character transmitted
    TXREG = a; // echo
    drp = 1; // le drapeau de passage, on sort de la routine
    } // d'interruption pour le traitement.
    RCIF = 0; // flag à zero
    FSR = sv_FSR;
    // int_restore_registers // si besoin
    }

    Routines que j'ai déja utilisées.

    Bonne prog, mictour.

Discussions similaires

  1. Problème UART AVR
    Par inviteee2a87e5 dans le forum Électronique
    Réponses: 2
    Dernier message: 07/01/2009, 09h27
  2. probleme uart pic24
    Par invite92ed4f10 dans le forum Électronique
    Réponses: 3
    Dernier message: 02/06/2008, 23h07
  3. Interuption volontaire de grossesse
    Par lolodecarvin dans le forum Contraception, gynécologie, grossesse et sexualité
    Réponses: 8
    Dernier message: 17/03/2008, 08h18
  4. probleme avec le pic16F877
    Par invite55a85f97 dans le forum Électronique
    Réponses: 1
    Dernier message: 30/11/2006, 08h37
  5. Problème de delais PIC16F877
    Par invite5aee2b41 dans le forum Électronique
    Réponses: 8
    Dernier message: 30/01/2006, 20h32
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...