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 :

Communication Pic/UART <=> modem


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut Communication Pic/UART <=> modem
    bonjour tout le monde,

    voila j'aimerais commander un moden 56K Olitec V90 via la liaison RS232 d'un pic 18F, donc utilisation de l'uart.

    j'ai fait qq recherche et je programme donc une fonction qui accède au modem :
    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
    #ifndef __APELLE_H
    #define __APELLE_H
     
     
     
    #include "TCPIP Stack/UART.h"
    #include "TCPIP Stack/TCPIP.h"
    #include "usart.h"
    #include "stdlib.h"
    //#include "p18f97j60.h"
     
     
     
    #include <usart.h>
    #include <stdio.h>
     
     
     
     
    void APELLE (void)
     
    {	
    static TICK t = 0;
    OpenUSART ( USART_TX_INT_OFF &
                	USART_RX_INT_OFF &
                	USART_ASYNCH_MODE &
                	USART_EIGHT_BIT &
                	USART_CONT_RX &
                	USART_BRGH_HIGH,
                	64 );
     
    if(TickGet() - t >= TICK_SECOND/2)
            {
    	        //t = TickGet();
                LED5_IO ^= 1;
    	        }
     
     
     
       putrsUSART("AT\r");
     
       CloseUSART();
    }
    mais on me retourne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MPLINK 4.12, Linker
    Copyright (c) 2007 Microchip Technology Inc.
    Error - could not find definition of symbol 'OpenUSART' in file 'C:\PPP\MainDemo.o'.
    Errors    : 1
     
    Link step failed.
    BUILD FAILED: Thu Aug 30 12:39:06 2007
    alors que OpenUSART est bien la dans usart.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void OpenUSART (PARAM_SCLASS unsigned char config, PARAM_SCLASS unsigned spbrg);
    merci pour votre aide ;-)

  2. #2
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Apparemment, la compilation s'est bien passée. Ce qui coince, c'est l'édition des liens. Avez-vous bien passé au linker les librairies nécessaires et notamment celle contenant OpenUSART()?

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tiya17 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MPLINK 4.12, Linker
    Copyright (c) 2007 Microchip Technology Inc.
    Error - could not find definition of symbol 'OpenUSART' in file 'C:\PPP\MainDemo.o'.
    Errors    : 1
     
    Link step failed.
    BUILD FAILED: Thu Aug 30 12:39:06 2007
    alors que OpenUSART est bien la dans usart.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void OpenUSART (PARAM_SCLASS unsigned char config, PARAM_SCLASS unsigned spbrg);
    Erreur classique de compréhension. Ce qu'il y a dans un .h, c'est la déclaration de la fonction (son protoype). Ce n'est qu'un interface. L'implémentation se trouve dans un fichier séparé appelé bibliothèque qu'il faut ajouter (lier) au projet.

    http://emmanuel-delahaye.developpez....htm#production

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    impossible de la trouver cette fonction !!!!!!! arrggggg lol

    je cherche !!

    par contre j'ai une question, quel est la différence entre un include et un linker?

  5. #5
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par tiya17 Voir le message
    impossible de la trouver cette fonction !!!!!!! arrggggg lol

    je cherche !!
    Où cherchez-vous? Ce qu'il vous faut savoir, c'est quelle est la librairie à lier avec le projet lorsque l'on utilise OpenUSART().

  6. #6
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par tiya17 Voir le message
    par contre j'ai une question, quel est la différence entre un include et un linker?
    hmmm
    Je pense que la question est plutôt: quelle est la différence entre un fichier d'en-tête (ou fichier d'include, càd les fichiers .h) et un fichier objet (.obj) ou une bibliothèque (library : .lib)?

    Le fichier d'en-tête est utilisé lors de la compilation et contient entre autres choses les prototypes des fonctions.

    Les fichiers objets sont produits par le compilateur à partir des sources (.c et .h). Ils contiennent le code objet et le linker (ou éditeur de liens) les assemble pour créer un fichier exécutable (.exe) par exemple.

    C'est une vision simple et vous trouverez facilement des explications plus précises sur le net.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tiya17 Voir le message
    impossible de la trouver cette fonction !!!!!!! arrggggg lol

    je cherche !!
    C'est dans la doc de la fonction qu'il faut chercher. Le nom de la bibliothèque devrait être indiqué.

    par contre j'ai une question, quel est la différence entre un include et un linker?
    linker ? Tu veux dire bibliothèque. Je t'ai passé un lien. Tu l'as lu ? Tu l'as compris ? Tu as des questions dessus ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    oupss pardon je n'est pas lu ton lien , il est vrais que je suis pas mal absorber par mon programme dsl je v y aller de suite.

    mais g trouver mon pb.

    En fait pas mal de chose sont deja initialiser ds la stack (j'aime pas car je ne c'est pas trop ce qui est fait, meme débutant je prefere partir de 0)

    donc c'est bon, ma seul erreur était

    WriteUSART("A"); au lieu de WriteUSART('A');


    autre erreur, mon programme ou j'aivais fais ma fonction qui permet d'ecrire sur le port rs232 était un .h au lieu d'un .c....

    je vais continué... et lire le lien

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    bonsoir tt le monde,


    j'ai toujours un pitit pb.

    j'essai de faire numéroter un modem relier par le port RS232 d'un PIC 18F.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     putrsUART("ATDT067197...\n");
    ou

    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
    putrsUART("A");
             DelayMs(100);
          putrsUART("T");
             DelayMs(100);
          putrsUART("D");
             DelayMs(100);
          putrsUART("T");
             DelayMs(100);
          putrsUSART("0");
             DelayMs(100);
          putrsUART("6");
            ....
          putrsUART("0");
             DelayMs(100);
          putrsUART("5");
             DelayMs(100);
          putrsUART("1");
             DelayMs(100);
          putrsUART("\r\n");

    le pb ce que sa numerote pas...

    je me branche alors sur l'hyperterminal windows, et la j'ai bien : ATDTnuméro de tel avec le caractere \CR

    mais rien en ce qui concerne le modem....sniff

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tiya17 Voir le message
    j'ai toujours un pitit pb.

    j'essai de faire numéroter un modem relier par le port RS232 d'un PIC 18F.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     putrsUART("ATDT067197...\n");
    Ben oui. C'est pas '\n' (LF), mais '\r' (CR)

    On l'a pas déjà expliqué 14.000 fois ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    lol dsl pour l'exemple c'était pas le bon,

    mais meme avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    putrsUART("ATDT06719.....\r");
    cela ne marche pas,

    l'hyperterminal windows me renvois bien ATDT0"numéro", mais qd je branche au modem, rein ....sniffff
    lol

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tiya17 Voir le message
    lol dsl pour l'exemple c'était pas le bon,

    mais meme avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    putrsUART("ATDT06719.....\r");
    cela ne marche pas,

    l'hyperterminal windows me renvois bien ATDT0"numéro", mais qd je branche au modem, rein ....sniffff
    lol
    Tu es bien conscient que le branchement de l'hyperterminal se fait avec un câble croisé (Tx -> Rx, Rx -> Tx) et que le branchement avec le modem se fait avec un câble droit (Tx -> Tx, Rx -> Rx).

    D'autre part, est-ce que le mode n'aurait pas besoin d'un DTR (108) actif pour numéroter ?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    ah oui c vrais il y a cette histoire, j'ai vraiment du mal aavec les croisé pas croisé...lol


    c oki avec cable droit : carte PIC => modem....

    mais bizarement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	putrsUART("\n");
    		DelayMs(200);
    		putrsUART("atz");
    		DelayMs(200);
    		putrsUART("\r");
    		DelayMs(200);
    		putrsUART("\n");
    		putrsUART("ATDT0671972051");
    		putrsUART("\r");
    		DelayMs(200);
    		putrsUART("\n");
    seule la commande ATZ est prise en compte par le modem, il ne numérote pas....

  14. #14
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tiya17 Voir le message
    ah oui c vrais il y a cette histoire, j'ai vraiment du mal aavec les croisé pas croisé...lol
    Je ne vois pas pourquoi tu as du mal avec ça. Ce n'est que simple logique et pur bon sens...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	putrsUART("\n");
    		DelayMs(200);
    		putrsUART("atz");
    		DelayMs(200);
    		putrsUART("\r");
    		DelayMs(200);
    		putrsUART("\n");
    		putrsUART("ATDT0671972051");
    		putrsUART("\r");
    		DelayMs(200);
    		putrsUART("\n");
    seule la commande ATZ est prise en compte par le modem, il ne numérote pas....
    Tu es sûr que ton modem supporte la numérotation bi-fréquence ? Essaye déjà par impulsions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		putrsUART("ATDP0671972051");
    Je n'en ai pas parlé jusque là, parce que c'est un préalable évident, mais les formats asynchrones (vitesse, start, stop etc.) sont bien identiques (ou compatibles) sur les 2 machines ?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    il supporte le ATDT oui car sous hyperterminal cela marche bien
    en ce qui concerne la vitesse oui elle est identique

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tiya17 Voir le message
    il supporte le ATDT oui car sous hyperterminal cela marche bien
    en ce qui concerne la vitesse oui elle est identique
    OK. Mais Hyperterminal et le PC positionnent DTR et RTS. Il est possible que ce soit exigé par le mode. Est-ce que le PIC le fait ?

    Y'a-t-il les circuits pour le faire ?

    Normalement, il faut un câble terminal (DTE) / modem (DCE) complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DTE     DCE
    DTR --> DTR
    DSR <-- DSR
    RTS --> RTS
    CTS <-- CTS
    CD  <-- CD
    RI  <-- RI
    GND --- GND

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    pour le cable on la fabriqué, mais il a deja marché mais sur un aurtre programme.

    je pense que j'ai un pb de flux materiel ou de cordon, je v regardé sa de plus pres....


    je suis perdu lol, une liaison pc <=> modem = cordon croisé ( cable null modem ).
    carte pic <=> modem = cable droit


    c'est cela?


    je rtegarde le cordon croisé qui relie le pc au modem, je pilote ce dernier via hyperterminal.

    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
     
    cordon relier au modem seul             
    broche     tension                              
    1                -9                                   
    2                -9                                   
    3                 0                                   
    4                 0                                     
    5                 0                                   
    6                 9                                    
    7                 0                                   
    8                 9                                   
    9                -9                                        
     
    cordon relier au Pc seul
    broche    tension
    1              0
    2              0
    3             -6
    4             -6
    5              0
    6              0
    7              -6 
    8               0
    9               0
    ce cable marche mais c normale les tension negatives?


    sur mon cable fabriqué qui relie le pic au modem, les broche 2 et 3 sont inversé Tx => Rx et donc Rx=>Tx

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    c'est bon sa marche !!!


    avant de numéroter j'ignore le signal DTR par AT&D0,

    et sa marche.... lol

    par contre dans une doc j'ai trouver


    mais je ne trouve rien sur cette commande AT, si qq1 la connais.... sinon c pas grave sa marche sans.lol

  19. #19
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tiya17 Voir le message
    c'est bon sa marche !!!


    avant de numéroter j'ignore le signal DTR par AT&D0,

    et sa marche.... lol

    par contre dans une doc j'ai trouver


    mais je ne trouve rien sur cette commande AT, si qq1 la connais.... sinon c pas grave sa marche sans.lol
    Beaucoup de commandes AT sont spécifiques à un constructeur. Lire la doc du modem...

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    bonjour,

    voila j'essai d'implémenter les différent etat du modem, piur cela je procède de la facon suivante :

    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
     
     
     
       static BYTE VERIF_UART=0;
       static BYTE NB_ESSAIS;
     
       static enum ModemState
             {
             ModemDebut = 0,
             ModemVerif, 
             ModemEnvoiDonne, 
             ModemDeconnexion,
             ModemFin,
             }ModemState = ModemFin;
     
     
     
    LED3_IO = 1;
     
    switch (ModemState)
                {
     
     
     
                   case ModemDebut : 
     
                         if(NB_ESSAIS<=0) ModemState=ModemFin;
                         putrsUART("atz");
                         putrsUART("\r");
                         putrsUART("at&D0");
                         putrsUART("\r");
                         putrsUART("ATDT0860922000\r");   // FREE 
                         ModemState++;
                   break;
     
                   case ModemVerif :
     
                         VERIF_UART=ReadUART();
                         if (VERIF_UART == 'C') ModemState++;
                         if (VERIF_UART== 'N' || VERIF_UART == 'B')
                            {
                               ModemState=ModemDebut;
                               NB_ESSAIS --;
                            }
                   break;
     
                   case ModemEnvoiDonne :
     
                         putrsUART("TESTsxqsxqsxqs");   
                         ModemState++;
                   break;   
     
                   case ModemDeconnexion :
                         putrsUART("ATH0");
                         ModemState++;            
                   break;   
     
                   case ModemFin :
     
                         if(BUTTON1_IO == 0u)
                            {
                            ModemState = ModemDebut;
                            NB_ESSAIS=5;                           
                            }
                   break;
                }   
     
     
     
                   LED5_IO = 1;

    les deux led s'allume, mais le code n'est pas exécuté, je ne sais pas si je procède de la bonne facon?

    doit il y avoir une condition pour exécuter ce programme?
    Ci oui un if ne serait il pas plus simple, et toujours si oui, quel est alors la différence en tre switch/case et if?


    en vous souhaitant une bonne fin de We!!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Communication entre un PIC PB-3B de Comfile et un modem GenPlug 16e
    Par mglm88 dans le forum Autres architectures
    Réponses: 0
    Dernier message: 31/12/2013, 10h28
  2. Problème de communication PIC-PC via RS232
    Par jiji94 dans le forum C++
    Réponses: 0
    Dernier message: 04/04/2008, 19h26
  3. communication des données via modem+rtc en VB6
    Par kadirov dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 06/07/2006, 11h56
  4. [LG] Communication via modem
    Par tomsteak dans le forum Langage
    Réponses: 1
    Dernier message: 27/01/2006, 12h22
  5. Communication RS232 avec un PIC via delphi
    Par JeanPh dans le forum API, COM et SDKs
    Réponses: 22
    Dernier message: 09/08/2004, 22h56

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