Bonjour,

J'ai un problème concernant un programme tout simple en C de microcontrôleur.

J'ai créé un programme (voir ci-dessous) pour tester la communication UART entre mon microcontrôleur (C8051F310, monté sur une Target Board de Silabs) et mon PC, avant d'utiliser un module Bluetooth et exploiter le même donnée par un autre appareil Bluetooth. En gros, le programme s'initialise en envoyant "OK", puis à chaque fois que j'envoie un caractère, il est censé me le renvoyer en echo.

Je reçois bien le "OK" du début de mon programme (=> le TX marche), mais:
  • Mon programme ne marche pas c'est à dire que je ne reçois aucun echo quand je tape une donnée (=> le PIC ne réagit pas à la donnée reçue)
  • En mettant un jumper entre TX et RX, je reçois bien en echo sur mon PC les données que j'essaie d'envoyer à RX (=> normalement la donnée reçue devrait atteindre le PIC)
  • En mettant un jumper entre P0.4 et P0.5, je reçois bien en echo sur RX les données que j'envoie sur TX (le test est un allumage de la LED si RI0 == 1, ce qui se passe effectivement) (=> le système UART a donc l'air de bien marcher)

C'est à n'y rien comprendre. Est-ce que le PIC serait grillé juste pour la fonction réception ?? Auriez-vous une autre idée ?

Je vous met une photo de mon binz.

Code:
#include "C8051F310.h"

// FUNCTION PROTOTYPES

void Timer_Init();
void UART_Init();
void Port_IO_Init();
void Oscillator_Init();
void Init_Device();
void Send(char lettre);
void Eteindre_LED();

// VARIABLES

char Byte;
sbit LED = P3^3;
sbit BTN = P0^7;

// FUNCTION MAIN

void main()
{
	PCA0MD &= ~0x40; // Désactive le Watchdog
	Init_Device();   // Initialisation

	Eteindre_LED();

	Send('O');
	Send('K');

	while(1)
	{
		if (RI0 == 1) // Si le flag de réception s'active
		{
			Byte = SBUF0; // Lire la donnée
			RI0 = 0; // Mettre à 0 le flag
			Send(Byte); // Renvoyer en echo
		}
	}
}


// Peripheral specific initialization functions,
// Called from the Init_Device() function
void Timer_Init()
{
    TCON      = 0x40; // Allume le Timer 1
    TMOD      = 0x20; // Met le Timer 1 en mode 2
    TH1       = 0x96; // Met le TImer 1 sur 9600 bps
}

void UART_Init()
{
    SCON0 = 0x10; // SCON0: 8-bit variable bit rate

	RI0   = 0; // On peut recevoir des données
	TI0   = 0; // On peut envoyer des données;
}

void Port_IO_Init()
{
	P0MDOUT   = 0x00; // Active le bouton poussoir comme une sortie digitale en open-drain
	P3MDOUT   = 0x08; // Active P3.3 (la led) comme une sortie digitale en push-pull
    XBR0      = 0x01; // Active l'UART
    XBR1      = 0x40; // Active la crossbar
}

void Oscillator_Init()
{
    OSCICN    = 0x83; // Active l'oscillateur sur sa fréquence max (24.5 Mhz)
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device()
{
    Timer_Init();
    UART_Init();
    Port_IO_Init();
    Oscillator_Init();
}

void Send(char lettre) // Fonction qui envoie une lettre
{
	SBUF0 = lettre; // Met la lettre dans le registre d'envoi

	while (TI0 == 0);
	TI0 = 0;

}

void Eteindre_LED()
{
	LED = 0;
}