lecture d'une trame RC5 via 16F877a
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

lecture d'une trame RC5 via 16F877a



  1. #1
    ilyasse192

    Unhappy lecture d'une trame RC5 via 16F877a


    ------

    bonsoir je suis entrain de travaillais sur un projet que j'utilise une télécomande RC5 j'ai compris le principe de décodage sur 14bits je peux utiliser les timers en interruption . j'ai essayé de faire un ptit programme qui affiche le contenu des registre TMR1L et TMR1H en PORTB et PORTD mais ça fonctionne plus


    unsigned char P_Faible=0 ;
    unsigned char P_Fort=0 ;


    void init_prog() {

    TRISA = 0xFF;
    PORTA = 0;
    TRISB = 0X00;
    PORTB = 0;
    TRISC = 0xFF;
    PORTC = 0;
    TRISD = 0x00;
    PORTD = 0;

    T1CON =0x09; //* predivision tmr1 = 1 ; horloge osc/4 *// */
    PIE1=0x05; //* activer l'interruption ccp1 et tmr1 *///
    CCP1CON=0x04; //* mode capture à chaque front decendant*//
    INTCON=0xC0;
    OPTION_REG=0x00;
    TMR1L = 0x00 ;
    TMR1H = 0x00 ;
    }


    void interrupt() {
    /*if(PIR1.CCP1IF){
    TMR1L = P_Faible;
    TMR1H = P_Fort;
    delay_ms(1000);
    TMR1L = 0x00 ;
    TMR1H = 0x00 ;
    PIR1.TMR1IF = 0 ;
    PIR1.CCP1IF = 0 ;
    PORTA = 1;
    delay_ms(1000);
    } */

    if(PIR1.TMR1IF){
    TMR1L = P_Faible;
    TMR1H = P_Fort;
    TMR1L = 0x00 ;
    TMR1H = 0x00 ;
    PIR1.TMR1IF = 0 ;
    PORTA = 2;
    delay_ms(1000);
    }
    }





    void main() {

    init_prog();

    while(1){

    PORTB = P_Faible ;
    PORTD = P_FORT ;
    delay_ms(1000);
    }

    }

    -----

  2. #2
    zhal

    Re : lecture d'une trame RC5 via 16F877a

    Bonjour, ,

    C'est normal si ton programme n'affiche rien : Le programme n'est pas bon.

    Avec ce morceau de code P_FAIBLE et P_FORT sont a 0
    unsigned char P_Faible=0 ;
    unsigned char P_Fort=0 ;
    Le code de l'interruption n'est pas bon :
    void interrupt() {
    /*if(PIR1.CCP1IF){
    TMR1L = P_Faible;
    TMR1H = P_Fort;
    delay_ms(1000);
    TMR1L = 0x00 ;
    TMR1H = 0x00 ;
    PIR1.TMR1IF = 0 ;
    PIR1.CCP1IF = 0 ;
    PORTA = 1;
    delay_ms(1000);
    } */
    TMR1L et TMR1H sont des registres à lire et pas a écrire !

    TMR1L = 0x00 ;
    TMR1H = 0x00 ;
    PORTA = 1;
    Bien relire la documentation du Pic

  3. #3
    PIXEL

    Re : lecture d'une trame RC5 via 16F877a

    en fouillant chez MICROCHIP , on trouve des exemples de code....

    http://www.microchip.com/search/sear...spx?id=2&q=rc5

  4. #4
    ilyasse192

    Re : lecture d'une trame RC5 via 16F877a

    merci pour les réponses je vais essayer dans un premier temps la méthode de la boucle je crois qu'elle est facile a réaliser.
    je vais poser le nouveau programme

    Pour:
    TMR1L = 0x00 ;
    TMR1H = 0x00 ;
    je voulais faire un clear des registre TMR1 affin de pouvoir lire une nouvelle donnée .

    j'ai un autre erreur:
    je dois faire :

    P_Faible = TMR1L ;
    p_Fort = TMR1H ;

    au lieu de :

    TMR1L = P_Faible;
    TMR1H = P_Fort;

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

    Re : lecture d'une trame RC5 via 16F877a

    voila le prog qui lis la valeur du tram avec RB0 :

    unsigned char x ;
    unsigned int tram ;

    void init (){

    /*********CONFIG_RB0/INT sur front descend***********/
    //
    INTCON = 0xD0 ; //active GIE , PEIE , RBIE //
    OPTION_REG = 0 ; //
    //
    /****************************** *****************/

    /*********CONFIG_LES PORTS************************* ***/
    //
    TRISB = 0xFF ; //
    TRISC = 0x00 ; //
    PORTB = 0 ; //
    PORTC = 0 ; //
    //
    /****************************** ****************/



    void interrupt() {

    if(INTCON.INTF){
    delay_us(5334); // durée d'un bit est (1778us). j'ai pas besoin des 3 premiers bits (2 bits de start et 1 bit de basculement) alors T1=1778*3
    delay_us(445); // atteindre 1/4 du 4èm bit ( bit d'adresse)

    for(x=1;x<11;x++){

    if (RB0_bit==0){
    tram >> 1 ; // décalage par 1
    tram |=0x8000; // si je tombe sur 1 (0 sur RB0) ajouté un 1 au plus fort bit du variable

    }

    if (RB0_bit){
    tram >> 1 ; // si je tombe sur un 0 (1sur RB0) je decale et j'ajoute un 1
    }
    delay_us(1775); // attendre qu'il tombe sur 1/4 du nouveau bit

    }

    mais je sais pas comment le décoder pour savoir qu'elle bit j crois que j dois faire un masquage mais je suis pas sur...
    qulqun peut me donner un chemin ??

  7. #6
    paulfjujo

    Re : lecture d'une trame RC5 via 16F877a

    bonjour,

    Tel qu'il est le traitement IT Timer1 ne SERT à RIEN et affichera 0
    à moins de basculer le bit PORTAbits.RA1 à chaque tour => clignotement led RA1
    mais aucun changement sur les ports B ou D
    enlever tout delay dans une interrupt !!

    On ne sait pas trop si tu veux mesurer une duree entre 2 front via CCP1
    ou simplement utiliser le timer1 ..

    si test timer1
    j'ai pas bien vu si GIE est mis à 1 quelque part ?

    nota: code C18 donc non non testé ..à verifier quand meme .

    Code:
    void interrupt() 
    {
    if(PIR1.TMR1IF)
    {
     P_Fort=TMR1L ;		
    // recuperer la valeur du timer 1 qui sera toujours à 0 ou quelques unites  puisque interrupt au debordment !
     P_Faible=TMR1L ;
    TMR1 = 0x0000 ;		// reinitialiser le timer à 0 => capacité de comptage 65535 sans debordement
    // PORTA = 2;                           // allume la led sur RA1 ..point barre
    PORTAbits.RA1=!PORTAbits.RA1;   // inverse le bit sortie RA1 à chaque passage
    PIR1.TMR1IF = 0 ;
    // delay_ms(1000);    // ne JAMAIS mettre de delai dans un traitement d'interruption
    }
    }
    
    
    void main()
     {
     init_prog();
     while(1)
    {
      // on se contente de visualiser le clignotement de RA1
    }
    
    }

    PAR CONTRE, activer l'interrupt CCP1 et desactiver l'interrupt Timer serait plus interressant
    a chaque capture , on stop le timer 1, on recupere le contenu du timer1 CAPTURE par CCP1
    et on le reactive

    nota: code non testé ..à verifier quand meme .

    Code:
    /
    
    void interrupt()
    {
    if(PIR1.CCP1IF)
    {
    T1MER1Bits.TMR1ON=0;   // Stop timer1
    
    P_Faible=CCPR1L; 
    P_Fort=CCPR1H;
    TMR1=0;
    // ATTENTION : il faudrait en plus compter le nombre de debordement du Timer1 dans le main
    Cnt=0;  // raz compteur debordement
    PIR1.TMR1IF = 0 ;
    PIR1.CCP1IF = 0 ;
    TIMER1bits.TMR1ON=1; // reactiver le comptage timer1
    }
    }
    
    
    
    void main()
     {
    init_prog();
    Cnt=0;
    while(1)
     {
     PORTB = P_Faible ; 
     PORTD = P_FORT ;
    if(PIR1.TMR1IF==1) 
    {
    Cnt++;
    PIR1.TMR1IF=0;
    PORTA=Cnt ;  // Nb  overflow timer1 
    }
    }
    }

  8. #7
    ilyasse192

    Re : lecture d'une trame RC5 via 16F877a

    bonjour, merci paulfjujo j'ai bien compris l'utilisation du tmr1, mais ce que je veux savoir comment le TMR1 lis le code présent au broche RB0 ; je veux savoir si je peux incrémenté un timer par une interruption ?? pour que je puisse le lire a la fin du tram :/

  9. #8
    ilyasse192

    Re : lecture d'une trame RC5 via 16F877a

    j'ai pas pu utiliser CCP1 en mode capture pour lire la tram alors j'ai décidé d travaillé avec la broche RB0

  10. #9
    paulfjujo

    Re : lecture d'une trame RC5 via 16F877a

    exemple en MikroC ou C18, adaptable..
    utilisant RB0 et Timer0
    http://paulfjujo.free.fr/IR_RC5/Deco...RC5_18F252.htm

Discussions similaires

  1. Trame RS485 vers trame Modbus
    Par La-Banane dans le forum Internet - Réseau - Sécurité générale
    Réponses: 11
    Dernier message: 06/11/2013, 15h48
  2. Réponses: 1
    Dernier message: 05/04/2012, 15h59
  3. Lecture de trame sur l'analyseur logique
    Par electron22 dans le forum Électronique
    Réponses: 7
    Dernier message: 28/07/2010, 09h22
  4. Ecriture/Lecture sur PIC 16F877A
    Par flyingrock dans le forum Électronique
    Réponses: 9
    Dernier message: 24/04/2009, 18h26
  5. Réponses: 2
    Dernier message: 27/07/2005, 09h44
Découvrez nos comparatifs produits sur l'informatique et les technologies.