Probleme avec PIC18f452 et pickit2
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Probleme avec PIC18f452 et pickit2



  1. #1
    invite4436e2b5

    Red face Probleme avec PIC18f452 et pickit2


    ------

    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

    -----

  2. #2
    invite4436e2b5

    Re : Probleme avec PIC18f452 et pickit2

    petit up

  3. #3
    invite4436e2b5

    Re : Probleme avec PIC18f452 et pickit2

    un autre petit up, s'il vous plait même si vous avez juste une piste .... aidez moi

  4. #4
    invite0e5af214

    Re : Probleme avec PIC18f452 et pickit2

    // on ne remet pas ce bit à 0, il sera
    // réarmé par le timer3
    //PIR1bits.TMR1IF = 0;
    Oula !!

    Si, il faut remettre ce bit à zero, sinon dès que tu vas quitter l'interruption tu vas y repartir instantannement.

    Si j'ai bien compris ce que tu veux faire, il faut plutot que tu désactive le timer quand tu rentres dans l'interruption (avec TMR1CON.T1CON ou quelque chose comme ca), et que tu le réactive dans l'interruption de TMR3.

    Bon courage.

    Tu utilises MPLAB plutot non ? et pas matlab

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

    Re : Probleme avec PIC18f452 et pickit2

    merci enormement pour ta réponse, mais comment ce fait il que lorsque je plug mon pickit2 sur ma carte et que je fais un read avec le logiciel pickit2 mon servo effectue la rotation demandée alors que sans le programmateur pickit2 et en faisant un reset de la carte le servo n'effectue pas la rotation..????

    merci encore pour ta réponse

  7. #6
    invite4436e2b5

    Re : Probleme avec PIC18f452 et pickit2

    Je pense que mon problème est autre.... vu que j'ai pris la source du programme sur un cours de pic sur internet....
    Mais expliquez moi pourquoi mon servo ne réagit que lorsque je fais un read avec le module de programmation pickit2 et pas quand il n'est pas plugger...
    N'hesitez surtout pas à me dire si je m'exprime mal et si vous avez du mal a comprendre.
    merci

  8. #7
    invitef26bdcba

    Re : Probleme avec PIC18f452 et pickit2

    Salut,

    Avant de tester tes servos, test avec un programme ultra simple qui fait par exemple clignoter une led.

    De cette manière, tu valideras la communication entre cible et PICKIT2.

    Ensuite, c'est normal que rien ne bouge étant donné que tu restes bloqué dans l'INT du timer1 comme cela a été signalé par cherwam07.

    La copie du résultat de la multiplication ne sert à rien non plus, vu qu'il n'y a pas de calcul dans ton code...

    Sur le 18F452, cela doit-être comme les autres 18F, la portA doit être multiplexé, et il faut probablement le configurer en numérique...

    David.

Discussions similaires

  1. problème programmteur PIC18F452
    Par invite9f1df75e dans le forum Électronique
    Réponses: 7
    Dernier message: 07/03/2008, 10h37
  2. problème de prog avec Pickit2
    Par invite4d22160b dans le forum Électronique
    Réponses: 4
    Dernier message: 06/02/2008, 20h32
  3. pickit2
    Par invited10148d9 dans le forum Matériel - Hardware
    Réponses: 3
    Dernier message: 16/09/2007, 11h43
  4. vous cherchez un pic18f452 avec bootloader ?
    Par inviteedbb79d6 dans le forum Électronique
    Réponses: 0
    Dernier message: 27/03/2007, 10h23
  5. PicKit2
    Par invitebba6b05d dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 16/01/2007, 09h04
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...