Problème RS232 et interruption PIC18F46K22
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Problème RS232 et interruption PIC18F46K22



  1. #1
    invite831b139b

    Problème RS232 et interruption PIC18F46K22


    ------

    Bonjour, voilà j'ai un projet en cours qui nécessite d'utiliser la liaison RS232 du PIC.
    Mon programme fonctionne parfaitement avec les interruptions si j'utilise les PIN C6 et C7 du PIC (RX et Tx), seulement pour des raisons de design du PCB je ne peux pas les utiliser. j'ai essayer d'utiliser B4 et B5 mais l'interruption ne fonctionne pas alors que le PIC envoie bien des messages (donc l'USART fonctionne bien avec ces broches...)

    à la base je voulais utiliser B6 et B7 (PGC et PGD) pour pouvoir utiliser le connecteur HE10 qui sert à la RS232 pour programmer le PIC avec l'ICD, mais ces broches semblent ne pas être compatibles...

    Je pense partir sur un PIC24F mais avant je préfère voir si il y a pas une solution, j'ai passé plus de 30h sur le design je tiens pas à recommencer à zéro avant d'être sur...

    merci

    -----

  2. #2
    paulfjujo

    Re : Problème RS232 et interruption PIC18F46K22

    bonsoir,


    Citation Envoyé par mica25000 Voir le message
    j'ai essayer d'utiliser B4 et B5 mais l'interruption ne fonctionne pas alors que le PIC envoie bien des messages (donc l'USART fonctionne bien avec ces broches...
    merci
    C'est un SoftUART avec les pins B4 et B5 .
    sinon tu pourrais utiliser B0 comme pin RX
    et utiliser l'interrupt via RB0 pour detecter le front d'arrivée d'un caractere..
    il faudra modifier alors la routine SW_UART.C de la librairie UARTsoft.
    ou reecrire une subroutine LectUART..

    Moi je l'ai deja utilisé en B4 B5 (donc SOFT UART) sans interrupt
    mais avec le timer0 pour ne pas rester bloqué dans la boucle d'attente de lecture d'un caractere (mode pooling.)
    Je n'ai pas encore testé la soluce au dessus..
    mais ca marche avec un 16F84 !!!
    Dernière modification par paulfjujo ; 19/12/2012 à 16h33.

  3. #3
    RISC

    Re : Problème RS232 et interruption PIC18F46K22

    Salut Mica,

    Peux-tu poster ton schéma et ton code ?
    tu peux également télécharger le code pour le PIC18F46K22 qui se trouve sur la carte PICDEM2PLUS sur cette page (samples files).

    a+
    Dernière modification par RISC ; 19/12/2012 à 21h24.

  4. #4
    invite831b139b

    Re : Problème RS232 et interruption PIC18F46K22

    Bonjour et merci pour vos réponses, je suis en train de revoir le design pour encore optimiser la taille (j'espère arriver à un circuit de 35*30mm et j'en suis à 35*35...), mais les solutions m'intéressent. Je ne peux pas poster mon code en entier (il est assez long) mais juste la partie qui sert à la RS-232 et les FUSES. J'utilise le compilateur CCS et j'utilise aussi le RTOS (Système d'Exploitation en Temps Réel) inclus dans la dernière version.
    Code:
    #include <18F46K22.h>
    #device ICD=TRUE
    #device adc=16
    #FUSES NOWDT                    //No Watch Dog Timer
    #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
    #FUSES HS                       //High speed Osc, high power 16MHz-25MHz
    #FUSES NOPLLEN                  //4X HW PLL disabled, 4X PLL enabled in software
    #FUSES NOBROWNOUT               //No brownout reset
    #FUSES WDT_NOSLEEP              //Watch Dog Timer, disabled during SLEEP
    #FUSES NOMCLR                   //Master Clear pin used for I/O
    #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
    #use delay(clock=24000000)
    #use rs232 (baud = 57600, parity = N, xmit = PIN_B4, rcv = PIN_B5, bits = 8, stream = RS232_1, errors)
    #use rs232 (baud = 57600, parity = N, xmit = PIN_D6, rcv = PIN_D7, bits = 8, stream = RS232_2, errors)
    #define SYSTEM_LED       PIN_E0
    
    short trame_RS232_1_presente = FALSE;
    short trame_RS232_2_presente = FALSE;
    char  buffer_RS232_1 [50];
    char  trame_RS232_1;
    char  buffer_RS232_2 [50];
    char  trame_RS232_2;
    int   pointeur_buffer_RS232_1 = 0;
    int   pointeur_buffer_RS232_2 = 0;
    
    #int_RDA
    void RDA_isr (void) 
       {
       trame_RS232_1 = fgetc(RS232_1);
       if (trame_RS232_1 == TERMINAISON) 
          {
          trame_RS232_1_presente = TRUE;
          buffer_RS232_1 [pointeur_buffer_RS232_1] = 0;
          pointeur_buffer_RS232_1 = 0;
          } 
       else
          {
          buffer_RS232_1 [pointeur_buffer_RS232_1++] = trame_RS232_1;
          if (pointeur_buffer_RS232_1 == 49)
             {
             pointeur_buffer_RS232_1 = 0;
             trame_RS232_1_presente = FALSE;
             }
          }
       }
    
    #int_RDA2
    void RDA2_isr (void) 
       {
       trame_RS232_2 = fgetc(RS232_2);
       if (trame_RS232_2 == TERMINAISON) 
          {
          trame_RS232_2_presente = TRUE;
          buffer_RS232_2 [pointeur_buffer_RS232_2] = 0;
          pointeur_buffer_RS232_2 = 0;
          } 
       else
          {
          buffer_RS232_2 [pointeur_buffer_RS232_2++] = trame_RS232_2;
          if (pointeur_buffer_RS232_2 == 10)
             {
             pointeur_buffer_RS232_2 = 0;
             trame_RS232_2_presente = FALSE;
             }
          }
       }
    
    #use rtos (timer = 0)
    
    #task (rate = 500ms)
    void toggle_led_2 (void)
       {
       output_toggle (SYSTEM_LED);
       }
       
    #task (rate = 5ms)
    void use_uart_1 ()
       {
       rtos_await (trame_RS232_1_presente);
       analyse_trame ();
       pointeur_buffer_RS232_1 = 0;
       trame_RS232_1_presente = FALSE;
       }
    
    #task (rate = 5ms)
    void use_uart_2 (void)
       {
       rtos_await (trame_RS232_2_presente);
       trame_RS232_2_presente = FALSE;
       }
    
    void main()
       {
       setup_adc_ports(sAN0);
       setup_adc (ADC_CLOCK_DIV_2 | ADC_TAD_MUL_0);
       setup_timer_2 (T2_DIV_BY_1, 127, 1);
       setup_timer_3 (T3_DISABLED | T3_DIV_BY_1);
       setup_timer_4 (T4_DISABLED, 0, 1);
       setup_timer_5 (T5_DISABLED | T5_DIV_BY_1);
       setup_timer_6 (T6_DISABLED, 0, 1);
       setup_comparator (NC_NC_NC_NC);
       setup_spi (SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_4);
       setup_ccp1 (CCP_PWM);
       enable_interrupts (INT_RDA);
       enable_interrupts (INT_RDA2);
       enable_interrupts (GLOBAL);
       initialisation ();
       while (true)
          {
          rtos_run ();
          }
       }
    Je ne sais pas trop comment procéder pour choisir entre le soft UART ou le hard UART, j'ai juste fait le changement au niveau de la ligne 14 en remplaçant C6 et C7 par B4 et B5.

    Merci à vous

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

    Re : Problème RS232 et interruption PIC18F46K22

    bonjour,

    Si on n'en crit la datasheet du PIC18F46K22
    tu n'as pas le choix

    Tel que tu l'as decris dans ton code
    Code:
    #use rs232 (baud = 57600, parity = N, xmit = PIN_B4, rcv = PIN_B5, bits = 8, stream = RS232_1, errors)
    #use rs232 (baud = 57600, parity = N, xmit = PIN_D6, rcv = PIN_D7, bits = 8, stream = RS232_2, errors)
    c'est OK pour gerer les 2 UART HARDWARE avec les gestions d'interruption associées

    mais si tu veux absolument utiliser B4 et B5
    qui ne peuvent etre re-aiguillé sur un UART Hardware
    il faudra passer par un SOftware UART , qui generiquement est sans interruption ( en mode pooling de l'entree )

    Voir le mode interrupt sur changement d'etat PortB RBIF,RBIE..etc
    pour gerer l'arrivée d'un caractere. et creer ta propre routine de lecture Uart.

    ou si RB0 est libre utiliser RB0 en RX. INTOIF,INTOIE..

  7. #6
    invite831b139b

    Re : Problème RS232 et interruption PIC18F46K22

    Merci beaucoup j'y vois déjà un peu plus clair, j'ai réussi à libérer RB0 j'aurai plus qu'à tester tout ça, je pense que ça va le faire! encore merci à vous!
    sujet résolu!

Discussions similaires

  1. PIC : interruption externe et interruption on change ?
    Par jlg_47 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 12h41
  2. Probléme interruption
    Par invite225faa3f dans le forum Électronique
    Réponses: 2
    Dernier message: 04/05/2011, 12h09
  3. probleme spi sur pic18f46k22 ou 46j50
    Par skydarc dans le forum Électronique
    Réponses: 1
    Dernier message: 18/11/2010, 20h49
  4. probleme interruption
    Par invite020e659a dans le forum Électronique
    Réponses: 3
    Dernier message: 26/06/2010, 23h29
  5. PIC interruption RS232
    Par inviteb229ed52 dans le forum Électronique
    Réponses: 2
    Dernier message: 14/05/2009, 16h34
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...