Liaison UART pour PIC18F2550
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Liaison UART pour PIC18F2550



  1. #1
    invite9ddd7dfb

    Liaison UART pour PIC18F2550


    ------

    Bonjour à tous,

    J'ai programmé une liaison UART entre mon PIC et mon émetteur Bluetooth et je lui envoie des mots binaires que je réceptionne sur mon PC via l'Hyperterminal.
    Je reçois bien mes 2 mots de 8 bits que j'ai imposé mais en plus je reçoit un "ü" qui s'affiche comme un exposant 3 dans la fenêtre du terminal mais comme "ü" dans un fichier texte.

    Et une autre question, mon programme comprend aussi une liaison I2C et j'aurai voulu récupérer la valeur bRet de ma partie I2C et mettre cette variable à la place des valeurs binaires que j'impose mais je ne vois pas trop comment faire.

    Merci de votre aide.

    Code:
    /* PROGRAMME*/
    
    
    
    #include <p18f2550.h>
    #include "i2c.h"
    #include "usart.h"
    
    #pragma config WDT = OFF 		 //Watchdog désactivé
    #pragma config MCLRE = OFF       //désactiver la pin de Reset
    #pragma config LVP = OFF  		 //Low Voltage Programming désactivé => RB5 I/O normale
    #pragma config FOSC = INTOSCIO_EC//Internal oscillator, port function on RA6, EC used by USB  
    #pragma config PLLDIV = 1		 //No prescale (4 MHz oscillator input drives PLL directly) 
    
    
    
    
    //INITIALISATION
    
    void initialisation(void)
    {
        //configuration horloge interne du pic à 32 MHz
        OSCCON = 0x70;        //pas de prédiviseur => 8MHz
        //OSCTUNE = 0x40;        //
        
        //désactiver le convertisseur analogique numerique
    	ADCON1|=0x0F;
    	
    	//désactiver le module CCP
        CCP1CON=0;
        
        //Configuration de l'I2C
        SSPSTAT=0b10000000; 
        SSPCON1=0x28;
        SSPCON2=0x00;
        SSPADD=0xF0;
        
        //direction des ports 0=Output, 1= Input 
        TRISAbits.TRISA3 = 1;//RA3 en entrée
    
    	TRISBbits.TRISB0=0; //SDA
    	TRISBbits.TRISB1=0; //SCL
    	TRISBbits.TRISB4 = 0;//RB4 en sortie
    	TRISBbits.TRISB5 = 0;//RB5 en sortie
    	
    	TRISCbits.TRISC0=0;
       	PORTCbits.RC0=0;
        
    
    	
    	OpenI2C(MASTER,SLEW_OFF); //Overture de l'I2C en master mode
    	
    	OpenUSART( USART_TX_INT_OFF  &
    
                 USART_RX_INT_OFF  &
    
                 USART_ASYNCH_MODE &
    
                 USART_EIGHT_BIT   &
    
                 USART_CONT_RX     &
    
                 USART_BRGH_HIGH,12 );
    } 
    
    //TEMPORISATION
    void tempo(unsigned int compte)
    {
    while(compte--);
    }
    
    
    //////////////////////////////////I2C////////////////////////////////////
    //LECTURE DE L'ACCELEROMETRE
    unsigned char ReadAccelerometre(unsigned char Registre)
    {
    unsigned char bRet = 0x00;
    
    IdleI2C(); //Attente du bus OK
    StartI2C(); //Envoi de message de début(envoie du ST)
    IdleI2C(); //Attente de la disponibilité du bus
    WriteI2C(0x3A); //Envoi de l'adresse de l'accéléromètre (0011101)+0(écrire)
    IdleI2C(); //Attente de la disponibilité du bus
    WriteI2C(Registre); //Envoi du registre a lire 
    IdleI2C();
    RestartI2C();//SR
    WriteI2C(0x3B);//Envoi de l'adresse de l'accéléromètre (0011101)+1(lire)
    
    	if (SSPCON2bits.ACKSTAT) //Si AckStat == 1, on n'a pas reçu d'acquittement
    	{
    		PORTBbits.RB4 = 1;
    		StopI2C(); //Envoi de la condition de stop
    		return bRet;
    	}
    
    bRet = ReadI2C(); //Lecture I2C
    NotAckI2C();//Pas d'acquittement car on lit qu'un seul caractère
    IdleI2C();
    
    StopI2C(); //Envoi du stop
    return bRet; //Retour de la valeur lue
    } 
    
    
    
    unsigned char WriteAccelerometre(unsigned char Adresse , unsigned char Value) 
    {
       unsigned char bRet = 0x00;
       IdleI2C();	 //Attente du bus OK
       StartI2C();	 //Envoi de message de début
       IdleI2C();	 //Attente de la disponibilité du bus
       WriteI2C(0x3A); //Envoi de l'adresse de l'accéléromètre
       IdleI2C();	//Attente de la disponibilité du bus
       WriteI2C(Adresse);//Envoi de l'adresse du registre
       IdleI2C();
       WriteI2C(Value);	//On écrit la valeur
       IdleI2C();			//Attente de disponibilité du bus
      
       if (!SSPCON2bits.ACKSTAT ) //Si on reçoit un acquitement, on retourne 1
       {
          bRet = 0x01;
       }
       StopI2C();
       return bRet;
    }
    /////////////////////////////////////////////////////////////////////////
    
    
    //DECLARATION DES VARIABLES
    
    int led=0;
    rom const char etat[4][10] = {"00110001","11111111",";",'\0'};
    
    
    
    ////////////////////////////////MAIN////////////////////////////////////
    void main ()
    {
    	PORTBbits.RB4= 1;
        initialisation();        //initialisation du PIC
            
        if (led==0) {
    	
    	if (PORTAbits.RA3 == 1)	
    		{
    	
    		PORTBbits.RB5 = 1;
    		led=1;
    		tempo(10000);
    	//	if(led==1)
    	//		PORTBbits.RB5 = 1;
    	//	else PORTBbits.RB5 = 0;
    		}	
    	else PORTBbits.RB5 = 0;
    
    			}
    
    if (led==1) {
    	
    	if (PORTAbits.RA3 == 1)
    		{
    		PORTBbits.RB5 = 0;
    		led=0;
    		}	
    	else PORTBbits.RB5 = 1;
    
    			}
        WriteAccelerometre(0xA0,0xC7);//On active l'accéléromètre en écrivant dans CTRL_REG1
        ReadAccelerometre(0x28);//ici 0+OUTX_L(0101000)
        tempo(10000);
        putrsUSART(etat[0]);
        tempo(1000);
        putrsUSART(etat[1]);
    	tempo(1000);
        putrsUSART(etat[2]);   
        
    }

    -----

  2. #2
    RISC

    Re : Liaison UART pour PIC18F2550

    Salut,

    Si j'ai bien compris tes bits de configuration, tu utilises l'oscillateur interne...qui est peut être la source de tes problèmes.
    L'oscillateur interne est spécifié je crois à +/-2% à 25C mais si tu utilises la gamme de température totale (-40 à +85C) l'erreur max est de +/-10%.

    Utilises un quartz ou un résonnateur céramique pour avoir une fréquence stable et fait un petit morceau de soft qui fait uniquement un echo distant.
    Tu le connectes à un PC et t'envoie un fichier pour vérifier que cela fonctionne.

    a+

  3. #3
    invite9ddd7dfb

    Re : Liaison UART pour PIC18F2550

    ok merci de ta réponse RISC, je vais voir comment je peux faire le temps me manque un peu pour pouvoir rajouter un quartz.

    Sinon quelqu'un serait comment je pourrai récupérer ma valeur bRet et l'utiliser pour mon UART. Peut-on mettre un variable dans un tableau?

  4. #4
    RISC

    Re : Liaison UART pour PIC18F2550

    Salut,

    Je ne suis pas sur à 100% que ma recommendation précédente soit la source de ton problème actuel, par contre je suis sur à 100% que si la température ambiante varie un peu ce sera un problème....que tu aies le temps de t'en occuper ou pas.

    Si tu préferre vivre avec une épée de Damoclès et perdre des heures en cherchant dans la mauvaise direction, c'est ton choix

    a+

  5. A voir en vidéo sur Futura

Discussions similaires

  1. [pic-01] Pic18f2550
    Par invitefcd0dbb3 dans le forum Électronique
    Réponses: 1
    Dernier message: 03/09/2008, 08h20
  2. Liaison UART par PIC24F
    Par invite5b91726d dans le forum Électronique
    Réponses: 16
    Dernier message: 04/06/2008, 15h36
  3. Premier programme pic18f2550
    Par invite03ffb73a dans le forum Électronique
    Réponses: 15
    Dernier message: 16/04/2008, 14h00
  4. UART pour 16F84
    Par invite103abebb dans le forum Électronique
    Réponses: 4
    Dernier message: 03/04/2008, 22h13
  5. TRMT - liaison UART PIC16F876
    Par invite0f39f32f dans le forum Électronique
    Réponses: 6
    Dernier message: 19/05/2006, 10h43
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...