Salut nlc.
Malgré toutes tes explications et tes indications, je n’arrive pas à faire fonctionner les interruptions.
Je suis en train de me tirer les cheveux depuis 2 jours sans succès. J’ai plus ou moins tout essayé mais rien n’y fait.
Quand j’envoie un octet, la fonction d’interruption de réception n’est pas exécutée.
Explication :
J’ai établi un programme (ci-dessous) sur base de ton code en utilisant le principe des buffers mais uniquement pour la réception dans un premier temps (histoire de faire des tests d’interruptions).
En toute logique, le programme est censé stocker les octets reçus dans un buffer de réception, et ensuite renvoyer ces octets grâce à la fonction _uart0SendDirect (sans passer par un buffer de transmission).
Histoire de faire des test sur base d’exemples simples, j’essaie d’envoyer un seul octet à la fois et je ne tient pas compte du cas ou le buffer de réception est rempli. Grâce à mes leds témoin, je peux constater que la fonction interruption de réception n’est jamais exécutée et que le buffer de réception est donc toujours vide.
#include "sfr_r813.h"
#include "def.h"
#define UART0_RECEIVE_BUFFER_SIZE 32
static BYTE receiveBuffer[UART0_RECEIVE_BUFFER_SIZE]; // Buffer de reception
static BYTE receiveBufferIn; // Index pour le buffer tournant, octet recu
static BYTE receiveBufferOut; // Index pour le buffer tournant, octet lu
// Interruption de réception
#pragma interrupt uart0ReceiveInt;
void uart0ReceiveInt ( void )
{
receiveBuffer[receiveBufferIn] = u0rbl;
re_u1c1 = 1; //Réception terminée -> reception enabled
p1_3 = 1; //Led témoin
receiveBufferIn++;
}
// Initialisation de l'uart
void UART0_init(void)
{
pd1 = pd1 | 0x10; // TxD0 en output
pd1 = pd1 & 0xdf; // RxD0 en input
u0mr = 0x05; // UART0 en mode transfert 8 bits de longueur
u0c0 = 0x00; // UART0 en transmission et réception
u0rrm = 1; // réception continue activée
u0brg = 130-1; // 9600 baud avec l'horloge 20MHz
u0c1 = 0x05;
p1_0 = 1;
}
// Envoi d'un octet sans passer par le buffer
BYTE _uart0SendDirect ( BYTE value )
{
while (ti_u0c1 == 0); // Attend que le buffer de transmission soit vide
u0tb = value;
te_u0c1 = 1; // Transmission terminée
}
// Lecture des octets reçus
BYTE _uart0Receive( BYTE* value )
{
if ( receiveBufferIn != receiveBufferOut ) //Il y a qqch qui est arrivé dans le buffer
{
*value = receiveBuffer[receiveBufferOut];
receiveBufferOut++;
p1_1 = 1; //Led témoin
return( TRUE );
}
return( FALSE );
}
int main ( void )
{
//Change on-chip oscillator clock to Main clock
prc0 = 1;
cm13 = 1;
cm15 = 1;
cm05 = 0;
cm16 = 0;
cm17 = 0;
cm06 = 0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
ocd2 = 0;
prc0 = 0;
s0ric = 0x07; //UART0 interrupt reception priority level = 7
pd1 = 0x0f; //Output mode for pin P1_0 to P1_3
p1 = 0x00;
UART0_init();
receiveBufferIn = receiveBufferOut = 0;
while ( 1 )
{
BYTE c;
if ( _uart0Receive( &c ) == TRUE )
{
p1_2=1;
_uart0SendDirect( c );
}
}
}
