Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Télécommande IR à 10 canaux
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1307
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#11 Message par paulfjujo » dim. 23 déc. 2018 13:46

bonjour,

Eh oui, j'ai aussi pratiqué l'asm jadis ...
qui est le point de depart indispensable pour tout debutant (ou non) dans le monde des PICs
j'ai rajouté le source asm dans le lien precité

Il faut bien verifier la relation
FOSC MCU et Frequence Porteuse I.R. ( largeur de bit) et type de codage RC5,RC6,SONY...
et le centrage de la bande passante du capteur I.R. utilisé
Dans mon cas un TSOP36 (36Khz), se decline aussi en TSOP38 et TSOP40
:!!: Indispensable de decoupler l'alim du TSOP via R)68ohms et 10 à 22µF pour eviter des
phenomenes erratics de détection.

et un outil pratique ..
IR_protocol_analyzer_v1.1.zip

avec une simple photodiode ou photo transistor conncté sur LPT ( il faut un PC XT Win98 )
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aides toi, le ciel ou Fantastpic t'aideras

Télécommande IR à 10 canaux
nondediode
Amateur
Amateur
Messages : 100
Enregistré en : novembre 2018
Localisation : Entre l'emetteur et le collecteur

#12 Message par nondediode » lun. 24 déc. 2018 09:12

Bonjour paulfjujo et bonjour tout le monde,

Merci d'être intervenu dans cette discussion, temps-x m'avait déjà fourni vos liens mais entre temps j'étais parti explorer un autre montage que j'ai d'ailleurs pas fini de câbler et qui semble se rapprocher du votre puisqu'il utilise aussi un afficheur.
ça me sera facile de passer d'un montage à l'autre étant donné qu'ils utilisent les mêmes composants.
Là avec les fêtes ça va être compliqué de consacrer du tps au projet mais j'y reviendrait très prochainement.

Bonnes fêtes à tous

Télécommande IR à 10 canaux
nondediode
Amateur
Amateur
Messages : 100
Enregistré en : novembre 2018
Localisation : Entre l'emetteur et le collecteur

#13 Message par nondediode » mer. 26 déc. 2018 16:51

Bonjour à tous,

J’espère que vous avez tous passé un excellent réveillon et que le Père Noël vous a apporté plein d’idée fantaspic. Pour ma part, n’ayant pas trop droit aux bonnes choses en raison de mes soucis santé, je me suis résigné au mode eau minérale et repas maigre, J'ai appris à ces veilles de fêtes que j'avais un cancer assez lourd :evil:

Malgré ça, pour libérer mes pensées, J’ai quand même bossé un max sur mon projet de télécommande dont j'étais parti sur le maquettage. Aujourd’hui je l'ai fini à force de soudure et d’asm. :wink:

28645-1033308-16f628-84-decodeur-rc5-lcd-et-6-sorties.zip

Après avoir passé des heures à modifier ce programme, il répond enfin à ce que je recherchais avec en plus la possibilité de recycler une vieille télécommande RC5 pour l’usage provisoire car je compte bien réaliser la partie émetteur.

Dans le programme d’origine, les sorties restent actives tant que la touche « power » n’est pas appuyée, j’ai été obligé de le modifier pour que les sorties soit en mode impulsion.
Le but étant bien sûr de simuler ce que je ferai avec les boutons poussoir situé juste sous l’afficheur. Voir mon projet « LCD origine inconnu » pour bien comprendre le contexte.

Pour commencer, j’ai viré la partie affichage pour ne conserver que les sorties RB0 à RB5 et surtout pour libérer des sorties dont j’ai besoin pour mes 2 potentiomètres .

C’est donc 4 touches supplémentaires pour piloter mes 2 potentiomètres de volume et 5 touches pour les cdes de l’afficheur dont j’ai besoin. En validant les touches numériques 6,7 et 8 j’ai donc bien le nbre qu’il me faut.
Il aurait été plus judicieux de ma part de me servir des touches 16 à 20 dédiés aux cdes de volumes et contraste pour piloter les pot. mais la télécommande que j'utiliser pour ma maquette ne dispose pas de ces touches.
Lorsque je réaliserai la télécommande, je ferai en sorte d'utiliser les bonnes touches. Ayant compris le programme il m’est à présent facile de le modifier voir même d’utiliser un PIC 876 pour profiter de X sorties.

Ces modifs dans le prg, j’aimerai que quelqu’un puisse vérifier ma routine « fini2 » pour m’expliquer pourquoi je suis obligé de temporiser 2X . J’ai un doute sur cette boucle et j’ai réalisé cette méthode sans trop comprendre ce que j’ai fait. :roll:
Si qq’un pouvait m’expliquer son fonctionnement ?

Le movlw 0X0C OK
Movwf RC5_DATA OK aussi
Mais mon bricolage derrière avec l’appel de la tempo avant et après les clrf alors que physiquement les leds réagissent comme si il y avait qu’une seule tempo ???? :oops:


Merci à paulfjujo pour son outil sur le protocole RC5, c’est ce qui m’a permis de comprendre un peu mieux le principe et surtout de repérer les directives RC5 dans le programme. Sans ça, il m’était difficile de mettre mes sorties actuelles en mode impulsion et de rajouter des sorties.
J’ai bien pensé à découpler l’alim du TSOP c’est vrai que c’est indispensable. Par contre j’aurai intérêt à bien blinder le montage car pas très loin j’ai l’alim HT à 1200V!


Merci à tous

Le programme modifié par mes soins

Code : Tout sélectionner

;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;
        
;        PIC 16F84
;         Reception de code RC5 + LCD 4x16* (ou plus)+ 6 sorties (leds)
;
         ryl le 06/01/2005 23:46
;        
;))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

    LIST     p=16f84
    
#include <p16f84.inc>
    __config B'11111111110001'
    
                                        
    ERRORLEVEL      
-224                                        
        


        cblock 0x0C
donn1    
:    1            ; reception des bits RC5 
donn2    
:    1            ; reception des bits RC5
BUSY_1
:        1            ;var utilisée pour temporisation
NB_TEMPO
:    1            ;var utilisée pour temporisation
cmpt1
:        1            ;var utilisée pour temporisation
RC5_CTRL
:    1            ;var bit controle RC5
RC5_ADR
:    1            ;var bits adresse RC5
RC5_DATA
:    1            ;var bits données RC5
Loop1
:        1            ;compteur
Loop2
:        1
Loop3
:        1
Retard1
:    1                
Retard2
:    1                

ROM_INDEX
:    1            ;pointeur ROM tables des mots (    "sortie RB", "sorties a ZERO", "Pas de RC5......" )            ;

        endc
;==========================================================================================================

    ORG    0x0000    
    
        
    bsf    STATUS    
,RP0        ;Select Bank 1
    clrf    TRISA            
;
    MOVLW B'01000000'        ;portb.6 en entrée
        MOVWF TRISB
    bcf    STATUS    
,RP0        ;Select Bank 0
    bcf    INTCON
, GIE        ; disable Interupt
        
    
debut
    call    tempox


    
boucl_prog

    call    Recv_RC5        
; Récéption d'un code RC5
    
    
    movfw    RC5_DATA        ; si RC5_DATA =0 (touche N°0 de la TC) 
    btfsc    STATUS,Z        ; 
    goto    Action_1        ;
    xorlw    (0x01 ^ 0x00)        ; si RC5_DATA =1 (touche N°1 de la TC)
    btfsc    STATUS,Z        ;
    goto    Action_2        ;            
    xorlw    (0x02 ^ 0x01)        ; si RC5_DATA =2 (touche N°2 de la TC)
    btfsc    STATUS,Z
    goto    Action_3        ;
    xorlw    (0x03 ^ 0x02)        ; si RC5_DATA =4 (touche N°4 de la TC)
    btfsc    STATUS,Z
    goto    Action_4        ;
    xorlw    (0x04 ^ 0x03)        ; si RC5_DATA =5 (touche N°5 de la TC)
    btfsc    STATUS,Z
    goto    Action_5        ;
    xorlw    (0x05 ^ 0x04)        ; si RC5_DATA =6 (touche N°6 de la TC)
    btfsc    STATUS,Z
    goto    Action_6        ;
    xorlw    (0x06 ^ 0x05)        ; si RC5_DATA =6 (touche N°6 de la TC)
    btfsc    STATUS,Z
    goto    Action_7        ;


    xorlw    (0x07 ^ 0x06)        ; si RC5_DATA =6 (touche N°6 de la TC)
    btfsc    STATUS,Z
    goto    Action_8        ;

    xorlw    (0x08 ^ 0x07)        ; si RC5_DATA =6 (touche N°6 de la TC)
    btfsc    STATUS,Z
    goto    Action_9        ;



    xorlw    (0x0C ^ 0x05)        ; si RC5_DATA =h0C (touche ON/OFF de la TC)
    btfsc    STATUS,Z
    goto    Action_10        ;

    goto    fini            ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    

Action_1
            bsf    PORTB,0            ; mettre a 1 la broche RB0 (led n°1)
            goto    LCD_refr            ;    
Action_2
            bsf    PORTB,1            ; mettre a 1 la broche RB1 (led n°2)
            goto    LCD_refr            
Action_3    
            bsf    PORTB,2            ; mettre a 1 la broche RB2 (led n°3)
            goto    LCD_refr            ;
Action_4
            bsf    PORTB,3            ; mettre a 1 la broche RB3 (led n°4)
            goto    LCD_refr            ;
Action_5
            bsf    PORTB,4            ; mettre a 1 la broche RB4 (led n°5)
            goto    LCD_refr            ;
Action_6
            bsf    PORTB,5            ; mettre a 1 la broche RB5 (led n°6)
            goto    LCD_refr            ;
Action_7
            bsf    PORTA,0            ; mettre a 1 la broche RA0 (led n°7)
            goto    LCD_refr
Action_8
            bsf    PORTA,1            ; mettre a 1 la broche RA0 (led n°7)
            goto    LCD_refr
Action_9
            bsf    PORTA,2            ; mettre a 1 la broche RA0 (led n°7)
            goto    LCD_refr

LCD_refr            
            goto    fini2
Action_10
            clrf    PORTB            ; mise a 0 de toutes les sorties
fini    
            call    tempox            ; tempo entre chaque detection/affichage
            call    tempox            ;  
            goto boucl_prog            ; recommencer la detection RC5+LCD
fini2

            movlw    0x0C
            movwf    RC5_DATA
            call    Tempo3            ;  
            clrf    PORTB
            clrf    PORTA
            call    Tempo3            ; 
            goto     boucl_prog        
        
;************************************
;TEMPO 500 µS
;************************************
busy        movwf    NB_TEMPO            ; Temporisation : dure 500µs x "la valeur contenue dans W"
boucle        movlw    .123
        movwf    BUSY_1
boucle1        NOP
        decfsz    BUSY_1,1
        goto    boucle1
        decfsz    NB_TEMPO,1
        goto    boucle    
        return               ; retour de la sous-routine
;************************************
;TEMPO xx S
;************************************
tempox       movlw 0x0B             ; pour x boucles 
tempoxx        movwf cmpt1             ; dans cmpt1 
boucle2         movlw    0x25
        call     busy                 ; TEMPO xxxx µS
            decfsz cmpt1 , f          ; si 0, décrémenter compteur 3 
           goto boucle2             ; si cmpt1 pas 0, recommencer boucle2 
           return                ; retour de la sous-routine 
;**********************************************************
; RECEPTION D'
UN CODE RC5
; RB6 en entrée (TSOP 1738...ou equivalent infra rouge)
;
 Controle RC5    : RC5_CTRL    => 1 bit
; Adresse RC5    : RC5_ADR    => 5 bits
; Données RC5   : RC5_DATA    => 6 bits
;**********************************************************
Recv_RC5     
        btfsc    PORTB
, 6    ; Attendre un "0" 
        goto    Recv_RC5    
; du bit de start

        call    Tempo444    
; attendre 444us, 1/4 cycle pour capture bit a bit
        
        btfsc    PORTB
, 6    ; tester si "0" (anormal probabl... une emission en cours mal sync!)
        goto    Fin_RC5        ; ERREUR ! finir la phase de reception

        clrf    donn1        
; donn1=0
        clrf    donn2        
; donn2=0
        movlw    .13        
; 13 bits a capturer
        movwf    Loop3        
; 12 sont traites 

        call    Tempo888    
; 1/4 du 2' Bit        
    
nextbit         rlf    donn1,f        ; rotation a gauche de tous les bits
        rlf    donn2,f        ;
        bcf    donn1, 0    ; forcer a "0" le bit0 de "donn1" 
        btfsc    PORTB, 6    ; si RB6 (infra rouge) =0
        bsf    donn1, 0    ; forcer a "1" le bit0 de "donn1"

        call    Set_bit        ; attendre flanc montant ou desc en fonction de l'
etat de RB6 (infra rouge)

        call    Tempo444    ; attendre 3/4 de Bit pour se                 ;tempo    ; = 444,5 us
        call    Tempo888    
; placer a 1/4 du bit suivant                ;tempo    ; = 889 us
        decfsz    Loop3
,f        ; les 13 bits sont t-ils tous reçus
        goto    nextbit        
; si non, recommencer reception du bit suivant
    
;Recuperation des bits du code RC5 des variables "donn1" "donn2" 
    
        movfw    donn1            
; recuperation des 6 bits de Données RC5
        andlw    b
'00111111'        ; 0 sur les bits non utilisés
        movwf    RC5_DATA        
; Placer val dans "RC5_DATA"

        rlf    donn1,f            ; decalage a gauche de 2 
        rlf    donn2
,f            ; pour faire "remonter" les bits    
        rlf    donn1
,f            ; de l'Adresse RC5 
        rlf    donn2,f            ; de donn1
        movfw    donn2            ; vers donn2
        andlw    b'
00011111'        ; 0 sur les bits non utilisés
        movwf    RC5_ADR            ; recuperation des 5 bits dans "RC5_ADR"
    
        clrf    RC5_CTRL        ; recuperation du bit     
        btfss    donn2, 5        ; de controle RC5
        bsf    RC5_CTRL, 0        ; dans "RC5_CTRL"
Fin_RC5
        return
        
;*************************************
;Attendre fin bit fonction de PORTB6 (IR)
;*************************************
Set_bit     movlw    0x09        ; Tempo
        movwf    Loop1
tim11         movlw    0x20        ;
        movwf    Loop2
tim22         decfsz    Loop2,f    
        goto    tim22

        btfsc    PORTB, 6    ; si "0"
        goto    haut
bas        btfsc    donn1, 0    ; bit en cours =0 ?    
        return            ; flanc haut/bas    
        goto    saut_l
haut        btfss    donn1, 0    ; bit en cours =1 ?    
        return            ; flanc bas/haut            
saut_l        decfsz    Loop1,f    
        goto    tim11    
        return            
        
;****************************
; TEMPORISATION POUR RC5
;****************************
Tempo888    movlw    0x12        ; Temporisation de 888µs
        goto    tim0
        
Tempo444    movlw    0x09        ; Temporisation de 444µs
tim0         movwf    Loop1
tim1         movlw    0x0F
        movwf    Loop2
tim2         decfsz    Loop2,f    
        goto    tim2

        decfsz    Loop1,f    
        goto    tim1    
    return    
        
;****************************
; TEMPORISATION DES LEDs
;****************************    

Tempo3
        movlw    0xFF
        movwf    Retard1
        movwf    Retard2
Attente
        decfsz    Retard1,f
        goto    Attente
        movlw    0xff
        movwf    Retard1
        decfsz    Retard2,f
        goto    Attente
    return








        
    end


Le programme d'origine

Code : Tout sélectionner

;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;
        
;        PIC 16F84
;         Reception de code RC5 + LCD 4x16* (ou plus)+ 6 sorties (leds)
;
         ryl le 06/01/2005 23:46
;        
;))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

    LIST     p=16f84
    
#include <p16f84.inc>
    __config B'11111111110001'
    
    
; Do not show warnings                                        
    ERRORLEVEL      
-224                                        
        
            
LCD_DATA    EQU    PORTA        
; RA0 ==> RA3
LCD_CTRLB    EQU    PORTB
;E        EQU    4        ; sur RA4 
RS        EQU    7        
; sur RB7



        cblock 0x0C
donn1    
:    1            ; reception des bits RC5 
donn2    
:    1            ; reception des bits RC5
        
LCD_TEMP
:    1            ;temp LCD
LCD_TEMP2
:    1            ;temp LCD        
BUSY_1
:        1            ;var utilisée pour temporisation
NB_TEMPO
:    1            ;var utilisée pour temporisation
cmpt1
:        1            ;var utilisée pour temporisation
LCD_INDEX
:    1            ;Position curseur LCD

RC5_CTRL
:    1            ;var bit controle RC5
RC5_ADR
:    1            ;var bits adresse RC5
RC5_DATA
:    1            ;var bits données RC5
Loop1
:        1            ;compteur
Loop2
:        1
Loop3
:        1

ROM_INDEX
:    1            ;pointeur ROM tables des mots (    "sortie RB", "sorties a ZERO", "Pas de RC5......" )            ;

        endc
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
    ORG    0x0000    
    
        
    bsf    STATUS    
,RP0        ;Select Bank 1
    
;clrf    TRISB            ;
    clrf    TRISA            ;
    MOVLW B'01000000'    ;portb.6 en entrée
        MOVWF TRISB
    bcf    STATUS    
,RP0        ;Select Bank 0
    bcf    INTCON
, GIE    ; disable Interupt
        
    
debut
    call    tempox
    call    lcdinit            
; Appel du sous-prog d'initialisation de l'afficheur LCD
        
    
boucl_prog
    
    call    Recv_RC5            
; Récéption d'un code RC5
    
    call    Lign_1            ; efface ecran LCD

    ;movfw    RC5_CTRL            ; Etat du bit CONTROL RC5 dans RC5_CTRL         (touche pressée par impulsion/continue)
    ;movfw    RC5_ADR                ; Etat des 5 bits ADRESSE RC5 dans RC5_ADR   (adresseRC5: ex:TV=h00)
    ;movfw    RC5_DATA            ; Etat des bits de DONNEES RC5 dans RC5_DATA (touches TC: ex:On/Off=h0C )
        
    
    
    movfw    RC5_DATA        ; si RC5_DATA =0 (touche N°0 de la TC) 
    btfsc    STATUS,Z        ; 
    goto    Action_1    ;
    xorlw    (0x01 ^ 0x00)        ; si RC5_DATA =1 (touche N°1 de la TC)
    btfsc    STATUS,Z        ;
    goto    Action_2    ;            
    xorlw    (0x02 ^ 0x01)        ; si RC5_DATA =2 (touche N°2 de la TC)
    btfsc    STATUS,Z
    goto    Action_3    ;
    xorlw    (0x03 ^ 0x02)        ; si RC5_DATA =4 (touche N°4 de la TC)
    btfsc    STATUS,Z
    goto    Action_4    ;
    xorlw    (0x04 ^ 0x03)        ; si RC5_DATA =5 (touche N°5 de la TC)
    btfsc    STATUS,Z
    goto    Action_5    ;
    xorlw    (0x05 ^ 0x04)        ; si RC5_DATA =6 (touche N°6 de la TC)
    btfsc    STATUS,Z
    goto    Action_6    ;
    xorlw    (0x0C ^ 0x05)        ; si RC5_DATA =h0C (touche ON/OFF de la TC)
    btfsc    STATUS,Z
    goto    Action_7    ;

    call    MOT3            ; Affiche "Pas de RC5......" (pas traitée ou pas de reception IR)
    goto    fini            ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    

Action_1
            bsf    PORTB,0            ; mettre a 1 la broche RB0 (led n°1)
            goto    LCD_refr            ;    
Action_2
            bsf    PORTB,1            ; mettre a 1 la broche RB1 (led n°2)
            goto    LCD_refr            ;            
Action_3    
            bsf    PORTB,2            ; mettre a 1 la broche RB2 (led n°3)
            goto    LCD_refr            ;
Action_4
            bsf    PORTB,3            ; mettre a 1 la broche RB3 (led n°4)
            goto    LCD_refr            ;
Action_5
            bsf    PORTB,4            ; mettre a 1 la broche RB4 (led n°5)
            goto    LCD_refr            ;
Action_6
            bsf    PORTB,5            ; mettre a 1 la broche RB5 (led n°6)
            goto    LCD_refr            ;
LCD_refr            
            call    MOT1            ; Affiche la sortie active
            goto    fini            ;    
Action_7        
            call    MOT2            ; Affiche "sorties a ZERO"
            clrf    PORTB            ; mise a 0 de toutes les sorties

    

        
fini    
        call    tempox        ; tempo entre chaque detection/affichage
        call    tempox        ;   
    
    goto boucl_prog            ; recommencer la detection RC5+LCD
        
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================        
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================        



;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;************************************
; MOT1 A AFFICHER SUR LCD 1'
 ligne
;************************************
MOT1         movlw    T_MOT1            ; debut adresse table du premier mot/phrase
        call    Phrase            
; Affiche "sortie RB" sur LCD
        
        movfw    RC5_DATA        
; Affiche le N° sortie active (0...5)
        addlw    0x30            ; pour une lecture correcte depuis LCD (0x30='0')
        call    lcd_putchar
        return
;************************************
;
 MOT2 A AFFICHER SUR LCD 2' ligne
;************************************        
MOT2        movlw    0x10
        movwf    LCD_INDEX        ; forçer 2ieme ligne LCD
        
        movlw    T_MOT2            ; debut adresse table du deuxieme mot/phrase
        goto    Phrase            ; Affiche "sorties a ZERO"
;************************************
; MOT3 A AFFICHER SUR LCD 1'
 ligne
;************************************        
MOT3          movlw    T_MOT3            
; debut adresse table du troisieme mot/phrase
        
;goto    Phrase            ; Affiche "Pas de RC5......"            
;************************************
;
 LECTURE ROM INTERNE DU MOT/PHRASE
;************************************
Phrase        movwf    ROM_INDEX        ; mettre dans pointeur adresse
Loop_Phrase    call     T_MOT            
; recuperer valeur dans table "T_MOT"
        andlw    0xFF                ; 
        btfsc    STATUS
,Z            ; si=0
        return                   
; fin du mot/phrase
        call    lcd_putchar        
; si non ,envoyer valeur a LCD
        incf    ROM_INDEX
,f        ; pointeur table +1
           goto     Loop_Phrase         
; mot pas fini
           
T_MOT         movfw    ROM_INDEX         
;!! ATTENTION a PCLATH !!    si ailleur dans ROM                                
        movwf    PCL                
; mettre dans pointeur     
T_MOT1    
;
        dt    "sortie RB",0                ; IMPORTANT mettre 0 a la fin    
T_MOT2    
;
        dt    "sorties a ZERO",0            ; le 0 indique la fin du mot/phrase
T_MOT3    
;
        dt    "Pas de RC5......",0            ;
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================




;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;************************************
;
INITIALISATION DU MODULE LCD
;************************************
lcdinit     movlw    .30        ; sous-programme d'initialisation
        call    busy        ; On attend 15 ms pour que le LCD soit prêt
            movlw    0x02        ; Force Mode 4 bits 
        call    lcd_putcmd
            movlw    0x28        ; Mode 4 bits 
        call    lcd_putcmd
        movlw    0x0C        ; Affichage activé , le curseur ne se voit pas
        call    lcd_putcmd
        movlw    0x06        ; Après chaque affichage , le curseur se déplace vers la droite
        call    lcd_putcmd
Clear_LCD    clrf    LCD_INDEX        ; Position curseur LCD =0
        movlw    0x01        ; On efface l'
écran et on met le curseur en haut à gauche
        call    lcd_putcmd
        return        

;************************************
;
ENVOYER UN CARACTERE AU LCD
;************************************
lcd_putchar    movwf    LCD_TEMP    ; Sauvegarde du caractere a envoyer
        movwf    LCD_TEMP2    
; Sauvegarde du caractere a envoyer
        
lcd_pucr    movfw   LCD_INDEX        
; verifier valeur en cas de saut ligne LCD
            xorlw    
(0x10 ^ 0x00)        ;si LEN > 16 saut a 2' lign
            btfsc   STATUS,Z
            call    Lign_2            ; /
            xorlw    (0x20 ^ 0x10)        ;si LEN > 32 saut a 3'
 lign
            btfsc   STATUS
,Z
            call    Lign_3            
; /            
            xorlw    
(0x30 ^ 0x20)        ;si LEN > 48 saut a 4' lign
            btfsc   STATUS,Z
            call    Lign_4            ; /
            xorlw    (0x40 ^ 0x30)        ;si LEN > 64 saut a 1'
 lign
            btfsc   STATUS
,Z
            call    Lign_1            
; /
        incf    LCD_INDEX,F             ; on incrémente le pointeur LCD
        
        movfw    LCD_TEMP2    
; remettre le caractere sauvé dans "LCD_TEMP"
        
        movwf    LCD_TEMP    
; caractere a envoyer            
        movlw    0x02        
; On attend que le LCD soit prêt
        call     busy        
        bsf    LCD_CTRLB
,RS    ; ... une commande
        goto    Comu_LCD
;************************************        
Lign_1        call    Clear_LCD    
; efface LCD et initialise pointeur LCD
        movlw    0x80        
; On place le curseur ( début de la 1e ligne )
        goto    lcd_putcmd
Lign_2
        movlw    0xC0        
; On place le curseur ( début de la 2e ligne )
        goto    lcd_putcmd
Lign_3
        movlw    0x90        
; On place le curseur ( début de la 3e ligne )
        goto    lcd_putcmd
Lign_4
        movlw    0xD0        
; On place le curseur ( début de la 4e ligne )
;************************************
;
ENVOYER UNE COMMANDE AU LCD
;************************************
lcd_putcmd    movwf    LCD_TEMP    ; Sous programme d'envoi de commande
        movlw    0x08        ; On attend que le LCD soit prêt
        call    busy        
        bcf    LCD_CTRLB,RS    ; ... d'
une commande
Comu_LCD    swapf    LCD_TEMP
,W    ; On permutte les 2 quartets ( groupes de 4 bits ) de l'instruction
        andlw    0x0F
        movwf    LCD_DATA    ; On envoie les bits de poids fort sur RA0 ==> RA3
        call    enable        ; On valide
                
        movf    LCD_TEMP,W
        andlw    0x0F
        movwf    LCD_DATA    ; On envoie les bits de poids faible (de l'
instruction)
enable        iorlw    0x10        ; On valide "ENABLE_LCD"
        movwf     LCD_DATA
        nop        
        xorlw    0x10        
; disable
        movwf     LCD_DATA
        return           
; retour de la sous-routine
        

;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;************************************
;
TEMPO 500 µS
;************************************
busy        movwf    NB_TEMPO        ; Temporisation : dure 500µs x "la valeur contenue dans W"
boucle        movlw    .123
        movwf    BUSY_1
boucle1        NOP
        decfsz    BUSY_1
,1
        goto    boucle1
        decfsz    NB_TEMPO
,1
        goto    boucle    
        return               
; retour de la sous-routine
;************************************
;
TEMPO xx S
;************************************
tempox       movlw 0x0B             ; pour x boucles 
tempoxx        movwf cmpt1             
; dans cmpt1 
boucle2         movlw    0x25
        call     busy                 
; TEMPO xxxx µS
            decfsz cmpt1 
, f          ; si 0, décrémenter compteur 3 
           goto boucle2             
; si cmpt1 pas 0, recommencer boucle2 
           return                
; retour de la sous-routine 
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================




;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;**********************************************************
;
 RECEPTION D'UN CODE RC5
; RB6 en entrée (TSOP 1738...ou equivalent infra rouge)
; Controle RC5    : RC5_CTRL    => 1 bit
; Adresse RC5    : RC5_ADR    => 5 bits
; Données RC5   : RC5_DATA    => 6 bits
;**********************************************************
Recv_RC5     
        btfsc    PORTB, 6    ; Attendre un "0" 
        goto    Recv_RC5    ; du bit de start

        call    Tempo444    ; attendre 444us, 1/4 cycle pour capture bit a bit
        
        btfsc    PORTB, 6    ; tester si "0" (anormal probabl... une emission en cours mal sync!)
        goto    Fin_RC5        ; ERREUR ! finir la phase de reception

        clrf    donn1        ; donn1=0
        clrf    donn2        ; donn2=0
        movlw    .13        ; 13 bits a capturer
        movwf    Loop3        ; 12 sont traites 

        call    Tempo888    ; 1/4 du 2'
 Bit        
    
nextbit         rlf    donn1
,f        ; rotation a gauche de tous les bits
        rlf    donn2
,f        ;
        bcf    donn1, 0    ; forcer a "0" le bit0 de "donn1" 
        btfsc    PORTB
, 6    ; si RB6 (infra rouge) =0
        bsf    donn1
, 0    ; forcer a "1" le bit0 de "donn1"

        call    Set_bit        ; attendre flanc montant ou desc en fonction de l'etat de RB6 (infra rouge)

        call    Tempo444    ; attendre 3/4 de Bit pour se                 ;tempo    ; = 444,5 us
        call    Tempo888    ; placer a 1/4 du bit suivant                ;tempo    ; = 889 us
        decfsz    Loop3,f        ; les 13 bits sont t-ils tous reçus
        goto    nextbit        ; si non, recommencer reception du bit suivant
    
    ;Recuperation des bits du code RC5 des variables "donn1" "donn2" 
    
        movfw    donn1            ; recuperation des 6 bits de Données RC5
        andlw    b'
00111111'        ; 0 sur les bits non utilisés
        movwf    RC5_DATA        ; Placer val dans "RC5_DATA"

        rlf    donn1,f            ; decalage a gauche de 2 
        rlf    donn2,f            ; pour faire "remonter" les bits    
        rlf    donn1,f            ; de l'
Adresse RC5 
        rlf    donn2
,f            ; de donn1
        movfw    donn2            
; vers donn2
        andlw    b
'00011111'        ; 0 sur les bits non utilisés
        movwf    RC5_ADR            
; recuperation des 5 bits dans "RC5_ADR"
    
        clrf    RC5_CTRL        
; recuperation du bit     
        btfss    donn2
, 5        ; de controle RC5
        bsf    RC5_CTRL
, 0        ; dans "RC5_CTRL"
Fin_RC5
        return
        
;*************************************
;
Attendre fin bit fonction de PORTB6 (IR)
;*************************************
Set_bit     movlw    0x09        ; Tempo
        movwf    Loop1
tim11         movlw    0x20        
;
        movwf    Loop2
tim22         decfsz    Loop2
,f    
        goto    tim22

        btfsc    PORTB
, 6    ; si "0"
        goto    haut
bas        btfsc    donn1
, 0    ; bit en cours =?    
        return            
; flanc haut/bas    
        goto    saut_l
haut        btfss    donn1
, 0    ; bit en cours =?    
        return            
; flanc bas/haut            
saut_l        decfsz    Loop1
,f    
        goto    tim11    
        return            
        
;****************************
;
 TEMPORISATION POUR RC5
;****************************
Tempo888    movlw    0x12        ; Temporisation de 888µs
        goto    tim0
        
Tempo444    movlw    0x09        
; Temporisation de 444µs
tim0         movwf    Loop1
tim1         movlw    0x0F
        movwf    Loop2
tim2         decfsz    Loop2
,f    
        goto    tim2

        decfsz    Loop1
,f    
        goto    tim1    
    return    
        
    
        
    end

Télécommande IR à 10 canaux
nondediode
Amateur
Amateur
Messages : 100
Enregistré en : novembre 2018
Localisation : Entre l'emetteur et le collecteur

#14 Message par nondediode » mer. 9 janv. 2019 08:56

Bonjour tout le monde,

Je reviens sur ce récepteur qui pose à priori 2 petits soucis.

Le 1er:
La maquette posée sur la table en mode veille en attente d'un appel de télécommande.
J'ai d'une façon très aléatoire une sortie qui s'active sans avoir reçu d'appel.
Cette sortie n'est pas tjrs la même et sur 1h00 elle peut s'activer 1 X ou 2 X ou rien :cry:
J'ai essayé de masquer la cellule dans un tube alu (de médoc) pour être certain que ce n'est pas un pb de faisceau parasite.
J'ai alimenté la maquette avec une pile 9V et un petit régulateur 5V
Rien n'y fait :oops:
Je pense que le problème est dans le programme mais où?

Le second:
Dans le programme d'origine, le récepteur décode les 7 appels de la télécommande 0 à 7
J'ai augmenté le nbre d'appel à 9 et jusque là pas de pb.
Ensuite j'ai voulu utiliser les codes affectés au volume et qq autres dédiés à des commandes de "MUTE" , "PRG" , etc..
J'ai été confronté au pb suivant:
Si j'affecte une cde supplémentaire tout se passe bien, la cde est bien prise en compte
Exemple avec le volume+ (code 15)

Code : Tout sélectionner

    
            xorlw    
(0x15 ^ 0x14)        ; si RC5_DATA =(touche N°6 de la TC)
    btfsc    STATUS,Z
    goto    Action_8        
;   ;


Si je continue pour obtenir le volume - (code 16).
Aucunes de ces 2 cdes fonctionne. Autrement dit la seconde cde annule les 2. :oops:

Code : Tout sélectionner

    xorlw    (0x16 ^ 0x15)        ; si RC5_DATA =(touche N°6 de la TC)
    btfsc    STATUS,Z
    goto    Action_9        
;


Quelqu'un a t-il une explication?

Merci

Télécommande IR à 10 canaux
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1214
Enregistré en : juillet 2016
Localisation : Terre

#15 Message par Temps-x » sam. 12 janv. 2019 02:46

Bonsoir nondediode, et tout le forum,

Peux tu réécrire ta routine sans la mettre comme ceci 0x16 ^ 0x15, en utilisant des instructions.

Le problème pour moi, c'est de comprendre ce que veux dire la personne, pour que je puisse l'aider.

Ont dit souvent : un problème bien posé, c'est un problème à moitié résolu, et je confirme. :wink:

==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Télécommande IR à 10 canaux
nondediode
Amateur
Amateur
Messages : 100
Enregistré en : novembre 2018
Localisation : Entre l'emetteur et le collecteur

#16 Message par nondediode » sam. 12 janv. 2019 09:33

Bonjour Temps-x et toute l'équipe du forum.

Le soucis c'est que j'utilise un modèle de programme dans lequel j'ai juste supprimé la partie affichage qui n'avait pas d'utilité pour moi. Ensuite j'ai fait qq modifs pour qu'il soit parfaitement adapté à mon montage.

Effectivement cette routine est un peu floue, juste qu'elle permet d'inclure le code de la touche.

Revoici le programme complet avant modif

Code : Tout sélectionner

;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;
        
;        PIC 16F84
;         Reception de code RC5 + LCD 4x16* (ou plus)+ 6 sorties (leds)
;
         ryl le 06/01/2005 23:46
;        
;))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

    LIST     p=16f84
    
#include <p16f84.inc>
    __config B'11111111110001'
    
    
; Do not show warnings                                        
    ERRORLEVEL      
-224                                        
        
            
LCD_DATA    EQU    PORTA        
; RA0 ==> RA3
LCD_CTRLB    EQU    PORTB
;E        EQU    4        ; sur RA4 
RS        EQU    7        
; sur RB7



        cblock 0x0C
donn1    
:    1            ; reception des bits RC5 
donn2    
:    1            ; reception des bits RC5
        
LCD_TEMP
:    1            ;temp LCD
LCD_TEMP2
:    1            ;temp LCD        
BUSY_1
:        1            ;var utilisée pour temporisation
NB_TEMPO
:    1            ;var utilisée pour temporisation
cmpt1
:        1            ;var utilisée pour temporisation
LCD_INDEX
:    1            ;Position curseur LCD

RC5_CTRL
:    1            ;var bit controle RC5
RC5_ADR
:    1            ;var bits adresse RC5
RC5_DATA
:    1            ;var bits données RC5
Loop1
:        1            ;compteur
Loop2
:        1
Loop3
:        1

ROM_INDEX
:    1            ;pointeur ROM tables des mots (    "sortie RB", "sorties a ZERO", "Pas de RC5......" )            ;

        endc
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
    ORG    0x0000    
    
        
    bsf    STATUS    
,RP0        ;Select Bank 1
    
;clrf    TRISB            ;
    clrf    TRISA            ;
    MOVLW B'01000000'    ;portb.6 en entrée
        MOVWF TRISB
    bcf    STATUS    
,RP0        ;Select Bank 0
    bcf    INTCON
, GIE    ; disable Interupt
        
    
debut
    call    tempox
    call    lcdinit            
; Appel du sous-prog d'initialisation de l'afficheur LCD
        
    
boucl_prog
    
    call    Recv_RC5            
; Récéption d'un code RC5
    
    call    Lign_1            ; efface ecran LCD

    ;movfw    RC5_CTRL            ; Etat du bit CONTROL RC5 dans RC5_CTRL         (touche pressée par impulsion/continue)
    ;movfw    RC5_ADR                ; Etat des 5 bits ADRESSE RC5 dans RC5_ADR   (adresseRC5: ex:TV=h00)
    ;movfw    RC5_DATA            ; Etat des bits de DONNEES RC5 dans RC5_DATA (touches TC: ex:On/Off=h0C )
        
    
    
    movfw    RC5_DATA        ; si RC5_DATA =0 (touche N°0 de la TC) 
    btfsc    STATUS,Z        ; 
    goto    Action_1    ;
    xorlw    (0x01 ^ 0x00)        ; si RC5_DATA =1 (touche N°1 de la TC)
    btfsc    STATUS,Z        ;
    goto    Action_2    ;            
    xorlw    (0x02 ^ 0x01)        ; si RC5_DATA =2 (touche N°2 de la TC)
    btfsc    STATUS,Z
    goto    Action_3    ;
    xorlw    (0x03 ^ 0x02)        ; si RC5_DATA =4 (touche N°4 de la TC)
    btfsc    STATUS,Z
    goto    Action_4    ;
    xorlw    (0x04 ^ 0x03)        ; si RC5_DATA =5 (touche N°5 de la TC)
    btfsc    STATUS,Z
    goto    Action_5    ;
    xorlw    (0x05 ^ 0x04)        ; si RC5_DATA =6 (touche N°6 de la TC)
    btfsc    STATUS,Z
    goto    Action_6    ;
    xorlw    (0x0C ^ 0x05)        ; si RC5_DATA =h0C (touche ON/OFF de la TC)
    btfsc    STATUS,Z
    goto    Action_7    ;

    call    MOT3            ; Affiche "Pas de RC5......" (pas traitée ou pas de reception IR)
    goto    fini            ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    

Action_1
            bsf    PORTB,0            ; mettre a 1 la broche RB0 (led n°1)
            goto    LCD_refr            ;    
Action_2
            bsf    PORTB,1            ; mettre a 1 la broche RB1 (led n°2)
            goto    LCD_refr            ;            
Action_3    
            bsf    PORTB,2            ; mettre a 1 la broche RB2 (led n°3)
            goto    LCD_refr            ;
Action_4
            bsf    PORTB,3            ; mettre a 1 la broche RB3 (led n°4)
            goto    LCD_refr            ;
Action_5
            bsf    PORTB,4            ; mettre a 1 la broche RB4 (led n°5)
            goto    LCD_refr            ;
Action_6
            bsf    PORTB,5            ; mettre a 1 la broche RB5 (led n°6)
            goto    LCD_refr            ;
LCD_refr            
            call    MOT1            ; Affiche la sortie active
            goto    fini            ;    
Action_7        
            call    MOT2            ; Affiche "sorties a ZERO"
            clrf    PORTB            ; mise a 0 de toutes les sorties

    

        
fini    
        call    tempox        ; tempo entre chaque detection/affichage
        call    tempox        ;   
    
    goto boucl_prog            ; recommencer la detection RC5+LCD
        
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================        
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================        



;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;************************************
; MOT1 A AFFICHER SUR LCD 1'
 ligne
;************************************
MOT1         movlw    T_MOT1            ; debut adresse table du premier mot/phrase
        call    Phrase            
; Affiche "sortie RB" sur LCD
        
        movfw    RC5_DATA        
; Affiche le N° sortie active (0...5)
        addlw    0x30            ; pour une lecture correcte depuis LCD (0x30='0')
        call    lcd_putchar
        return
;************************************
;
 MOT2 A AFFICHER SUR LCD 2' ligne
;************************************        
MOT2        movlw    0x10
        movwf    LCD_INDEX        ; forçer 2ieme ligne LCD
        
        movlw    T_MOT2            ; debut adresse table du deuxieme mot/phrase
        goto    Phrase            ; Affiche "sorties a ZERO"
;************************************
; MOT3 A AFFICHER SUR LCD 1'
 ligne
;************************************        
MOT3          movlw    T_MOT3            
; debut adresse table du troisieme mot/phrase
        
;goto    Phrase            ; Affiche "Pas de RC5......"            
;************************************
;
 LECTURE ROM INTERNE DU MOT/PHRASE
;************************************
Phrase        movwf    ROM_INDEX        ; mettre dans pointeur adresse
Loop_Phrase    call     T_MOT            
; recuperer valeur dans table "T_MOT"
        andlw    0xFF                ; 
        btfsc    STATUS
,Z            ; si=0
        return                   
; fin du mot/phrase
        call    lcd_putchar        
; si non ,envoyer valeur a LCD
        incf    ROM_INDEX
,f        ; pointeur table +1
           goto     Loop_Phrase         
; mot pas fini
           
T_MOT         movfw    ROM_INDEX         
;!! ATTENTION a PCLATH !!    si ailleur dans ROM                                
        movwf    PCL                
; mettre dans pointeur     
T_MOT1    
;
        dt    "sortie RB",0                ; IMPORTANT mettre 0 a la fin    
T_MOT2    
;
        dt    "sorties a ZERO",0            ; le 0 indique la fin du mot/phrase
T_MOT3    
;
        dt    "Pas de RC5......",0            ;
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================




;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;************************************
;
INITIALISATION DU MODULE LCD
;************************************
lcdinit     movlw    .30        ; sous-programme d'initialisation
        call    busy        ; On attend 15 ms pour que le LCD soit prêt
            movlw    0x02        ; Force Mode 4 bits 
        call    lcd_putcmd
            movlw    0x28        ; Mode 4 bits 
        call    lcd_putcmd
        movlw    0x0C        ; Affichage activé , le curseur ne se voit pas
        call    lcd_putcmd
        movlw    0x06        ; Après chaque affichage , le curseur se déplace vers la droite
        call    lcd_putcmd
Clear_LCD    clrf    LCD_INDEX        ; Position curseur LCD =0
        movlw    0x01        ; On efface l'
écran et on met le curseur en haut à gauche
        call    lcd_putcmd
        return        

;************************************
;
ENVOYER UN CARACTERE AU LCD
;************************************
lcd_putchar    movwf    LCD_TEMP    ; Sauvegarde du caractere a envoyer
        movwf    LCD_TEMP2    
; Sauvegarde du caractere a envoyer
        
lcd_pucr    movfw   LCD_INDEX        
; verifier valeur en cas de saut ligne LCD
            xorlw    
(0x10 ^ 0x00)        ;si LEN > 16 saut a 2' lign
            btfsc   STATUS,Z
            call    Lign_2            ; /
            xorlw    (0x20 ^ 0x10)        ;si LEN > 32 saut a 3'
 lign
            btfsc   STATUS
,Z
            call    Lign_3            
; /            
            xorlw    
(0x30 ^ 0x20)        ;si LEN > 48 saut a 4' lign
            btfsc   STATUS,Z
            call    Lign_4            ; /
            xorlw    (0x40 ^ 0x30)        ;si LEN > 64 saut a 1'
 lign
            btfsc   STATUS
,Z
            call    Lign_1            
; /
        incf    LCD_INDEX,F             ; on incrémente le pointeur LCD
        
        movfw    LCD_TEMP2    
; remettre le caractere sauvé dans "LCD_TEMP"
        
        movwf    LCD_TEMP    
; caractere a envoyer            
        movlw    0x02        
; On attend que le LCD soit prêt
        call     busy        
        bsf    LCD_CTRLB
,RS    ; ... une commande
        goto    Comu_LCD
;************************************        
Lign_1        call    Clear_LCD    
; efface LCD et initialise pointeur LCD
        movlw    0x80        
; On place le curseur ( début de la 1e ligne )
        goto    lcd_putcmd
Lign_2
        movlw    0xC0        
; On place le curseur ( début de la 2e ligne )
        goto    lcd_putcmd
Lign_3
        movlw    0x90        
; On place le curseur ( début de la 3e ligne )
        goto    lcd_putcmd
Lign_4
        movlw    0xD0        
; On place le curseur ( début de la 4e ligne )
;************************************
;
ENVOYER UNE COMMANDE AU LCD
;************************************
lcd_putcmd    movwf    LCD_TEMP    ; Sous programme d'envoi de commande
        movlw    0x08        ; On attend que le LCD soit prêt
        call    busy        
        bcf    LCD_CTRLB,RS    ; ... d'
une commande
Comu_LCD    swapf    LCD_TEMP
,W    ; On permutte les 2 quartets ( groupes de 4 bits ) de l'instruction
        andlw    0x0F
        movwf    LCD_DATA    ; On envoie les bits de poids fort sur RA0 ==> RA3
        call    enable        ; On valide
                
        movf    LCD_TEMP,W
        andlw    0x0F
        movwf    LCD_DATA    ; On envoie les bits de poids faible (de l'
instruction)
enable        iorlw    0x10        ; On valide "ENABLE_LCD"
        movwf     LCD_DATA
        nop        
        xorlw    0x10        
; disable
        movwf     LCD_DATA
        return           
; retour de la sous-routine
        

;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;************************************
;
TEMPO 500 µS
;************************************
busy        movwf    NB_TEMPO        ; Temporisation : dure 500µs x "la valeur contenue dans W"
boucle        movlw    .123
        movwf    BUSY_1
boucle1        NOP
        decfsz    BUSY_1
,1
        goto    boucle1
        decfsz    NB_TEMPO
,1
        goto    boucle    
        return               
; retour de la sous-routine
;************************************
;
TEMPO xx S
;************************************
tempox       movlw 0x0B             ; pour x boucles 
tempoxx        movwf cmpt1             
; dans cmpt1 
boucle2         movlw    0x25
        call     busy                 
; TEMPO xxxx µS
            decfsz cmpt1 
, f          ; si 0, décrémenter compteur 3 
           goto boucle2             
; si cmpt1 pas 0, recommencer boucle2 
           return                
; retour de la sous-routine 
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================




;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;**********************************************************
;
 RECEPTION D'UN CODE RC5
; RB6 en entrée (TSOP 1738...ou equivalent infra rouge)
; Controle RC5    : RC5_CTRL    => 1 bit
; Adresse RC5    : RC5_ADR    => 5 bits
; Données RC5   : RC5_DATA    => 6 bits
;**********************************************************
Recv_RC5     
        btfsc    PORTB, 6    ; Attendre un "0" 
        goto    Recv_RC5    ; du bit de start

        call    Tempo444    ; attendre 444us, 1/4 cycle pour capture bit a bit
        
        btfsc    PORTB, 6    ; tester si "0" (anormal probabl... une emission en cours mal sync!)
        goto    Fin_RC5        ; ERREUR ! finir la phase de reception

        clrf    donn1        ; donn1=0
        clrf    donn2        ; donn2=0
        movlw    .13        ; 13 bits a capturer
        movwf    Loop3        ; 12 sont traites 

        call    Tempo888    ; 1/4 du 2'
 Bit        
    
nextbit         rlf    donn1
,f        ; rotation a gauche de tous les bits
        rlf    donn2
,f        ;
        bcf    donn1, 0    ; forcer a "0" le bit0 de "donn1" 
        btfsc    PORTB
, 6    ; si RB6 (infra rouge) =0
        bsf    donn1
, 0    ; forcer a "1" le bit0 de "donn1"

        call    Set_bit        ; attendre flanc montant ou desc en fonction de l'etat de RB6 (infra rouge)

        call    Tempo444    ; attendre 3/4 de Bit pour se                 ;tempo    ; = 444,5 us
        call    Tempo888    ; placer a 1/4 du bit suivant                ;tempo    ; = 889 us
        decfsz    Loop3,f        ; les 13 bits sont t-ils tous reçus
        goto    nextbit        ; si non, recommencer reception du bit suivant
    
    ;Recuperation des bits du code RC5 des variables "donn1" "donn2" 
    
        movfw    donn1            ; recuperation des 6 bits de Données RC5
        andlw    b'
00111111'        ; 0 sur les bits non utilisés
        movwf    RC5_DATA        ; Placer val dans "RC5_DATA"

        rlf    donn1,f            ; decalage a gauche de 2 
        rlf    donn2,f            ; pour faire "remonter" les bits    
        rlf    donn1,f            ; de l'
Adresse RC5 
        rlf    donn2
,f            ; de donn1
        movfw    donn2            
; vers donn2
        andlw    b
'00011111'        ; 0 sur les bits non utilisés
        movwf    RC5_ADR            
; recuperation des 5 bits dans "RC5_ADR"
    
        clrf    RC5_CTRL        
; recuperation du bit     
        btfss    donn2
, 5        ; de controle RC5
        bsf    RC5_CTRL
, 0        ; dans "RC5_CTRL"
Fin_RC5
        return
        
;*************************************
;
Attendre fin bit fonction de PORTB6 (IR)
;*************************************
Set_bit     movlw    0x09        ; Tempo
        movwf    Loop1
tim11         movlw    0x20        
;
        movwf    Loop2
tim22         decfsz    Loop2
,f    
        goto    tim22

        btfsc    PORTB
, 6    ; si "0"
        goto    haut
bas        btfsc    donn1
, 0    ; bit en cours =?    
        return            
; flanc haut/bas    
        goto    saut_l
haut        btfss    donn1
, 0    ; bit en cours =?    
        return            
; flanc bas/haut            
saut_l        decfsz    Loop1
,f    
        goto    tim11    
        return            
        
;****************************
;
 TEMPORISATION POUR RC5
;****************************
Tempo888    movlw    0x12        ; Temporisation de 888µs
        goto    tim0
        
Tempo444    movlw    0x09        
; Temporisation de 444µs
tim0         movwf    Loop1
tim1         movlw    0x0F
        movwf    Loop2
tim2         decfsz    Loop2
,f    
        goto    tim2

        decfsz    Loop1
,f    
        goto    tim1    
    return    
        
    
        
    end



Et le programme modifié


Code : Tout sélectionner

;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;
        
;        PIC 16F84
;         Reception de code RC5 + LCD 4x16* (ou plus)+ 6 sorties (leds)
;
         ryl le 06/01/2005 23:46
;        
;))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

    LIST     p=16f84
    
#include <p16f84.inc>
    __config B'11111111110001'
    
                                        
    ERRORLEVEL      
-224                                        
        


        cblock 0x0C
donn1    
:    1            ; reception des bits RC5 
donn2    
:    1            ; reception des bits RC5
BUSY_1
:        1            ;var utilisée pour temporisation
NB_TEMPO
:    1            ;var utilisée pour temporisation
cmpt1
:        1            ;var utilisée pour temporisation
RC5_CTRL
:    1            ;var bit controle RC5
RC5_ADR
:    1            ;var bits adresse RC5
RC5_DATA
:    1            ;var bits données RC5
Loop1
:        1            ;compteur
Loop2
:        1
Loop3
:        1
Retard1
:    1                
Retard2
:    1                

ROM_INDEX
:    1            ;pointeur ROM tables des mots (    "sortie RB", "sorties a ZERO", "Pas de RC5......" )            ;

        endc
;==========================================================================================================

    ORG    0x0000    
    
        
    bsf    STATUS    
,RP0        ;Select Bank 1
    clrf    TRISA            
;
    MOVLW B'01000000'        ;portb.6 en entrée
        MOVWF TRISB
    bcf    STATUS    
,RP0        ;Select Bank 0
    bcf    INTCON
, GIE        ; disable Interupt
        
    
debut
    call    tempox


    
boucl_prog

    call    Recv_RC5        
; Récéption d'un code RC5
    
    
    movfw    RC5_DATA        ; si RC5_DATA =0 (touche N°0 de la TC) 
    btfsc    STATUS,Z        ; 
    goto    Action_1        ;
    xorlw    (0x01 ^ 0x00)        ; si RC5_DATA =1 (touche N°1 de la TC)
    btfsc    STATUS,Z        ;
    goto    Action_2        ;            
    xorlw    (0x02 ^ 0x01)        ; si RC5_DATA =2 (touche N°2 de la TC)
    btfsc    STATUS,Z
    goto    Action_3        ;
    xorlw    (0x03 ^ 0x02)        ; si RC5_DATA =4 (touche N°4 de la TC)
    btfsc    STATUS,Z
    goto    Action_4        ;
    xorlw    (0x04 ^ 0x03)        ; si RC5_DATA =5 (touche N°5 de la TC)
    btfsc    STATUS,Z
    goto    Action_5        ;
    xorlw    (0x05 ^ 0x04)        ; si RC5_DATA =6 (touche N°6 de la TC)
    btfsc    STATUS,Z
    goto    Action_6        ;
    xorlw    (0x06 ^ 0x05)        ; si RC5_DATA =6 (touche N°6 de la TC)
    btfsc    STATUS,Z
    goto    Action_7        ;


    xorlw    (0x07 ^ 0x06)        ; si RC5_DATA =6 (touche N°6 de la TC)
    btfsc    STATUS,Z
    goto    Action_8        ;

    xorlw    (0x08 ^ 0x07)        ; si RC5_DATA =6 (touche N°6 de la TC)
    btfsc    STATUS,Z
    goto    Action_9        ;



    xorlw    (0x0C ^ 0x05)        ; si RC5_DATA =h0C (touche ON/OFF de la TC)
    btfsc    STATUS,Z
    goto    Action_10        ;

    goto    fini            ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    

Action_1
            bsf    PORTB,0            ; mettre a 1 la broche RB0 (led n°1)
            goto    LCD_refr            ;    
Action_2
            bsf    PORTB,1            ; mettre a 1 la broche RB1 (led n°2)
            goto    LCD_refr            
Action_3    
            bsf    PORTB,2            ; mettre a 1 la broche RB2 (led n°3)
            goto    LCD_refr            ;
Action_4
            bsf    PORTB,3            ; mettre a 1 la broche RB3 (led n°4)
            goto    LCD_refr            ;
Action_5
            bsf    PORTB,4            ; mettre a 1 la broche RB4 (led n°5)
            goto    LCD_refr            ;
Action_6
            bsf    PORTB,5            ; mettre a 1 la broche RB5 (led n°6)
            goto    LCD_refr            ;
Action_7
            bsf    PORTA,0            ; mettre a 1 la broche RA0 (led n°7)
            goto    LCD_refr
Action_8
            bsf    PORTA,1            ; mettre a 1 la broche RA0 (led n°7)
            goto    LCD_refr
Action_9
            bsf    PORTA,2            ; mettre a 1 la broche RA0 (led n°7)
            goto    LCD_refr

LCD_refr            
            goto    fini2
Action_10
            clrf    PORTB            ; mise a 0 de toutes les sorties
fini    
            call    tempox            ; tempo entre chaque detection/affichage
            call    tempox            ;  
            goto boucl_prog            ; recommencer la detection RC5+LCD
fini2

            movlw    0x0C
            movwf    RC5_DATA
            call    Tempo3            ;  
            clrf    PORTB
            clrf    PORTA
            call    Tempo3            ; 
            goto     boucl_prog        
        
;************************************
;TEMPO 500 µS
;************************************
busy        movwf    NB_TEMPO            ; Temporisation : dure 500µs x "la valeur contenue dans W"
boucle        movlw    .123
        movwf    BUSY_1
boucle1        NOP
        decfsz    BUSY_1,1
        goto    boucle1
        decfsz    NB_TEMPO,1
        goto    boucle    
        return               ; retour de la sous-routine
;************************************
;TEMPO xx S
;************************************
tempox       movlw 0x0B             ; pour x boucles 
tempoxx        movwf cmpt1             ; dans cmpt1 
boucle2         movlw    0x25
        call     busy                 ; TEMPO xxxx µS
            decfsz cmpt1 , f          ; si 0, décrémenter compteur 3 
           goto boucle2             ; si cmpt1 pas 0, recommencer boucle2 
           return                ; retour de la sous-routine 
;**********************************************************
; RECEPTION D'
UN CODE RC5
; RB6 en entrée (TSOP 1738...ou equivalent infra rouge)
;
 Controle RC5    : RC5_CTRL    => 1 bit
; Adresse RC5    : RC5_ADR    => 5 bits
; Données RC5   : RC5_DATA    => 6 bits
;**********************************************************
Recv_RC5     
        btfsc    PORTB
, 6    ; Attendre un "0" 
        goto    Recv_RC5    
; du bit de start

        call    Tempo444    
; attendre 444us, 1/4 cycle pour capture bit a bit
        
        btfsc    PORTB
, 6    ; tester si "0" (anormal probabl... une emission en cours mal sync!)
        goto    Fin_RC5        ; ERREUR ! finir la phase de reception

        clrf    donn1        
; donn1=0
        clrf    donn2        
; donn2=0
        movlw    .13        
; 13 bits a capturer
        movwf    Loop3        
; 12 sont traites 

        call    Tempo888    
; 1/4 du 2' Bit        
    
nextbit         rlf    donn1,f        ; rotation a gauche de tous les bits
        rlf    donn2,f        ;
        bcf    donn1, 0    ; forcer a "0" le bit0 de "donn1" 
        btfsc    PORTB, 6    ; si RB6 (infra rouge) =0
        bsf    donn1, 0    ; forcer a "1" le bit0 de "donn1"

        call    Set_bit        ; attendre flanc montant ou desc en fonction de l'
etat de RB6 (infra rouge)

        call    Tempo444    ; attendre 3/4 de Bit pour se                 ;tempo    ; = 444,5 us
        call    Tempo888    
; placer a 1/4 du bit suivant                ;tempo    ; = 889 us
        decfsz    Loop3
,f        ; les 13 bits sont t-ils tous reçus
        goto    nextbit        
; si non, recommencer reception du bit suivant
    
;Recuperation des bits du code RC5 des variables "donn1" "donn2" 
    
        movfw    donn1            
; recuperation des 6 bits de Données RC5
        andlw    b
'00111111'        ; 0 sur les bits non utilisés
        movwf    RC5_DATA        
; Placer val dans "RC5_DATA"

        rlf    donn1,f            ; decalage a gauche de 2 
        rlf    donn2
,f            ; pour faire "remonter" les bits    
        rlf    donn1
,f            ; de l'Adresse RC5 
        rlf    donn2,f            ; de donn1
        movfw    donn2            ; vers donn2
        andlw    b'
00011111'        ; 0 sur les bits non utilisés
        movwf    RC5_ADR            ; recuperation des 5 bits dans "RC5_ADR"
    
        clrf    RC5_CTRL        ; recuperation du bit     
        btfss    donn2, 5        ; de controle RC5
        bsf    RC5_CTRL, 0        ; dans "RC5_CTRL"
Fin_RC5
        return
        
;*************************************
;Attendre fin bit fonction de PORTB6 (IR)
;*************************************
Set_bit     movlw    0x09        ; Tempo
        movwf    Loop1
tim11         movlw    0x20        ;
        movwf    Loop2
tim22         decfsz    Loop2,f    
        goto    tim22

        btfsc    PORTB, 6    ; si "0"
        goto    haut
bas        btfsc    donn1, 0    ; bit en cours =0 ?    
        return            ; flanc haut/bas    
        goto    saut_l
haut        btfss    donn1, 0    ; bit en cours =1 ?    
        return            ; flanc bas/haut            
saut_l        decfsz    Loop1,f    
        goto    tim11    
        return            
        
;****************************
; TEMPORISATION POUR RC5
;****************************
Tempo888    movlw    0x12        ; Temporisation de 888µs
        goto    tim0
        
Tempo444    movlw    0x09        ; Temporisation de 444µs
tim0         movwf    Loop1
tim1         movlw    0x0F
        movwf    Loop2
tim2         decfsz    Loop2,f    
        goto    tim2

        decfsz    Loop1,f    
        goto    tim1    
    return    
        
;****************************
; TEMPORISATION DES LEDs
;****************************    

Tempo3
        movlw    0xFF
        movwf    Retard1
        movwf    Retard2
Attente
        decfsz    Retard1,f
        goto    Attente
        movlw    0xff
        movwf    Retard1
        decfsz    Retard2,f
        goto    Attente
    return

       
    end


J'ai juste suivi la suite logique de cette commande très particulière pour lequel je pense qu'il s'agit de vérifier une différence entre registre mais je ne suis pas arrivé à trouver d'autres explications.

Télécommande IR à 10 canaux
Triac01
Membre
Membre
Messages : 3
Enregistré en : août 2017

#17 Message par Triac01 » sam. 12 janv. 2019 15:33

Bonjour NONDEDIODE.
Pour l'utilisation du Xorlw
Regarde sur le cours 1 du maître BIGONOFF dans le chapitre 18 astuces de programmation une explication en est donnée.
Bon courage pour t'ont programme .

Télécommande IR à 10 canaux
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1214
Enregistré en : juillet 2016
Localisation : Terre

#18 Message par Temps-x » jeu. 17 janv. 2019 02:07

Bonsoir Triac01, nondediode, et tout le forum,

Triac01 a écrit :Source du message Regarde sur le cours 1 du maître BIGONOFF dans le chapitre 18 astuces de programmation une explication en est donnée.


Effectivement, il ont parle en chapitre 18, j'ai jamais fini la fin du cours 1 du maître BIGONOFF :sifflotte:

Merci ! Triac01

Pour revenir à notre télécommande, je me rappelle que certaine télécommande ont deux codes pour la même touche,
en général ça concerne presque toujours le volume.

==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Télécommande IR à 10 canaux
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 604
Âge : 33
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#19 Message par venom » sam. 19 janv. 2019 13:06

Bonjour,

En voilà un sujet qui m'a toujours intrigué. Le fonctionnement d'une télécommande

Si j'ai bien compris, la télécommande envoie une série de clignotement via l'infrarouge et le récepteur sais du coup la touche. C'est bien sa ?
Genre
Touche 1 = 10101010
Touche 2 = 10110010
Etc...
Et la led s'allume quand elle rencontre un 1 et s'éteint quand elle rencontre un 0 ?






@++
En fait tout est une question de BIT ? :-D

Télécommande IR à 10 canaux
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1307
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#20 Message par paulfjujo » sam. 19 janv. 2019 17:14

Bonjour,

venom a écrit :Bonjour,

En voilà un sujet qui m'a toujours intrigué. Le fonctionnement d'une télécommande

Si j'ai bien compris, la télécommande envoie une série de clignotement via l'infrarouge et le récepteur sais du coup la touche. C'est bien sa ?
Genre
Touche 1 = 10101010
Touche 2 = 10110010
Etc...
Et la led s'allume quand elle rencontre un 1 et s'éteint quand elle rencontre un 0 ?
@++


un sujet effectivement tres interessant ..
non seulement une serie de bit, mais aussi

la frequence porteuse
36KHz
38KHz
40KHz
...

Le protocole de codage
RC5
RC6
SONY
...etc

la duree d'un bit
la duree des silences
les repetitions

donc tout un programme ..

elles reviennent en force, ces telecommandes IR :
ex: Led RGB ou ruban + telecommande IR pour moins de 4€ chez ACTION , où je n'en ai pas .(.. des actions)
peut etre intressant pour piloter autre chose via un PIC
Aides toi, le ciel ou Fantastpic t'aideras


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités