Discussion fermée
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 31

Programmer un 16F628 avec MikroC



  1. #1
    inoxxam

    Programmer un 16F628 avec MikroC


    ------

    Bonjour,
    je suis actuellement entrain d'étudier un PIC 16F628 et j'essaie de faire un petit programme simple pour tester. J'ai déjà une bonne expérience en programmation C/C++ sur PC. Je lance la compilation du programme ci-dessous sous MikroC mais j'obtiens des erreurs.

    Code:
    /* Début du programme */
    void main(void)
    {
        TRISA = 0xFF ; // Port A en sortie
        TRISB = 0x00 ; // Port B en entrée
        CMCON = 7 ; // Désactiver les comparateurs
    
        // Initialisation des variables
        int leds ;
        int ledcourante ;
    
        leds = 0x01 ;
        ledcourante = 0x01 ;
    
        while(1) // Boucle principale
        {
                // Gestion de la led à afficher
                if(ledcourante == 7)
                {
                        ledcourante = 1 ;
                }
                else
                {
                        ++ledcourante ;
                }
    
                // Affecter une valeur de sortie
                PORTB = 2 ^ ledcourante ;
                
                Delay_ms(50) ; // Temps entre deux passages de la boucle
        }
    }
    Les erreurs:
    Ligne 9: "Invalid expression" et "';' expected bud int found"
    Ligne 10: "Invalid expression" et deux "Internal errors"

    Je ne comprends pas l'origine de ces erreurs. Est-ce que quelqu'un peut m'éclairer s'il vous plaît?

    Merci d'avance.

    iNo

    -----

  2. Publicité
  3. #2
    laurentnic

    Re : Programmer un 16F628 avec MikroC

    Salut

    A mon avis il faut mette un include pour utiliser la fonction Delay_ms().
    je ne comprend pas ce que fait exactement cette ligne PORTB = 2 ^ ledcourante ;????
    Ou sont les erreur exactement, le compilateur doit te preciser l'endroit non?

    cordialement

  4. #3
    Seb.26

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par laurentnic Voir le message
    Ou sont les erreur exactement, le compilateur doit te preciser l'endroit non?
    +1 ... donne nous les n° de lignes ...

    NB: je dirais que "PORTB = 2 ^ ledcourante" doit vouloir allumer la LED n°ledcourante du portb ( et seulement celle ci puisque = et pas | ) ... mais ^ n'est pas un EXP, c'est un XOR ... ... donc ça fait pas grand chose ...

    [Edit] au vu du code, je pense qu'il voulais faire un chenillard de 8 led ...

    PS: AMA, sur uCPU, le type int est interdit ... il ne faut utiliser que les byte, short et long ... mais surtout les bytes quand c'est possible ...
    Dernière modification par Seb.26 ; 17/01/2008 à 11h09.

  5. #4
    Seb.26

    Re : Programmer un 16F628 avec MikroC

    Pour ton chenillard, le code suivant est pas pire AMA :

    Code:
    byte ledcourante = 0x80;
    while(1) // Boucle principale
    {
        PORTB = ledcourante;
    
        ledcourante = ledcourante >> 1;
        if( !ledcourante )
            ledcourante = 0x80;
    
        Delay_ms(50) ; // Temps entre deux passages de la boucle
    }
    PS: Quand à ton erreur ... tu fais du C, et pas du C++ ... il est donc normalement interdit de declarer des variables locales après le début du code ...
    Dernière modification par Seb.26 ; 17/01/2008 à 11h18.

  6. #5
    inoxxam

    Re : Programmer un 16F628 avec MikroC

    Bonjour,
    pour l'histoire des int je ne savais pas. Pour avoir la fonction puissance je peux inclure math.h pour avoir pow(arg1, arg2)?

    Merci d'avance et a bientôt.

    iNo

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

    Re : Programmer un 16F628 avec MikroC

    Salut,

    pourquoi utiliser la notation puissance?

    Pour allumer une led il suffit de déclarer le port qui va bien directement ou de faire un masque ou un décalage comme le décrit seb.26 suivant ton appli.
    Avec MikroC c'est:

    PORTB.F2=1; par exemple si tu veux mettre à 1 le RB2.

    De plus tu déclares un int alors que tu cherches à piloter une led sur un port 8 bits... donc un char non signé te suffit.
    @+
    Le génie est fait d'1 pour cent d'inspiration et de 99% pour cent de transpiration. Edison

  9. Publicité
  10. #7
    HULK28

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par Seb.26 Voir le message
    +1 ... donne nous les n° de lignes ...


    PS: AMA, sur uCPU, le type int est interdit ... il ne faut utiliser que les byte, short et long ... mais surtout les bytes quand c'est possible ...
    Depuis quand?

    le type int est parfaitement utilisable, le type byte par contre n'existe pas c'est char en C.

    Par contre rien ne t'interdit si tu tiens à appeler un char un byte de faire:

    typedef char byte;
    Le génie est fait d'1 pour cent d'inspiration et de 99% pour cent de transpiration. Edison

  11. #8
    HULK28

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par laurentnic Voir le message
    Salut

    A mon avis il faut mette un include pour utiliser la fonction Delay_ms().
    Non pas la peine avec MikroC les librairies n'étant pas publiques, c'est le linker qui fait tout seul le travail.
    Le génie est fait d'1 pour cent d'inspiration et de 99% pour cent de transpiration. Edison

  12. #9
    Seb.26

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par HULK28 Voir le message
    Depuis quand?
    le type int est parfaitement utilisable, le type byte par contre n'existe pas c'est char en C.
    En effet, c'est pas "interdit", mais le type int en C est particulier ( de par son implementation ) ... car si sur PC le type int est le type "bateau", sur uCPU, il faut changer ses habitudes ... comme par exemple se demander de quel type on a réelement besoin ... ... ensuite : << chacun fait fait fait ... s'ki lui plait plait plait ... >>

    Par contre rien ne t'interdit si tu tiens à appeler un char un byte de faire:

    typedef char byte;
    je conseillerais plutot "typedef unsigned char byte;" ...

  13. #10
    Seb.26

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par inoxxam Voir le message
    Bonjour,
    pour l'histoire des int je ne savais pas. Pour avoir la fonction puissance je peux inclure math.h pour avoir pow(arg1, arg2)?
    le type int est parfaitement utilisable comme l'a dit HULK28 ... c'est simplement un type que je n'aime pas puisque c'est un moyen de se creer des bug lors de portage de code ...
    ( par exemple, perso je commence toujours mes dev uCPU dans un projet sur PC qui emule ma plateforme uCPU ... sur PC, un int c'est 32b, combien avec ton compilo sur PIC ? ... 32b aussi ... chouette, tu as du bol ... mais pourquoi prendre ce risque ? ... un long fera exactement la même chose et au moins, sa taille est normalisée )

    De plus, s'obliger à ne pas utiliser le int à tout va, t'obligera à te demander de quelle taille ta variable doit être ? ... car si sur PC, c'est pas un problème d'allouer 4 octets pour stocker un flag, sur uCPU tu risque de vite te retrouver coincé par manque de RAM ... de plus, les uCPU n'aime pas trop manipuler des 32b ...

    Quand à utiliser "math.h pour avoir pow(arg1, arg2)" ... ça te coutera moins cher en RAM, en ROM et en temps CPU de te creer un tableau du style Pow2 { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 } et d'aller lire dedans la valeur correspondante ...

    Il faut penser uCPU ...

    Mais evidement, tout cela n'est que MON opinion ... ensuite, chacun fait comme il veut ...

    << just my 2 cents ... >>

    PS: HULK28, tu en pense quoi de ce compilo ( MikroC ) ... ? ... il est potable ou pas ?
    Dernière modification par Seb.26 ; 17/01/2008 à 13h58.

  14. #11
    HULK28

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par Seb.26 Voir le message
    je conseillerais plutot "typedef unsigned char byte;" ...
    Certes mais pas avec MikroC qui par défaut attribue à char un non signé.
    Bref il suffit de lire la doc du compilo comme d'habitude.
    @+
    Le génie est fait d'1 pour cent d'inspiration et de 99% pour cent de transpiration. Edison

  15. #12
    inoxxam

    Re : Programmer un 16F628 avec MikroC

    Bonsoir,
    j'ai à nouveau travaillé sur mon code et le voici:

    Code:
    /*                        Chenillard avancé multi-modes                       */
    
    // Initialisation des variables
    char leds ;
    char ledcourante ;
    char ledsmode ;
    char mode ;
    char imode ;
    char sens ;
    char etapeactuelle ;
    char mode4[4] = {0x81, 0x42, 0x24, 0x18} ;
    
    /* Début du programme */
    void main(void)
    {
        TRISA = 0xFF ; // Port A en sortie
        TRISB = 0x00 ; // Port B en entrée
        CMCON = 7 ; // Désactiver les comparateurs
    
        leds = 0x80 ;
        mode = 1 ; // Mode par défaut: de gauche à droite
        ledsmode = 241 ; // L'affichage du menu mode est 1111 0001
        imode = 0 ; // Gestion du clignottement du menu mode
        sens = 0 ; // Sens par défaut
        etapeactuelle = 0 ; // Etape actuelle (mode 4)
        
    
        while(1) // Boucle principale
        {
                // Acquisition des entrées
                if(PORTB.F0 == 1) // Bouton "mode" enfoncé?
                {
                       while(PORTB.F1 == 0) // Tant qu'on ne demande pas à sortir du mode
                       {
                               for(imode = 0; imode <= 50; imode = imode + 1)
                               {
                                       if(PORTB.F2 == 1 && mode > 1) // Si on appuie sur le bouton "mode-" et qu'un
                                                                     // mode au numéro plus bas existe
                                       {
                                              mode = mode - 1 ; // Changer de mode
                                              ledsmode = ledsmode - 1 ; // Changer l'affichage du mode
                                       }
                                       if(PORTB.F3 == 1 && mode < 4) // Si on appuie sur le bouton "mode+" et qu'un
                                                                     // mode au numéro plus haut existe
                                       {
                                              mode = mode + 1 ; // Changer de mode
                                              ledsmode = ledsmode + 1 ; // Changer l'affichage du mode
                                       }
                                       
                                       delay_ms(10) ; // Gérer la durée du clignottement des leds
                               }
                               
                               if(ledsmode > 240)
                               {
                                      ledsmode = ledsmode - 240 ;
                               }
                               else
                               {
                                      ledsmode = ledsmode + 240 ;
                               }
                       }
                }
    
                // Gestion du mode
                if(mode == 1) // Mode 1: chenillard gauche -> droite
                {
                      // Gestion de la led à afficher
                      leds = leds >> 1 ;
                      if(!leds)
                      {
                             leds = 0x80 ;
                      }
                }
                else if(mode == 2) // Mode 2: chenillard droite -> gauche
                {
                      // Gestion de la led à afficher
                      leds = leds << 1 ;
                      if(!leds)
                      {
                             leds = 0x00 ;
                      }
                }
                else if(mode == 3) // Mode 3: chenillard aller-retour
                {
                      // Gestion de la led à afficher
                      if(sens == 0)
                      {
                             leds = leds << 1 ;
                      }
                      else
                      {
                             leds = leds >> 1 ;
                      }
                      
                      // Gestion du sens
                      if(leds == 0x80)
                      {
                             sens = 1;
                      }
                      else if(leds == 0x01)
                      {
                             sens = 0;
                      }
                }
                else if(mode == 4) // Mode 4: chenillard double aller retour
                {
                      leds = mode4[etapeactuelle] ; // Affichage
                      
                      // Gérer le sens
                      if(sens == 0 && etapeactuelle == 3)
                      {
                             sens = 1 ;
                      }
                      else if(sens == 1 && etapeactuelle == 0)
                      {
                             sens = 0 ;
                      }
                      
                      if(etapeactuelle != 0 && sens == 1)
                      {
                             etapeactuelle = etapeactuelle - 1;
                      }
                      else if(etapeactuelle != 3 && sens == 0)
                      {
                             etapeactuelle = etapeactuelle + 1;
                      }
                }
    
    
                // Affecter une valeur de sortie
                PORTB = leds ;
                
                Delay_ms(50) ; // Temps entre deux passages de la boucle
        }
    }
    Il passe très bien la compilation (0 Erreur ni Warning) mais je voudrais savoir s'il ne contient pas de problème particulier. Je compte le mettre sur un PIC dès que possible mais je ne pourrais pas modifier le programme a ce moment. Voilà merci à tous pour vos conseils.

    A bientôt!

    iNo

  16. Publicité
  17. #13
    HULK28

    Re : Programmer un 16F628 avec MikroC

    void main(void)
    {
    TRISA = 0xFF ; // Port A en sortie
    TRISB = 0x00 ; // Port B en entrée
    ....
    }

    C'est l'inverse, pour configurer le registre TRIS en entrée il faut écrire:

    TRISA = 0xFF;

    Je regarde pour le reste.
    Le génie est fait d'1 pour cent d'inspiration et de 99% pour cent de transpiration. Edison

  18. #14
    HULK28

    Re : Programmer un 16F628 avec MikroC

    Un détail (qui ne dérange pas la bonne marche du programme):

    ledsmode = 241 ; // L'affichage du menu mode est 1111 0001

    personellement je préfère écrire:

    ledsmode = 0b11110001;

    quand on configure un port je trouve cette écriture plus lisible, on voit de suite quel bit est positionné.
    Certain préfèreront l'Hexa:

    ledsmode = 0xF1;

    A toi de voir.
    Le génie est fait d'1 pour cent d'inspiration et de 99% pour cent de transpiration. Edison

  19. #15
    inoxxam

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par HULK28 Voir le message
    void main(void)
    {
    TRISA = 0xFF ; // Port A en sortie
    TRISB = 0x00 ; // Port B en entrée
    ....
    }

    C'est l'inverse, pour configurer le registre TRIS en entrée il faut écrire:

    TRISA = 0xFF;

    Je regarde pour le reste.
    Rebonsoir,
    Enfaite mon code est juste, je me suis juste trompé dans les commentaires. Je veux en effet le port a en entrée et le port B en sortie ^^.

    Je vous remercie pour avoir pris le temps de m'aider!

    A plus!

    iNo

  20. #16
    HULK28

    Re : Programmer un 16F628 avec MikroC

    Peux-tu poster un schéma de ton appli, je vois que tu as mis les BP au +5V, il est plus judicieux de les relier à 0V, en mettant RBPU=0 (pull-up soft activé sur le portB donc tirage à 1) ce qui évite de rajouter des pull-up hard.

    Un truc qui me gêne:

    Code:
    if(ledsmode > 240)
      {
       ledsmode = ledsmode - 240 ;
      }
    else
        {
        ledsmode = ledsmode + 240 ;
     //(donc dès que ledsmode>15 on dépasse le type char choisit...)
        }
    @+
    Le génie est fait d'1 pour cent d'inspiration et de 99% pour cent de transpiration. Edison

  21. #17
    HULK28

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par inoxxam Voir le message
    Rebonsoir,
    Enfaite mon code est juste, je me suis juste trompé dans les commentaires. Je veux en effet le port a en entrée et le port B en sortie ^^.
    Sauf que tes boutons poussoirs sont bien en entrée et sur le portB.
    Le génie est fait d'1 pour cent d'inspiration et de 99% pour cent de transpiration. Edison

  22. #18
    inoxxam

    Re : Programmer un 16F628 avec MikroC

    Re bonsoir,

    donc dès que ledsmode>15 on dépasse le type char choisit...)
    Relis bien le programme (si je ne me suis pas trompé) ledsmode ne peux pas dépasser la capacité de char. Le +240 (et accessoirement le -240) c'est pour faire clignotter les 4 leds de gauche quand on est dans le "menu mode".

    Pour la partie hardware je n'ai pas le schéma mais il me semble bien que B est en sortie car il y'a 8 LEDS et 5 boutons poussoirs. Après tu as peut-être raison. Pour quelles raisons émets-tu cette objection? (Raisons matérielles?)

    Merci et à bientôt.

    iNo.

  23. Publicité
  24. #19
    inoxxam

    Re : Programmer un 16F628 avec MikroC

    Re bonsoir (et oui encore...),
    est-ce qu'il existe un émulateur de PIC pour PC (de préférence gratuit) pour tester mon programme et voir si ça donne bien ce que je veux?

    Merci d'avance.

    iNo.

  25. #20
    Gérard

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par inoxxam Voir le message
    Re bonsoir (et oui encore...),
    est-ce qu'il existe un émulateur de PIC pour PC (de préférence gratuit) pour tester mon programme et voir si ça donne bien ce que je veux?

    Merci d'avance.

    iNo.
    Bonjour,
    Tu peux utiliser MPLAB pour simuler.

  26. #21
    HULK28

    Re : Programmer un 16F628 avec MikroC

    Dans ton cas un simulateur ne te sera pas d'une grande utilité pour ce programme car les hypothèses de ton programme sont erronées, si tu considères que les BP sont en sorties et les leds en entrées on avancera pas.
    Il faut donc si tu veux être aidé nous montrer le schéma d'appli, sans ça personnellement je ne pourrai pas t'aider.
    Ce qui est certain c'est que ton programme en l'état ne fonctionnera pas.
    Il ne suffit pas que le code passe la compilation pour qu'une appli soit OK, ça se saurait.
    @+
    Le génie est fait d'1 pour cent d'inspiration et de 99% pour cent de transpiration. Edison

  27. #22
    inoxxam

    Re : Programmer un 16F628 avec MikroC

    Bonjour,
    voici mes hypothèses de départ:
    - 5 boutons poussoirs sur le port A en entrée
    - 8 LEDs sur le port B en sortie
    - Possibilité de mettre un afficheur 20*2 à la place des LEDs (ici inutile)

    Je serais sur le système ce après-midi. Je prendrais des photos du système (si possible). Je ne risque rien (niveau matériel) à essayer ce programme sur le matos?

    Merci d'avance et à bientôt (il faut que je retourne à la philo ^^).

    iNo.

  28. #23
    Seb.26

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par HULK28 Voir le message
    Certes mais pas avec MikroC qui par défaut attribue à char un non signé.
    Chouette, encore du code non ANSI et donc non portable ...

  29. #24
    Seb.26

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par inoxxam Voir le message
    Il passe très bien la compilation (0 Erreur ni Warning) mais je voudrais savoir s'il ne contient pas de problème particulier. Je compte le mettre sur un PIC dès que possible mais je ne pourrais pas modifier le programme a ce moment. Voilà merci à tous pour vos conseils.

    A bientôt!

    iNo
    A priori, la partie "chenillard" a l'air pas mal, mais je pense qu'il pourrait y avoir un problème sur la partie selection du mode ... si j'ai vu juste, l'utilsateur va avoir du mal à choisir son mode, ça va changer trop vite ... mais je suis pas sûr ...

    D'ailleur, j'ai pas trop compris à quoi servait "imode", la variable du for( ; ; ) ...

    Mais j'ai lu ça en diagonale ... alors ...

    PS: c'est toi qui decide du fonctionnel, ou c'est imposé ?

  30. Publicité
  31. #25
    inoxxam

    Re : Programmer un 16F628 avec MikroC

    Bonsoir,
    La variable imode c'est la variable dans laquelle est stocké le numéro de l'itération de la boucle for.

    Dans ce projet rien ne m'est imposé.

    Bye!

  32. #26
    Seb.26

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par inoxxam Voir le message
    La variable imode c'est la variable dans laquelle est stocké le numéro de l'itération de la boucle for.
    Oui, merci ... ... Mais elle sert à quoi pour toi cette boucle for ???

  33. #27
    inoxxam

    Re : Programmer un 16F628 avec MikroC

    Rien de très utile, c'est juste pour faire clignotter les leds des 4 bits de poids les plus forts quand on est dans le menu. Mais je pense que je vais enlever cette fonction en raison de sa relative inutilité...

  34. #28
    Seb.26

    Re : Programmer un 16F628 avec MikroC

    Citation Envoyé par inoxxam Voir le message
    Rien de très utile, c'est juste pour faire clignotter les leds des 4 bits de poids les plus forts quand on est dans le menu. Mais je pense que je vais enlever cette fonction en raison de sa relative inutilité...
    AMA : Je pense qu'il manque un morceau de code alors ... car je vois pas où tu ecris dans PORTB ... ... Ou alors j'ai zappé un truc ...

  35. #29
    inoxxam

    Re : Programmer un 16F628 avec MikroC

    Bonjour,
    A mon plus grand regrêt je viens de me rendre compte que je n'ai pas copié la version de mon code dont je parle dans les derniers messages ce qui fait qu'on ne parle pas de la même chose... Désolé ^^

    Voici le code en sa version actuelle:

    Code:
    /*                        Chenillard avancé multi-modes                       */
    
    // Initialisation des variables
    char leds ;
    char ledcourante ;
    char ledsmode ;
    char mode ;
    char imode ;
    char sens ;
    char etapeactuelle ;
    char mode4[4] = {0x81, 0x42, 0x24, 0x18} ;
    char delay ;
    char vitesseactuelle ;
    
    /* Début du programme */
    void main(void)
    {
        TRISA = 0xFF ; // Port A en entrée
        TRISB = 0x00 ; // Port B en sortie
        CMCON = 7 ; // Désactiver les comparateurs
    
        leds = 0x80 ;
        mode = 1 ; // Mode par défaut: de gauche à droite
        ledsmode = 0b11110001 ; // L'affichage du menu mode est 1111 0001
        imode = 0 ; // Gestion du clignottement du menu mode
        sens = 0 ; // Sens par défaut
        etapeactuelle = 0 ; // Etape actuelle (mode 4)
        delay = 50 ; // Temps d'attente par défaut entre deux boucles
        vitesseactuelle = 1 ; // Cran de vitesse actuelle
        
    
        while(1) // Boucle principale
        {
                // Acquisition des entrées
                if(PORTA.F0 == 1) // Bouton "mode" enfoncé?
                {
                       while(PORTA.F1 == 0) // Tant qu'on ne demande pas à sortir du mode
                       {
                               for(imode = 0; imode <= 50; imode = imode + 1)
                               {
                                       if(PORTA.F2 == 1 && mode > 1) // Si on appuie sur le bouton "mode-" et qu'un
                                                                     // mode au numéro plus bas existe
                                       {
                                              mode = mode - 1 ; // Changer de mode
                                              ledsmode = ledsmode - 1 ; // Changer l'affichage du mode
                                       }
                                       if(PORTA.F3 == 1 && mode < 4) // Si on appuie sur le bouton "mode+" et qu'un
                                                                     // mode au numéro plus haut existe
                                       {
                                              mode = mode + 1 ; // Changer de mode
                                              ledsmode = ledsmode + 1 ; // Changer l'affichage du mode
                                       }
                                       
                                       delay_ms(10) ; // Gérer la durée du clignottement des leds
                               }
                               
                               if(ledsmode > 240)
                               {
                                      ledsmode = ledsmode - 240 ;
                               }
                               else
                               {
                                      ledsmode = ledsmode + 240 ;
                               }
                               
                               PORTB = ledsmode ;
                       }
                }
                
                if(PORTA.F1 == 1) // Bouton "Delai" enfoncé?
                {
                       while(PORTA.F0 == 0) // Tant qu'on ne demande pas a sortir du mode
                       {
                               if(PORTA.F2 == 1 && delay != 25)
                               {
                                        delay = delay / 2 ;
                                        vitesseactuelle = vitesseactuelle - 1 ;
                                        
                                        PORTB = 0b11111111 ;
                                        delay_ms(50) ;
                                        PORTB = 0b00000000 ;
                                        delay_ms(50) ;
                                        PORTB = 0b11111111 ;
                                        delay_ms(50) ;
                                        PORTB = 0b00000000 ;
                                        delay_ms(50) ;
                               }
                               
                               if(PORTA.F3 == 1 && delay != 200)
                               {
                                        delay = delay * 2 ;
                                        vitesseactuelle = vitesseactuelle + 1 ;
    
                                        PORTB = 0b11111111 ;
                                        delay_ms(50) ;
                                        PORTB = 0b00000000 ;
                                        delay_ms(50) ;
                                        PORTB = 0b11111111 ;
                                        delay_ms(50) ;
                                        PORTB = 0b00000000 ;
                                        delay_ms(50) ;
                               }
                               
                               switch(vitesseactuelle)
                               {
                                        case 0:
                                        PORTB = 0b00000011 ;
                                        break ;
                                        
                                        case 1:
                                        PORTB = 0b00001100 ;
                                        break ;
                                        
                                        case 2:
                                        PORTB = 0b00110000 ;
                                        break ;
                                        
                                        case 3:
                                        PORTB = 0b11000000 ;
                                        break ;
                               }
                       }
                }
    
                // Gestion du mode
                if(mode == 1) // Mode 1: chenillard gauche -> droite
                {
                      // Gestion de la led à afficher
                      leds = leds >> 1 ;
                      if(!leds)
                      {
                             leds = 0x80 ;
                      }
                }
                else if(mode == 2) // Mode 2: chenillard droite -> gauche
                {
                      // Gestion de la led à afficher
                      leds = leds << 1 ;
                      if(!leds)
                      {
                             leds = 0x00 ;
                      }
                }
                else if(mode == 3) // Mode 3: chenillard aller-retour
                {
                      // Gestion de la led à afficher
                      if(sens == 0)
                      {
                             leds = leds << 1 ;
                      }
                      else
                      {
                             leds = leds >> 1 ;
                      }
                      
                      // Gestion du sens
                      if(leds == 0x80)
                      {
                             sens = 1;
                      }
                      else if(leds == 0x01)
                      {
                             sens = 0;
                      }
                }
                else if(mode == 4) // Mode 4: chenillard double aller retour
                {
                      leds = mode4[etapeactuelle] ; // Affichage
                      
                      // Gérer le sens
                      if(sens == 0 && etapeactuelle == 3)
                      {
                             sens = 1 ;
                      }
                      else if(sens == 1 && etapeactuelle == 0)
                      {
                             sens = 0 ;
                      }
                      
                      if(etapeactuelle != 0 && sens == 1)
                      {
                             etapeactuelle = etapeactuelle - 1;
                      }
                      else if(etapeactuelle != 3 && sens == 0)
                      {
                             etapeactuelle = etapeactuelle + 1;
                      }
                }
    
    
                // Affecter une valeur de sortie
                PORTB = leds ;
                
                if(delay == 25)
                {
                      delay_ms(25) ; // Temps entre deux passages de la boucle
                }
                else if(delay == 50)
                {
                      delay_ms(50) ; // Temps entre deux passages de la boucle
                }
                else if(delay == 100)
                {
                      delay_ms(100) ; // Temps entre deux passages de la boucle
                }
                else if(delay == 200)
                {
                      delay_ms(200) ; // Temps entre deux passages de la boucle
                }
        }
    }
    Encore une fois merci de votre aide et à bientôt.

    iNo.

  36. #30
    houssemelectronica

    Re : Programmer un 16F628 avec MikroC

    bonsoir
    je cherche un code sur microc qui permet de fonctionne deus moteur si en clic sur le boutton1 le deus moteur tourne en avant si en clic sur le boutton2 le moteur tourne en arriere si en clic sur le boutton3 le moteur 1 tourne si en clic sur le botton4 le moteur 2 tourne.merci

Sur le même thème :

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Me programmer un PIC 16F628 à mes besoins
    Par mentos49 dans le forum Électronique
    Réponses: 23
    Dernier message: 09/01/2014, 14h12
  2. Interruptions mikroc + 16f628 + easypic5
    Par Thom0801 dans le forum Électronique
    Réponses: 0
    Dernier message: 06/10/2009, 18h13
  3. Test de PIC 16F628 avec une LED...
    Par Raphael2 dans le forum Électronique
    Réponses: 15
    Dernier message: 23/07/2006, 10h37
  4. Problème avec 16F628
    Par maho dans le forum Électronique
    Réponses: 5
    Dernier message: 04/03/2005, 13h02
Découvrez nos comparatifs produits sur l'informatique et les technologies.