voici mon programme:Code:#include <p24fj64ga002.h> #define SWITCH1 PORTAbits.RA2 //intérupteur 1 sur RA2 #define SWITCH2 PORTAbits.RA3 //intérupteur 1 sur RA3 #define SWITCH3 PORTAbits.RA4 //intérupteur 1 sur RA4 #define AFF1 PORTBbits.RB1 //#define AFF2 PORTBbits.RB2 #define AFF3 PORTBbits.RB3 #define AFF4 PORTBbits.RB4 #define AFF5 PORTBbits.RB5 #define AFF6 PORTBbits.RB6 #define AFF7 PORTBbits.RB7 char tab_message_envoyer[16],LRC_calcule = 0,adresse_carte=0; int indice_LRC2 = 0, indice_trame = 0; /*************************************************************************************************/ /* Assignatgion PINS */ /*************************************************************************************************/ void assignation_PINS(void) { AD1PCFG = /*0xE1FF*/0xFFFF; // ANALOGIQUE: AN9,AN10,AN11,AN12 // NUMERIQUE: AN0,AN1,AN2,AN3,AN4,AN5 __builtin_write_OSCCONL(OSCCON & 0xbf); // Déverrouiller registres RPINR18bits.U1RXR = 4; // U1RX sort sur la patte RP4 // RPINR18bits.U1CTSR = 9; // /CTS sort sur la patte RP9 RPOR1bits.RP2R = 3; // U1TX sort sur la patte RP2 //RPOR5bits.RP10R = 3; // U1TX sort sur la patte RP10 // RPOR4bits.RP8R = 4; // /RTS sort sur la patte RP8 __builtin_write_OSCCONL(OSCCON | 0x40); // Verrouiller registres } /*************************************************************************************************/ /* Initialisation des PORTS */ /*************************************************************************************************/ void init_ports(void) { TRISA = 0x001F; // ENTREE:RA0,RA1,RA2,RA3,RA4 PORTA = 0; // INITIALISATION DES SORTIE A ZERO TRISB = 0xFA01; // ENTREE: RB0,RB9,RB11,RB12,RB13,RB14,RB15 // SORTIE: RB1,RB2,RB3,RB4,RB5,RB6,RB7,RB8,RB10 PORTB = 0; // INITIALISATION DES SORTIE A ZERO } /*************************************************************************************************/ /* Initialisation CAN */ /*************************************************************************************************/ void init_CAN(void) { AD1CON1 = 0x0000; // ADON=0,ADSIDL=0,FORM=00,SSRC=000,ASAM=0,DONE=0 AD1CSSL = 0x0000; // CSSL=0 AD1CON2 = 0x0000; // VCFG=000,CSCNA=0,BUFS=0;SMPI=0000,BUFM=0,ALTS=0 AD1CON3 = 0x0F07; // ADRC=0,SAMC4=01111,ADCS7=00000111 AD1CON1bits.ADON = 1; // CAN activé } /*************************************************************************************************/ /* Initialisation UART */ /*************************************************************************************************/ void init_UART(void) { U1BRG = 12; // 9600 bits par seconde U1MODE = 0x8000; // Reset UART to 8-n-1, transmition activé U1STA = 0x0400; // Reset status register and enable TX & RX // Interrupt is set when any character is received // IEC0bits.U1RXIE = 1; // Enable Receive Interrupt IFS0bits.U1RXIF = 0; // interuption sur RX initialisé a 0 // interuption de niveau 0 } /*************************************************************************************************/ /* Convertisseur A/N */ /*************************************************************************************************/ int CAN(void) { int i=0; AD1CON1bits.SAMP = 1; // Le condensateur se charge for (i=0;i<1000;i++); // Attente chargement AD1CON1bits.SAMP = 0; // Deconnection entrée du ADC while (!AD1CON1bits.DONE); // Attente fin convertion return ADC1BUF0; // Retourner resultat } /*************************************************************************************************/ /* Adresse carte */ /*************************************************************************************************/ char init_adresse() { adresse_carte = (SWITCH1*4 + SWITCH2*2 + SWITCH3 ); return adresse_carte; //Création d'une adresse a partir du SWITCH } /*************************************************************************************************/ /* Envoyer octet Uart */ /*************************************************************************************************/ void EnvoyerUart(char *Ch) { int i=0; while (Ch[i] != '\0') // Tend que la trame n'est pas fini { while (U1STAbits.UTXBF == 1); // Attente que le buffer soit vide U1TXREG = Ch[i++]; // Envoyer sur TX les octets } } /*************************************************************************************************/ /* Interuption Recevoir trame Uart */ /*************************************************************************************************/ //char RecevoirRS232(void) //{ //char C; // IFS0bits.U1RXIF = 0; //INTERRUPT FLAG STATUS REGISTER 0 // // while(!U1STAbits.TRMT); // // C = U1RXREG; // return C; //} /*************************************************************************************************/ /* calcul du LRC a envoyer */ /*************************************************************************************************/ char TEST_LRC_ENVOI(char indice_LRC2) { int i; LRC_calcule = 0 ; // LRC=0 for (i = 1; i < indice_LRC2; i++) // Tend que la trame n'est pas fini { // Le calcul est fait sans SOH LRC_calcule = LRC_calcule ^ tab_message_envoyer[i]; } return LRC_calcule; // Retourner la valeur du LRC } /*************************************************************************************************/ /* Mise en forme Temperature */ /*************************************************************************************************/ void mise_en_forme_temp(void) { char dizaine=0, reste=0, unite=0, LRC=0; // Initialisations des variables float Vbat=0, temp=0, ax=0, b=0, a=0, ax_b=0; int resultat=0; AD1CHS = 0x000B; // Selection de AN11 pour le CAN tab_message_envoyer[0] = 0x01; // SOH tab_message_envoyer[1] = adresse_carte | 0x20; // PADR tab_message_envoyer[2] = 0x02; // STX tab_message_envoyer[3] = 'T'; // 0x54 Lettre 'T' pour la température temp = CAN(); // Valeur du CAN de 0 a 1023 a= 42; a= a/ 809; ax = temp*a; b = 53; ax_b= -ax + b; ax_b=ax_b*10; // Calcul de l'équation de la courbe resultat=(int)ax_b; // Température*10 enregistrée en int16 dizaine=resultat/100; // Mise en forme des dizaines unite=resultat/10; unite=unite%10; // Mise en forme des unitées reste=resultat%10; // Mise en forme du reste if ( (temp < 114) | (temp > 924) ) // Si la sonde n'est pas branchée { tab_message_envoyer[ 4] = 'N'; // Envoyer Non tab_message_envoyer[ 5] = 'C'; // Envoyer Connectée tab_message_envoyer[ 6] = '.'; // Envoyer . } else // Si la sonde est branchée { tab_message_envoyer[ 4] = 0x30 + (dizaine); // Valeur des dizaines en code ASCII tab_message_envoyer[ 5] = 0x30 + (unite); // Valeur des unités en code ASCII tab_message_envoyer[ 6] = 0x30 + (reste); // Valeur du reste en code ASCII } tab_message_envoyer[7] = 0x03; // ETX tab_message_envoyer[8] = 'V'; // 0X56 Lettre 'V' la tension batterie dizaine=0; unite=0; reste=0; resultat=0; a=0; // Initialisations des variables AD1CHS = 0x000C; // Selection de AN12 pour le CAN Vbat = CAN(); // Valeur du CAN de 0 à 1023 a=120; a= a/1023; ax= Vbat*a; // Calcul de l'équation de la courbe resultat=(char)ax; // Tension_bat*10 enregistrée en char dizaine=resultat/100; // Mise en forme des dizaines unite=resultat/10; unite=unite%10; // Mise en forme des unitées reste = resultat%10; // Mise en forme du reste tab_message_envoyer[ 9] = 0x30 + (dizaine); // Valeur des dizaines en code ASCII tab_message_envoyer[10] = 0x30 + (unite); // Valeur des unitées en code ASCII tab_message_envoyer[11] = 0x30 + (reste); // Valeur du reste en code ASCII tab_message_envoyer[12] = 0x04; // EOT indice_LRC2 = 13 ; // Calcul du LRC LRC = TEST_LRC_ENVOI(indice_LRC2) ; tab_message_envoyer[13] = LRC; // LRC tab_message_envoyer[14] = '\0'; // Fin trame } /************************************************************************************************/ /* Mise en forme Hygrométrie */ /************************************************************************************************/ void mise_en_forme_hygro(void) { char dizaine=0, unite=0, reste=0, LRC=0, resultat=0; // Initialisations des variables float hygro=0, a=0, ax=0, b=0, ax_b=0, Vbat=0; AD1CHS = 0x000A; // Selection de AN10 pour le CAN tab_message_envoyer[ 0] = 0x01; // SOH tab_message_envoyer[ 1] = adresse_carte | 0x20; // PADR tab_message_envoyer[ 2] = 0x02; // STX tab_message_envoyer[ 3] = 'H'; // 0x48 Lettre 'H' pour l'hygrométrie hygro = CAN(); // Valeur du CAN de 0 à 1023 a= 99; a= a/ 818; ax = hygro*a; b = 20295; b = b/818; ax_b= ax - b; // Calcul de l'équation de la courbe resultat = (char)ax_b; // Hygrométrie enregistrée en char dizaine = resultat/10; // Mise en forme des dizaines unite= resultat % 10; // Mise en forme des unitées if ( hygro < 204) // Si la sonde n'est pas branchée { tab_message_envoyer[ 4] = 'N'; // Envoyer Non tab_message_envoyer[ 5] = 'C'; // Envoyer Connectée } else // Si la sonde est branchée { tab_message_envoyer[ 4] = 0x30 + (dizaine); // Valeur des dizaines en code ASCII tab_message_envoyer[ 5] = 0x30 + (unite); // Valeur des unitées en code ASCII } tab_message_envoyer[ 6] = 0x03; // ETX tab_message_envoyer[ 7] = 'V'; // 0X56 Lettre 'V' la tension batterie dizaine=0; unite=0; reste=0; resultat=0; a=0; // Initialisations des variables AD1CHS = 0x000C; // Selection de AN12 pour le CAN Vbat = CAN(); // Valeur du CAN de 0 à 1023 a=120; a= a/1023; ax= Vbat*a; // Calcul de l'équation de la courbe resultat=(char)ax; // Tension_bat*10 enregistrée en char dizaine=resultat/100; // Mise en forme des dizaines unite=resultat/10; unite=unite%10; // Mise en forme des unitées reste = resultat%10; // Mise en forme du reste tab_message_envoyer[ 8] = 0x30 + (dizaine); // Valeur des dizaines en code ASCII tab_message_envoyer[ 9] = 0x30 + (unite); // Valeur des unitées en code ASCII tab_message_envoyer[10] = 0x30 + (reste); // Valeur du reste en code ASCII tab_message_envoyer[11] = 0x04; // ETX indice_LRC2 = 12; // Calcul du LRC LRC = TEST_LRC_ENVOI(indice_LRC2) ; tab_message_envoyer[12] = LRC; // LRC tab_message_envoyer[13] = '\0'; // Fin trame } /************************************************************************************************/ /* Programme principal */ /************************************************************************************************/ void main(void) { float i=0; // Initialisations des variables assignation_PINS(); // Assignations des E/S de l'UART1 init_ports(); // Initialisations des ports init_UART(); // Initialisations du l'UART1 init_CAN(); // Initialisations du CAN init_adresse(); // Aquisition de l'adresse de la carte while(1) // Boucle infini { mise_en_forme_CO2(); // Mise en forme de taux de CO2 EnvoyerUart(tab_message_envoyer); // Envoyer trame CO2 sur U1TX for(i=0;i<20000;i++); // Attente de 3 secondes } }
voila mes problemes:
je n'arrive pas a sortir Tx sur la broche RP11, quand je le configure rien ne sort
a par sa pour l'émission tou fonctionne niquel
Pour Rx je pense que ma configue n'est pas bonne, quand je cable Tx sur Rx mon niveau haut passe de 3.3V a 1V, il y a confli quelque par mais ou?
De plus meme si Rx n'est pas cablé, au repos il devrai y avoir un niveau logique 1 et la j'ai zero
Si quelqu'un pouvai m'aidé, je ne compren vraiment pas pourquoi sa ne fonctionne pas
merci d'avance
-----