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]); }
-----