UART dsPIC33F

Lesquels choisir ? Comment les utiliser ?

Postby mika » Thu Dec 19, 2013 12:00 am

Bonjour,

j'essaye de développer un UART sur un dsPIC. J'arrive sans difficulté à envoyer et à recevoir mais voilà, je n'arrive pas à lancer l'interruption de réception sur réception d'un caractère. Celle-ci s'initialise tout le temps. J'utilise seulement les Pins RX et TX. Dois-je utiliser les pins u1cts?

Mon code en init:

{
U1MODEbits.UARTEN=1; //UART ON
U1MODEbits.USIDL=0; //Mode continu(0)/discontinu(1) en IDLE
U1MODEbits.IREN=0; //IRDA disable
U1MODEbits.RTSMD=0; //Flow control mode
U1MODEbits.UEN=0; //TX et RX activé
U1MODEbits.WAKE=0;
U1MODEbits.LPBACK=0; //Loopback mode disable
U1MODEbits.ABAUD=0; //Autobaud or not
U1MODEbits.URXINV=0; //Polarité inversé (non)
U1MODEbits.BRGH=0; //High Baud mode
U1MODEbits.PDSEL=1; //8 Bits, pas de parité
U1MODEbits.STSEL=1; //2 bits de stop
U1STAbits.UTXISEL0=0; //Interruption mode
U1STAbits.UTXISEL1=1; //Interruption mode
U1STAbits.UTXINV=0; //Inversion de la polarité
U1STAbits.UTXBRK=0; //Pas de vérif de la transmition
U1STAbits.UTXEN=0; //Transmition ON
U1STAbits.UTXBF=0; //Statut du buffer full
U1STAbits.TRMT=0; //Transmet si pas vide
U1STAbits.URXISEL=0; //Interupt si buffer plen 4 data
U1STAbits.ADDEN=0; //Dectect character disabled
U1STAbits.RIDLE=0; //Receiver Idle active
U1STAbits.PERR=0; //Parity error status disabled
U1STAbits.FERR=0; //Framing error status bit (disabled)
U1STAbits.OERR=0; //status buffer disabled
U1STAbits.URXDA=0; //Receive buffer data available disabled

U1MODEbits.UARTEN=1;
U1STAbits.UTXEN=1;

U1BRG=(Fcy/(16*115200))-1; //9600 Bauds

IPC2bits.U1RXIP=2; //Priorité basse en réception
IPC3bits.U1TXIP=3; //Priorité basse en transmission
}

Code dans l'interruption:

void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt()
{
IFS0bits.U1RXIF=0;
while(U1STAbits.URXDA)
{

n=U1RXREG;



}
IFS0bits.U1TXIF=0;


void __attribute__((interrupt, no_auto_psv)) _U1TXInterrupt()
{
Buffer_TX[3]=n;
do
{
U1TXREG=*ptrTX_RDdata++;
if(ptrTX_RDdata==Buffer_TX+TX_BufSize) ptrTX_RDdata=Buffer_TX;
}
while ((ptrTX_RDdata!=ptrTX_WRdata)&&(!U1STAbits.UTXBF));
}

Pour être plus clair, ce que j'essaye de faire c'est que lorsque je reçois un caractère, il est enregistré et renvoyé dans un buffer de transmission pour être retournée. Je fais mes essais à l'aide d'un hyper terminal.

http://ww1.microchip.com/downloads/...eDoc/70188D.pdf le lien vers la datasheet de luart.

Je vous remercie par avance!

Mikael'
mika
 
Posts: 1
Joined: Mon Jan 20, 2014 8:08 am

Postby iso14000 » Thu Dec 19, 2013 12:00 am

Bonjour Mika.

tu as donné des détails sur l'init mais pas grand chose sur les routine de service des IT

je ne vois pas bien en particulier comment tu gère tes buffers circulaires

A++
tant qu'un auteur sera aussi un modérateur ici (et donc plaignant et juge) je serais un Troll assumé
iso14000
 
Posts: 3083
Joined: Fri Jan 03, 2014 1:55 pm

Postby risc » Fri Jan 24, 2014 12:00 am

Salut,

Pour ce genre de problème tu peux t'inspirer des exemples de code : http://www.microchip.com/codeexamples

a+
risc
 
Posts: 67
Joined: Fri Jan 17, 2014 4:42 pm


Return to Microcontrôleurs & microprocesseurs

Who is online

Users browsing this forum: No registered users and 1 guest