Accueil
F6FCO
Ondes courtes
Le radioamateurisme
Station
Manipulateurs
Divers radio
Mecatronique
Robotique
CNC
Imprimante 3D
Electronique
Usinage
Divers
Travail du bois
Petits trucs
Divers
PIC16F88
Hello World
;********************************************************************** ; ; F6FCO ; Hello World ; xtal: 4Mhz ; ; ;********************************************************************** List p=16F88 ; processeur utilisé #include
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _XT_OSC __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF OPTIONVAL EQU H'0008' ; -------------------------------------------------------------------------------------------- CBLOCK 0x020 Reg_1 Reg_2 Reg_3 ENDC ;********************************************************************** org 0x0000 ; Adresse de départ après reset init clrf PORTB ; sorties portB à 0 bsf STATUS,RP0 ; bank1 clrf ANSEL ; broches du CAN en I/O movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option movlw b'00000111' ; A0 en entrée pour poussoirs movwf TRISA clrf TRISB ; Bit PORTB.0 en sortie bcf STATUS,5 ; bank0 clrf PORTB ; sorties portB à 0
#include
;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* main bsf PORTB,0 call tempo300ms bcf PORTB,0 call tempo300ms goto main tempo300ms ; Délai 300 000 Cycles de la machine ; Durée du délai 300 millisecond ; Fréquence de l'oscillateur 4 MHZ movlw .153 movwf Reg_1 movlw .134 movwf Reg_2 movlw .2 movwf Reg_3 decfsz Reg_1,F goto $-1 decfsz Reg_2,F goto $-3 decfsz Reg_3,F goto $-5 return END
Hello World avec le Timer0
;********************************************************************** ; ; Led clignotante avecr TIMER0 ; ; ;********************************************************************** List p=16F88 #include
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _XT_OSC __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF OPTIONVAL EQU H'0087' ; Valeur registre option, Prescaler à 256 MasqueIntcon EQU H'00A0' ; réglage interruptions Timer0 #DEFINE LED PORTA,0 BANK0 macro bcf STATUS , RP0 endm BANK1 macro bsf STATUS , RP0 endm CBLOCK 0x00C w_temp :1 ; Sauvegarde du registre W status_temp : 1 ; Sauvegarde du registre STATUS cmpt : 1 ENDC org 0x000 ; Adresse de départ après reset goto init ; Adresse 0: initialiser ; ------------------------ Routines Interruptions ;sauvegarder registres org 0x004 ; adresse d'interruption movwf w_temp ; sauver registre W swapf STATUS,w ; swap status avec résultat dans w movwf status_temp ; sauver status swappé ; Interrupt TIMER0 btfsc INTCON,TMR0IE ; tester si interrupt timer autorisée btfss INTCON,TMR0IF ; oui, tester si interrupt timer en cours goto restorereg call inttimer ; oui, traiter interrupt timer bcf INTCON,TMR0IF ; effacer flag interrupt timer ;restaurer registres restorereg swapf status_temp,w ; swap ancien status, résultat dans w movwf STATUS ; restaurer status swapf w_temp,f ; Inversion L et H de l'ancien W ; sans modifier Z swapf w_temp,w ; Réinversion de L et H dans W ; W restauré sans modifier status retfie ; return from interrupt ; Routine d'interruption TIMER 0 inttimer decfsz cmpt,f ; décrémenter compteur de passages return ; pas 0, on ne fait rien BANK0 movlw b'00000001' ; sélectionner bit à inverser xorwf PORTA , f ; inverser LED movlw d'7' ; on recommence à décompter movwf cmpt return ; fin d'interruption timer ; ------------------------ Init init clrf PORTA clrf PORTB clrf EEADR ; diminue la consommation BANK1 ; passer banque1 movlw OPTIONVAL movwf OPTION_REG clrf ANSEL ; broches toutes en I/O movlw b'00000000' movwf TRISA movwf TRISB BANK0 movlw MasqueIntcon ; masque interruption movwf INTCON ; charger interrupt control movlw d'7' movwf cmpt ; ----------------------------------- main nop nop nop goto main ; boucler END
Commande servomoteur
;****************************************************************************** ; F6FCO - 16mai2024 ; routine servomoteur ; xtal horloge 4Mhz ; ; NOTE: - Ce code à été mis au point avec un servomoteur MG996R Tower Pro et n'a pas ; été testé avec d'autres servosmoteurs. ; Il est possible que les valeurs duty-cycle ne soient pas adaptées pour ; un autre type, dans ce cas il faudra recalculer les tempos. ; - Pour un positionnement correct j'ai du adapter les valeurs de tempo ; par rapport à celles données par le datasheet. ; - Le PWM est calculé pour une horloge de 4Mhz. Pour une autre fréquence ; d'horloge il faudra recalculer les tempos. ; - Pour des valeurs d'angles intermédiaires, recalculer les tempos. ; ;****************************************************************************** List p=16F88 #include
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _XT_OSC __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF OPTIONVAL EQU H'0087' ; Valeur registre option, Prescaler à 256 #define servo1 PORTA,0 #define cycle d'50' ; nombre de cycles que met le servo pour atteindre la position BANK0 macro bcf STATUS , RP0 endm BANK1 macro bsf STATUS , RP0 endm CBLOCK 0x00C cmpt :1 w_temp :1 ; Sauvegarde du registre W status_temp :1 ; Sauvegarde du registre STATUS Reg_1 :1 Reg_2 :1 Reg_3 :1 conchita :1 ; variable à tout faire ptr :1 ENDC org 0x000 ; Adresse de départ après reset goto init ; Adresse 0: initialiser ; ------------------------ Init init clrf PORTA clrf PORTB clrf EEADR ; diminue la consommation BANK1 movlw OPTIONVAL movwf OPTION_REG clrf ANSEL ; broches toutes en I/O movlw b'00000000' movwf TRISA movwf TRISB BANK0 ;call _0degres_servo1 ;call tempo2s4 ;call tempo2s4 ;call _180degres_servo1 ; ----------------------------------- main ;goto main ; éxécute des aller/retours de 0 à 180° call _0degres_servo1 nop call tempo2s4 ; tempo call tempo2s4 ; tempo nop call _90degres_servo1 nop call tempo2s4 ; tempo call tempo2s4 ; tempo nop call _180degres_servo1 nop call tempo2s4 ; tempo call tempo2s4 ; tempo nop call _90degres_servo1 nop call tempo2s4 ; tempo call tempo2s4 ; tempo nop goto main #include
#include
END
_0degres_servo1 movlw cycle movwf ptr p1 bsf servo1 call tempo0.2ms4 bcf servo1 call tempo19.8ms4 decfsz ptr goto p1 return _90degres_servo1 movlw cycle movwf ptr p2 bsf servo1 call tempo1ms4 bcf servo1 call tempo19ms4 decfsz ptr goto p2 return _180degres_servo1 movlw cycle movwf ptr p3 bsf servo1 call tempo2ms4 bcf servo1 call tempo18ms4 decfsz ptr goto p3 return
; ----------------- 0° avec xtal 4MHz tempo0.2ms4 ; Délai 200 Cycles de la machine ; Durée du délai 0.2 millisecond ; Fréquence de l'oscillateur 4 MHZ movlw .66 movwf Reg_1 decfsz Reg_1,F goto $-1 nop return tempo19.8ms4 ; Délai 19 800 Cycles de la machine ; Durée du délai 19.8 millisecond ; Fréquence de l'oscillateur 4 MHZ movlw .181 movwf Reg_1 movlw .26 movwf Reg_2 decfsz Reg_1,F goto $-1 decfsz Reg_2,F goto $-3 nop nop return ; ----------------- 90° avec xtal 4MHz tempo1ms4 ; Délai 1 000 Cycles de la machine ; Durée du délai 1 millisecond ; Fréquence de l'oscillateur 4 MHZ movlw .75 movwf Reg_1 movlw .2 movwf Reg_2 decfsz Reg_1,F goto $-1 decfsz Reg_2,F goto $-3 return tempo19ms4 ; Délai 19 000 Cycles de la machine ; Durée du délai 19 millisecond ; Fréquence de l'oscillateur 4 MHZ movlw .171 movwf Reg_1 movlw .25 movwf Reg_2 decfsz Reg_1,F goto $-1 decfsz Reg_2,F goto $-3 nop nop return tempo1.5ms4 ; Délai 1 500 Cycles de la machine ; Durée du délai 1.5 millisecond ; Fréquence de l'oscillateur 4 MHZ movlw .241 movwf Reg_1 movlw .2 movwf Reg_2 decfsz Reg_1,F goto $-1 decfsz Reg_2,F goto $-3 nop nop return tempo18.5ms4 ; Délai 18 500 Cycles de la machine ; Durée du délai 18.5 millisecond ; Fréquence de l'oscillateur 4 MHZ movlw .5 movwf Reg_1 movlw .25 movwf Reg_2 decfsz Reg_1,F goto $-1 decfsz Reg_2,F goto $-3 return ; ----------------- 180° avec xtal 4MHz tempo2ms4 ; Délai 2 000 Cycles de la machine ; Durée du délai 2 millisecond ; Fréquence de l'oscillateur 4 MHZ movlw .151 movwf Reg_1 movlw .3 movwf Reg_2 decfsz Reg_1,F goto $-1 decfsz Reg_2,F goto $-3 nop nop return tempo18ms4 ; Délai 18 000 Cycles de la machine ; Durée du délai 18 millisecond ; Fréquence de l'oscillateur 4 MHZ movlw .95 movwf Reg_1 movlw .24 movwf Reg_2 decfsz Reg_1,F goto $-1 decfsz Reg_2,F goto $-3 return tempo1.8ms4 ; Délai 1 800 Cycles de la machine ; Durée du délai 1.8 millisecond ; Fréquence de l'oscillateur 4 MHZ movlw .85 movwf Reg_1 movlw .3 movwf Reg_2 decfsz Reg_1,F goto $-1 decfsz Reg_2,F goto $-3 return tempo18.2ms4 ; Délai 18 200 Cycles de la machine ; Durée du délai 18.2 millisecond ; Fréquence de l'oscillateur 4 MHZ movlw .161 movwf Reg_1 movlw .24 movwf Reg_2 decfsz Reg_1,F goto $-1 decfsz Reg_2,F goto $-3 nop nop return ; --------------------------------------------------- tempo2s4 ; Délai 2 000 000 Cycles de la machine ; Durée du délai 2000 millisecond ; Fréquence de l'oscillateur 4 MHZ movlw .93 movwf Reg_1 movlw .38 movwf Reg_2 movlw .11 movwf Reg_3 decfsz Reg_1,F goto $-1 decfsz Reg_2,F goto $-3 decfsz Reg_3,F goto $-5 nop nop return