Bonjour voilà mon souci j'ai fabriqué une carte à base d'un site web pour commander 24 servo à base du PIC18f452 :
http://www.digitalspirit.org/wiki/pr...tionde24servos
et pour la programmation j'utilise matlab 8.0 avec le compilateur C18
...
pour tester la carte que j'ai fait j'ai pris une source sur le net :
/* PIC 18F252 quartz 10Mhz + PLL = 40Mhz
* pilote un servo avec deux timers : la consigne est de 1ms
* (au max dans le sens inverse des aiguilles d'une montre
*/
#include <p18f252.h> /* déclarations pour le PIC18F252 */
#include <timers.h> /* fonctions pour les timers */
#define IO_SERVO PORTAbits.RA0
#define IO_SERVO_TRIS TRISAbits.TRISA0
#define PULSE_ON 1
#define PULSE_OFF 0
/* fonction interruption */
void MyInterrupt(void);
#pragma code highVector=0x008
void atInterrupthigh(void)
{
_asm GOTO MyInterrupt _endasm
}
#pragma code // retour à la zone de code
// ************************
// **** Interruptions ****
// ************************
#pragma interrupt MyInterrupt
void MyInterrupt(void)
{
unsigned char sauv1;
unsigned char sauv2;
sauv1 = PRODL;
sauv2 = PRODH;
/* timer qui se charge de l'impulsion */
if (PIR1bits.TMR1IF)
{
// on ne remet pas ce bit à 0, il sera
// réarmé par le timer3
//PIR1bits.TMR1IF = 0;
// on remet le pin à 0, le pulse est terminé
IO_SERVO = PULSE_OFF;
}
/* timer qui se charge du temps inter-pulse */
if (PIR2bits.TMR3IF)
{
// on réarme le timer
PIR2bits.TMR3IF = 0;
// déclenchement du timer dans 20ms
WriteTimer3(15535);
/* on commence l'impulsion de 1ms */
// on met le pin à 1
IO_SERVO = PULSE_ON;
// on écrit 55535 dans le timer1 pour
// qu'il se déclenche dans 1ms
WriteTimer1(55535);
// et on réarme le timer1
PIR1bits.TMR1IF = 0;
}
PRODL = sauv1;
PRODH = sauv2;
}
/* fonction principale */
void main (void)
{
// on crée le timer1
OpenTimer1(TIMER_INT_ON & T1_8BIT_RW & T1_SOURCE_INT
& T1_PS_1_1 & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF);
// puis le timer3 avec un prescaler de 4
OpenTimer3(TIMER_INT_ON & T3_8BIT_RW & T3_SOURCE_INT
& T3_PS_1_4 & T3_SYNC_EXT_ON & T1_SOURCE_CCP);
// on va compter 4 * 50000 cycles = 20ms
// avant de lever l'interruption
WriteTimer3(15535);
// On active toutes les interruptions
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
// on configure le pin 0 du port A en sortie
IO_SERVO_TRIS = 0;
// et on démarre la boucle infinie
while (1) {
}
}
/* configuration du PIC */
#pragma romdata CONFIG
_CONFIG_DECL (
_CONFIG1H_DEFAULT & _OSC_HSPLL_1H ,
_CONFIG2L_DEFAULT & _PWRT_ON_2L ,
_CONFIG2H_DEFAULT & _WDT_OFF_2H,
_CONFIG3H_DEFAULT,
_CONFIG4L_DEFAULT & _STVR_OFF_4L & _LVP_OFF_4L
& _DEBUG_OFF_4L ,
_CONFIG5L_DEFAULT & _CP0_OFF_5L & _CP1_OFF_5L
& _CP2_OFF_5L & _CP3_OFF_5L,
_CONFIG5H_DEFAULT & _CPB_OFF_5H & _CPD_OFF_5H,
_CONFIG6L_DEFAULT & _WRT0_OFF_6L & _WRT1_OFF_6L
& _WRT2_OFF_6L & _WRT3_OFF_6L,
_CONFIG6H_DEFAULT & _WPC_OFF_6H & _WPB_OFF_6H
& _WPD_OFF_6H,
_CONFIG7L_DEFAULT & _EBTR0_OFF_7L & _EBTR1_OFF_7L
& _EBTR2_OFF_7L & _EBTR3_OFF_7L,
_CONFIG7H_DEFAULT & _EBTRB_OFF_7H
);
#pragma romdata
Alors ma question est la suivant :
quand je charge le fichier hex dans le pic18f452 tout se passe bien
mais mon servo ne bouge que lorsque mon pickit2 est connecté et que je fais READ......
mais quand je deconnecte le pickit2 et que je fais un reset sur la carte fabriquée mon servo bouge un tout petit peu mais pas comme prévu (il devrait bouger jusqu'à la butée à gauche).
J'espère que les informations que je vous ai donné seront suffisantes.
Vous avez bien compris que je débutais et je vous remercie par avance si vous vous penchez sur mon problème.
McCorwin
-----