UART sur PIC24 sous Mplab
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

UART sur PIC24 sous Mplab



  1. #1
    PtiBruno

    UART sur PIC24 sous Mplab


    ------

    Bonjour à tous,
    je souhaite transférer des données d'un capteur vers serveur via une liaisons GPRS.
    Pour cela, mon capteur est relié à un PIC24Fj128GB206 programmer en langage C qui est à son tour relié à un module GPRS.

    Le débit du GPRS étant variable, j'utilise des UART câblé en HardWare Flow control ( RX/TX/CTS/RTS).

    mon problème est le suivant :
    le RTS/CTS ne semble pas fonctionner, pour simuler le probleme, je reçois des données de l'UART2 ( en 115200 bauds) et le recopie sur l'UART3 (9600 bauds).
    Malgré l'utilisation du flow control le programme plante au bout de quelques octets, il semblerai que le passage à 0 du CTS engendre bien un arrêt des envoie mais son passage à 1 ne le relance pas.

    voici mon programme :
    Code:
    
    #include <p24Fxxxx.h>
    #include <uart.h>
    #include <PPS.h>
    #include <libpic30.h>
    #include <stdio.h>	//fichier dans le sous rιpertoire du compilateur
    #include "main.h"	//fichier crιι pour le projet
    #include "init.h"	//fichier crιι pour le projet
    
    
    	//watchdog OFF //use PGx1 //jtag off
    	_CONFIG1(FWDTEN_OFF & ICS_PGx1 & JTAGEN_OFF);
    
    	//quartz <10 MHz //Primary Oscillator without PLL module // no clk switching
    	_CONFIG2(POSCMOD_XT & OSCIOFNC_OFF & FCKSM_CSDCMD &	FNOSC_PRI);
    
    
    
    
    //*************************************************************************************************************************
    // ZE MAIN
    //**************************************************************************************************************************
    int main(void)
    {
    	  ///////////////////
    	 //INITIALISATIONS//
    	///////////////////
    
     	IOmap();
    	UARTinit();
    	IOinit();
    	INTinit();
    
    	IFS1bits.U2RXIF = 0;		// Clear U2RX_Int flag
    	IEC1bits.U2RXIE = 1;		// Enable U2RX_Int
    
    	while(1)
    	{
    	
    	}
    }
    
    
    //*********************************************************************************************************************************************************************************
    // This is UART2 receive ISR (UART2RX INTERRUPTION)
    //*********************************************************************************************************************************************************************************
    
    void __attribute__((interrupt,no_auto_psv)) _U2RXInterrupt(void)	
    {
    
    while(!U3STAbits.TRMT);
    U3TXREG = U2RXREG;
    
    IFS1bits.U2RXIF = 0;		// Clear U2RX_Int flag
    }
    
    
    
    
    //*********************************************************************************************************************************************************************************
    // This is UART3 tranceive ISR (UART3TX INTERRUPTION)
    //*********************************************************************************************************************************************************************************
    
    void __attribute__((interrupt,no_auto_psv)) _U3TXInterrupt(void)	
    {
    
    	IFS5bits.U3TXIF = 0;			//UART3 Tranceiver Interrupt Flag set to 0
    
    }
    
    #include <p24Fxxxx.h>
    #include <uart.h>
    #include <PPS.h>
    #include <libpic30.h>
    #include <stdio.h>	//fichier dans le sous rιpertoire du compilateur
    #include "main.h"	//fichier crιι pour le projet
    #include "init.h"	//fichier crιι pour le projet
    
    
    
    //*********************************************************************************************************************************************************************************
    // fonction qui effectue le mapping des uarts
    //*********************************************************************************************************************************************************************************
    void IOmap()
    {
    
    	//*************************************************
    	//	STEP 1:     Unlock the Reprogrammable Pin Mechanism
    	//*************************************************/
    	IOunlock();                         	// ###
    	//*************************************************
    	//	STEP 2:    configuration UART 1 = DEBUG				
    	//*************************************************
    	RPOR10bits.RP21R=3; 	//attribue RP21 ΰ U1Tx
    	RPINR18bits.U1RXR=26; 	//attribue RP26 ΰ U1Rx
    	//*************************************************
    	//	STEP 3:     configuration uart 2
    	//*************************************************
    	iPPSInput(IN_FN_PPS_U2RX,IN_PIN_PPS_RP17);		//Assing U2RX to pin RP17
    	iPPSInput(IN_FN_PPS_U2CTS,IN_PIN_PPS_RP4);		//Assing U2CTS to pin RP4
    	iPPSOutput(OUT_PIN_PPS_RP16,OUT_FN_PPS_U2TX);	//Assing U2TX to pin RP16
    	iPPSOutput(OUT_PIN_PPS_RP2,OUT_FN_PPS_U2RTS);	//Assing U2RTS to pin RP2
    	//*************************************************
    	//	STEP 4:     configuration uart 3 
    	//*************************************************
    	iPPSInput(IN_FN_PPS_U3RX,IN_PIN_PPS_RP22);		//Assing U3RX to pin RP22
    	iPPSInput(IN_FN_PPS_U3CTS,IN_PIN_PPS_RP24);	//Assing U3CTS to pin RP23
    	iPPSOutput(OUT_PIN_PPS_RP25,OUT_FN_PPS_U3TX);	//Assing U3TX to pin RP25
    	iPPSOutput(OUT_PIN_PPS_RP23,OUT_FN_PPS_U3RTS);	//Assing U3RTS to pin RP24
    	//*************************************************
    	//	STEP 6:     Lock the Reprogrammable Pin Mechanism
    	//*************************************************/
    	IOlock();                       	// ###
    
    }
    
    //*********************************************************************************************************************************************************************************
    //fonctions de Lock unlock du mapping
    //*********************************************************************************************************************************************************************************
    void IOlock(){
    
    asm volatile ("mov #OSCCON,w1 \n"
    				"mov #0x46, w2 \n"
    				"mov #0x57, w3 \n"
    				"mov.b w2,[w1] \n"
    				"mov.b w3,[w1] \n"
    				"bset OSCCON, #6":::"w1","w2","w3");
    }
    
    
    void IOunlock()
    {
    asm volatile ("mov #OSCCON,w1 \n"
    				"mov #0x46, w2 \n"
    				"mov #0x57, w3 \n"
    				"mov.b w2,[w1] \n"
    				"mov.b w3,[w1] \n"
    				"bclr OSCCON, #6":::"w1","w2","w3");
    }
    
    
    
    //*********************************************************************************************************************************************************************************
    //FonctionS d'initalisation des interruptions
    //*********************************************************************************************************************************************************************************
    
    void INTinit()
    {
    	//UART3
    	IEC5bits.U3RXIE = 0;		//Enable(1)/Disable(0) UART3 Receiver Interrupt
    	IEC5bits.U3TXIE = 0;		//Enable(1)/Disable(0) UART3 Tranceiver Interrupt
    	//UART2
    	IEC1bits.U2RXIE = 0;		//Enable(1)/Disable(0) UART2 Receiver Interrupt
    	IEC1bits.U2TXIE = 0;		//Enable(1)/Disable(0) UART2 Tranceiver Interrupt
    	IPC20bits.U3RXIP = 6;
    
    	IPC7bits.U2RXIP = 7;			//UART2 Receiver Interrupt priority 7 of 7
    	////////////////////////////////////////////////////////////////////////
    
    
    }
    
    
    
    
    //*********************************************************************************************************************************************************************************
    //fonctions d'initalisation des Entrιes / Sorties
    //*********************************************************************************************************************************************************************************
    
    void IOinit(void)
    {
    	TRISEbits.TRISE4=0; 	//RE4 en SORTIE pour la Led rouge
    	TRISEbits.TRISE3=0; 	//RE3 en SORTIE pour la Led verte
    	ANSB=0x0000;	//deactivate analog
    }
    
    
    //*********************************************************************************************************************************************************************************
    //fonctions d'initalisation des UART
    //*********************************************************************************************************************************************************************************
    
    void UARTinit()
    {
    
    	TRISGbits.TRISG6 = 0;	// configure pin RG6 en sortie UART1TX
    	TRISGbits.TRISG7 = 1;	// configure pin RG6 en entrιe UART1RX
    
    	TRISFbits.TRISF3 = 0;	// configure pin RF3 en sortie UART2TX
    	TRISFbits.TRISF5 = 1;	// configure pin RG6 en entrιe UART2RX
    	TRISDbits.TRISD8 = 0;	// configure pin RD8 en sortie U2RTS
    	TRISDbits.TRISD9 = 1;	// configure pin RD8 en entrιe U2CTS	
    	
    	TRISDbits.TRISD4 = 0;	// configure pin RG6 en sortie UART3TX
    	TRISDbits.TRISD3 = 1;	// configure pin RD3 en entrιe UART3RX
    	TRISDbits.TRISD2 = 0;	// configure pin RD8 en sortie U3RTS
    	TRISDbits.TRISD1 = 1;	// configure pin RD8 en entrιe U3CTS
    
    
    	//********************************************************************************
    	//  Load the count to get 9600 baudrate
    	//	BRG = Fcy/(16*BaudRate)-1  where Fcy = Fosc/2 = 4MHz
    	//********************************************************************************/
    	U1BRG = BRGVAL1;
    	U2BRG = BRGVAL2; // automatic macro computation = 0x19; 
    	U3BRG = BRGVAL3;
    	//********************************************************************************
    	//  Hardware Flow Control OFF(sur U1 et ON sur U2 et U3), No Loop-Back
    	// 	No Auto-Baud, No Rx-Inversion
    	//	Low BaudRate, 1 Stop-bit
    	//	8-bit, no parity 
    	//********************************************************************************/
    	U1MODE = 0x8000;	
    	U2MODE = 0x8200; 
    	U3MODE = 0x8200;
    	//********************************************************************************
    	//  Tx Interrupt to interrupt when at least one location is free in Tx buffer
    	//	No Tx Inversion, Disable Sync Break
    	//	Enable Transmit, Disable Address Detect
    	//	Interrupt on every receive. 
    	//********************************************************************************/
    	U1STA = 0x0400;
    	U2STA = 0x0400; // 0b0000 0100 0000 0000
    	U3STA = 0x0400;
    
    	IFS0bits.U1RXIF = 0;		// Clear U1RX_Int flag
    	IFS1bits.U2RXIF = 0;		// Clear U2RX_Int flag
    	IFS5bits.U3RXIF = 0;		// Clear U3RX_Int flag
    }

    -----

  2. #2
    Jack
    Modérateur

    Re : UART sur PIC24 sous Mplab

    Prière de faire l'effort de lire les règles participatives du forum programmation avant de poster.
    Merci.

    En conséquence, je déplace en électronique

Discussions similaires

  1. URGENT : Impossible dialogue UART avec 2 bits Stop sous CCS C (PIC)
    Par inviteafbffaf9 dans le forum Électronique
    Réponses: 1
    Dernier message: 02/03/2011, 20h53
  2. Mplab sous Windows 7
    Par invite1928af64 dans le forum Électronique
    Réponses: 3
    Dernier message: 17/11/2010, 17h10
  3. pic24 et UART, la reception ne marche pas ??
    Par invite9426e977 dans le forum Électronique
    Réponses: 19
    Dernier message: 28/05/2010, 09h42
  4. Comment compiler une librairie sous MPLAB C30 (Microchip) pour PIC24?
    Par invitea674c8fa dans le forum Électronique
    Réponses: 4
    Dernier message: 08/10/2009, 10h30
  5. probleme uart pic24
    Par invite92ed4f10 dans le forum Électronique
    Réponses: 3
    Dernier message: 03/06/2008, 00h07
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...