Répondre à la discussion
Affichage des résultats 1 à 23 sur 23

Uart & isis



  1. #1
    mirachou

    Uart & isis

    Bonjour tout le monde
    J'ai besoin de votre aide, je veux programmer en mikroc un message tapé par mon clavier (en utilisant Virtual Terminal) et qu'il soit afficher sur LCD.
    Voici mon schéma ISIS:
    uart-lcd.png
    et voici le code :
    Code:
    // LCD pinout setting
     sbit LCD_RS at RE1_bit;
     sbit LCD_EN at RE2_bit;
     sbit LCD_D0 at RD0_bit;
     sbit LCD_D1 at RD1_bit;
     sbit LCD_D2 at RD2_bit;
     sbit LCD_D3 at RD3_bit;
     sbit LCD_D4 at RD4_bit;
     sbit LCD_D5 at RD5_bit;
     sbit LCD_D6 at RD6_bit;
     sbit LCD_D7 at RD7_bit;
     // Pin Direction;
     sbit LCD_RS_Direction at TRISE.B1;
     sbit LCD_EN_Direction at TRISE.B2;
     sbit LCD_D0_Direction at TRISD.B0;
     sbit LCD_D1_Direction at TRISD.B1;
     sbit LCD_D2_Direction at TRISD.B2;
     sbit LCD_D3_Direction at TRISD.B3;
     sbit LCD_D4_Direction at TRISD.B4;
     sbit LCD_D5_Direction at TRISD.B5;
     sbit LCD_D6_Direction at TRISD.B6;
     sbit LCD_D7_Direction at TRISD.B7;
     // End LCD module connections
    
     // Buffers should be in USB RAM, please consult datasheet
     unsigned char RD_buffer[64] absolute 0x500;
     unsigned char WR_buffer[64] absolute 0x540;
    
     /*// fonction de convertion en binaire
    char * Bin2Ascii(unsigned char untel)
     {
     unsigned char masque=0x80;
     int indice=0;
     unsigned char Binary[9];
     while (masque > 0)
     {
        Binary[indice]='0';
       if (untel & masque)  Binary[indice]='1';
        masque = masque >> 1;
        indice++;
      }
      Binary[8]=0; // string terminator
      return (Binary);
    }*/
    
    char uart_rd;
    char msg;
    
     void main ()
    {
     TRISC=0b00000000;
    // Configure PORTC pins as digital
     ADCON1=0b00001111;
    
     Lcd_Init();
     Lcd_Out(1,1,"Start");
     Delay_ms(100);
      Lcd_Cmd(_LCD_CLEAR);
     
    
    UART1_Init(9600);               // Initialize UART module at 9600 bps
    Delay_ms(100);                  // Wait for UART module to stabilize
    
    UART1_Write_Text("Start");
    UART1_Write(13);
    UART1_Write(10);
    
     while (1)
      {                     // Endless loop
        if (UART1_Data_Ready())
        {                             // If data is received,
          uart_rd = UART1_Read();     // read the received data,
          UART1_Write(uart_rd);       // and send data via UART
          msg = uart_rd ;
        }
      }
    
      Lcd_Out(1,1,"msg = ") ;
      Delay_ms(100);
      Lcd_Out(2,1,msg);
      Lcd_cmd(_Lcd_cursor_off) ;
    
    }
    Il affiche juste "hello" et "msg = " , mais lorsque je tape un msg en Virtual Temrinal rien ne se passe :/
    Merci d'avance.

    -----


  2. Publicité
  3. #2
    adipie

    Re : Uart & isis

    Place un oscilloscope sur TX de ton terminal pour voir ce qui sort de ce bidule.
    Comme RC6 est en l'air, à quoi sert Uart1_Write ?
    Comment peux tu afficher 'Hello' alors que ce n'est pas écrit dans le programme.
    Je te conseille de nettoyer ton schéma et ton programme pour améliorer la lecture (USB par exemple).

  4. #3
    paulfjujo

    Re : Uart & isis

    comment peux tu voir lemessage start sur ton terminal
    connecte RC6 TX sur RX du terminal

    Si tu envoie ton message avec tous les caracteres accolees, tu risque de bloque l'UART
    ..traite la reception en interruption
    Dernière modification par paulfjujo ; 11/06/2015 à 13h42.

  5. #4
    mirachou

    Re : Uart & isis

    SVP, vous pouvez mieux m'expliquer, qu'est ce que je dois faire alors? c a dire interruption ?
    Dernière modification par mirachou ; 11/06/2015 à 13h50.

  6. #5
    mirachou

    Re : Uart & isis

    Après modification :
    uart-terminal.png

  7. A voir en vidéo sur Futura
  8. #6
    paulfjujo

    Re : Uart & isis

    c'est pas top !
    on dirait un probleme de vitesse non adaptée
    dans l'exemple ci dessous on envoi d'abord les 3 lettres A,B,C
    pour verifier que la transmission soit OK.
    et dans lemain on test le contenu du buffer de reception (qui est affiché)
    pour faire differentes actions..
    tourne OK sur ma carte STARTUSB 18F2550, dans le monde reel

    quelle est la valeur du quartz?
    quelles sont les valeurs des bits config ?




    Code:
    // FOSC=48MHz  Q=8MHz
    
    #define MAX_LEN 80
    
    char  c1;
    int DataReady;
    int Index,i1;
    char Buffer[MAX_LEN];        // buffer de reception
    int CptFO,CptFE;
    
    
    
    void void InterruptVectorHigh() iv 0x0008 ics ICS_AUTO
     {
      static unsigned int count;      // mis a zero seulement au 1er passage
     if ( (RCIE_bit) && ( RCIF_bit))
       {
       // traitement separe des erreurs de COM
          if (RCSTA.OERR==1)    // voir parag 16.1.26 p273
          {
           RCSTA.CREN = 0 ;
           c1 = RCREG;
           RCSTA.CREN = 1 ;
           CptFO++;
           }
          if(RCSTA.FERR==1 )
          {
          RCSTA.SPEN = 0 ;
          RCSTA.SPEN= 1 ;
          CptFE++;
           c1 = RCREG;
          }
          c1 = RCREG;
         if (c1==CR)
          {
          DataReady=1;
          //PIE1.RCIE=0 ; //interdit IT Reception UART
          Buffer[i1]=0;
          Index=i1;
          i1=0;
          c1=0;
         }
         else
         {
            DataReady=0;
            Buffer[i1]=c1;
            Index=i1;
            i1++;
    
          }
       }  //if PIR1
    }
    
    
    
    void UART1_Write_CText(const char *T1)
    {
       while (*T1)   UART1_Write(*T1++);
     }
    
    
    void Raz_COM()
    {
      CptFO=0;CptFE=0;
      for (i=0;i<MAX_LEN;i++)  Buffer[i]=0;
      DataReady = 0;
      Index=0;
      i1=0;
      c1=RCREG;
      c1=0;
      RCIE_bit=1;
    }
    
    
    void main()
    {
    
    ..some init hardware ..etc ...
    
     UART1_Init(9600);     // 19200 bds at 48Mhz
    //test UART Transmission
    UART1_Write('A'); UART1_Write('B'); UART1_Write('C');
    
    
       // init pour interruptions UART ----
      RCSTA.CREN= 1 ;
      IPR1.RCIP=1;  // high priority for UART
      RCON.IPEN = 1;     // Enable High interrupt priority model.
      PIE1.RCIE = 1;    /// enable interrupt reception
      INTCON.PEIE = 1;   // autorisation des IT des périphériques
      INTCON.GIEL=1;
      INTCON.GIE = 1 ; // Enable IT
    while(1)
    {
    
    
    ... some job 
    
     if (DataReady==1)
       {
       UART1_Write_CText("Reception :");
       UART1_Write(TAB); 
       UART1_Write_Text(Buffer);
       UART1_Write(TAB);
       if(strncmp(Buffer,"RED_ON",6)==0 )  Led_Rouge=1;
       if(strncmp(Buffer,"RED_OFF",7)==0 )  Led_Rouge=0;
       if(strncmp(Buffer,"GREEN_ON",8)==0) Led_Verte=1;
       if(strncmp(Buffer,"GREEN_OFF",9)==0) Led_Verte=0;
       if(strncmp(Buffer,"TOGGLE",5)==0)  Flags.Drapeaux.Togle=!Flags.Drapeaux.Togle;
        Raz_COM();
        }
    
    }
    
       // si erreurs de communication
     if (CptFE>0  || CptFO>0)
      {
          UART1_Write_CText(RS_Str[0]);
          UART1_Write(TAB); Write_Word_(CptFE,0);UART1_Write(TAB);Write_Word_(CptFO,0);
          CRLF();
          Delay_ms(500);
      }
    
    
    }

  9. Publicité
  10. #7
    mirachou

    Re : Uart & isis

    Bon, j'ai rien compris :/
    Quartz = 1MHz
    Quelles bits?

  11. #8
    paulfjujo

    Re : Uart & isis

    sous mikroC
    il faut bien definir la valeur de FOSC
    et aussi la configuration des "bits de configurations"
    Project
    Edit Project
    pour faire apparaitre cette page

    d'autant que le 18F4550 est assez compliqué de ce point de vue, à cause de l'USB.
    Cette frequence sert à determiner la valeur correcte en bauds
    dans l'init de l'UART..
    si mal renseigné ou mal configuré..ce n'est pas la bonne vitesse.

  12. #9
    mirachou

    Re : Uart & isis

    la vitesse de transmission que j'utilise 9600 bauds

  13. #10
    paulfjujo

    Re : Uart & isis

    C'est la vitesse que tu desires , pas forcement celle que tu as ..

    sous MikroC
    Project
    Edit Project
    capture et post la page ecran "edit projet"

  14. #11
    mirachou

    Re : Uart & isis

    c fait :
    edit.png

  15. #12
    paulfjujo

    Re : Uart & isis

    en attendant la validation de l'image

    essaie de faire ce test avec 2 leds comme temoin


    Code:
    
      // verif Fosc
       LED_Inf=0;
       LED_Sup=1;
       Delay_ms(10000);
       LED_Sup=0;
       LED_Inf=1;
    chronometre la duree entre le basculement des leds
    si FOSC est bien configuree tu dois trouver 10 secondes
    sinon PB de config FOSC ou config bits

  16. Publicité
  17. #13
    mirachou

    Re : Uart & isis

    Excusez mois mais j'ai rien compris :/ quelle est la liaison entre ça et mon projet ?

  18. #14
    adipie

    Re : Uart & isis

    Citation Envoyé par mirachou Voir le message
    Excusez mois mais j'ai rien compris :/ quelle est la liaison entre ça et mon projet ?
    Ceci te permet de vérifier si ta configuration est bonne.
    Si le changement d'état de tes leds se fait exactement toutes les 10 secondes ton PIC est bien cadencé et l'UART devrait fonctionner.

  19. #15
    adipie

    Re : Uart & isis

    Une configuration qui fonctionne avec un PIC 18F4550:
    Config_PIC18F4550_15012014.JPG
    Attention pour un quartz de 8 MHz mettre MCU clock frequency à 48 MHz
    Sur le site de MikroElektronika tu peux trouver des exemples de programmes.

  20. #16
    adipie

    Re : Uart & isis

    Citation Envoyé par mirachou Voir le message
    Bon, j'ai rien compris :/
    Quartz = 1MHz
    Quelles bits?
    Met un quartz de 8 MHz.

  21. #17
    paulfjujo

    Re : Uart & isis

    je t'ai donné une methode pour verifier ton FOSC
    tu n'as qu'à chronometrer le changement d'etat de 2 leds ( ou meme 1 seule !)
    à toi de definir ou sont cablées tes leds !

    Par contre dans ta config tu as mis 8MHZ
    alors que tu dis que ton quartz est de 1 MHz
    LA CA NE VAS PAS DU TOUT !
    pas etonnant que l'UART donne n'importe quoi..
    au pire essaie avec terminal = 9600/8= 1200 bauds .. coté terminal ISIS

    au mieux , mets un quarrtz de 8 Mhz !




    Code:
    dans mon cas, je veux FOSC=48MHZ, sachant que mon quartz fait 8Mhz
    
    sbit LED_Sup at LATA1_bit;    // led rouge
    sbit LED_Inf at LATB4_bit;    // led jaune   
    
    
      LED_Inf=0;
      LED_Sup=1;
      Delay_ms(10000);
    // j'ai verifié avec un chronometre => 10,0sec ,donc FOS  OK
      LED_Sup=0;
      LED_Inf=1;
    
    
     k=Get_Fosc_kHz()  ;
        WordToStr(k,CRam1);
         strConstRamCpy( &writebuff," Fosc (Khz)= ");
       while(!HID_Write(&writebuff,64)) ;
         strcpy( &writebuff,CRam1);
       while(!HID_Write(&writebuff,64)) ;
        CRLF_HID();
    
       LED_Sup=0;
       LED_Inf=0;
    
    ce qui me donne le resultat affiché
     Fosc (Khz)= 48000
    car je suis bien à FOSC=48MHz avec Q=8Mhz
    sur le terminal HID de mikroC (et non pas terminal UART RS232)
    Nota: je ne suis pas sur l'UART mais sur la laison USB de mon 18F2550
    Dernière modification par paulfjujo ; 11/06/2015 à 19h11.

  22. #18
    Blue Sn4ke

    Re : Uart & isis

    Citation Envoyé par mirachou Voir le message
    Bonjour tout le monde
    J'ai besoin de votre aide, je veux programmer en mikroc un message tapé par mon clavier (en utilisant Virtual Terminal) et qu'il soit afficher sur LCD.
    Je sais que ça ne fait pas avancer le topic... mais ça me fait bondir alors tant pis !
    "Programmer en MikroC" (tout comme "programmer en Arduino") ça ne veut rien dire !!

    Le langage utilisé, c'est du C, pas du MikroC (ni de l'Arduino) !

    C'est nettement mieux de dire "programmer en C sous MikroC" !

  23. Publicité
  24. #19
    mirachou

    Re : Uart & isis

    Bonsoir une autre foie, merci pour vos aides, j'ai avancé un peu dans mon travail, mais j'étais bloqué une autre foie :/
    Mon LCD et aussi le Virtual Terminal affiche des caractères inconnus, je sais pas d'où vient le problème, même j'ai vérifie les codes ASCII mais c'est du n'importe quoi, voici la figure suivante:
    lcd-inconnu.png

    Le message inconnu affiché par virtual doit être "Press a key! ..." dans LCD aussi le caractère choisi c'est 'A' mais il affiche 'p' je sais pas pourquoi :/

    Aidez mois SVP!

  25. #20
    adipie

    Re : Uart & isis

    Bonjour, ton problème sent la mauvaise configuration, mais avant de poser de nouvelles questions il faut d'abord répondre aux anciennes questions.
    As-tu essayer la méthode des 2 leds de paulfjujo ?
    As tu essayé un quartz de 8 MHz ?
    Fait voir la nouvelle configuration ?
    Essaye d'envoyer le caractère U (code Asci 01010101) en continu et analyse la trame avec un oscilloscope.
    Poste le fichier descripteur de l'USB.
    Si l'USB n'est pas utilisé dans ton projet, ce qui semble être ton cas, change de PIC et utilise un 18F4520 sans USB avec le même soft sans les lignes de code USB, et un quartz de 8MHz.

  26. #21
    mirachou

    Re : Uart & isis

    Merci bien, le problème est résolu avec le pic18f4520, mais il faut travailler avec le pic18f23k22 mais ça ne marche pas :/ le LCD n'affiche rien!
    j'utilise le mode 4 bits de LCD, je sais pas le problème s'agit de quoi?

  27. #22
    paulfjujo

    Re : Uart & isis

    il me semble qu'au depart on etait sur le 18F4550 ...
    testé OK avec 18F4520 donc ..
    on efface tout, on recommence

    je ne saisis pas la logique de ce parcours.

    reposte code et schema avec ton 18F23K22 ...
    nota : un peu plus grosse , la taille du schema.. meme avec une loupe on le lit mal..

  28. #23
    adipie

    Re : Uart & isis

    Citation Envoyé par mirachou Voir le message
    Merci bien, le problème est résolu avec le pic18f4520, mais il faut travailler avec le pic18f23k22 mais ça ne marche pas :/ le LCD n'affiche rien!
    j'utilise le mode 4 bits de LCD, je sais pas le problème s'agit de quoi?
    Comme ça fonctionne avec le 18F4520, c'est la preuve que tu était mal configuré avec le 18F4550.
    Poste la configuration qui marche avec le 18F4520 et celle du 18F4550 qui transmet des caractères erronés.
    Indique aussi la fréquence du quartz qui n'est pas marquée sur le schéma.
    Quand au changement du PIC 18F4550 par un 18F23K22 c'est une autre étape et pourquoi ce changement ?

    Q1.JPG

Sur le même thème :

Discussions similaires

  1. uart
    Par lm321 dans le forum Électronique
    Réponses: 2
    Dernier message: 19/03/2015, 22h05
  2. Utilisation proteus et isis, demande d'aide utilisation pour isis.
    Par stephane85 dans le forum Électronique
    Réponses: 0
    Dernier message: 15/06/2012, 09h03
  3. PIC et I2C vs UART
    Par frcsbdx dans le forum Électronique
    Réponses: 3
    Dernier message: 15/07/2009, 11h36
  4. bus i2c ou UART et RTC
    Par Voltron dans le forum Électronique
    Réponses: 7
    Dernier message: 16/11/2008, 13h31
  5. UART avr
    Par McFly dans le forum Électronique
    Réponses: 8
    Dernier message: 18/05/2006, 18h07