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

aide pour PIC 16F877 vers PC via port serie (transfert de données)



  1. #1
    noozee

    Question aide pour PIC 16F877 vers PC via port serie (transfert de données)


    ------

    Bonjour à tous et toutes...

    Je suis en train de travailler sur un projet qui de cryptage par carte PIC.

    Je programme ma PIC en C
    (avec CC5X31, mais ca n'a pas vraiment d'importance il me semble)

    Je rentre avec un son analogique dans la PIC, je la connverti en binaire et je la crypte. Ensuite j'envoie le tout par le port série de la carte PIC sur le PC.

    Seulement, j'ai un petit problème, c'est que je n'arrive pas à envoyer les données sur le port série.

    Si quelqu'un savait me donner la moindre info concernant cette communication, je prends.

    Merci.

    Je vous joinds un exemple de code qui devrait être fonctionel, mais qui ne l'est pas vraiment...

    Bonne journée.


    ############################## #####
    ############################## #####
    ############################## #####

    /*
    SERIAL COMMUNICATION (RS232)
    ============================

    Using 9600 baud, one stop bit, no parity.
    Baudrate 9600 baud => 104.167 microsec. per bit
    TMR0 counts each 8th microsec. => 13.02 steps per bit

    ______ _____ _____ _____ _____ _____ _____ _____ _____ _____
    |_____|_____|_____|_____|_____ |_____|_____|_____|_____|
    Start bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 Stop

    NOTE: RS232 signal levels are different from the CMOS levels
    used by the PIC device. A level converter is required:

    Logic level CMOS RS232
    1 (default) +Vcc -2.8V to -15V
    0 0 V +2.8V to +15V
    */

    #define _4_MHz /* 4 MHz system clock */

    // optional items
    //#define UseTMR0
    //#define USE_CONST


    #pragma bit RS232_out @ PORTB.0
    #pragma bit RS232_in @ PORTB.1

    #ifdef _4_MHz
    #define TimeStartbit 4
    #define BitTimeIncr 13
    #endif

    char bitCount, limit;
    char serialData;

    #ifdef _4_MHz
    #ifdef UseTMR0
    #define delayStart limit = TMR0;
    #define delayOneBit \
    limit += BitTimeIncr; \
    while (limit != TMR0) \
    ;
    #else
    #define delayStart /* empty */
    #define delayOneBit { \
    char ti; \
    ti = 30; \
    do ; while( --ti > 0); \
    nop(); \
    } /* total: 5 + 30*3 - 1 + 1 + 9 \
    = 104 microsec. at 4 MHz */
    #endif
    #endif

    void sendData( char dout)
    /* sends one byte */
    {
    RS232_out = 0; /* startbit */
    delayStart
    for (bitCount = 9; ; bitCount--) {
    delayOneBit
    if (bitCount == 0)
    break;
    Carry = 1; /* incl. stopbit */
    dout = rr( dout);
    RS232_out = Carry;
    RS232_in = 1;
    }
    }


    #define NText 12

    #ifndef USE_CONST
    char text( char i)
    {
    skip(i);
    #pragma return[NText] = "Hello world!"
    }
    #else
    const char text[NText] = "Hello world!";
    #endif


    void main( void)
    {
    char i;

    /* NOTE: some devices like the 16F877 have an on-chip analog to
    digital converter with analog input pins that should be
    configured. */
    //ADCON1 = ..; // Refer to the data sheet for init values.

    PORTB = 0x03; // xxxx xx11
    TRISB = 0xFE; // xxxx xx10
    OPTION = 2; // prescaler divide by 8

    for (i = 0; i < NText; i++) {
    #ifndef USE_CONST
    sendData( text(i)); /* text string */
    #else
    sendData( text[i]); /* text string */
    #endif
    }



    //////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////


    WaitNextIO:
    while (RS232_in == 1)
    ;

    Start_RS232:
    /* sampling once per bit */
    TMR0 = 0;
    limit = TimeStartbit;
    while (limit != TMR0)
    ;
    if (RS232_in == 1)
    goto StartBitError;

    bitCount = 8;
    do {
    limit += BitTimeIncr;
    while (limit != TMR0)
    ;
    Carry = RS232_in;
    serialData = rr( serialData); /* rotate carry */
    } while (-- bitCount > 0);

    limit += BitTimeIncr;
    while (limit != TMR0)
    ;
    if (RS232_in == 0)
    goto StopBitError;

    /* 'serialData' can be processed here */
    /* NOTE: limited time (40 - 50 microsec.) */
    goto WaitNextIO;

    StopBitError:
    /* RS232 stopbit error,
    waiting while line is low */
    while (RS232_in == 0)
    ;
    StartBitError:
    goto WaitNextIO;
    }

    -----
    Fichiers attachés Fichiers attachés

  2. Publicité
  3. #2
    mictour

    Re : aide pour PIC 16F877 vers PC via port serie (transfert de données)

    Bonjour noozee,
    Regarde ici : http://www.isk.kth.se/kursinfo/mekat...ab/include.htm
    tu trouveras ce qu'il te faut en RS232 et CC5X.
    Ce sont les routines que j'utilise, sans problème.
    Bonne prog.
    mictour.
    PS : le site est en suedois mais les routines, en anglais.

  4. #3
    noozee

    encore qques petits prob's . . .

    Un tout grand merci pour ce lien, j'y ai trouvé pas mal d'infos interressante.

    Seulement, je dispose d'une 16F877A et non d'une 874.
    je sais pas si ca change grand chose.

    De plus, je dois transmettre des bits crypter avec ma fonction de convertion analogique.

    Je dois donc transmettre des bits sur le port série.

    Je suis tout perdu, cela me semble tellement complexe!!

    Si quelqu'un avait un prog fonctionnel qui fait des actions semblables, je suis toujours preneur.

    Je rappelle que le plus important pour moi est de transferer des bits sur le port serie et vers un pc, mais pas d'en recevoir.

    Merci à tous, bonne journée

  5. #4
    mictour

    Re : encore qques petits prob's . . .

    Bonjour noozee,
    Pour le 877A, il suffit de modifier le 'include' ( tu n'as pas besoin du comparateur ?) .
    Par contre je ne comprends pas bien cette histoire de bits cryptes. En RS232 on envoie, n'est-ce pas, des octets. Si tu dois crypter ....
    Pour un exemple de conversion A/N il suffit de demander ! http://www.isk.kth.se/kursinfo/mekat...ript/adlab.htm
    A bientôt, mictour.

  6. #5
    mictour

    Re : encore qques petits prob's . . .

    Re-bonjour...
    Peut-être que ce que tu cherches est dans le fichier 'ascnum.c' (1er lien), routine 'chartoa' ... et que je n'ai pas compris ton problème ?
    mictour.

  7. A voir en vidéo sur Futura
  8. #6
    noozee

    Re : aide pour PIC 16F877 vers PC via port serie (transfert de données)

    Bonjour tout le monde !!
    Et bien voila, je suis enfin arriver a faire tourner mon projet. Je vais vouss expliquer pour les suivant, ce sera surement tres utile!!


    - tout d'abord, je rentre avec un sinus (ou un autre signal comme un micro par) dans la carte PIC 16F877A (avec mplab ICD2).

    - grace a l'instruction ADRESH.x du convertisseur analogique/numérique (x = 7 à 0) on obtient la valeur de l'amplitude du signal à l'instant T où la convertion se fait. c'est donc un échantillon sur 8bits et donc une valeur comprise entre 0 et 255.
    - j'inverse un bit sur 2 pour crypter le signal qui rentre et la nouvelle suite de 8 bits est convertie en un Entier (entre 0 et 255) et je l'envoie par le port série de la PIC sur mon pc (COM).

    - j'effectue cette opération en boucle infinie.

    - sur le pc, j'utilise MATLAB pour réceptioner les données, ce qui va me permettre d'afficher un graphique sur XX données recue de la PIC.

    - le sinus que j'envoie à une amplitude max de 5v, sinon on crame la carte PIC

    - il faut mettre un offset sur le générateur de fonction pour "remonter" le sinus (les 8 bits d'échantillon représentent une valeur positive, et pas capable de données une valeur négative, or un sinus d'amplitude 1 sera compris entre -1 et 1 V !) D'ou, remonte le signal pour toutes les valeurs du sinus positive (entre 0 et 2 par exemple). Facile à controler avec un oscillateur.

    - Préférer des fréquences faible (moins de 100Hz, sinon il y a apparition de battement dans le signal).

    - pour ma part, j'injecte un sinus à 10Hz, pour un meilleur échantillonage.

    - je défini sur matlab le nombre d'échantillon que je souhaite recevoir par le port série (environ 5000 à 10000)

    - MATLAB recoit des entier entre 0 et 255, mais qui ont été crypter en binaire !!

    - on va donc reconvertir chaque entier en binaire et ré-inverser un bits sur 2 pour obtenir la valeur décryptée.

    - on retranfsorme la suite binraire décryptée en entier et on divise ce dernier par 255 pour avoir des valeurs entre
    0 et 1, plus facile à visualiser

    - ensuite, j'affiche 2 graphique de 200 à 400 échantillon chacun. l'un représente le signal crypté et l'autre le signal décrypter, qui est identique au sinus 10Hz envoyer et en apercu sur l'oscilloscope.

    Je joinds les fichier nécessaire au fonctionnement de ce projet, ca peut toujours interesser quelqu'un !

    - le fichier matlab pour la réception (decrypter.txt à reconvertire en *.m))
    - le fichier C pour programme la pic 16F877A (crytpage.txt à renomer en *.c)
    - la librairie 16F877A.txt (à mettre dans le meme dossier que le fichier C et renommé en *.h)

    il y a énormément de commentaire dans les fichier, donc la compréhension sera très facile !

    Merci pour votre soutient rapide !


    Je suis à vote entière disposition pour toute remarque, question ou amélioration.

    Merci,
    Nico
    Fichiers attachés Fichiers attachés

  9. Publicité
  10. #7
    mehdavitcha85

    Re : aide pour PIC 16F877 vers PC via port serie (transfert de données)

    bonjour tous le monde je voulais tous d'abord remercié tous les gens qui participent a ce forum vraiment je trouve sa trés interessant voila moi je suis nouveau dans ce forum je m'interesse a cette rebrique spéciallement car je suis entrein de réalisé un projet et la je suis dans la partie programmation je v commencé tous d'abord a programmé sur un pic 16f887 avec CCS le probléme c que j'essaye a m'adapter avec ce dernier a travers des programmes sinon est ce que y'a des documantations interessante sur la programmation avec CCS. merci!!!!

  11. #8
    RISC

    Re : aide pour PIC 16F877 vers PC via port serie (transfert de données)

    Bonsoir,

    Tu peux télécharger le manuel du langage C de CCS ici :

    http://www.ccsinfo.com/downloads/ccs_c_manual.pdf

    a+

  12. #9
    faffou

    Re : aide pour PIC 16F877 vers PC via port serie (transfert de données)

    bonsoir
    s'il vous plait est ce que vous avez pu réaliser une communication série via RS232 avec CCS C? car j'ai besoin de ça urgent et je suis plintée. s'il vous plait aidez moi!!!!

Discussions similaires

  1. Programme en C pour PIC 16F877
    Par riquet dans le forum Électronique
    Réponses: 7
    Dernier message: 11/04/2012, 13h25
  2. Communication PIC <-> PC port série
    Par Toufinet dans le forum Électronique
    Réponses: 7
    Dernier message: 27/05/2010, 16h13
  3. Port serie sur 16F877 avec CCS
    Par joseph4008 dans le forum Électronique
    Réponses: 7
    Dernier message: 12/07/2006, 18h56
  4. Pb transfert des données caméra vers pc
    Par Aurelieetnathan dans le forum Matériel - Hardware
    Réponses: 6
    Dernier message: 18/04/2006, 20h27
  5. PIC et port série -- Parasites ?
    Par Milkidreams dans le forum Électronique
    Réponses: 17
    Dernier message: 18/10/2005, 11h41
Découvrez nos comparatifs produits sur l'informatique et les technologies.