Décodage Code RC5 PIC18F4520
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

Décodage Code RC5 PIC18F4520



  1. #1
    invitec7e444aa

    Smile Décodage Code RC5 PIC18F4520


    ------

    Bonjour,

    Je travail sur un Robot suiveur de ligne et j'aimerais pouvoir le télécommander avec l'aide d'une télécommande universelle RC5.
    J'ai étudier la trame du RC5 et connecter un récepteur IR sur une entrée qui gère les interruptions sur mon PIC mais je n'arrive pas à récupérer le code de la touche appuyer, pour ensuite l’assimiler a une commande des moteurs..

    J'ai fait de nombreuses recherche sur internet mais je trouve rien :s

    Quelqu'un peut-il m'aider ?

    Merci !

    -----

  2. #2
    paulfjujo

    Re : Décodage Code RC5 PIC18F4520

    bonjour,

    Un exemple d'appli ici
    http://paulfjujo.free.fr/DDS/Sinedds.htm#AD9835
    je mes sers ici de ma telecommande Marrantz RC5200 pour regler la consigne !
    avec decodage des touches.

  3. #3
    invitec7e444aa

    Re : Décodage Code RC5 PIC18F4520

    EDIT:

    J'ai étudier la trame du RC5 et connecter un récepteur IR sur une entrée qui gère les interruptions ensuite mon programme part sur le principe que si on reçoit un signal sur la PIN RB0 (récepteur) on rentre dans uns boucle d’interruption.

    Ensuite je vérifie que les bits de synchro et d'adresse son correct (pour retirer les interférence) et je récupère la commande qui correspond à une touche, pour ensuite l’assimiler a une commande des moteurs..

  4. #4
    invitec7e444aa

    Post Re : Décodage Code RC5 PIC18F4520

    Merci pour ta réponse, j'ai consulter ton programme en C, je te montre le miens si tu peux me venir en aide si tu voit une érreur :

    Code:
    #include <18F4520.h>
    //**********************************************************//
    //						PIC 18F4520
    //
    //					 clock = 500 000 Hz
    //**********************************************************//
    
    #fuses INTRC,NOWDT,NOPROTECT,NOLVP,NOPUT
    #use delay(clock = 500000)
    
    int16 buff=0,p=32,r=2,s=16,syn=0,adresse=0;
    
    #INT_EXT
    void ext_isr()
    {
    	int i;
    
    	disable_interrupts(INT_EXT);
    	disable_interrupts(GLOBAL);
    
    	buff=0;
    	p=32;
    	r=2;
    	s=16;
    	syn=0;
    	adresse=0;
    
    	for(i=0 ; i<2;i++)
    	{
    	syn += !INPUT(PIN_B1) *r;
    	delay_us(1778);			// attente d'un nouveau bit
    	r=r/2;
    	}
    
    	if (syn==0x03)
    	{
    		delay_us(1778);
    		for(i=0 ; i<5;i++)
    		{
    			adresse += !INPUT(PIN_B1) *s;
    			delay_us(1778);			// attente d'un nouveau bit
    			s=s/2;
    		}
    		
    		if(adresse==0x0000)
    		{
    
    			for ( i=0; i<6; i++ )	//	Parcours des 5 bits de commande RC5
    			{
    				buff += !INPUT(PIN_B1)*p;	// Composition de la trame
    				delay_us(1778);			// attente d'un nouveau bit
    				p=p/2;					
    			}
    		
    			switch (buff)
    			{
        				         case 0x04:	Output_high(Pin_D4);
    
    									break;
    					
    					case 0x06:		Output_high(Pin_D5);
    
    									 break;
    
    					case 0x08:		Output_high(Pin_D6);
    
    									break;
    
    
        				        default:		Output_high(Pin_B4);
    
    									break; 
    			}
    		}
    	}
    	enable_interrupts(INT_EXT);
    	enable_interrupts(GLOBAL);
    }
    
    void main(void)            //Programme principal
    {
    
    	setup_oscillator(OSC_4MHZ);
    	set_tris_b(0xFF);
    
    	set_pwm1_duty(11);
        set_pwm2_duty(11);
    
    	ext_int_edge(H_TO_L);
    	enable_interrupts(INT_EXT);
    	enable_interrupts(GLOBAL);
    
    	Output_low(Pin_B4);
    
    	while(TRUE)
    	{
    		Output_high(Pin_D7);    
    	}
    	
    }

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

    Re : Décodage Code RC5 PIC18F4520

    As-tu verifié que tu rentres bien dans la routine d'interruption sur le front descendant de Rb0 ?
    sinon, rajouter un Drapeau de passage dans ton interruption pour suivre le deroulement...
    ou des leds sur le port D.
    A verifier aussi si le delay 1778µS est bien correct ( ex chrono sur 10000 boucles, hors interruption)

  7. #6
    RISC

    Re : Décodage Code RC5 PIC18F4520

    Salut,

    Faire un traitement aussi long dans l'interruption c'est du suicide...

    Il faut faire le traitement dans le programme principal.
    De plus, il y a une unité très puissante pour faire du décodage : l'unité CCP en mode Capture.
    Cette unité est capable de mesurer les timings de façon hardware.
    Je te recommande de lire la datasheet et de chercher sur internet.
    Par exemple ici : http://www.microchip.com/codeexamples

    a+

  8. #7
    invitec7e444aa

    Post Re : Décodage Code RC5 PIC18F4520

    Rebonjour,

    J'ai abandonner les Interruptions au profit d'un " delay_us(1600) " le soucis vient du fait que je suis trop lent avec mon ancienne Horloge de 500 KHz, à 2 Mhz ça fonctionne.
    Par contre d'un autre côte je doit contrôler des PWM et j'utilise le CCP de mon PIC mais a 2 MHz je ne plus obtenir les 20ms de période de PWM..
    Comment crée un PWM d'une autre manière ?

    Merci

    ps: Mon code pour décoder le RC5 avec une horloge de 2Mhz.


    Code:
    #include <18F4520.h>
    #fuses INTRC,NOWDT,NOPROTECT,NOLVP,NOPUT
    #use delay(clock = 2000000)
    
    signed int16 Buffer[14],touche;
    signed int8 i=0,R=0, fin=0;
    
    void main(void)
    {
    	setup_oscillator(OSC_2MHZ);
    	set_tris_b(0xFF);
    	set_tris_d(0xF0);
    
    	while(TRUE)
    	{
    
    			if (input(PIN_B0)) {
    				while (input(PIN_B0));
    				delay_us(444);
     				for (i=0;i<14;i++) {
    					Buffer[i] = !INPUT(PIN_B0);
    					delay_us(1600);
    				}
    				touche=buffer[13]+2*buffer[12]+4*buffer[11]+8*buffer[10];					
    				switch(touche) {
    					case 1 : OUTPUT_HIGH(PIN_D4);break;
    					case 2 : OUTPUT_HIGH(PIN_D5);break;
    					case 3 : OUTPUT_HIGH(PIN_D6);break;
    					case 4 : OUTPUT_HIGH(PIN_D7);break;
    				}
    			}
    	}	
    }

  9. #8
    RISC

    Re : Décodage Code RC5 PIC18F4520

    Salut,

    Pourquoi fais-tu tourner ton PIC si lentement ????
    Tu vas avoir plein de problèmes de temps-réel...
    Tu utilises l'horloge interne...es-tu conscient que cette horloge à une précision de +/-5%... Est-ce acceptable pour ton application ??

    Le PIC18F4520 possède je crois 2 CCP ( en fait un CCP et un ECCP).
    Utilises un CCP pour la capture et l'autre en mode PWM ...

    a+

  10. #9
    invitec7e444aa

    Re : Décodage Code RC5 PIC18F4520

    J'utilise déjà le CCP pour commander ma PWM mais le souci viens quand je doit l'utiliser pour crée une PWM de 20ms pour commander mes moteurs puisque ma valeur de "period" que je doit programme est beaucoup trop grande par rapport a celle autoriser (624 alors quelle doit etre comprise entre 0-255) et le postscale ne fonctionne pas en PWM..

    Sur ma carte proto,j'ai un quartz de 4Mhz mais je l'utilise pas.

  11. #10
    invitec7e444aa

    Wink Re : Décodage Code RC5 PIC18F4520

    Re bonjour,

    J'ai trouver ma solution en utilisant les timers je vous propose mon code en C sur PIC 18f4520 :

    Code:
    #include <18F4520.h>
    
    #fuses INTRC,NOWDT,NOPROTECT,NOLVP,NOPUT
    #use delay(clock = 32000000)
    
    signed int16 Buffer[14],touche,val,compt=0,ton1=75, ton2=75, per=1200;
    signed int8 i=0;
    
    #int_timer2                         // interruption ttes les 0,01ms
    void sp_it()                         // Timer de gestion de la PWM
    {
    	compt++;
    
    	if(compt>=per)
    	{
    		compt=0;
    		OUTPUT_HIGH(PIN_C1);
    		OUTPUT_HIGH(PIN_C2);
    	}
    	if(compt>=ton1)                           //MOTEUR 1
    	{
    		OUTPUT_LOW(PIN_C1);
    	}
    	if(compt>=ton2)                          //MOTEUR 2
    	{
    		OUTPUT_LOW(PIN_C2);
    	}
    }
    
    int lecture_trame_rc5()
    {
    	if (input(PIN_B0))                           // Récepteur Infrarouge
    	{
    		while (input(PIN_B0));            // Ligne au repos
    
    		delay_us(1778/4);               // Après passage à l'état bas on attend 1/4 d'un bit
     		for (i=0;i<14;i++)               // On lit les 14 bits
    		{
    			Buffer[i] = !INPUT(PIN_B0);
    			delay_us(1778);                 // Passage au bit suivant
    		}
    	val=buffer[13]+2*buffer[12]+4*buffer[11]+8*buffer[10]+16*buffer[9]+32*buffer[8];   // On récupère les 6 derniers bits de Commande
    	}
    	return (val);
    }
    
    void suiveur_de_ligne()
    {
    	int LineL, LineC, LineR;
    					// LINE L => Broche 18
    	LineL = input(PIN_C3);
                                            // LINE C => Broche 23
        LineC = input(PIN_C4);
                                            // LINE R => Broche 24
        LineR = input(PIN_C5);
    
    
        if(LineL==1 && LineC==0 && LineR==1) // condition tt droit
        {
            ton1 = 88;
    	ton2 = 88;
        }
        else if(LineL==1 && LineC==0 && LineR==0) // condition à droite lent
        {
            ton1 = 82;
    		ton2 = 86;
        }
        else if(LineL==1 && LineC==1 && LineR==0) // condition à droite
        {
            ton1 = 81;
    		ton2 = 86;
        }
        else if(LineL==0 && LineC==0 && LineR==1) // condition à gauche lent
        {
            ton1 = 86;
    		ton2 = 82;
        }
    
        else if(LineL==0 && LineC==1 && LineR==1) // condition à gauche
        {
            ton1 = 86;
    		ton2 = 81;
    
        }
        else if(LineL==1 && LineC==1 && LineR==1) // condition Demi tour
        {
            do
    		{
    		 	LineC = input(PIN_C4);
                ton1 = 85;
    			ton2 = 60;
    		}while(LineC!=0);
         }
    
         else if(LineL==0 && LineC==0 && LineR==0) // condition arret
         {
             ton1 = 75;
    		 ton2 = 75;
         }
    }
    
    void main(void)
    {
    	setup_oscillator(OSC_32MHZ);
    
    	set_tris_b(0xFF);
    	set_tris_d(0xF0);
    	set_tris_c(0xF9);
    
     	OUTPUT_LOW(PIN_C1);
    	OUTPUT_LOW(PIN_C2);
    
    	setup_timer_2(T2_DIV_BY_4,19,1);           // PWM interrupt = 0.01ms = [(PR2) + 1]*4*Tosc*TMR2prescalevalue
    
    	enable_interrupts(INT_TIMER2);                // autorise les ITs du Timer2
    	enable_interrupts(GLOBAL);                     // autorise la gestion des ITs
    
    	while(TRUE)
    	{
    
    		touche = lecture_trame_rc5();
            switch(touche)
    		{
    		    case 1 : 	ton1 = 75;                      // Arret du suiveur de ligne
    						ton2 = 75;
    						break;
    
                case 2 :    suiveur_de_ligne();
                            break;
    		}
    	}
    
    }
    Pour des questions n'hésitez pas !

  12. #11
    paulfjujo

    Re : Décodage Code RC5 PIC18F4520

    bonjour,

    J'ai testé ta routine IRC5, mais sous MikroC pro 5.40
    qui fonctionne bien a condition de bien tester les macro delay_us fournie par MikroC..
    a priori elles sont calibrees pour une horloge Q=10Mhz..
    J'ai pu le mettre en evidence avec Terminal Vray qui peut rajouter le Time à la mS pret sur
    la reception d'un caracatere (servant ici de drapeau d'encadrement de la tempo)
    avec mon quartz de 20 Mhz, il a fallu diviser les tempo par 2 pour que cela fonctionne.

    Je vois que tu te sert de la commande IRC5 que pour faire du marche/arret.
    Pour d'autres appli, il serait preferable de mettre la routine IRC5 dans le traitement 'interruption RB0
    pour ne rentrer dedans QUE lors du premier front descendant ,
    ce qui rendrait cette routine NON BLOQUANTE dans le programme principal
    (boucle while sur etat 1).

    pour ceux qui seraient interressé, je mets la version MikroC pour un 18F46K22

    affiche le code RC5 capté sur LCD et sur RS232
    et le resultat de capture des touche telecommande Marrantz RC5200 en fin de listing

    Code:
    //13/03/2012
    // rajout IRC5
    // 09/03/2012
    // rajout LCD 2x16 . test OK
    // programme de test pour 18F46K22  ... OK
    // Attention à la taille de reservation pour chaine scii
    // si trop courte, affecte les valeurs decalrees suivante !!!
       
     /*  HARDWARE
     =========== HARDWARE ====================
    27 pf  Q=10Mhz 27pF
    Interface 2T pour liaison UART TTL <-> RS232 38400 bauds
    LCD 2x16 cars
    
    PIC 18F46K22  40 pins DIP
    PortB
     RB0  33  DATA    13_D4 LCD
     RB1  34  DATA    14_D5 LCD
     RB2  23  DATA    15_D6 LCD
     RB3  24  DATA    16_D7 LCD
     RB4  25  RS_PIN  5_LCD
     RB5  26  E_PIN   7_Enable  LCD
     RB6  27  ICSP_Clck   Bleu foncé    Pin5 Pickit2
     RB7  28  ICSP_Data   Bleu clair    Pin4 Pickit2
            DATAS   7_D0_LCD ..10_LCD_D3  ...to Gnd
            1_LCD   Gnd power
            2_LCD   +5V power
            3_LCD   R=390 to Gnd
            
    PORTA
     RA0   2  Output .. Led .. 390 ohms +5V
     RA1   3  Analog Input
     RA2   4
     RA3   5
     RA4   6
     RA5   7
     RA6   8  ----- Quartz 10Mhz   C=22pF -- Gnd
     RA7   9  ------ Quartz ---    C=22pF -- Gnd
    
    PORTC
     RC0   15
     RC1   16
     RC2   17
     RC3   18
     RC4   23
     RC5   24
     RC6   25  TX  RS232   UART1 Harware
     RC7   26  RX  RS232   UART1 Hardware
    
    PORTD
     RD0   19
     RD1   20
     RD2   21
     RD3   22
     RD4   27
     RD5   28
     RD6   29
     RD7   30
    
    PORTE
     RE0   8
     RE1   9
     RE2   10
     RE3   1   MCLR via Rserie=1K to  R=2,7K to +5V et C=100nF to Gnd  diode//2,7K
          1   --- jaune -- VPP/MCLR ---  pin1 Pickit2
     VSS  12  ---- blanc ------Gnd-----  pin3 Pickit2
     VSS  12  ----  GND Power
     VSS  31  ----  GND Power
     VDD  11  ----  +5V Power
     VDD  32  ----  +5V Power
     
    ====================================================*/
    //  ac:Pinout Pic18F46K22
    
     /* configuration bits dans
       project ->  project
                  MCU name          18F4K22
                  Oscil Frequency   20MHz
       ac:Edit_config
    CONFIG1H   :$300001 : 0x0023
    CONFIG2L   :$300002 : 0x0000
    CONFIG2H   :$300003 : 0x003C
    CONFIG3H   :$300005 : 0x0099
    CONFIG4L   :$300006 : 0x0084
    CONFIG5L   :$300008 : 0x000F
    CONFIG5H   :$300009 : 0x00C0
    CONFIG6L   :$30000A : 0x000F
    CONFIG6H   :$30000B : 0x00E0
     */
    
    
    #define TAB 9
    #define CLS 12
    
    
    #define Lo(param) ((char *)&param)[0]
    #define Hi(param) ((char *)&param)[1]
    #define Higher(param) ((char *)&param)[2]
    #define Highest(param) ((char *)&param)[3]
    
    #define lo(param) ((char *)&param)[0]
    #define hi(param) ((char *)&param)[1]
    #define higher(param) ((char *)&param)[2]
    #define highest(param) ((char *)&param)[3]
    
    //ac:LCD_pinout
    // LCD module connections
    sbit LCD_RS at LATB4_bit;
    sbit LCD_EN at LATB5_bit;
    sbit LCD_D4 at LATB0_bit;
    sbit LCD_D5 at LATB1_bit;
    sbit LCD_D6 at LATB2_bit;
    sbit LCD_D7 at LATB3_bit;
    
    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD module connections
    
    #define LED_A LATA.F0
    #define InRC5 PORTA.F2
    char IntValue[12];
    //             1234567890123456
    char txt1[] = "18F46K22   LCD  ";
    char txt2[] = "Mesure ";
    char txt3[] = "Volts  ";
    char *txt=".......Reservations.............................................";
    char *p1=".............................." ;
    unsigned int M;
    char outmode=0;
    char UnCar,LADC;
    unsigned int Mesure;
    float Volt;
    unsigned char etat;
    unsigned char count1,count2,count3;
    
    unsigned int Buffer[14];
    unsigned int Touche;
    unsigned int lecture_trame_rc5(void);
    unsigned int clk;
    unsigned char IRC5;
    void Write_String();
    void CRLF();
    
    void main ()
    {
    int i,j,k;
    
    // init hardware
      C1ON_bit = 0;               // Disable comparators
      C2ON_bit = 0;
      ANSELB=0;
      ANSELC=0;
      PORTB = 0x00;           // set PORTB to FF
      TRISB = 0b11000000;     // portb pins RB7 RB6 as input others as output
      PORTA = 0xFF;
      TRISA = 0xFE;          // PORTA is RA1,2,3,5=input   RA0, RA4 out
      TRISE=0;
      PORTE=0xFF;
      TRISD=0x00; // all outputs
    
     // portA A0 A1 analog AN2=-Vref=3,0V An3=+ref=4.096V   RA5,RE0,RE1,RE2 digitals,
      ANSELA=0;
      ANSELA.F1=1;
      PORTC = 0xFE;       // set PORTC to $FF
      TRISC = 0;          // designate PORTC pins as output
    // init comm RS232
      UART1_Init(38400);   // RS232   Nota: si Q=10Mhz on aura 19200 bds
      Delay_ms(1000);
    // set UART1 active
      UART_Set_Active(&UART1_Read, &UART1_Write, &UART1_Data_Ready, &UART1_Tx_Idle);
      UART1_Write(CLS);
    // Initialize LCD
      Lcd_Init();
      Mesure=0;
      ADC_Init();
      // presentation sur LCD
      Lcd_Cmd(_LCD_CLEAR);               // Clear display
      Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
      Lcd_Out(1,1,txt1);
       Lcd_Cmd(_LCD_CURSOR_OFF);
      
      // presentation sur RS232
      txt= strcpy(txt,"Mikroc Pro 5.40 ");
      Write_String();
      CRLF();
      txt= strcpy(txt,"18F46K22 40pins  ");
      Write_String();
      CRLF();
      txt= strcpy(txt,"Attente saisie au clavier");
      Write_String();
      CRLF();
      txt= strcpy(txt,"A = Led_RA0 ON   E=Led_RA0 OFF  L=lect ADC1  I=IRC5 H=Help");
      Write_String();
      CRLF();
      txt= strcpy(txt,"Clock in Khz =");
      Write_String();
      clk = Clock_kHz();
      WordToStr(clk , txt);
      Write_String();
      CRLF();
      INTCON.GIE=0;
      Touche=0;
      CRLF();
      UART1_Write('#');
      CRLF();
          delay_us(100000);   // Mesure duree reelle via time Terminal VBray
      CRLF();
      UART1_Write ('*');
      CRLF();
      
      IRC5=0;
      LADC=0;
      while(1)
      {
      if (UART1_Data_Ready())
      {
    
       UnCar=UART1_Read() & 0x5F ;     // passe en MAJUSCULE !!
       UART1_Write (UnCar);            // echo
       UART1_Write (TAB);
       *(txt)=0;
       }
       if (UnCar=='A')
       {
       txt= strcpy(txt,"Led A ON ");
        LED_A=0;   // 0 car led tiree au +5V
        Write_String();
        UnCar=0;
        CRLF();
       }
       if (UnCar=='E')
       {
         UART1_Write_Text("Led A OFF");
         LED_A=1;
         UnCar=0;
         CRLF();
       }
       if (UnCar=='L')
       {
        if (LADC==1)
          LADC=0; 
          else  
          LADC=1;
        UnCar=0;
        }
        if(LADC==1)
        {
         UART1_Write_Text("Lecture avec ADC_Read(1)");
        Mesure = ADC_Read(1);
        WordToStr(Mesure, txt);
        Write_String();
       // UART1_Write (TAB);
       // UART1_Write_Text(" en V avec ADC1 Get_Sample(1)");
       // Mesure=ADC_Get_Sample(1);
       // WordToStr(Mesure, txt);
       // Write_String();
        CRLF();
        }
       if (UnCar=='I')
       { 
         if (IRC5==1) 
          IRC5=0;
           else
           IRC5=1;
         if (IRC5==1)
         {
          txt= strcpy(txt," En attente telecommande IRC5");
          }
          else
          {
          txt= strcpy(txt," fin de test telecommande IRC5");
          }
          Write_String();
          CRLF();
          UnCar=0;
        }
        if (IRC5==1)
        {
        Touche = lecture_trame_rc5();
        Lcd_Cmd(_LCD_FIRST_ROW );
        txt= strcpy(txt,"Touche: ");
        Write_String();
        Lcd_Out(1, 1, txt);
        Touche = lecture_trame_rc5();
        WordToStr(Touche, txt);
        Lcd_Out(1, 10, txt);
        Write_String();
        Touche=0;
        CRLF();
        }
       if (UnCar=='H')
       {
        txt= strcpy(txt,"A = Led_RA0 ON   E=Led_RA0 OFF  L=lect ADC1  I=IRC5 H=Help");
        Write_String();
        CRLF();
        UnCar=0;
       }
        Lcd_Out(2,1,txt2);
        WordToStr(Mesure, txt);
        Lcd_Out(2,8,txt );
        Delay_ms(100);
      }
     }
    
    
    unsigned int lecture_trame_rc5()
    {   unsigned int i,val;
            if (InRC5==1)                           // Récepteur Infrarouge
            {
            while (InRC5== 1){};            // Ligne au repos
           Delay_us(1778/8);               // Après passage à l'état bas on attend 1/4 d'un bit
             for (i=0;i<14;i++)            // On lit les 14 bits
            {
               Buffer[i] = !InRC5;
              Delay_us(1778/2);// 1778µS Q=20Mhz
            }
          // On récupère les 6 derniers bits de Commande
            val=buffer[13]+2*buffer[12]+4*buffer[11]+8*buffer[10]+16*buffer[9]+32*buffer[8];
            }
     return (val);
     }
    
    void Write_String()
    {
    short int i1,j1,k;
     j1=strlen(txt);
       i1=0;
       do
       {
       k=txt[i1];
       UART1_Write(k);
       i1++;
       }while (i1<j1);
    }
     void CRLF()
     {
     UART1_Write(13);
     UART1_Write(10);
     }
     
    
    /*
    0 1 mikroCPIC1618.exe -MSF -DBG -pP18F46K22 -LHF -O11111013 -fo20 -N"C:\_MickroC\_MesProjets_MickroC\_18F26K22_46K22\18F46K22_uart_Lcd_Irc5_MC.mcppi" -EH"C:\_MickroC\_MesProjets_MickroC\_18F26K22_46K22\18F46K22_uart_MC.ihex" -SP"C:\_MickroC\defs\" -SP"C:\_MickroC\uses\P18\" -SP"C:\_MickroC\_MesProjets_MickroC\_18F26K22_46K22\" -SP"E:\Microchip_Docus\" -SP"C:\_MickroC\_MesProjets_MickroC\_18F45K22_ReadyForPic\" -SP"E:\_MikroC\common\" -SP"C:\_MickroC\include\" -IP"C:\_MickroC\_MesProjets_MickroC\_18F26K22_46K22\" "18F46K22_UART_LCD_IRC5.c" "__Lib_Math.mcl" "__Lib_MathDouble.mcl" "__Lib_System.mcl" "__Lib_Delays.mcl" "__Lib_CType.mcl" "__Lib_CString.mcl" "__Lib_CStdlib.mcl" "__Lib_Conversions.mcl" "__Lib_ADC_A_D.mcl" "__Lib_UART_c67d67.mcl" "__Lib_LcdConsts.mcl" "__Lib_Lcd.mcl"
    0 1139 Available RAM: 3875 [bytes], Available ROM: 65536 [bytes]
    0 126 All files Preprocessed in 70 ms
    0 122 Compilation Started 18F46K22_UART_LCD_IRC5.c
    171 1509 Generated baud rate is 38462 bps (error = 0.16 percent) 18F46K22_UART_LCD_IRC5.c
    150 1163 Variable 'i' has been declared, but not used 18F46K22_UART_LCD_IRC5.c
    150 1163 Variable 'j' has been declared, but not used 18F46K22_UART_LCD_IRC5.c
    150 1163 Variable 'k' has been declared, but not used 18F46K22_UART_LCD_IRC5.c
    343 123 Compiled Successfully 18F46K22_UART_LCD_IRC5.c
    329 1164 Variable 'k' has been eliminated by optimizer 18F46K22_UART_LCD_IRC5.c
    0 127 All files Compiled in 130 ms
    0 1144 Used RAM (bytes): 510 (13%)  Free RAM (bytes): 3365 (87%) Used RAM (bytes): 510 (13%)  Free RAM (bytes): 3365 (87%)
    0 1144 Used ROM (bytes): 3132 (5%)  Free ROM (bytes): 62404 (95%) Used ROM (bytes): 3132 (5%)  Free ROM (bytes): 62404 (95%)
    0 125 Project Linked Successfully 18F46K22_uart_Lcd_Irc5_MC.mcppi
    0 128 Linked in 311 ms
    0 129 Project '18F46K22_uart_Lcd_Irc5_MC.mcppi' completed: 701 ms
    0 103 Finished successfully: 13 mars 2012, 23:57:14 18F46K22_uart_Lcd_Irc5_MC.mcppi
    
    */
      
    /*
    Mikroc Pro 5.40
    18F46K22 40pins
    Attente saisie au clavier
    A = Led_RA0 ON   E=Led_RA0 OFF  L=lect ADC1  I=IRC5 H=Help
    Clock in Khz =20000
    
    #
    
    *
    Led A ON
    Led A OFF
    Lecture avec ADC_Read(1)  131
    Lecture avec ADC_Read(1)  131
    Lecture avec ADC_Read(1)  149
    Lecture avec ADC_Read(1)  150
    Led A ON
    Led A OFF
    Led A ON
    Led A OFF
    Led A ON
    Led A OFF
    A = Led_RA0 ON   E=Led_RA0 OFF  L=lect ADC1  I=IRC5 H=Help
     En attente telecommande IRC5
    Touche:    16     +Vol
    Touche:    17     - Vol
    Touche:     1     Touche num 1
    Touche:     2     Touche num 2
    Touche:     3     Touche num 3
    Touche:     0     Touche num 0
    Touche:    28     UP
    Touche:    29     Down
    Touche:    44     Left
    Touche:    43     Right
    Touche:    23     Bass Down
    Touche:    22     Bass UP
    Touche:    24     Aigu UP
    Touche:    25     Aigu Down
    Touche:    33     << chanel
    Touche:    32     >> chanel
    Touche:    11     << Tune
    Touche:    10     >> Tune
    Touche:    41
    Touche:    15
    Touche:    46
    */

  13. #12
    paulfjujo

    Re : Décodage Code RC5 PIC18F4520

    Auto correction !

    Citation Envoyé par paulfjujo Voir le message
    bonjour,

    a priori elles sont calibrees pour une horloge Q=10Mhz..
    J'ai pu le mettre en evidence avec Terminal Vray qui peut rajouter le Time à la mS pret sur
    la reception d'un caracatere (servant ici de drapeau d'encadrement de la tempo)
    avec mon quartz de 20 Mhz, il a fallu diviser les tempo par 2 pour que cela fonctionne.
    ERRARE !
    En fait ces delays fonctionent bien en fonction du quartz declaré dans la config!!
    en plus le marquage de mon quartz etait effacé , c'etait un 10MHz et non un 20Mhz
    apres remise en ordre, Config et quartz , les tempos sont OK sans bidouiller..

    Entre temps, J'ai rajouté la gestion d'interruption RB0 pour ne pas bloquer le programme principal
    dans la boucle d'attente de la trame IRC5.
    Des l'apparition du front descendant on decode la trame apres un delay de 444µS.
    et on utilise le resultat dans le main programme

Discussions similaires

  1. Ir et pic code RC5
    Par bypbop dans le forum Électronique
    Réponses: 39
    Dernier message: 19/01/2015, 18h05
  2. PIC16f887, decodage RC5 philips
    Par invite0f4614b0 dans le forum Électronique
    Réponses: 16
    Dernier message: 21/04/2011, 21h29
  3. recuperation de code ir rc5 avec pic
    Par invite13ed46c1 dans le forum Électronique
    Réponses: 6
    Dernier message: 20/09/2008, 19h25
  4. emetteur code RC5 par pic
    Par invite3a1051d7 dans le forum Électronique
    Réponses: 7
    Dernier message: 25/10/2005, 14h44
  5. décodage trame RC5
    Par invite4aa0e93b dans le forum Électronique
    Réponses: 2
    Dernier message: 08/01/2004, 21h09
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...