; ************************************************************************* ; JOY_ITF ; connection des 4 axes d'une radio-commande au port joystick ; via le signal PPM d'écolage ... ; Thierry Pébayle, 01/2003 ; ************************************************************************* PROCESSOR PIC12C509A INCLUDE radix dec ; Configuration: ; Master clear désactivé car pin utilisée pour entrée PPM ; Code protection OFF ; Watchdog timer OFF ; Oscillateur XT (quartz 4Mhz ou résonateur 4Mhz) __config _MCLRE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC ; Bit definitions for the GPIO register and theTRIS register SData EQU 0 ; output serial data SClock EQU 1 ; output serial clock CSelect EQU 2 ; Chip Select PPM EQU 3 ; Input PPM TrisBits EQU H'FF' & ~((1 << SData)|(1 << SClock)|(1 << CSelect)) ;************************************************************************** ;* Variables ;************************************************************************** CptHI EQU 0x08 CptLO EQU 0x09 Cpt EQU 0x0A CptBis EQU 0x0B pulse1 EQU 0x10 ;durée pulse pulse2 EQU 0x11 pulse3 EQU 0x12 pulse4 EQU 0x13 ;************************************************************************** ;* Program Code ;************************************************************************** ORG 0 ; code en page 0 bcf STATUS, PA0 ;désactive entrée externe timer 0 ;pour utiliser GPIO(2) en sortie (CSelect) movlw B'11000000' OPTION ;config des E/S clrf GPIO movlw TrisBits tris GPIO ;désactive les potentiometres par défaut bsf GPIO, CSelect ;************************* ;attente 1er front montant ;************************* Loop1 btfsc GPIO, PPM ;attente niveau bas goto Loop1 Loop2 btfss GPIO, PPM ;attente niveau haut goto Loop2 ;*********************************** ;boucle d'attente début de trame PPM ;*********************************** AttenteDebutTrame ;init compteur des durées de pulse à -63 (=-1ms) clrf pulse1 movlw .63 subwf pulse1,f movf pulse1,w movwf pulse2 movwf pulse3 movwf pulse4 ;init compteur duree 16bits clrf CptHI clrf CptLO movlw 1 ;attente front montant suivant ;une boucle = 5 cycles = 5 micro-sec ;attente niveau bas Loop3 addwf CptLO,f addcf CptHI,f btfsc GPIO, PPM goto Loop3 ;attente niveau haut Loop4 addwf CptLO,f addcf CptHI,f btfss GPIO, PPM goto Loop4 ;test si temps sup à 5ms environ (test CptHILO>=1024 ou CptHI>=4) movlw 4 subwf CptHI,w skpc goto AttenteDebutTrame ;si oui: recupère durées des 4 premiers pulses ;1 boucle = 16 cycles = 16 micro-sec ;64 boucles = 16*64 = 1024 micro-sec = env. 1 ms ;et les potentiomètres ont 64 pas (0->63) ;****************************** ;mesure durées des pulses 1 a 4 ;****************************** MesureDureePulse ;init compteur boucle movlw 0x04 movwf Cpt ;init registre indirect movlw pulse1 movwf FSR boucle4x_1 ;attente niveau bas Loop5 ;8 micro-sec nop nop nop nop nop nop nop nop ;8 micro-sec nop nop nop nop incf INDF,f btfsc GPIO, PPM goto Loop5 ;attente niveau haut Loop6 ;8 micro-sec nop nop nop nop nop nop nop nop ;8 micro-sec nop nop nop nop incf INDF,f btfss GPIO, PPM goto Loop6 incf FSR,f ;passage au compteur du pulse suivant decfsz Cpt,f ;test rebouclage 4x goto boucle4x_1 ;************************************************ ;mise a jour des potentiomètres numériques 1 à 4 ;************************************************ majPotentiometres ;init compteur boucle movlw 0x04 movwf CptBis ;init registre indirect movlw pulse1 movwf FSR boucle4x_2 ;test passage à zero btfsc INDF,7 ;test bit de signe clrf INDF ;force à 0 ;test durée > 63 (63*16micro = env 1ms) movlw .63 btfsc INDF,6 ;test bit6 (poids 64) movwf INDF ;force à 63 ;active potentiomètre bcf GPIO, CSelect nop nop nop nop nop ;2 bits d'addresse ;PF bcf GPIO, SData btfsc FSR,1 bsf GPIO, SData bsf GPIO, SClock ;pulse horloge bcf GPIO, SClock ;pf bcf GPIO, SData btfsc FSR,0 bsf GPIO, SData bsf GPIO, SClock ;pulse horloge bcf GPIO, SClock ;6 bits de valeur 0->63 movlw 6 movwf Cpt rlf INDF,f rlf INDF,f boucle6x rlf INDF,f bcf GPIO, SData ;0 par defaut skpnc bsf GPIO, SData ;1 si carry bsf GPIO, SClock ;pulse horloge bcf GPIO, SClock decfsz Cpt,f goto boucle6x bcf GPIO, SData ;0 par defaut ;desactive potentiomètre bsf GPIO, CSelect ;passage pulse suivant incf FSR,f ;test fin de boucle decfsz CptBis,f goto boucle4x_2 ;retour attente trame suivante goto AttenteDebutTrame ;*********************** F I N ********************** END