Quelques précision pour gérer les données du RS232 sur un PIC
Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

Quelques précision pour gérer les données du RS232 sur un PIC



  1. #1
    invite00043ad3

    Quelques précision pour gérer les données du RS232 sur un PIC


    ------

    Bonjour à tous,

    dans le cadre d'un projet, j'essaie de réaliser un dialogue entre PC et PIC via le RS232. J'ai fait ma partit PC (avec l'aide de Daudet78) et je l'ai modifié pour mon programme.

    J'envoie donc des données via mon PC au RS232.
    J'envoie 3 types de données:
    Bouton 1 envoie : OD 4F 31 OA
    Bouton 2 envoie : OD 46 31 OA
    Bouton 3 envoie : OD 53 31 OA

    J'aimerais donc recevoir ces données dans mon PIC 16F877 et ainsi si je reçois : OD 4F 31 OA la sortie B0 est activé, si je reçois OD 46 31 OA c'est la sortie B1 et si je reçois OD 53 31 OA c'est la sortie B2 d'actif.
    Pour l'instant je ne désire pas envoyer de données du PIC au PC, je pense qu'il faut mieux commencer par la reception des données.

    J'ai feuilleté la doc de mon compilateur : CCS et j'en ai déduit ceci :
    que la fonction getc() réceptionnait les données et que la fonction putc() envoyait les données. Mais je n'en suis pas sûr du tout.

    Je ne connais pas la syntaxe.

    C'est pourquoi je m'en remets encore une fois à vous, j'aimerais si possible que quelqu'un m'explique clairement la syntaxe de réception des données dans le PIC en C. Pour ainsi gérer ces données et donc traiter les informations reçus.

    Pour certains, ce que je veux faire pourra vous paraître vraiment simple et banal mais quand on débute c'est pas évident.

    Vous m'avez déjà beaucoup aidé sur d'autres projets et vous m'avez permis de m'améliorer sur des tas de choses que j'ignorais. J'espère que ça sera encore le cas

    Je vous en remercie d'avance

    Bonne journée.

    -----

  2. #2
    invite00043ad3

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Je me permet de faire un petit UP.

    J'espere que quelqu'un pourra m'expliquer clairement la syntaxe de réception de données via RS232 dans le PIC, car je trouve rien de bienclair sur lesexemples pris dans le net. Je suis un peu perdu, il me faudrait quelque chose de claire.

    Je vous remercie d'avance

    Bonne soirée.

  3. #3
    invite0e5af214

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    salut,

    Je ne sais pas ce que vont en penser d'autres personnes, mais dans l'optique d'apprendre, de comprendre et de debugger facilement, pourquoi n'essaierais-tu pas d'utiliser les registres et flag internes du PIC, sans passer par des fonctions peut-etre compliquées, voire pourquoi pas buggées (ca arrive).


    Tu pourrais, même en C, avoir une fonction d'interruption que tu autoriserais sur reception de l'USART.
    Dans cette fonction tu testerais le flag qui si je me souviens bien s'appel RXIF.

    Tu récupererais ensuite l'octet du registre RXREG et le placerais quelque part en mémoire en attendant une nouvelle reception.


    Ensuite si tu veux tu pourrais écrire toi même une fonction qui attend la reception de 4 octets avant de te renvoyer le numero de la sortie à activer.

    Bon courage

  4. #4
    invite00043ad3

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Merci pour votre réponse.

    Par contre je n'ai jamais entendu parler de Flag sur un PIC, qu'est ce que c'est ?
    Je n'ai jamais vu les RXIF et RXREG, j'ai essayé de comprendre la section USART dans la datasheet de mon 16f877 mais je n'ai rien compris, tout est en anglais technique et quand on est étudiant c'est pas évident.

    Je suis quasiment sûr qu'il y a des fonctions dejà faite dans mon PIC qui me permettraient de recevoir les données, de les stocker puis de les traiter mais je ne les trouves pas, j'ai beau chercher je les trouves pas. Et surtout c'est pas facile d'y comprendre seul.

    Merci en tout cas pour vos aides

    Bonne soirée.

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

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Je suis quasiment sûr qu'il y a des fonctions dejà faite dans mon PIC qui me permettraient de recevoir les données
    Dans le PIC, surement pas. Dans les librairies du compilateur peut-etre.
    Si tu es étudiant, tu as déja du te rendre compte qu'on ne trouve jamais LA solution que l'on cherche nul part. Il faut toujours adapter un petit peu.

    Tape bigonoff sur google et lit son cours part1 ou 2, il y explique de A à Z le fonctionnement de l'USART.
    Il programme il assembleur et sur un autre pic que le tiens, mais le fonctionnement est exactement le même.



    Bonne chance

  7. #6
    Seb.26

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Tu veux apprendre ?
    -> gère tout en IT et des FIFO, avec une tache applicative qui consomme la FIFO Rx et qui remplit la FIFO Tx, les IT faisant tout le boulot d'émission et de réception ...

    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  8. #7
    invite00043ad3

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Merci pour vos réponses.

    Le problème des cours de bigonoff c'est que c'est en assembleur, moi il faut que je le fasse en C. C'est pour ça que je vous demandais à quoi servent les fonctions getc() et putc()

    La fonction getc() permet de recevoir une données via le Rs232 non ?

    Voilà sur quoi je m'étais basé :
    /// This program displays a message over the RS-232 and waits for ////
    //// any keypress to continue. The program will then begin a 1khz ////
    //// square wave over I/O pin B0. ///
    Code:
    #if defined(__PCM__)
    #include <16F877.h>
    #fuses HS,NOWDT,NOPROTECT
    #use delay(clock=20000000)
    #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 1
    
    void main() {
    
       printf("Press any key to begin\n\r");
       getc();
       printf("1 khz signal activated\n\r");
    
       while (TRUE) {
         output_high(PIN_B0);
         delay_us(500);
         output_low(PIN_B0);
         delay_us(500);
       }
    }
    D'après ce que j'ai compris le getc() reçoit les informations du RS232 mais il ne les garde pas en mémoire, ce n'est pas un buffer et on ne fait de réinitialisation quand on a une autre donnée.
    Mais je sais pas si c'est vraiment ça. Si c'est ça alors quand je reçoit une données particulière j'activerais une sortie tant qu'une autre entrée ne soit pas actif.

    Par contre le while juste après le getc() je n'ai pas vraiment compris quand il se met en "marche" est-ce après la réception de la donnée du RS232 ? Ou c'est une boucle infinie (je crois que l'on peut mettre TRUE pour faire l'infinie dans une boucle aussi non ?

    A noter que j'utilise CCS comme compilateur.

    Sinon Seb.26 je n'ai pas vraiment compris ce que vous vouliez me dire, je ne connais pas ces termes... pouvez vous me l'expliquez plus en détail ?

    Merci encore ?

  9. #8
    Seb.26

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Citation Envoyé par Panda184 Voir le message
    Sinon Seb.26 je n'ai pas vraiment compris ce que vous vouliez me dire, je ne connais pas ces termes... pouvez vous me l'expliquez plus en détail ?
    Oki, je détaille un peu alors ( NB: en général, sur un forum tout le monde tutoies tout le monde ... ne le prend donc pas mal si tu as du "tu" )

    Ce que je voulais dire, c'est qu'une façon que je trouve élégante de faire ( mais ceci n'est une fois de plus que mon opinion personnelle ... ), c'est d'utiliser les interruptions pour gérer 100% de la RS232.

    En gros, chaque fois qu'un octet arrive sur l'UART, il déclenche une interruption ( voir la datasheet ), cette interruption va stocker cet octet dans une FIFO ( disons FIFO_Rx ), et idem pour l'émission : quand une tache (le programme) veut envoyer une trame, il met les données dans une FIFO ( FIFO_Tx au hasard ), et les interruptions vont faire tout le boulot en consommant chaque octet et en l'envoyant sur l'UART ...

    Ton programme n'a donc plus à attendre un octet (qui n'arrivera peut être jamais ! ... adieu le watchdog ... ), il doit simplement regarder de temps à autre si des données sont présentes dans la FIFO, et si oui, les "consommer" puis éventuellement en produire lui même ( dans le FIFO_Tx ) ...

    Cela permet de traiter tout en tache de fond et de ne pas attendre "bêtement" sur un getc() ...

    Imagine que tu veuille faire un chenillard ( original, non ? ) qui soit piloté par le PC ... comment faire pour pouvoir à la fois attendre un éventuel octet via le getc() et en même temps continuer à faire clignoter tout le monde ?
    ( tu vas me dire que tu mettras le chenillard dans un Timer, mais n'est ce pas le monde à l'envers ? ... )

    D'une manière générale, un programme doit éviter d'attendre, attendre c'est perdre du temps CPU, mais également bloquer un programme ... que penserais tu si quand tu ouvre Word ton lecteur de MP3 s'arrête car le PC attend la prochaine touche au clavier ?

    Dans un programme simple comme le tient, c'est peu important, il est vrai ... Mais doit on commencer à mettre son clignotant à partir de 90KM/h ?

    << Just my 2 cents... >>

    Seb.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  10. #9
    Seb.26

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    PS: pour le getc(), je pense que son prototype doit ressembler à :
    Code:
    char getc();
    et s'utilise :

    Code:
    [...]
    
    char data = getc();
    
    if( data == '1' )
      start_toto();
    
    if( data == '0' )
      stop_toto();
    
    [...]
    Donc la fonction retourne le premier char qui arrive sur la RS232 ... quand un octet arrive ... s'il arrive ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  11. #10
    invite00043ad3

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Bien merci pour cette réponse.

    Donc en gros si je choisis une solution disons basique pour ce type de programme, je n'ai juste à utiliser la fonction getc().

    Par contre si je veux continuer à piloter un programme de manière manuel (bouton poussoir...) mais également recevoir des données via le RS232 je dois utiliser la méthode des FIFO.

    Par contre je n'ai jamais vu de FIFO dans quelconque programme, aurais-tu un exemple ?

    Mais dans un programme, on peut bien faire des if avec des commandes manuels (bouton poissoir) et un if avec le getc(), ça revient au même non ?
    Juste une petite chose le getc() il peut recevoir une trame de 4 octets ? Par exemple est-ce que je peux lui envoyer : OD 4F 31 OA ou juste lui envoyer 4F. C'est peut-être bête ce que je dis mais j'ai l'impression que ça risque de faire beaucoup de trames (bien qu'en réalité ça ne soit pas grand chose ) pour un simple getc() car quand va t-il savoir qu'il n'y a plus rien après le OA ?

    En tout cas merci pour tout
    J'essaie de faire des recherches sur les FIFO, si vous avez un site dessus je suis prenant

  12. #11
    Seb.26

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Pour les FIFO, facile : http://fr.wikipedia.org/wiki/PEPS
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  13. #12
    Seb.26

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Citation Envoyé par Panda184 Voir le message
    Donc en gros si je choisis une solution disons basique pour ce type de programme, je n'ai juste à utiliser la fonction getc().
    Oui, je pense ...

    Code:
    Par contre si je veux continuer à piloter un programme de manière manuel (bouton poussoir...) mais également recevoir des données via le RS232 je dois utiliser la méthode des FIFO.
    C'est une solution, mais si sais que tu ne vas recevoir qu'une seul octet à la fois, une simple variable "Rx_Data" peut suffire aussi ( tu la mets à 0xFF quand elle est "vide", et quand un octet arrive, tu le mets dedans ... le programme "voit" la valeur, la traite, puis remets 0xFF ...etc... )

    Les FIFO permettent une utilisation asynchrone de ton UART ...

    Mais dans un programme, on peut bien faire des if avec des commandes manuels (bouton poissoir) et un if avec le getc(), ça revient au même non ?
    Si tu mets ton getc() dans un if, tu ne sortira de ton if que si un octet arrive ...

    Mais tu peux en effet écrire :
    Code:
    if( getc()==0x4E ) { ... }
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  14. #13
    invite00043ad3

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Merci pour tout, je vais essayer de me renseigner pour les RX_data, les FIFO.... surtout pour avoir la syntaxe du programme.

    Pour le getc() il ne peut recevoir donc qu'une seule trame de 1 octet ? Pas 4 comme initialement prévu ?

  15. #14
    Seb.26

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Citation Envoyé par Panda184 Voir le message
    Pour le getc() il ne peut recevoir donc qu'une seule trame de 1 octet ? Pas 4 comme initialement prévu ?
    Le getc() ne fait qu'une seule chose : attendre (indéfiniment) qu'un octet arrive sur la RS232 et en renvoyer la valeur ...

    Si tu en veux 4, il faut faire :
    Code:
    char[4] Rx_Buffer;
    char i;
    for( i=0 ; i<4 ; i++ )
      Rx_Buffer[i] = getc();
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  16. #15
    invite00043ad3

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Ah oui j'avais pas pensé au tableau. Donc en gros si j'envoie juste un octet, un getc() suffit, si j'en envoie plusieurs je fais un tableau.
    Mais le getc() n'est pas la meilleur façon de procéder, il est preferable de faire un rx_data ou utiliser le FIFO. Il me reste à trouver la syntaxe pour les utiliser et ça je ne le trouve pas

    Merci encore

  17. #16
    Seb.26

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Citation Envoyé par Panda184 Voir le message
    Mais le getc() n'est pas la meilleur façon de procéder, il est preferable de faire un rx_data ou utiliser le FIFO. Il me reste à trouver la syntaxe pour les utiliser et ça je ne le trouve pas
    Y'a pas de syntaxe "toute faite", c'est à toi de bosser ... ... c'est pour ça que je te disais "si tu veux apprendre ..."

    Maintenant, si tu veux obtenir un résultat fonctionnel "rapidement", et si tu pense que le getc() répond à ton besoin et que cela ne t'empêchera pas plus tard d'aller plus loin, et bien fais comme tu le sens ... surtout que tu as l'air de débuter en C ( je me trompe ? ) ...

    En gros, une FIFO, c'est quoi ?
    -> un buffer
    -> un pointeur de lecture
    -> un pointeur d'écriture
    + facultatif :
    -> un compteur d'octet présent
    -> la valeur maximum de nombre d'octet présent

    le principe est simple : quand tu veux ajouter un octet à ta FIFO, tu le place dans ton tableau à l'endroit pointé par le pointeur d'écriture, puis tu l'avance d'un cran ( en retournant au début si tu atteins la fin du buffer ), et idem pour la lecture : tu lis la valeur à l'indice du pointeur de lecture, puis tu l'avance d'une case.

    ... peut être devrais tu lire quelques cours sur les algorithmes ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  18. #17
    invite00043ad3

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    En faite j'ai déjà pas mal programmer en C mais sur console windows et sur quelques applications assez basiques sur des PIC (gestion bouton, gestion capteur analogique...) mais jamais avec du RS232.

    Mais il y a quelque chose que je ne comprend pas trop pour le FIFO, on doit bien partir de quelque chose non ? Je veux dire par là qu'il faut pas tout réinventer, il y a bien un point de départ : comment utiliser le buffer (son écriture dans le programme par exemple), c'est le genre de choses que je n'ai jamais utilisé auparavant en C, c'est pour ça que si vous avez un tutoriel, un site ou quelque chose, je suis prenant

    En tout cas merci pour tout

    Je vais essayer de voir le getc() dans un premier temps, mais j'aimerais bien approfondir ce FIFO.

  19. #18
    Seb.26

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Citation Envoyé par Panda184 Voir le message
    Mais il y a quelque chose que je ne comprend pas trop pour le FIFO, on doit bien partir de quelque chose non ? Je veux dire par là qu'il faut pas tout réinventer, il y a bien un point de départ : comment utiliser le buffer (son écriture dans le programme par exemple), c'est le genre de choses que je n'ai jamais utilisé auparavant en C, c'est pour ça que si vous avez un tutoriel, un site ou quelque chose, je suis prenant
    Bah, tu dois en effet pouvoir trouver des exemples sur le net ...

    Les FIFO et LIFO sont vraiment les trucs de base que l'on voit en cours d'algo, avec la dichotomie, la récursivité, les parcours d'arbres binaires, les méthodes de tri, les listes chainées ...etc...

    Cherche des cours d'algorithme ... ... Potasse tout ça, et ensuite tu seras content de l'avoir fait ( c'est un conseil "satisfait ou remboursé", parole de Seb ! )

    Bon courage pour ton projet, @++
    Seb.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  20. #19
    invite00043ad3

    Re : Quelques précision pour gérer les données du RS232 sur un PIC

    Merci pour tout, je vais essayer de faire dans un premier temps mon programme avec getc() et au faite putc() sert a envoyer des caractèrc non ?

    En faite dans mes "cours" de progra j'ai d'abord fait beaucoup de progra séquentielle et combinatoire avec les logigrammes, equation logique.... puis je me suis mis au C mais sur console et j'ai jamais vu de FIFO ou LIFO, c'est pour ça qu'au début ça me paraissait du chinois ce que tu disais .
    Mais maintenant ça va bien mieux, je vais essayer de trouver ça sur le net, je vous tiendrais au courant sur l'évolution du programme avec le getc() et avec le FIFO

    Merci encore

Discussions similaires

  1. aide pour PIC 16F877 vers PC via port serie (transfert de données)
    Par invite1c4b6700 dans le forum Électronique
    Réponses: 8
    Dernier message: 08/05/2009, 02h47
  2. VB envoyer des données avec le rs232
    Par invite00043ad3 dans le forum Électronique
    Réponses: 31
    Dernier message: 07/03/2008, 18h01
  3. programme pour voir les données sur le port-jeu (DB 15)
    Par invitece60ff16 dans le forum Électronique
    Réponses: 2
    Dernier message: 13/01/2008, 13h07
  4. pour bien gérer les proportionnalités
    Par invite812a1562 dans le forum Science ludique : la science en s'amusant
    Réponses: 2
    Dernier message: 22/02/2007, 15h10
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...