[CCS] Petit problème avec interruption RDA
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

[CCS] Petit problème avec interruption RDA



  1. #1
    invite20f901d9

    [CCS] Petit problème avec interruption RDA


    ------

    Bonjour à tous,

    je travaille depuis peu avec le compilateur CCS pour programmmer des pic 18f4520 et je rencontre une petite difficulté.
    Pour bien démarrer avec ce compilateur, j'ai décidé de faire clignoter des LED sur les ports RB0 et RB1 du pic quand celui-ci recoit "Y" sur RX, en interruption. Ce caractère est envoyé (via RS 232) depuis un PC.
    Je receptionne le caractère sans problème, mais après il ne veut pas allé dans le "main" une fois reçu. J'ai regardé un peu partout sur les forums mais ayant quelques lacunes en anglais j'ai pas beaucoup progressé. Quelqun pourrait m'expliquer ce qu'il ne va pas svp?


    le code :

    Code:
    #include <Etalonnage Auto.h>
    #use rs232(baud=9600,  parity=N, xmit=PIN_C6, rcv=PIN_C7, stream=PORT1, bits=8, errors)    
    #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT  
    
    char reception[1]='\0';
    int i=0;
    
    #INT_RDA
    void RDA_isr()
    	{
    	puts("ack");
       	gets(reception);
    	}
    
    void main(void)
       {   
       enable_interrupts(GLOBAL);
       enable_interrupts(INT_RDA); 
    
       set_tris_b(0x00);
    
       while(1)
          {
          if (reception[0]=='Y')
    		while(i<4)				// fonction permettant de faire clignoter les leds de RB0 et RB1 (4 fois)
               {					// elle est active quand reception[0] = Y
               output_high(PIN_B0);
               output_high(PIN_B1);
               delay_ms(500);
               output_low(PIN_B0);
               output_low(PIN_B1);
               delay_ms(500);
    		   i++;
               } 
          }
       }

    J'utilise PCW de CCS pour écrire les codes et Mplab (configuré pour le compilateur CCS) pour les transferer sur le Pic.
    (à noter que la fenetre "watch" de Mplab m'indique bien que reception[0] = 'Y' mais i toujours à 0)
    Je compte garder le "gets()" afin d'envoyer des chaînes "d'ordre" pour plus tard.


    Merci bien par avance.

    -----

  2. #2
    invite20f901d9

    Re : [CCS] Petit problème avec interruption RDA

    Personne svp? Je n'arrive toujours pas à sortir de cette interruption.

  3. #3
    carcan

    Re : [CCS] Petit problème avec interruption RDA

    Hello !

    je ne suis pas au bureau et je n'ai pas ma bible CCS sous la main, mais :
    - Utilise getc à la place de gets
    - déclare ta variable comme un caractère simple (char reception)
    - à la fin de ta boucle de clignotement, remets i à 0

    A+
    Laurent

  4. #4
    invite20f901d9

    Re : [CCS] Petit problème avec interruption RDA

    Salut Laurent,


    Merci pour ton conseil avec le getc(), ca fonctionne Ca m'avance un peu c'est déjà ca.

    Je vais continuer à résoudre le problème en ce qui concerne le gets(), car plus tard je compte complexer un peu plus le code en receptionnant une chaîne de caractère plutot qu'un seul bit, et faire un tri.
    Si tu as des suggestions par rapport au gets() n'hesite pas je suis preneur.


    voici le code à jour :

    Code:
    #include <18F4520.h>
    #use delay(clock=40000000)
    #use rs232(baud=9600,  parity=N, xmit=PIN_C6, rcv=PIN_C7, stream=PORT1, bits=8,)
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    
    int i=0;
    char reception;
    
    #INT_RDA
    void RDA_isr()
       {
       reception=getc();
       puts("ack");           
       i=0;
       }
    
    void main(void)
       {   
       enable_interrupts(GLOBAL);
       enable_interrupts(INT_RDA); 
    
       set_tris_b(0x00);
    
       while(1)
          {
          if (reception==0x31)
          {
          while(i<4)            // fonction permettant de faire clignoter les leds de RB0 et RB1 (4 fois)
               {               // elle est active quand reception[0] = Y
               output_high(PIN_B0);
               output_high(PIN_B1);
               delay_ms(100);
               output_low(PIN_B0);
               output_low(PIN_B1);
               delay_ms(100);
               i++;
               }
          reception='\0';
          }
    
       else if (reception==0x30)
          {
          while(i<1)            // fonction permettant de faire clignoter les leds de RB0 et RB1 (4 fois)
               {               // elle est active quand reception[0] = Y
               output_high(PIN_B0);
               output_high(PIN_B1);
               delay_ms(100);
               output_low(PIN_B0);
               output_low(PIN_B1);
               delay_ms(100);
               i++;
               }
          reception='\0';
          }
       }
    }

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

    Re : [CCS] Petit problème avec interruption RDA

    Bon, après toute une journée de recherches + aspirine, j'ai enfin réussi.

    Il faut faire un carriage return juste après l'envoi de la chaîne de caractères depuis le PC. Le pic receptionne le tout et quand il voit ce carriage return il comprend que c'est la fin de la chaîne de caractère et retourne dans le main (enfin d'après ce que j'en ai déduis).


    Voila le code qui marche avec quelques rajouts, pour ceux qui auront le même problème que moi :



    Code:
    #include <18F4520.h>
    #use delay(clock=40000000)
    #use rs232(baud=9600,  parity=N, xmit=PIN_C6, rcv=PIN_C7, stream=PORT1, bits=8,)
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    
    int i=0;
    char reception[8]={'\0'}; //initialisation : tableau vide
    
    
    #define BUFFER_SIZE 32
    BYTE buffer[BUFFER_SIZE];
    BYTE next_in = 0;
    BYTE next_out = 0;
    
    
    #int_rda
    void serial_isr() {		//interruption quand quelque chose arrive sur RX (RC7)
       int t;
       buffer[next_in]=getc();
       t=next_in;
       next_in=(next_in+1) % BUFFER_SIZE;
       if(next_in==next_out)
         next_in=t;           // Buffer full !!
    }
    
    #define bkbhit (next_in!=next_out)
    
    BYTE bgetc() {
       BYTE c;
       while(!bkbhit) ;
       c=buffer[next_out];
       next_out=(next_out+1) % BUFFER_SIZE;
       return(c);
    }
    
    
    void get_string(char* s, unsigned int8 max) { //dispo dans "input.c" : C:\Program Files\PICC\Drivers
       unsigned int8 len;						  // supprimer les "putc()", y en a 4
       char c;
       --max;
       len=0;
       do {
         //c=getc();  // Commented out.
           c = bgetc();   // Call bgetc(). ajouter  
           if(c==8) {  // Backspace
            if(len>0) {
              len--;
            }
         } else if ((c>=' ')&&(c<='~'))
           if(len<=max) {
             s[len++]=c;
           }
       } while(c!=13);
       s[len]=0;
    }
    
    #define STRING_SIZE 40 
    
    
    
    //PROGRAMME PRINCIPALE
    //*********************
    void main(void)
       {   
       enable_interrupts(GLOBAL);
       enable_interrupts(INT_RDA); 
    
       set_tris_b(0x00); //ports B en sorties
    
       while(1)
          {
          get_string(reception, STRING_SIZE-1);
          
          if (reception[0]=='1')
          {
          while(i<4)            
               {      				//clignotement des leds RB0 et RB1 (4 fois) si le premier
    								//caractère est égal à 1
               output_high(PIN_B0);
               output_high(PIN_B1);
               delay_ms(100);
               output_low(PIN_B0);
               output_low(PIN_B1);
               delay_ms(100);
               i++;
               }
          i=0; // i remis à zero
          puts("ack"); //opération éffectuée
          }
    
       else if (reception[0]=='0')
          {							//clignotement des leds RB0 et RB1 (1 fois)
    								//caractère est égal à 0
          while(i<1)            
               {               
               output_high(PIN_B0);
               output_high(PIN_B1);
               delay_ms(100);
               output_low(PIN_B0);
               output_low(PIN_B1);
               delay_ms(100);
               i++;
               }
          i=0;
          puts("ack");
          }
       }
    }


    Merci Julien, et si tu as des suggestions par rapport au code ci-dessus n'hesite pas (ainsi que le reste des membres du forum).

    A+

  7. #6
    invited0ebaa8a

    Re : [CCS] Petit problème avec interruption RDA

    Bonjour a vous
    je suis sur un projet de fin d'étude qui me demande l'utilisation d'interruption RDA sur un DSPIC30F3013.
    je dois pouvoir récupérer les donnés transmises par un module Zigbee sur ma broche RX (sur ce DSPIC les broches permettant la communication de l'UART1 sont aussi celle qui permettent la programmation (PGC,PGD), donc ils nous permet d'utiliser deux autre broches appelées UART1A qui sont celles que j'utilise.)
    malheureusement après 6h passées dessus je n'arrive pas à récupérer mes données pour les traiter.
    si vous pouvez m'aider voici le programme en question:

    code:

    #include "P:\micropc\Projet_E6.2_2012\A XIS\programmation_carte_coordi nateur\inter_recep\recep_inter .h"
    #use rs232(UART1A,baud=115200,parit y=N,bits=8,stream=zigbee)

    const char RST[5]={'R','S','T',0x0d,0x0a};

    char copy[40],recep[70];
    int i,j;
    int1 flag;
    #int_RDA
    void RDA_isr(void)
    {
    recep[j]=fgetc(zigbee);
    j++;
    if (j==34) flag=1;

    }

    void envoi_zigbee(char *tab, char taille)
    {
    for(i=0;i<taille;i++)
    {
    fputc(tab[i],zigbee);
    delay_ms(1);
    }
    }

    void main()
    {
    setup_spi(SPI_SS_DISABLED);
    setup_wdt(WDT_OFF);
    setup_timer1(TMR_DISABLED);
    enable_interrupts(INT_RDA);

    flag=0;
    for(i=0;i<5;i++)
    {
    copy[i]=RST[i];
    }
    do
    {
    envoi_zigbee(*copy,5);
    j=0;
    do
    {
    }
    while(flag==0);
    flag=0;j=0;
    }
    while(1);
    }


    merci d'avance

Discussions similaires

  1. AVR : timer + interruption petit problème ...
    Par invite3570b5f7 dans le forum Électronique
    Réponses: 4
    Dernier message: 19/07/2011, 07h23
  2. [PIC18F2550] langage C,MPLAB avec CCS - problème de tableau
    Par inviteff826af6 dans le forum Électronique
    Réponses: 2
    Dernier message: 08/04/2010, 14h32
  3. problème compilation code ccs avec mplab
    Par invite2adf9254 dans le forum Électronique
    Réponses: 2
    Dernier message: 01/06/2009, 09h57
  4. Interruption Timer0 PIC16F628 et CCS
    Par invite70684c77 dans le forum Électronique
    Réponses: 1
    Dernier message: 15/05/2009, 16h56
  5. Interruption RB0 (int_ext) avec compilateur CCS
    Par invite70684c77 dans le forum Électronique
    Réponses: 10
    Dernier message: 06/05/2009, 15h13
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...