comment gerer deux liaisons series du pic16F877
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

comment gerer deux liaisons series du pic16F877



  1. #1
    inviteb70ac811

    comment gerer deux liaisons series du pic16F877


    ------

    Salut à tous!
    je voudrais gérer 2 liaisons séries du PIC16F877 avec interruptions.
    Mon code source ci-dessous fonctionne de la manière suivante:
    Le pic regarde l'état de ses ports d'entrée(pinD0 et pinD1),si pinD0 est à 1 le port de sortie pinB1 passe à 1 et s'il est 0 pinB1 passe à 0. Simultanément les messages (pinB1 est à 1 ou pinB1 est à 0 ) selon l'état des ports d'entrée doit être envoyer sur 2 liaisons séries (xmit=PIN_B6,rcv=PIN_B0 reçu par une siemens C35 et xmit=PIN_C6,rcv=PIN_C7 reçu par un ORDINATEUR)
    De même si pinD1 est à 1 le port de sortie pinB2 passe à 1 et s'il est 0 pinB2 passe à 0.
    jusqu'ici ça fonctionne très bien, mais mon véritable problème se pause quand la siemens C35 veux envoyer un caractère au pic,le pic ne reçoit rien, mais quand j'envoie ce caractère par l'ordinateur le pic reçoit bien et exécute l'instruction que je lui demande.
    Pour moi, je pense que le problème se pause au niveau de la gestion des deux liaisons séries que j'utilise et les interruptions.
    S'il vous plaît aidez moi

    voici mon code.C

    #include "C:\Documents and Settings\Bernard The Gamorax\Bureau\BON\main.h"
    #include <stdio.h>
    #include <string.h>
    #ZERO_RAM
    #int_RDA
    void RDA_isr(void)
    {
    gets(string);

    }


    void main()
    {

    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_OFF);
    setup_psp(PSP_DISABLED);
    setup_spi(SPI_SS_DISABLED);
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1) ;
    enable_interrupts(INT_RDA);
    enable_interrupts(GLOBAL);

    // TODO: USER CODE!!

    initGSm();
    AT();


    CONFIGSMS(); //Indication automatique SMS

    P:
    do{

    if(niveau1==0 )

    {



    if( input(PIN_D0)==1 )
    {
    output_high(PIN_B1);
    if(r0==1)
    {printf("pinB1 à 1\r\n");r0--;}
    if(m0==0)
    {ENVOIESMSR0();m0++;}
    }

    else
    {output_low(PIN_B1);
    if(r0==0)
    {printf("pinB1 à 0\r\n");r0++;}
    if(m0==1){m0--;}
    }



    if( input(PIN_D1)==1 )
    {
    output_high(PIN_B2);
    if(r1==1)
    {printf("PIN_B2 à 1\r\n");r1--;}
    if(m1==1)
    {ENVOIESMSR1();m1--;}
    }
    else
    {output_low(PIN_B2);
    if(r1==0)
    {printf("PIN_B2 à 0\r\n");r1++;}
    if(m1==0){m1++;}
    }




    }

    }

    }while(!string[0]);



    if( string[0]=='O' )
    {
    output_high(PIN_B1);
    niveau1=1;
    if(r0==1)
    {printf("PinB1 à 1\r\n");r0--;}
    if(m0==0)
    {ENVOIESMSR0();m0++;}
    }



    if( string[0]=='1' )
    {
    output_high(PIN_B2);
    niveau1=1;
    if(r1==1)
    {printf("PIN_B2 à 1\r\n");r1--;}
    if(m1==1)
    {ENVOIESMSR1();m1--;}
    }



    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)

    if( string[0]=='0' )
    {
    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
    output_high(PIN_C5);

    ATD1();
    delay_ms(3000);
    ATH ();
    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
    //goto P;
    }
    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
    else //MODEM NON CONNECTE
    {
    #use rs232(baud=9600,parity=N,xmit= PIN_C6,rcv=PIN_C7,bits=8)
    LEDCMD();

    }

    goto p;


    }

    voici mon code.C

    #include <16F877.h>
    #device adc=8

    #FUSES NOWDT //No Watch Dog Timer
    #FUSES HS //High speed Osc (> 4mhz)
    #FUSES NOPUT //No Power Up Timer
    #FUSES PROTECT //Code protected from reads
    #FUSES NOBROWNOUT //No brownout reset
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD //No EE protection
    #FUSES NOWRT //Program memory not write protected
    #FUSES NODEBUG //No Debug mode for ICD

    #use delay(clock=20000000)
    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)

    char string[1];
    int m0=0;
    int m1=1;
    int r0=1;
    int r1=1;
    int niveau1=0;
    char buffer [16] ;


    char appel []="ATD74580411;\r";
    int i;

    //CLIGNOTER LA DIODE


    void LEDCMD()
    {
    output_high(PIN_C5);
    delay_ms( 300 );
    output_low(PIN_C5);
    delay_ms( 300 );
    }

    /*INITIALISATION DU MODEM GSM*/
    void initGSm()
    {
    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
    PUTS("ATZ\r"); // ATZ RESET MODEM
    PUTS ("ATE0\r"); //ATE0
    PUTS ("ATV\r");
    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
    }


    //TEST DE LA PRESENCE DU MODEM
    void AT()
    {
    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
    PUTS ("AT\r");
    //#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B7,bits=8)
    }
    //RACROCHAGE AUTOMATIQUE
    void ATH ()
    {
    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
    PUTS ("ATH\r");
    //#use rs232(baud=9600,parity=N,xmit= PIN_C6,rcv=PIN_C7,bits=8)
    }


    //CONFIGURATION DU MODEM POUR LES SMS
    void CONFIGSMS ()
    {
    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
    PUTS("AT+CMGF=0\r"); //MODE PDU ACTIF
    PUTS ("AT+CNMI=1,1\r"); //Detection nouveau SMS
    //#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B7,bits=8)
    }

    //CONFIRMATION PAR APPEL: Numero unique: 74 58 04 11
    void ATD1 () //OK
    {
    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
    PUTS (appel);
    //#use rs232(baud=9600,parity=N,xmit= PIN_C6,rcv=PIN_C7,bits=8)
    }

    //envoie SMS
    void ENVOIESMSR0()
    {
    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
    printf("AT+CMGF=0\r\n");
    delay_ms(500);
    printf("AT+CSMS=0\r\n");
    delay_ms(500);
    printf("AT+CMGS=31\r\n");
    delay_ms(500);
    printf("0011000891478540110000 AA15D2E2B008A516AB52100C547482 9A41E9105904\r\n");
    #use rs232(baud=9600,parity=N,xmit= PIN_C6,rcv=PIN_C7,bits=8)
    }

    void ENVOIESMSR1()
    {
    #use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
    printf("AT+CMGF=0\r\n");
    delay_ms(500);
    printf("AT+CSMS=0\r\n");
    delay_ms(500);
    printf("AT+CMGS=31\r\n");
    delay_ms(500);
    printf("0011000891478540110000 AA15D2E2B008A516AB52500C547482 9A41E9105904\r\n");
    #use rs232(baud=9600,parity=N,xmit= PIN_C6,rcv=PIN_C7,bits=8)
    }

    NB:je rappelle que j'ai simuler le fonctionnement avec ISIS PROTEUS donc l'ordinateur et la siemens étaient représentés des virtual terminal

    -----

  2. #2
    RISC

    Re : comment gerer deux liaisons series du pic16F877

    Salut,

    As-tu l'obligation d'utiliser le PIC16F877 ?
    Si la réponse est non, je te recommande d'utiliser un PIC18 avec 2 UARTs comme le PIC18F26J11 (28 broches) ou le PIC18F45K22 (40 broches).
    Il existe beaucoup d'autres produits (tu peux les trouver en utilisant le logiciel MAPS) mais certains n'existent qu'en boitiers QFP44. Tu peux aussi utiliser le sélecteur de PIC en ligne.

    Si tu dois utiliser le PIC16F877, préferres les PIC16F887 plus récent et plus souple au niveau du choix des broches analogiques / digitales.

    a+

  3. #3
    invite29971eb1

    Re : comment gerer deux liaisons series du pic16F877

    Encore un mauvais choix de composant....en plus du fait de ne pas avoir de seconde UART, tu es peut-être limite avec les 5MHz maxi de ton PIC

    Avec un baudrate à 9600 bauds, tu disposes de seulement 520 instructions entre 2 bits, ce qui est très limite avec un composant à 35 instructions.

    Le problème sera le même avec un 887.

    On ne le répètera jamais assez....la moitié du boulot est déja fait quand le microcontrôleur est correctement choisi

  4. #4
    inviteb70ac811

    Re : comment gerer deux liaisons series du pic16F877

    Merci pour votre idée génial mais seulement je peux pas avoir un PIC18F45K22 actullement, je vous en pris est ce que vous ne pouvez pas modifier mon code source? s'il vous plaît aidez moi.

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

    Re : comment gerer deux liaisons series du pic16F877

    Merci pour votre idée génial mais seulement je peux pas avoir un PIC18F45K22 actullement, je vous en pris est ce que vous ne pouvez pas modifier mon code source? s'il vous plaît aidez moi.

Discussions similaires

  1. Deux Séries de Fourier
    Par invitec1855b44 dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 08/11/2009, 17h59
  2. Quotient de deux séries
    Par Bleyblue dans le forum Mathématiques du supérieur
    Réponses: 23
    Dernier message: 07/09/2008, 17h32
  3. Programme gérer afficheur AIMV avec PIC16F877
    Par invite316e0cb0 dans le forum Électronique
    Réponses: 0
    Dernier message: 27/03/2008, 14h30
  4. fac de medecine...comment bien gérer le stress, comment bien s'y prendre?
    Par inviteb4741baa dans le forum Orientation après le BAC
    Réponses: 2
    Dernier message: 25/02/2007, 20h41
  5. gérer deux moteurs avec PIC
    Par invitee601b486 dans le forum TPE / TIPE et autres travaux
    Réponses: 6
    Dernier message: 25/01/2007, 20h12
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...