Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

communication PC-PIC par USB-UART
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#51 Message par Guest » ven. 25 déc. 2015 20:27

bonsoir
Paul le seul cas critique que je vois, c'est lorsque on est dans INT par exemple pour UART et qu'en même temps celle du timer arrive aussi (ou l'inverse), sinon en dehors impossible puisque tu ne valides plus int du timer0 (se pose la une question arrêt timer0 ou la non validation de cette int ) mais revenons au cas exceptionnel que vas t-il se passer, flag RCIF=0 flag buffer plein a 1 -> RETIF et la on retourne de suite dans l'int et oui le bit de TMR0IF est a 1 et donc TMR0IF=0 valider le flag du débord a 1 ->RETIF, et la et seulement la, on vas dans la boucle principale ou tu as c'est deux flag a traiter, après a toi de définir la priorité en testant UART en premier, fin du module UART, retour dans la boucle on traite le timer0.

Sinon on a aussi le vecteur secondaire, qui est la pour cela.Perso, je ne désactive pas les int valides, et dans les cas critiques, optimise le code et la méthode. si pas bon change de µC
il y a aussi la possibilité de gérer int prioritaire dans int elle même, comme la fait Jeremy

Pour les effets de débord ou effet secondaire ;) en ASM nos variable sont toutes globales, c'est pas mal aussi a gérer :P

A+

Et bonne soirée a vous

communication PC-PIC par USB-UART
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#52 Message par paulfjujo » lun. 4 janv. 2016 18:35

un autre exemple d'utilisation UART pour commander 8 leds sur le portB (MikroE EasyledLed Board Led 0 à Led 7)
Je suppose que la partie Reception UART1est fonctionelle (sinon je peux poster le programme complet
mais le but est surtout l'exemple de recuperation d'info par manipulation de pointeur .
au clavier on tape LED1=1 suivi de CR (enter) pour allumer la led#1
LED + numero de led 0 à7 +"=" + etat logique '1' ou '0' <CR>
cde Globale LEDs_ON ou LEDs_OFF
cde ? ou HELP pour lister les commandes.
Nota : le LCD n'est pas utilisé ICI , seul le terminal PC port Virtuel ( via liaison USB-FTDI) carte Ready for PIC 18F45K22 ( comme sur EASY7 ?)

Code : Tout sélectionner



  if
(UART1_DataReady==1)
    {
    UART1_Write_CText("Reception de : \r\n");
    UART1_Write_Text(buffer1);
    p1=0;
    p1=strstr(buffer1,"LED");     // cde possible LED 0 à 7  =0 ou =1
    if ( (p1>0) && (*(p1+4)=='=')) // buffer1 contient bien cette portion de texte
    {
      // on test le caractere apres le =
     if (  (*(p1+3)>='0') && (*(p1+3)<'8') && ( (*(p1+5)=='0')  || (*(p1+5)=='1') ))
        {  
           Pos
=*(p1+3)-'0';
           Cde=*(p1+5)-'0';
           // ancien Etat
           Etat_PORTB=LATB;
           UART1_Write(TAB);
           strConstRamCpy(CRam1,"Pos=  Cde=  PortB= ");
           *(CRam1+ 4)= Pos+48;
           *(CRam1+10)= Cde+48;
           //UART1_Write_CText("  Pos et Cde : ");
           //UART1_Write( Pos+48);UART1_Write(TAB);UART1_Write(Cde+48);
           if (Cde==0)   LATB = Etat_PORTB & ~(1<<Pos);   // (0xFF-(2^Pos)
           if (Cde==1)   LATB = Etat_PORTB | (1<<Pos) ; // (2^Pos);
           // nouvel etat
           Etat_PORTB=LATB;
           ByteToHex(Etat_PORTB ,CRam1+18);
           UART1_Write_Text(CRam1);
        }
     }

     // autres test de commandes
    p1=strstr(buffer1,"LEDs_OFF");     // cde possible LED 0 à 7  =0 ou =1
    if  (p1>0)
    {  LATB=0;
       Etat_PORTB=0;
    }
     p1=strstr(buffer1,"LEDs_ON");     // cde possible LED 0 à 7  =0 ou =1
     if  (p1>0)
     {  LATB=0xFF;
       Etat_PORTB=0xFF;
     }
      p1=strstr(buffer1,"HELP");
      if ((p1>0) || (*(buffer1)=='?'))
      {
      UART1_Write_CText("\r\nCdes Possibles :\r\n");
      UART1_Write_CText("Cde LED avec  x=num led de 0 à 7, etat 1 ou 0 ex: LED1=1 ou  LED1=0 \r\n");
      UART1_Write_CText("Cde Globale LEDs avec  LEDs_ON  ou LEDs_OFF \r\n");
      }
     // todo
     // autre test de comamnde
     // ...
     CRLF1();
     RAZ_UART1(); // on nettoie tout

Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 31 invités