Utilisation du module CH376 avec PIC 18f520

prog_SAHIL

Utilisation du module CH376 avec PIC 18f520


J’essaie de lire les données d’une clé USB à l’aide du module CH376 avec microcontrôleur PIC 18f4520.

Le nom du fichier que j’essaie de lire est « ABC.txt » et il contient « bonjour ».

// Instructing module which file to read

SerialTransmit(0x57);
SerialTransmit(0xAB);
SerialTransmit(0x2f);
SerialTransmit(0x2f);
SerialTransmit('A');
SerialTransmit('B');
SerialTransmit('C');
SerialTransmit('.');
SerialTransmit('T');
SerialTransmit('X');
SerialTransmit('T');
SerialTransmit(0x00);

init_lcd();
lcd_string("fn");
function_int(RCREG);
DelayMS(1); 

// Opening the File

SerialTransmit(0x57);
SerialTransmit(0xAB);
SerialTransmit(0x32);

init_lcd();
lcd_string("open");
function_int(RCREG); 
DelayMS(2000);

if(RCREG!=0x14)
   {
    init_lcd();
    lcd_string("open not ok");
    while(1);
    }

 else
    {   
        init_lcd();
        lcd_string("open ok");
        DelayMS(1);
     }
 i=0;

  // Setting to read 5 bytes 

  SerialTransmit(0x57);
  SerialTransmit(0xAB);
  SerialTransmit(0x3A);
  SerialTransmit(0x05); // here
  SerialTransmit(0x00);

 i++;
 init_lcd();
 lcd_string("dl");
 function_int(RCREG);
 DelayMS(2);

 if(RCREG!=0x1D)
{   
   init_lcd();
   lcd_string("dl not ok");
   while(1);
 }

 else   
 {  
    init_lcd(); 
    lcd_string("dl ok");    
    DelayMS(1);
  }

// Reading

SerialTransmit(0x57);
SerialTransmit(0xAB);
SerialTransmit(0x27);

// It reads the first byte here, first byte is a waste byte i.e. 
// it returns 0x05 (The number of bytes we want to read)

init_lcd(); 
lcd_string("0read");
function_int(RCREG);    
DelayMS(3000);

// It reads the first byte here, i.e. H

init_lcd();
lcd_string("1read");
function_int(RCREG);
lcd_string("==");
lcd_data(RCREG);    
DelayMS(3000);

// It is supposed to read 'E' here, but it still reads 'H'

init_lcd();
lcd_string("2read");
function_int(RCREG);
lcd_string("==");
lcd_data(RCREG);
DelayMS(3000);

// It is supposed to read 'L' here, but it still reads 'H'

init_lcd();
lcd_string("3read");
function_int(RCREG);
lcd_string("==");
lcd_data(RCREG);
DelayMS(3000);

while(1);

Je peux configurer et demander au module d’ouvrir et de commencer la lecture du fichier. Mais le problème est que je suis bloqué sur le premier octet. Je n’arrive pas à lire le deuxième octet. Comment faire?

Merci, j’apprécierai vraiment toute aide.

Dorian

function_int fait quoi?

prog_SAHIL

@Dorian Il affiche la valeur hexadécimale de l’octet, lcd_data affiche le caractère réel

Dorian

Quel complicateur utilisez-vous?

prog_SAHIL

@ Dorian, j’utilise MPLAB avec le compilateur Hi-Tech.

Dorian

Voir plus de détails sur le chat

Réponses


 Dorian

Vous ne pouvez pas utiliser RCREG de cette manière. Vous devez le lire dans un tampon puis utiliser le tampon pour d’autres tests.

Je vois que vous utilisez:

function_int(RCREG);
lcd_string("==");
lcd_data(RCREG);    

Lors de la deuxième utilisation, RCREG sera le prochain octet reçu ou l’unité uart affichera une erreur car il n’y a pas de données dans le registre RCREG.

De plus, l’image 16f4520 n’a pas de FIFO de réception, les longs délais que vous utilisez entraînent un débordement de tampon et tous les octets reçus sont perdus.

Utilisez un tampon temporaire pour lire tous les octets sans délai puis traitez les données

La bonne façon est de:

  • lire le drapeau RCIF pour voir si des données sont disponibles dans RCREG
  • lire RCREG dans un tampon et à nouveau à la première étape jusqu’à ce que vous ayez lu tous les octets attendus.
  • traiter les données reçues.

Ou utilisez un tampon UART logiciel, si vous utilisez MPLABX puis utilisez le configurateur de code mplab et les fonctions générées, ne lisez pas directement le RCREG

Mettre à jour. Lorsque vous utilisez SerialTransmit qui attend que le tampon TX soit vide avant d’envoyer un caractère, utilisez également SerialReceive qui attend la réception d’un caractère.

Vous avez une combinaison de défauts ici, dans le code ci-dessus, vous lisez deux fois et le deuxième octet lu est défectueux conduisant à un dépassement de réception

Ensuite, même à mon avis, vous avez mis en mémoire tampon le RCREG, après cela, vous avez un long délai, mais le tampon de réception de l’UART ne peut contenir qu’un seul octet et tous les autres octets sont perdus.

Utilisez SerialReceive (qui attend qu’un octet soit disponible avant de revenir comme vous le voyez ci-dessus) et mettez en mémoire tampon toutes les données attendues avant d’effectuer tout traitement:

for(i=0;i<number_of_bytes_expected;i++)
  {
   buffer[i] = SerialReceive();
  }
// do whatever you need with the data 
prog_SAHIL

Merci. Je vais essayer cela et vous faire savoir si cela fonctionne.

prog_SAHIL

Je l’ai essayé en utilisant un tampon mais il est toujours bloqué sur le premier octet. (Pouvons-nous déplacer cette conversation le chat?)

Dorian

@prog_SAHIL Bien sûr, laissez 30 min pour arriver à un PC, je suis sur mobile en ce moment

 

18f520, avec, CH376, du, Module, PIC, utilisation

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *