///////////////////////////////////////////////////////////////////////// //// 876_USB_IO.C //// //// //// //// Ce programme attend de l'USB un caractère. //// //// Attente de changement d'état sur RXF (RC5), actif Low. //// //// Lecture du caractère sur PortB. //// //// Si caractère reçu vaut "M" comme message alors //// //// Envoi du message "Coucou Bernard!" //// //// Donc création d'une routine d'envoi sur PortB USB_PUTC(Char) //// //// La fonction printf utilisera cette nouvelle fonction //// //// USB_PUTC(Char) pour les futures utilisations. //// //// //// //// //// ///////////////////////////////////////////////////////////////////////// #if defined(__PCM__) #include "16F876.h" #fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP // #DEVICE ADC=10 //Obligatoire, sinon, il passe en mode 8 bits #use delay(clock=20000000) // #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, PARITY=N) #use fast_io(B) #Define RXF PIN_C5 //Lecture USB possible si état bas. #Define TXE PIN_A2 //Ecriture USB possible si état bas. #Define RD PIN_A5 //Latch des données en lecture #Define WR PIN_A4 //Latch des données en ecriture #Define LED0 PIN_C0 //Indique la réception d'un caractère #Define LED1 PIN_C1 //Indique l'envoi d'un caractère #Define OUT 0x00 //Sens Entrées/Sorties #Define IN 0xFF //Sens Entrées/Sorties #Zero_RAM #endif char USB_GETC() { int8 valeur; while(input(RXF)); //On boucle ici tant que RXF du module USB reste à l'état Haut output_low(RD); //RD état Bas, on valide la lecture. valeur = input_B(); //On récupère la valeur. output_high(RD); //RD état Haut, on ne lit plus. Return(valeur); } Void USB_PUTC(char c) { while (input(TXE)); //On boucle ici tant que TXE du module USB reste à l'état Haut output_high(WR); //Metre WR état haut pour valider l'écriture. delay_cycles( 1 ); output_B(c); //On envoie le caractère delay_cycles( 1 ); output_low(WR); //WR état Bas pour dévalider l'écriture (obligatoire) } Void Initialisation() { Set_tris_A(0x0F); //A0 à A3 en entrées, A4 et A5 en sorties Set_tris_C(0xB0); //C0 à C3 et C6 en sorties, C4, C5 et C7 en entrées Set_tris_B(IN); output_low(WR); //WR état Bas, on n'écrit pas. output_high(RD); //RD état Haut, on ne lit pas non plus. } main() { int8 Recept; Initialisation(); do { Recept = USB_GETC(); output_high(LED0); //On reçoit un caractère if (Recept == 'M') { output_high(LED1); //On envoie bien un caractère Set_tris_B(OUT); printf(USB_PUTC,"Enfin, il etait temps!\r\n"); Set_tris_B(IN); output_low(LED1); //On indique la fin de l'envoie } else { output_high(LED1); //On envoie bien un caractère Set_tris_B(OUT); printf(USB_PUTC,"Pas bon, recommence!\r\n"); Set_tris_B(IN); output_low(LED1); //On indique la fin de l'envoie } output_low(LED0); //On a bien reçu un caractère } while(TRUE); }