Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Programmation sur PIC 18F4550



  1. #1
    Stude 12

    Programmation sur PIC 18F4550


    ------

    Bonjour à tous, et merci de votre intérêt pour mon problème, car en langage C je suis pas terrible alors programmer un PIC ....

    Voilà, je doit effectuer une conversion de voie analogique en numérique grâce au module A/N du Pic 18F4550. J'ai en tous 12 voir analogique de AN0 à AN11 ( j'utilise pas le AN12 ). Et je doit transférer vers de l'usb, le resultat.

    J'aimerais traiter les 12 conversions en interruption et transmettre les 12 résultats par 1 seul envoie sur l'usb et le transmettre en ascii et pas en binaire, car convertir et envoyer juste 1 octet serait + simple à programmer mais plus long à traiter par un pc. Pour simplifier un peu j'ai prit que les 8bits de poids les + fort ( que ADRESH sur 8 bits ). Si vous pouvez m'aider un peu car perso les interruptions je maîtrise pas trop. Donc j'avoue que c'est un peu le bordel dans mon prog et pour l'instant j'essaie de faire que la voix AN0.

    /** I N C L U D E S ****************************** ****************************/
    #include <p18f4550.h>
    #include "typedefs.h"
    #include "usb.h"
    #include "io_cfg.h"
    #include "usbdrv.h"



    /** C O N F I G U R A T I O N ****************************** ******************/
    // Note: For a complete list of the available config pragmas and their values,
    // see the compiler documentation, and/or click "Help --> Topics..." and then
    // select "PIC18 Config Settings" in the Language Tools section.

    #if defined(PIC18F4550_PICDEM_FS_U SB) // Configuration bits for PICDEM FS USB Demo Board
    #pragma config PLLDIV = 5 // (20 MHz crystal on PICDEM FS USB board)
    #pragma config CPUDIV = OSC1_PLL2
    #pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
    #pragma config FOSC = HSPLL_HS
    #pragma config FCMEN = OFF
    #pragma config IESO = OFF
    #pragma config PWRT = OFF
    #pragma config BOR = ON
    #pragma config BORV = 2
    #pragma config VREGEN = ON //USB Voltage Regulator
    #pragma config WDT = OFF
    #pragma config WDTPS = 32768
    #pragma config MCLRE = ON
    #pragma config LPT1OSC = OFF
    #pragma config PBADEN = OFF //NOTE: modifying this value here won't have an effect
    //on the application. See the top of the main() function.
    //By default the RB4 I/O pin is used to detect if the
    //firmware should enter the bootloader or the main application
    //firmware after a reset. In order to do this, it needs to
    //configure RB4 as a digital input, thereby changing it from
    //the reset value according to this configuration bit.
    // #pragma config CCP2MX = ON
    #pragma config STVREN = ON
    #pragma config LVP = OFF
    // #pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming
    #pragma config XINST = OFF // Extended Instruction Set
    #pragma config CP0 = OFF
    #pragma config CP1 = OFF
    // #pragma config CP2 = OFF
    // #pragma config CP3 = OFF
    #pragma config CPB = OFF
    // #pragma config CPD = OFF
    #pragma config WRT0 = OFF
    #pragma config WRT1 = OFF
    // #pragma config WRT2 = OFF
    // #pragma config WRT3 = OFF
    #pragma config WRTB = OFF // Boot Block Write Protection
    #pragma config WRTC = OFF
    // #pragma config WRTD = OFF
    #pragma config EBTR0 = OFF
    #pragma config EBTR1 = OFF
    // #pragma config EBTR2 = OFF
    // #pragma config EBTR3 = OFF
    #pragma config EBTRB = OFF

    #else
    #error Not a supported board (yet), make sure the proper board is selected in usbcfg.h, and if so, set configuration bits in __FILE__, line __LINE__
    #endif

    /** V A R I A B L E S ****************************** **************************/
    #pragma udata


    /** P R I V A T E P R O T O T Y P E S ****************************** *********/
    char *conv_char_chaine (char val); //convertie une valeur en centaine, dizaine, unité ascii
    void init_timer0 (void);
    void interrupt_prog_int (void);

    /** D E C L A R A T I O N S ****************************** ********************/
    static volatile float input;
    static volatile char res[10], asc[3], T0IF;
    static volatile int i;

    /****************************** ****************************** ******************
    * Function: void main(void)
    *
    * PreCondition: None
    *
    * Input: None
    *
    * Output: None
    *
    * Side Effects: None
    *
    * Overview: Main program entry point.
    *
    * Note: None
    ****************************** ****************************** *****************/
    void main(void)
    {
    ADCON0bits.ADON = 1 ; // A/D convert ON

    ADCON0bits.CHS0 = 0 ; // Choisir la voie a convertir => AN0
    ADCON0bits.CHS1 = 0 ; // Choisir la voie a convertir => AN0
    ADCON0bits.CHS2 = 0 ; // Choisir la voie a convertir => AN0
    ADCON0bits.CHS3 = 0 ; // Choisir la voie a convertir => AN0


    ADCON1bits.PCFG0 = 0 ; // Configuration des ports A/D = Tout les ports en analogique
    ADCON1bits.PCFG1 = 1 ; // Configuration des ports A/D
    ADCON1bits.PCFG2 = 0 ; // Configuration des ports A/D
    ADCON1bits.PCFG3 = 0 ; // Configuration des ports A/D

    ADCON1bits.VCFG0 = 0 ; // references de tension a utiliser par le CAN => Vref+ = Vdd
    ADCON1bits.VCFG1 = 0 ; // references de tension a utiliser par le CAN => Vref- = Vss


    ADCON2bits.ADCS0 = 1 ; // configurer horloge selection (pour un quartz de 20 Mhz)
    ADCON2bits.ADCS1 = 0 ; // configurer horloge selection
    ADCON2bits.ADCS2 = 1 ; // configurer horloge selection

    ADCON2bits.ACQT0 = 0 ; // configurer un temps d'acquisition (configuration manuelle)
    ADCON2bits.ACQT1 = 0 ; // configurer un temps d'acquisition
    ADCON2bits.ACQT2 = 0 ; // configurer un temps d'acquisition

    ADCON2bits.ADFM = 0 ; // justification à gauche

    ADRESH=0x00 ; // Mise à zero du registre ADRESH
    ADCON0bits.GO_DONE=1;
    res[0]= 0x00; //Initialisation des buffers de résultat
    i=0;
    T0IF=1;

    for (i=0; i<11; i++)
    {

    if ( T0IF )
    {
    ADCON0bits.GO_DONE=1;
    }

    if (ADCON0bits.ADON=0) // Teste bit de fin de conversion, si ADON=0 : la conversion est terminée
    {
    ADCON0bits.GO_DONE=0;
    res[i]=ADRESH; // On place le résultat dans un tableau
    T0IF=0;
    }

    }
    asc[i]=conv_char_chaine(res[i]); //Conversion binaire => ASCII




    /*-----------------------------envoie des données sur le bus -----------------------------------*/

    if(!mHIDTxIsBusy()) // Test si la connexion est occupée
    {
    HIDTxReport(asc,0); // Envoie de donnée sur l'usb fonction définie dans le hid.c
    }


    }//end main
    /*----------------------------------------------------------------------------------------------*/
    char *conv_char_chaine(char val) // Conversion binaire => ASCII
    {
    unsigned char uni, diz,cent,z;
    char chaine[3];
    if(val>=99)cent=val/100;
    if(val<=99)cent=0;
    z=val-cent;
    if(z>=9)diz=z/10;
    if(z<=9)diz=0;
    diz= val-(cent*100);
    uni= val-(cent*100)-(diz*10);
    chaine[0]=cent|0x30;
    chaine[1]=diz|0x30;
    chaine[2]=uni|0x30;

    return(chaine);
    }
    /*----------------------------------------------------------------------------------------------*/
    void init_timer0 (void) // Initialisation du timer
    {
    T0CON.PSA =0; // Prédiviseur affecté au timer 0
    T0CON.T0CS= 0; // Timer 0 utilise l'horloge interne
    T0CON.PS2 = 1; // Prédivision de 256
    T0CON.PS1 = 1;
    T0CON.PS0= 1;

    }
    /*----------------------------------------------------------------------------------------------*/
    void interrupt_prog_int (void)
    {

    if ( T0IF ) // Test sur le bit d'interruption de débordement du timer
    {
    T0IF = 0; // RAZ du bit de débordement
    T0CON.TMR0 = 0; // RAZ du timer pour qu'il recommence à compter jusque 65536


    }

    }
    Sur un autre forum on m'as dit de modifier déjà ça :
    void conv_char_chaine(unsigned char val, char *chaine) // Conversion binaire non signe => ASCII
    {
    unsigned char uni, diz,cent,z;
    if( val>99 )
    {
    z=val/100
    chaine[0]=z|0x30;
    val=val-z*100;
    }
    else
    chaine[0]='0';
    if( val>9 )
    {
    z=val/10
    chaine[1]=z|0x30;
    val=val-z*10;
    }
    else
    chaine[1]='0';
    chaine[2]=val|0x30;
    }

    C'est correcte ?

    Merci d'avance

    -----

  2. Publicité
  3. #2
    Stude 12

    Re : Programmation sur PIC 18F4550

    je viens de modifier mon programme pour gérer les interruptions alors personne pour me dire si c'est bon ou pas ?


    /** P R I V A T E P R O T O T Y P E S ****************************** *********/
    char *conv_char_chaine (char val); //convertie une valeur en centaine, dizaine, unité ascii
    void init_timer0(void);
    void interrupt_prog(void);
    void interrupt_prog_conv(void);
    void init_conv(void);
    void sel_voix0(void);
    /** V E C T O R R E M A P P I N G ****************************** *************/

    /** D E C L A R A T I O N S ****************************** ********************/
    static volatile float input;
    static volatile char res[10], asc[3];
    static volatile int i;

    /****************************** ****************************** ******************
    * Function: void main(void)
    ****************************** ****************************** *****************/
    void main(void)
    {
    init_timer0();
    init_conv();

    ADRESH=0x00 ; // Mise à zero du registre ADRESH
    res[0]= 0x00; // Initialisation des buffers de résultat

    while (1) // Tâche de fond
    {
    sel_voix0(); // Selection de la voie 0 pour la conversion A/N

    asc[i]=conv_char_chaine(res[i]); //Convertion binaire => ASCII

    /*---------------------------| Envoie des données sur le bus |----------------------------------*/

    if(!mHIDTxIsBusy()) // Test si la connexion est occupée
    {
    HIDTxReport(asc,0); // Envoie de donnée sur l'usb fonction définie dans le hid.c
    }

    } // fin du while (Tâche de fond)

    }//end main

    /*----------------------------------------------------------------------------------------------*/
    char *conv_char_chaine(char val) // Conversion binaire => ASCII
    {
    unsigned char uni, diz,cent,z;
    char chaine[3];
    if(val>=99)cent=val/100;
    if(val<=99)cent=0;
    z=val-cent;
    if(z>=9)diz=z/10;
    if(z<=9)diz=0;
    diz= val-(cent*100);
    uni= val-(cent*100)-(diz*10);
    chaine[0]=cent|0x30;
    chaine[1]=diz|0x30;
    chaine[2]=uni|0x30;

    return(chaine);
    }
    /*----------------------------------------------------------------------------------------------*/
    void init_timer0(void) // Initialisation du timer
    {
    T0CON.TMR0ON=1; // Validation du timer0
    T0CON.PSA =0; // Prédiviseur affecté au timer 0
    T0CON.T0CS= 0; // Timer 0 utilise l'horloge interne
    T0CON.PS2 = 1; // Prédivision de 256
    T0CON.PS1 = 1;
    T0CON.PS0= 1;
    T0CON.RP0 = 0 ; // retour au registeur bank0
    T0CON.T0IE = 1; // autorise l'interruption timeur
    T0CON.GIE = 1;

    }
    /*----------------------------------------------------------------------------------------------*/
    void interrupt_prog(void)
    {

    if ( INTCON.TMR0IF ) // Test sur le bit d'interruption de déborment du timer
    {
    ADCON0bits.GO_DONE=1; // Lancement de la conversion
    INTCON.TMR0IF = 0; // RAZ du bit de débordement
    T0CON.TMR0 = 0; // RAZ du timer pour qu'il recommence à compter jusque 65536

    }

    }
    /*----------------------------------------------------------------------------------------------*/
    void interrupt_prog_conv(void)
    {
    if (ADIF==1) // Test bit de fin de convertion, si ADIF=1 : la conversion est terminée
    {
    ADCON0bits.GO_DONE=0; // EOC
    res[i]=ADRESH; // On place le résultat dans un tableau
    }
    }
    /*----------------------------------------------------------------------------------------------*/
    void init_conv(void)
    {
    ADCON0bits.ADON = 1 ; // A/D convert ON

    ADCON1bits.PCFG0 = 0 ; // Configuration des ports A/D = Tout les ports en analogique
    ADCON1bits.PCFG1 = 1 ; // Configuration des ports A/D
    ADCON1bits.PCFG2 = 0 ; // Configuration des ports A/D
    ADCON1bits.PCFG3 = 0 ; // Configuration des ports A/D

    ADCON1bits.VCFG0 = 0 ; // references de tension a utiliser par le CAN => Vref+ = Vdd
    ADCON1bits.VCFG1 = 0 ; // references de tension a utiliser par le CAN => Vref- = Vss


    ADCON2bits.ADCS0 = 1 ; // configurer horloge selection (pour un quartz de 20 Mhz)
    ADCON2bits.ADCS1 = 0 ; // configurer horloge selection
    ADCON2bits.ADCS2 = 1 ; // configurer horloge selection

    ADCON2bits.ACQT0 = 0 ; // configurer un temps d'acquisition (configuration manuelle)
    ADCON2bits.ACQT1 = 0 ; // configurer un temps d'acquisition
    ADCON2bits.ACQT2 = 0 ; // configurer un temps d'acquisition

    ADCON2bits.ADFM = 0 ; // justification à gauche

    }
    /*----------------------------------------------------------------------------------------------*/
    void sel_voix0(void)
    {
    ADCON0bits.CHS0 = 0 ; // Choisir la voie a convertir => AN0
    ADCON0bits.CHS1 = 0 ; // Choisir la voie a convertir => AN0
    ADCON0bits.CHS2 = 0 ; // Choisir la voie a convertir => AN0
    ADCON0bits.CHS3 = 0 ; // Choisir la voie a convertir => AN0
    }

  4. #3
    lolou77

    Re : Programmation sur PIC 18F4550

    tu utilises quelle compilateur?

  5. #4
    oussamasgh

    Re : Programmation sur PIC 18F4550

    bonjour , mon projet consiste a réaliser un recepteur FM sur port USB , j'utilise pic 18f4550 , je suis obliger de faire la conversion A/N plz hepl

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    lolou77

    Re : Programmation sur PIC 18F4550

    sur quel compilateur? CCS, HI-TECH, C18, etc...
    sinon tu es allé voir sur roboticus.org?
    passe ton mail j'ai des doc a te passer qui pourront t'aider.
    tu peux mettre en place des interruption sur le bus USB c'est ca?

  9. #6
    oussamasgh

    Re : Programmation sur PIC 18F4550

    j'utilise le compilateu PIC C comiler mon E_mail est : supprimé conformément à la charte du forum. JPL, modérateur
    merci
    Dernière modification par JPL ; 16/04/2009 à 16h16.

  10. Publicité

Discussions similaires

  1. rs232 parité sur pic 18f4550
    Par EmKa69 dans le forum Électronique
    Réponses: 1
    Dernier message: 22/06/2011, 16h24
  2. Programmation 18F4550 en C18
    Par narf dans le forum Électronique
    Réponses: 19
    Dernier message: 29/04/2008, 18h09
  3. Pic 18f4550
    Par kanet dans le forum Électronique
    Réponses: 0
    Dernier message: 07/04/2008, 20h48
  4. erreur 0X00 programmation PIC plus questions sur les PIC
    Par ROTT dans le forum Électronique
    Réponses: 4
    Dernier message: 22/07/2007, 14h36
  5. Pic 18f4550
    Par Gérard dans le forum Électronique
    Réponses: 8
    Dernier message: 06/06/2006, 23h42
Découvrez nos comparatifs produits sur l'informatique et les technologies.