probleme uart pic24
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

probleme uart pic24



  1. #1
    invite92ed4f10

    probleme uart pic24


    ------

    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

    -----
    Dernière modification par gienas ; 02/06/2008 à 14h00. Motif: Ajouté balises code

  2. #2
    invite92ed4f10

    Re : probleme uart pic24

    up!!!!!!!!

  3. #3
    invite92ed4f10

    Re : probleme uart pic24

    personne a une idee?

  4. #4
    RISC

    Re : probleme uart pic24

    Salut,

    Jette un oeil à ce sujet. Tu devrais pouvoir trouver la réponse à ton problème :
    http://forums.futura-sciences.com/thread158620.html

    a+

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Usb < -- > Uart
    Par invitee5173b0d dans le forum Électronique
    Réponses: 0
    Dernier message: 22/04/2008, 13h29
  2. Spi + Uart
    Par invite820b5138 dans le forum Électronique
    Réponses: 6
    Dernier message: 08/03/2008, 23h19
  3. Uart
    Par invitedba2660f dans le forum Électronique
    Réponses: 1
    Dernier message: 17/04/2007, 00h03
  4. Dspic30f6014 - Uart
    Par fab04 dans le forum Électronique
    Réponses: 1
    Dernier message: 31/01/2007, 00h23
  5. UART avr
    Par invite2b4da655 dans le forum Électronique
    Réponses: 8
    Dernier message: 18/05/2006, 18h07
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...