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; }
-----