Répondre à la discussion
Affichage des résultats 1 à 23 sur 23

RS232 et PIC



  1. #1
    tranquille12

    RS232 et PIC


    ------

    Bonjour à tous

    Je voudrais savoir si une personne peut m'aider à utiliser le port RS232 d'une carte EasyPIC V7 programmée en MikroBasic (PIC18F45K22 et UART hard)

    J'arrive à écrire sur le port mais je n'arrive pas à le lire

    La communication permet de relier un modem GSM a un PIC pour faire envoyer un SMS en cas de changement d'état d'une entrée

    Quelqu'un a peut-être un morceau de code qui fait ça ou a un peu de temps pour se pencher sur mon code

    Merci à ceux qui voudront bien répondre
    ++
    Yves

    -----

  2. Publicité
  3. #2
    invite03481543

    Re : RS232 et PIC

    Bonjour et bienvenue,

    il y a des exemples dans votre CD du compilateur traitant les transferts RS232 sous MikroC.

    Pour vous aider il nous faut connaitre deux choses:

    1/connaitre le modem GSM que vous utilisez.
    2/votre code traitant les échanges de données.

    L'émission et la réception ne font pas appel au même type de traitement.
    @+

  4. #3
    invite03481543

    Re : RS232 et PIC

    Voici des fonctions que j'ai écrites

    Code:
    /******************************************************************************/
    /*                         Traitement des interruptions                       */
    /******************************************************************************/
    void interrupt()
    {
         
         if(RC1IF)
            {
      
           if((RC1IE == 1) && (reception == 0))  
            {
            PORTH.F6 = 1;  // on allume une led qui informe d'une réception
            caractere_recu = RCREG1 ; //on lit le registre de réception
            if(index == 0)
              {
              output[0] = caractere_recu ; //on stocke les caractères reçu un à un dans un tableau
              index = index + 1;
              }
            else
              {
              output[index] = caractere_recu ;
              index = index + 1;
              }
            if(caractere_recu == 13)     // si \r (return) -> code decimal 13
              {
              RC1IE = 0;   // on desactive
              RC1IF = 0;
              output[index]='\0' ; // on ferme le tableau avec le caractère de fin de chaine.
              reception = 1;
              }
            RC1IF = 0 ; // drapeau de réception réinitialisé à 0 prêt à recevoir de nouveau
           }
          RC1IF = 0;
         }
    }
    
    /******************************************************************************/
    /**************   Prototype des fonctions liees a l'UART         **************/
    /******************************************************************************/
    void _Usart_Init(void);
    char Recept_UsartChar(void);
    void Emet_UsartChar(char caractere);
    void Emet_UsartText(const char* Pointeur_caract);
    void transmission_active(void);
    
    
    /******************************************************************************/
    /*                 Emission d'un caractère sur l'USART                       */
    /******************************************************************************/
    void Emet_UsartChar(register char caractere)
    {
    while(!TX1IF);
    TXREG1 = caractere;
    while(TRMT == 0);
    }
    /******************************************************************************/
    /*                 Emission d'un texte sur l'USART                       */
    /******************************************************************************/
    void Emet_UsartText(char* Pointeur_caract)
    {
    while (*Pointeur_caract != '\r')
          {
          Emet_UsartChar(*Pointeur_caract);
          Pointeur_caract++;
          }
    }
    /******************************************************************************/
    /*                 Reception d'un caractère sur l'USART                       */
    /******************************************************************************/
    char Recept_UsartChar(void)
    {
    while(!RC1IF) continue;
    RC1IF = 0;
    return RCREG1;
    }
    Avec ça tu devrais t'en sortir aisément.
    @+
    Dernière modification par HULK28 ; 17/12/2012 à 13h40.

  5. #4
    tranquille12

    Re : RS232 et PIC

    Bonsoir et merci pour ta réponse. J'imprime et j'épluche ton code. Je me permettrai de revenir vers toi si je ne pige pas un paramètre. J'aime bien comprendre ce que je fais. Le problème majeur et que je ne connais pas le C, hors dans ces cas-là, c'est souvent une erreur de syntaxe ou de choix d'instruction qui met la pagaille.

    Mon modem est un Wavecom WMOD2 qui réagit aux commandes Hayes habituelles
    Je voudrais le faire fonctionner à 9600 Bds , mon PIC et un 18F45K22 avec un quartz de 8 Mhz
    J'utilise la platine EasyPIC V7 avec RC7 en Rx et RC6 en Tx
    Mes signaux reviennent bien, j'ai vérifié à l'oscillo. D'autre part, l'envoi du SMS se passe fort bien car je le reçoit correctement

    Code:
    program GSM
    
    ' Declarations des variables
    
                   dim uart_rd as byte
                   dim oldstate1 as byte
                   dim oldstate2 as byte
                   dim texteyves as string[256]
                   dim touche as integer
                   dim t as string[20]
                   dim Output as string[255]
                   dim rc as string [1]
                   dim ab as char
                   dim ac as integer
                   dim ad as string[1]
                   dim reception as string[255]
    
    
    ' procedure envoi sms
    sub procedure envoi()
    
                    UART1_Write_Text("AT+CMGS=+33**********")
                    UART1_Write(13)                      ' Line Feed
                    UART1_Write(10)                      ' Carriage Return
                    Delay_ms(100)
    
    
                    UART1_Write_Text(texteyves)
                    texteyves=""
                    UART1_Write (26)
                    UART1_Write(13)                      ' Line Feed
                    UART1_Write(10)                      ' Carriage Return
                    Delay_ms(100)
    
    
    end sub
    
                  '   Procédure de gestion d'interruption
                  ' sub  procedure interrupt
                  '    if (UART_Data_Ready() <> 0) then  ' If data is received,
                  '       uart_rd = UART1_Read()           ' read the received data,
                  '       ab = chr(uart_rd)
                  '       reception = reception +"/"+ ab +"/"
                  '    end if
                  ' end sub
    
    
    
    
    main:
    '   programme principal
     
    '   Configure ports
    
                       TRISA = 0x00          ' Set PORTA direction to be Output
                       TRISB0_bit = 1        ' set RB0 pin as input
                       TRISB1_bit = 1        ' set RB1 pin as input
                       ANSELB = 0            ' Configure PORTB pins as digital
                       ANSELC = 0            ' Configure PORTC' pins as digital
    
     '  initialisation UART
                      BAUDCON1.SPBRG1=12                  '9600 bds avec osc 8 mhz
                      'BAUDCON1.BRG16 = 0                  'Generateur de bauds sur 8 bits
                      'BAUDCON1.ABDEN=1                    'autobaud detect
    
                      'RCSTA1.SPEN = 0
                      'RCSTA1.CREN =  0
    
                     TRISC.TRISC7=0                     ' RX
                     TRISC.TRISC6=1                      'TX
    
                    ' INTCON.PEIE = 1        '//enable peripheral interupts
                  '   INTCON.GIE     = 1        '//enable interupts
                  '   PIE1.RC1IE     = 1        '//enable interupts on USART reception
                  '   IPR1.RC1IP = 1
    
                      RCSTA.SPEN = 1
                      RCSTA.CREN =  1
    
    
    
                     UART1_Init(9600)                     ' Initialize UART module at 9600 bps
                     Delay_ms(100)                        ' Wait for UART module to stabilize
    
    
      ' RAZ variables
    
                     oldstate1 = 0
                     oldstate2= 0
                     LATA = 0x00         ' Turn OFF the LATA leds
    
    
    
    
      while TRUE
        'envoi d'un message si appui sur la touche 1 du port B
        if (Button(PORTB, 0, 1, 1)) then                  ' Appui sur la touche reliée à RB0
           oldstate1 = 1
        end if
        if (oldstate1 and Button(PORTB, 0, 1, 0))  then   ' detection du relachement de la touche reliée à RB0
           texteyves = "Appui sur touche 1"
           envoi ()
           oldstate1 = 0
           LATA = 0x01     ' Allume la LED 1 du PORTA
        end if
        
        ' l'appui sur le bouton 2 du port B envoi un sms avec, comme texte, le message recu du modem
        if (Button(PORTB, 1, 1, 1)) then                  ' detect logical one on RB1 pin
          oldstate2 = 1
        end if
        if (oldstate2 and Button(PORTB, 1, 1, 0))  then    ' detect one-to-zero transition on RB0 pin
           texteyves = reception
           envoi ()
           oldstate2 = 0
           LATA = 0x02     ' Turn ON LEDs on PORTA
        end if
            
        if (UART1_Data_Ready() <> 0) then  ' If data is received,
           uart_rd = UART1_Read()           ' read the received data,
           ab = chr(uart_rd)
           reception = reception +"/"+ ab +"/"
        end if
    
      wend
    
    end.
    Je pense que mes erreurs sont dans les registres du PIC et l'interprétation de la datasheet, mais j'ai fait plusieurs essais et je ne suis pas arrivé à un résultat correct. Pour visualiser la réponse de mon modem, je la met dans un SMS et j'envoie car j'ai oublié de commander un afficheur LCD 2x16
    Dernière modification par HULK28 ; 17/12/2012 à 21h08. Motif: masquage du numero portable

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    paulfjujo

    Re : RS232 et PIC

    bonsoir,

    Pour deverminer ton programme tu peux aussi utiliser un 2em UART Software
    et envoyer une copie de ce que tu emet ou recoit
    sur un terminal quelconque..
    Le 2em UART (Soft) ne necessitant pas d'interruption pour emettre.
    C'est ce que j'ai utilisé pour debugger une liaison modbus connectée sur L'UART Hardware
    (appli en C18)

  9. #6
    tranquille12

    Re : RS232 et PIC

    Oui, c'est une bonne idée, sauf que ma petite tête à déjà pas mal de boulot avec un UART, alors, en mettre un deuxième ...

  10. Publicité
  11. #7
    tranquille12

    Re : RS232 et PIC

    Dans mon cas, j'ai tendance à penser que je n'ai pas besoin d'interruption, le programme ne faisant que 3 tests, dont 2 qui se revelent negatifs, car je n'appuie pas partout en même temps. Mais je me trompe peut-être ...

  12. #8
    tranquille12

    Re : RS232 et PIC

    D'apès ce que j'ai compris, UART1_init(9600) gère l'ensemble de registres d'init

    Code:
    Configures and initializes the UART module.
    
    The internal UART module module is set to: 
    
    receiver enabled 
    transmitter enabled 
    frame size 8 bits 
    1 STOP bit 
    parity mode disabled 
    asynchronous operation 
    
    Parameters : 
    
    baud_rate: requested baud rate 
    
    Refer to the device data sheet for baud rates allowed for specific Fosc.

  13. #9
    invite03481543

    Re : RS232 et PIC

    Ne te passe pas du mode interruptif c'est tellement plus confortable.
    Je vais regarder ton code.
    @+

  14. #10
    invite03481543

    Re : RS232 et PIC

    Attention line feed(\n) c'est 10 et return (\r) c'est 13 !

    UART1_Init(9600)
    Tu n'as rien d'autre a faire pour declarer ta comm, la fonction met automatiquement la config en place et rempli les registres qui vont bien, tu n'as donc rien d'autre a declarer.
    Dernière modification par HULK28 ; 17/12/2012 à 21h50.

  15. #11
    invite03481543

    Re : RS232 et PIC

    Tes problemes viennent de la:

    end sub

    Procédure de gestion d'interruption
    sub procedure interrupt
    if (UART1_Data_Ready() <> 0) then ' If data is received,
    uart_rd = UART1_Read() ' read the received data,
    ab = chr(uart_rd)
    reception = reception +"/"+ ab +"/"
    end if
    end sub
    La reception doit se faire avec un pointeur de preference, et remplir un tableau octet apres octet, ou caractere apres caractere si tu preferes.
    Je vais t'ecrire un exemple en C, tu transposeras.

    reception = reception +"/"+ ab +"/"
    D'ailleurs tu as bien declare reception comme une chaine qui est un tableau de caracteres, or la ta manipulation n'est pas correcte.
    Dernière modification par HULK28 ; 17/12/2012 à 21h51.

  16. #12
    invite03481543

    Re : RS232 et PIC

    Essaye deja avec ca:

    while TRUE
    if (UART1_Data_Ready() = 1) ' si octet recu
    UART1_Read_Text(reception, '\n', 25) ' rempli reception jusqu'a detection de \n
    end if
    wend.
    Place ca en bas de ton programme et remplace le TRUE du while par une variable qui te fera sortir de cette boucle a la fin de ton if.
    Une fois sorti tu remettras cette variable a 0 pour pouvoir y reacceder de nouveau.
    Il faut envoyer evidemment le feed line (10) en fin de ta chaine, ou tout autre caractere de delimitation qui soit different d'un caractere de ta chaine transmise pour qu'il n'y ait pas confusion.
    @+
    Dernière modification par HULK28 ; 17/12/2012 à 22h21.

  17. Publicité
  18. #13
    tranquille12

    Re : RS232 et PIC

    Oui, je serai bien obligé de passer par l'interruption, mais je prefere travailler ce problème sur un code le plus simple possible

    L'afficheur est commandé

    Le LF est ajouté en dur dans l'envoi du SMS

    Pour la reception, comme on ne recoit que de l'ascii, je suis parti sur une chaine de caracteres qui est cree par concatenation

    les / ne sont la que pour visualiser les espaces ou caracteres de controles et voir combien de fois je fais de tour dans ma boucle
    Visiblement, je recoit des caracteres hors ascii. ce qui me faisait penser à une erreur de vitesse

    Je tenterai aussi une fixation de la vitesse du modem a 9600, il ne faudrait pas qu'il fasse une renegotiation vitesse avant sa réémission. Théroiquement, non. D'autres part, les renegotiations sont faites avec U (fronts montants réguliers)

    J'avais essayé le UART1_read_text mais sans succés, ne recevant pas forcement le flag de sortie de la fonction. Je re-tenterai quand même

    Je te remercie de tes efforts pour m'aider à résoudre mon problème
    ++
    Yves
    Dernière modification par tranquille12 ; 18/12/2012 à 06h32.

  19. #14
    tranquille12

    Re : RS232 et PIC

    J'ai simplifié mon programme au strict minimum et j'ai mis un modem RTC qui a les voyants Rx et Tx

    En fait, je recois la trame que j'envoie

    j'envoie un AT, il devrait répondre OK, et je lis AT

    J'ai envoyé au préalable un ATE0 pour virer l'écho

  20. #15
    gienas
    Modérateur

    Re : RS232 et PIC

    Bonjour tranquille12 et tout le groupe

    Citation Envoyé par tranquille12 Voir le message
    ... j'ai mis un modem RTC qui a les voyants Rx et Tx

    En fait, je recois la trame que j'envoie

    j'envoie un AT, il devrait répondre OK, et je lis AT

    J'ai envoyé au préalable un ATE0 pour virer l'écho
    Les voyants indiquent-ils qui (re)émet?

    N'est-ce pas une erreur de câblage qui reboucle la sortie sur l'entrée?

    Ton blocage d'écho est-il vraiment effectif? On peut se poser la question si la réponse n'est pas celle qui est attendue.

  21. #16
    tranquille12

    Re : RS232 et PIC

    j'ai posé un scope sur le retour, mais ce n'est pas un analyseur de trame, donc je ne peux pas "lire" la trame, mais je vois passer l'aller et le retour
    l'erreur de cablage ? le n'ai que les 3 fils Rx Tx et Gnd
    L'envoi est correct. je sais envoyer un SMS et le recevoir sur mon portable, donc l'envoi est bien pris en compte

    Je suis vraiment débutant en PIC, un peu plus moustachu en com et modem; J'aurai tendance à penser que j'oublie, que j'exploite ou que je paramètre mal les registres du PIC
    Dernière modification par tranquille12 ; 24/12/2012 à 12h57.

  22. #17
    tranquille12

    Re : RS232 et PIC

    J'ai essaye aussi de faire un pull up et un pull down sur RC6 et RC7 mais ça ne change rien

  23. #18
    tranquille12

    Re : RS232 et PIC

    Si je ne positionne pas SW3 sur LED, mes datas ne partent pas, hors sur le schema, ce n'est qu'une led et une R de 10k qui est enclenchée par sw3
    bizarre

  24. Publicité
  25. #19
    tranquille12

    Re : RS232 et PIC

    J'alimente ma carte EasyPICv7 avec une alim extérieure, au cas où l'alim USB ne suffirait pas
    Mais le résultat est le même

  26. #20
    tranquille12

    Re : RS232 et PIC

    Mon init de l'UART
    Code:
                     
    
    TRISC7_bit = 1        ' set RC7 pin as input rx
    TRISC6_bit = 0        ' set RC6 pin as Output tx
    
    
    UART1_Init(9600)                     ' Initialize UART module at 9600 bps
    Delay_ms(100)                        ' Wait for UART module to stabilize
    Ma procédure d'envoi

    Code:
    UART1_Write_Text("ATE")
    UART1_Write(13)                      ' Carriage Return
    UART1_Write(10)                      ' Line Feed
    Delay_ms(100)
    Mon code de reception pour remplir mon tableau de bytes issus de Uart1_Read

    Code:
    if (UART1_Data_Ready() <> 0) then                           ' Reception d'une donnée
           reception[i] = UART1_Read ()
           i=i+1
    end if
    Dernière modification par tranquille12 ; 24/12/2012 à 16h12.

  27. #21
    tranquille12

    Re : RS232 et PIC

    Un coup d'analyseur de trame montre que la commande ATE0 ne désactive pas l'echo sur ce modem
    Toujours se mefier de ce que l'on pense connaitre !

  28. #22
    RISC

    Re : RS232 et PIC

    Salut Tranquille12,

    Comment as-tu programmé les bits de configurations ?
    Il faut être sûr que tu tournes sur le quartz externe.
    NB : le PIC18F45K22 a 2 UART HW..pas besoin de s'ennuyer avec un 2e UART SW

    a+
    Ma marotte ? les microcontrôleurs ;=)

  29. #23
    tranquille12

    Re : RS232 et PIC

    Avec le basic de Mikroe, on n'a pas besoin de programmer les bits de config quand on charge la biblio
    Je suis passé sous interruption et ça marche
    Je trouve bizarre de ne pas pouvoir tourner sans les interrupt, mais bon ...

    le sujet peut être cloturé, sauf si quelqu'un a des explications ou une info qui justifie les résultats, pour ma part, je stoppe les tests et continue mon prog
    merci à tous ceux qui se sont penchés sur le pb
    ++
    Yves

Discussions similaires

  1. pic uart rs232 pc
    Par abrac dans le forum Électronique
    Réponses: 16
    Dernier message: 27/01/2012, 12h34
  2. rs232 pic et pc
    Par coeur noire dans le forum Électronique
    Réponses: 2
    Dernier message: 16/07/2011, 08h37
  3. PIC interruption RS232
    Par abdelhafidhberkana dans le forum Électronique
    Réponses: 2
    Dernier message: 14/05/2009, 16h34
  4. Pic programmable rs232
    Par didou1982 dans le forum Électronique
    Réponses: 6
    Dernier message: 10/03/2009, 16h28
  5. RS232 et PIC
    Par poche49 dans le forum Électronique
    Réponses: 1
    Dernier message: 26/08/2008, 10h34
Découvrez nos comparatifs produits sur l'informatique et les technologies.