Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1194 connectés 

  FORUM HardWare.fr
  Programmation
  C

  mikroc

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

mikroc

n°2258717
nebukadnez​are
Posté le 25-05-2015 à 20:42:39  profilanswer
 

bonsoir
je suis nouveau en programmation, et j'ai realise ce petit decompteur, je cherche a l'optimise et rajouter 2 ou 3 petit truck si quelqu'un a un instant pour moi merci d'avance voici le code:
 
#define plus PORTA.RA0
#define moin PORTA.RA1
#define star PORTA.RA2
char display;
  char i;
 
void main() {
      debut :;
      //display = 0;
      //i=0;
trisb = 0x00;
portb = 0x00;
//trisc = 0X03;
//portc = 0x00;
TRISA=0xff ;
PORTA=0x00;
display = 1 ;
 
while(1){
 
if(!plus)
{
display++;
while(!plus);
}
if(!moin)
{
display--;
while(!moin);
}
PORTB=Dec2Bcd(display);
delay_ms(20);
//if (i>90) display = 0;
//if (i<0) display = 99;
if(!star)
{
while(1)
{
if (i==0)
{
i=display;
}
PORTB=Dec2Bcd(i);
i-- ;
delay_ms(100);
if (i==0) goto debut;
}
while(!star);
}
}
}

mood
Publicité
Posté le 25-05-2015 à 20:42:39  profilanswer
 

n°2258719
rat de com​bat
attention rongeur méchant!
Posté le 25-05-2015 à 21:06:49  profilanswer
 

quelque remarques:
-baliser le code pour une mise en page correcte!!
-décrire ton algorithme, personne à envie de décortiquer le code pour comprendre comment c'est censé fonctionner... Bon, pour cette fois ci ça va, c'est pas bien long.
-moins avec un s
-star c'est start? Alors autant l'écrire en entier pour que ce soit clair.
-PORTA.RA0 c'est très pratique et correct mais il faut savoir que c'est pas portable. méthode classique: bitshift et opérations binaires, soit if(!(PORTA&(1<<_RA0))) avec #define _RA0 0 (la position du pin sur le port, il y a certainement un fichier header avec les bonnes constantes quelque part)
-les variables globales c'est moche, à utiliser uniquement quand c'est absolument nécessaire ce qui n'est pas le cas içi
-le goto c'est très moche, à éviter! Si on en abuse on se retrouve avec du code "spaghetti" incompréhensible
-delay_ms: ouais... Si le processeur n'a rien d'autre à faire de toute façon on peut utiliser cette fonction, mais c'est pas très élégant. Si on veut faire autre chose alors que le compteur tourne faut passer par un timer et une interruption, mais là sur du PIC je sèche.
-soit cohérent, soit les noms des registres en majuscule, soit en minuscule mais pas les deux mélangés.
-on initialise une seule fois, donc le debut: est mal placé. (Faut mettre un point-virgule derrière? Je sais pas, jamais utilisé...)


Message édité par rat de combat le 25-05-2015 à 21:08:51
n°2258722
rat de com​bat
attention rongeur méchant!
Posté le 25-05-2015 à 21:20:08  profilanswer
 

la suite:
-utiliser des #define pour avoir les constantes en haut et à un seul endroit, ça facilite nettement les modifications éventuelles
-ne pas hésiter à utiliser des #define pour faire un code plus parlant (mais ça peut être un sujet de discussions, certains n'aiment pas le préprocesseur...)
 
non testé:

Code :
  1. #define bouton_plus PORTA.RA0
  2. #define bouton_moins PORTA.RA1
  3. #define bouton_start PORTA.RA2
  4. #define appui_bouton(b) (!(b))
  5. #define TEMPS_MAX 9
  6. #define TEMPS_MIN 0
  7. #define TICK_DELAY_MS 100
  8. void main()
  9. {
  10.     char temps;
  11.    
  12.     TRISB=0x00;
  13.     PORTB=0x00;
  14.     TRISA=0xff;
  15.     PORTA=0x00;
  16.     temps=1;
  17.     while(1)
  18.     {
  19.         if(appui_bouton(bouton_plus))
  20.         {
  21.             if(temps<TEMPS_MAX)
  22.                 temps++;
  23.             PORTB=Dec2Bcd(temps);
  24.             while(appui_bouton(bouton_plus));
  25.         }
  26.         else if(appui_bouton(bouton_moins))
  27.         {
  28.             if(temps>TEMPS_MIN)
  29.                 temps--;
  30.             PORTB=Dec2Bcd(temps);
  31.             while(appui_bouton(bouton_moins));
  32.         }
  33.         else if(appui_bouton(bouton_start))
  34.         {
  35.             while(temps>0)
  36.             {
  37.                 PORTB=Dec2Bcd(temps);
  38.                 delay_ms(TICK_DELAY_MS);
  39.                 temps--;
  40.             }
  41.             while(appui_bouton(bouton_start));
  42.         }
  43.     }
  44. }


 
edit: essayer de ne pas mélanger (trop) l'anglais et le français au niveau des noms de variables, moi-même j'ai du mal avec ça...


Message édité par rat de combat le 25-05-2015 à 21:23:13
n°2258727
nebukadnez​are
Posté le 25-05-2015 à 21:48:36  profilanswer
 

waw merci "rat de combat" pour ta réponse mais comme je l'ai dit c'est vraiment mon premier code, donc j'ai bien note toutes tes remarques et s'il en reste n’hésite pas, et aussi merci pour le Recodage.
je le test et je te dit quoi. merci encore pour l’intérêt.

n°2258728
nebukadnez​are
Posté le 25-05-2015 à 22:02:40  profilanswer
 

merci mon pote il super nikel propre ton code  .
dit , j'utilise 2X7447 es que le code change beaucoup si j'utilise 1 seul 74ls47 avec 2 digit 7 segments?

n°2259135
rat de com​bat
attention rongeur méchant!
Posté le 30-05-2015 à 13:11:16  profilanswer
 

Je viens juste de voir: Désolé, les 7447 et Co. j'y connais rien. C'est plutôt une question pour un forum d'électronique ça.

n°2259195
nebukadnez​are
Posté le 01-06-2015 à 02:19:12  profilanswer
 

y a pas de quoi "rat de combat";
voila j'y suis presque ,mais je cale sur la mémorisation de la dernière valeur et aussi la vitesse de l’exécution ( après avoir appuyer sur star il vas trop vite).
je vous joins le fichier complet (code +isis) si une bonne âmes aimerais bien m'aider.
 
le code: (en espérant qu'il est digne d'un codehttp://forum-images.hardware.fr/icones/message/icon7.gif)
 

Code :
  1. void displayDigit(int y)
  2. {
  3. switch(y)
  4. {
  5. case 0:PORTB        = 0x3F;break;
  6. case 1:PORTB        = 0x06;break;
  7. case 2:PORTB        = 0x5B;break;
  8. case 3:PORTB        = 0x4F;break;
  9. case 4:PORTB        = 0x66;break;
  10. case 5:PORTB        = 0x6D;break;
  11. case 6:PORTB        = 0x7D;break;
  12. case 7:PORTB        = 0x07;break;
  13. case 8:PORTB        = 0x7F;break;
  14. case 9:PORTB        = 0x67;break;
  15. }
  16. }
  17. #define bouton_plus PORTD.RD0
  18. #define bouton_moins PORTD.RD1
  19. #define bouton_start PORTD.RD2
  20. #define bouton_select PORTD.RD3
  21. #define appui_bouton(b) (!(b))
  22. #define TEMPS_MAX 9999
  23. #define TEMPS_MIN 0
  24. #define TICK_DELAY_MS 100
  25. unsigned int count = 1;
  26. unsigned int count1 = 0;
  27. unsigned int count2 = 0;
  28. unsigned int count3 = 0;
  29. unsigned int count4 = 0;
  30. unsigned int time = 0;
  31. unsigned int x = 0;
  32. void main(void)
  33. {
  34. TRISA = 0x00;
  35. TRISB = 0x00;
  36. PORTA = 0x00;        // RA3 RA2 RA1 RA0 (Common Cathode)
  37. PORTB = 0x00;        // dpgfedcba (Common Cathode)
  38. TRISD = 0xff;        // input button
  39. PORTD = 0x00;
  40. TRISC = 0x00;
  41. PORTC = 0x00;
  42.     //count=0;
  43.            while(1)
  44.     {
  45.                 count4= (count/1000)%10;
  46.                 count3= (count/100)%10;
  47.                 count2 = (count/10)%10;
  48.                 count1 = count%10;
  49.                 for (x = 0; x <=50; x--)
  50.                 PORTA        = 0x17; displayDigit(count1); Delay_ms(10);
  51.                 PORTA        = 0x1B; displayDigit(count2); Delay_ms(10);
  52.                 PORTA        = 0x1D; displayDigit(count3); Delay_ms(10);
  53.                 PORTA        = 0x16; displayDigit(count4); Delay_ms(10);
  54.         if(appui_bouton(bouton_plus))
  55.         {
  56.             if(count<TEMPS_MAX)
  57.                 count++;
  58.         }
  59.          if(appui_bouton(bouton_moins))
  60.         {
  61.             if(count>TEMPS_MIN)
  62.                 count--;
  63.            time=count;
  64.         }
  65.        
  66.           if(appui_bouton(bouton_start))
  67.           {
  68.                
  69.                do
  70.                {
  71.                 if (count > TEMPS_MIN)
  72.                 count4= (count/1000)%10;
  73.                 count3= (count/100)%10;
  74.                 count2 = (count/10)%10;
  75.                 count1 = count%10;
  76.                 for (x = 0; x <=50; x--)
  77.                 PORTA        = 0x17; displayDigit(count1); Delay_ms(10);
  78.                 PORTA        = 0x1B; displayDigit(count2); Delay_ms(10);
  79.                 PORTA        = 0x1D; displayDigit(count3); Delay_ms(10);
  80.                 PORTA        = 0x16; displayDigit(count4); Delay_ms(10);
  81.                }
  82.              
  83.                while(count--);
  84.                 PORTC=0xff;
  85.                 delay_ms(1000);
  86.                 count=1;
  87.                 PORTC=0;
  88.          
  89.          
  90.          
  91.          
  92.            }
  93.    }
  94.                
  95.                
  96. }


Message édité par nebukadnezare le 01-06-2015 à 02:24:10
n°2259197
nebukadnez​are
Posté le 01-06-2015 à 02:23:13  profilanswer
 

heu; je ne vois pas comment inséré une pièce jointe????

n°2259319
rat de com​bat
attention rongeur méchant!
Posté le 01-06-2015 à 20:51:07  profilanswer
 

Pour les PJ faut regarder l'aide: http://wiki.atlas.doctissimo.fr/di [...] d%27images (doctissimo? C'est lié à HW.fr ça?)

 

Pour ton code:
- mise en page encore améliorable, pas besoin de x espaces dans chaque ligne du switch(case) et attention à l'insertion(?? - le décalage à droite quoi) et au bon placement des accolades.
- Encore des variables globales, faut les mettre dans main().
- N'hésite pas à insérer des lignes blanches pour aérer un peu ton code! edit: Pardon, tu le fais déjà, ça doit être un problème de copier-coller (je mets le code dans un autre logiciel pour pouvoir l'éditer).

 

Sans regarder la logique du code on peut voir que tes boucles for() sont pas bonnes. for (x = 0; x <=50; x--) Tu vois le problème?

 

Ensuite pour ta première boucle tu veux éxecuter en boucle tout le bloc de code qui vient après je suppose? Alors il faut obligatoirement mettre des accolades, sinon seule la première instruction (soit PORTA = 0x17; ) est exécutée en boucle!

Code :
  1. for (x = 0; x <=50; x--)
  2. {
  3.     PORTA = 0x17; displayDigit(count1); Delay_ms(10);
  4.     PORTA = 0x1B; displayDigit(count2); Delay_ms(10);
  5.     PORTA = 0x1D; displayDigit(count3); Delay_ms(10);
  6.     PORTA = 0x16; displayDigit(count4); Delay_ms(10);
  7. }
 

Dans le bloc  if(appui_bouton(bouton_moins)) on trouve ceci time=count; sauf que time est utilisé null part.

 

Pour la logique tu code faut que je refléchisse un moment. Apparemment tu as un affichage LED multiplexé, le mieux serait de gérer ça avec un timer et une interruption mais là tu risque de galérer et moi je connais pas les PIC...

 

(à suivre)


Message édité par rat de combat le 01-06-2015 à 20:52:44
n°2259321
nebukadnez​are
Posté le 01-06-2015 à 21:11:39  profilanswer
 

Touts est dans la code, en attente de vos lire merci
 
 
 

Code :
  1. // Projet décompteur sur LSD 4 digit 7 segments
  2. // pour l'instant comme sa il marche comme je veut;
  3. // saut que le delays de la dernière phase "START " il descend trop vite
  4. // il n'ais pas calibre en temps réel (seconde)
  5. void displayDigit(int y)
  6. {
  7. switch(y)
  8. {
  9. case 0:PORTB        = 0x3F;break;
  10. case 1:PORTB        = 0x06;break;
  11. case 2:PORTB        = 0x5B;break;
  12. case 3:PORTB        = 0x4F;break;
  13. case 4:PORTB        = 0x66;break;
  14. case 5:PORTB        = 0x6D;break;
  15. case 6:PORTB        = 0x7D;break;
  16. case 7:PORTB        = 0x07;break;
  17. case 8:PORTB        = 0x7F;break;
  18. case 9:PORTB        = 0x67;break;
  19. }
  20. }
  21. #define bouton_plus PORTD.RD0
  22. #define bouton_moins PORTD.RD1
  23. #define bouton_start PORTD.RD2
  24. #define bouton_select PORTD.RD3
  25. #define appui_bouton(b) (!(b))
  26. #define TEMPS_MAX 9999
  27. #define TEMPS_MIN 0
  28. #define TICK_DELAY_MS 10
  29. unsigned int count = 1;
  30. unsigned int count1 = 0;
  31. unsigned int count2 = 0;
  32. unsigned int count3 = 0;
  33. unsigned int count4 = 0;
  34. unsigned int x = 0;
  35. void main(void)
  36. {
  37. TRISA = 0x00;
  38. TRISB = 0x00;
  39. PORTA = 0x00;        // RA3 RA2 RA1 RA0 (Common Cathode)
  40. PORTB = 0x00;        // dpgfedcba (Common Cathode)
  41. TRISD = 0xff;        // input button
  42. PORTD = 0x00;
  43. TRISC = 0x00;        // OUTPUT LED
  44. PORTC = 0x00;
  45.            while(1)
  46.     {
  47.                 count4= (count/1000)%10;             // AFFICHAGE 0000
  48.                 count3= (count/100)%10;
  49.                 count2 = (count/10)%10;
  50.                 count1 = count%10;
  51.                 PORTA = 0x17; displayDigit(count1); Delay_ms(TICK_DELAY_MS);
  52.                 PORTA = 0x1B; displayDigit(count2); Delay_ms(TICK_DELAY_MS);
  53.                 PORTA = 0x1D; displayDigit(count3); Delay_ms(TICK_DELAY_MS);
  54.                 PORTA = 0x16; displayDigit(count4); Delay_ms(TICK_DELAY_MS);
  55.         if(appui_bouton(bouton_plus))    // BP PLUS TEMPS
  56.         {
  57.             if(count<TEMPS_MAX)
  58.                 count++;
  59.         }
  60.          if(appui_bouton(bouton_moins))    //BP MOINS TEMPS
  61.         {
  62.             if(count>TEMPS_MIN)
  63.                 count--;
  64.         }
  65.     // avant de passer à START je voudrais que "count" soie mémorisée pour qu'a la fin
  66.     // du décomptage il m'affiche ce dernier en début.
  67.          
  68.          
  69.           if(appui_bouton(bouton_start))     // BP DEBUT DECOMPTAGE
  70.           {
  71.               do
  72.                {
  73.                 if (count > TEMPS_MIN)               // AFFICHAGE DECOMPTE
  74.                 count4= (count/1000)%10;
  75.                 count3= (count/100)%10;
  76.                 count2 = (count/10)%10;
  77.                 count1 = count%10;
  78.                 PORTA = 0x17; displayDigit(count1); Delay_ms(TICK_DELAY_MS);
  79.                 PORTA = 0x1B; displayDigit(count2); Delay_ms(TICK_DELAY_MS);
  80.                 PORTA = 0x1D; displayDigit(count3); Delay_ms(TICK_DELAY_MS);
  81.                 PORTA = 0x16; displayDigit(count4); Delay_ms(TICK_DELAY_MS);
  82.                }
  83.              
  84.                while(count--);                // CONDITION
  85.                 PORTC=0xff;                   // ACTIVATION PORTC...
  86.                 delay_ms(1000);               // ...1S
  87.                 count=1;
  88.                 PORTC=0;
  89.          
  90.            }
  91.    }
  92. }

mood
Publicité
Posté le 01-06-2015 à 21:11:39  profilanswer
 

n°2259322
nebukadnez​are
Posté le 01-06-2015 à 21:19:07  profilanswer
 
n°2259323
rat de com​bat
attention rongeur méchant!
Posté le 01-06-2015 à 21:19:54  profilanswer
 

EDIT: Ce message est la suite de mon dernier, je n'ai pas vu le message 21:11:39 avant de poster!

 

Ici il manque encore des accolades: if (count > TEMPS_MIN) (dans la boucle do-while). En plus cette condition on peut s'en passer. Pour appui bouton moins il y a déjà un test pour voir si on peut décrémenter. Par contre si le temps est écoulé il ne faut pas remettre 1 dans count comme tu le fais ici count=1; mais il faut mettre TEMPS_MIN.

 

Pour le programme entier:

 

Lorsqu'on a appuyé sur start il faut faire s'écouler le temps mais en même temps maintenir l'affichage. Entre parenthèses, pourquoi une boucle do while() plutôt que while(). C'est un truc en rapport avec l'affichage du zéro ou pas non? Je manque de pratique, j'ai un doute là, à voir...

 

Bon, si on prends la méthode naive

Code :
  1. if(appui_bouton(bouton_start))
  2. {
  3.     do
  4.     {
  5.         count4= (count/1000)%10;
  6.         count3= (count/100)%10;
  7.         count2 = (count/10)%10;
  8.         count1 = count%10;
  9.         PORTA = 0x17; displayDigit(count1);
  10.         PORTA = 0x1B; displayDigit(count2);
  11.         PORTA = 0x1D; displayDigit(count3);
  12.         PORTA = 0x16; displayDigit(count4);
  13.         delay_ms(1000);
  14.        
  15.     }while(count--);
  16.    
  17.     PORTC=0xff;
  18.     count=TEMPS_MIN;
  19.     PORTC=0;
  20. }


on va bloquer l'affichage. (Entre parenthèses les instructions d'affichage prennent du tems aussi qu'il faudrait enlèver sur le delay. Le soucis c'est que ce temps de calcul n'est pas constant mais dépends de count. Le chrono ne sera pas très précis. Pour régler ce problème faut utiliser un timer (le PIC en a je suppose).)

 

Pour maintenir l'affichage on "triche": Au lieu d'attendre une fois 1000ms on attends p.ex. 200 fois 5ms et entre chaque attente on s'occupe de l'affichage. La première approche

Code :
  1. if(appui_bouton(bouton_start))
  2. {
  3.     do
  4.     {
  5.         count4= (count/1000)%10;
  6.         count3= (count/100)%10;
  7.         count2 = (count/10)%10;
  8.         count1 = count%10;
  9.        
  10.         unsigned int nombre;
  11.        
  12.         for(nombre=0; nombre <200; nombre++)
  13.         {
  14.             PORTA = 0x17; displayDigit(count1);
  15.             PORTA = 0x1B; displayDigit(count2);
  16.             PORTA = 0x1D; displayDigit(count3);
  17.             PORTA = 0x16; displayDigit(count4);
  18.             delay_ms(5);
  19.         }
  20.        
  21.     }while(count--);
  22.    
  23.     PORTC=0xff;
  24.     count=TEMPS_MIN;
  25.     PORTC=0;
  26. }


devrait faire apparaître un défaut: Le dernier nombre est bien plus lumineux que les autres. C'est normal parce que c'est lui qui reste affiché pendant le delay de 5ms (Entre parenthèses même remarque qu'en haut: La boucle for prends aussi un peu de temps --> imprécis). La solution tu y as déjà pensé: Diviser le temps d'attente de nouveau pour attendre le même temps entre chaque digit. Bon, voyons, il faut un multiple de 4 et c'est pas le cas du cinq. Bon, alors on dit qu'on attends 250 fois 4x1ms, ça devrait être bon. Faut choisir des temps raisonnables, là on est encore plutôt haut avec 250Hz de fréquence de multiplexage.
Bref, voici l'idée en C:

Code :
  1. if(appui_bouton(bouton_start))
  2. {
  3.     do
  4.     {
  5.         count4= (count/1000)%10;
  6.         count3= (count/100)%10;
  7.         count2 = (count/10)%10;
  8.         count1 = count%10;
  9.        
  10.         unsigned int nombre;
  11.        
  12.         for(nombre=0; nombre <250; nombre++)
  13.         {
  14.             PORTA = 0x17; displayDigit(count1); delay_ms(1);
  15.             PORTA = 0x1B; displayDigit(count2); delay_ms(1);
  16.             PORTA = 0x1D; displayDigit(count3); delay_ms(1);
  17.             PORTA = 0x16; displayDigit(count4); delay_ms(1);
  18.         }
  19.        
  20.     }while(count--);
  21.    
  22.     PORTC=0xff;
  23.     count=TEMPS_MIN;
  24.     PORTC=0;
  25. }
 

À toi de reposter un nouveau code complet, je fais exprès de ne pas le faire. Tout mes dires sont sans garantie, comme je disais je manque de pratique (et l'erreur est humaine...) et je ne peux pas tester le code faute du support hardware!


Message édité par rat de combat le 01-06-2015 à 21:55:46
n°2259327
rat de com​bat
attention rongeur méchant!
Posté le 01-06-2015 à 21:50:09  profilanswer
 

Plusieurs messages en parallèle... Regarde mon dernier message pour "calibrer" ton truc et aussi pour toutes les autres remarques.  
 
Mémoriser START? Tu veux dire le temps programmé? Comment pourrait-on faire...? Peut-être en sauvegardant le temps dans une variable de sauvegarde avant de démarrer le compteur et réinitialiser count avec cette valeur sauvegardée à la fin?
 

Citation :

LSD 4 digit 7 segments


:lol:
 
Et heu pardon mais un minimum d'application svp...

Citation :


    // pour l'instant comme ça il marche comme je veux;
    // sauf que le délai de la dernière phase "START " il descend trop vite
    // il n'est pas calibré en temps réel (seconde)


n°2259331
nebukadnez​are
Posté le 01-06-2015 à 22:06:08  profilanswer
 

ok ok  ;)
 pour le temps c'est super merci ( il y a juste de petit étincellement au nivaux de l'affichage mais je crois que c'est ISIS).
il ne me reste plus que la mémorisation du temps choisie avant le START , et bingo ;).
petit remarque quand j'utilise le " unsigned int nombre; " il me fait une erreur donc je l'ai mis au début et sa marche.

n°2259332
rat de com​bat
attention rongeur méchant!
Posté le 01-06-2015 à 22:09:33  profilanswer
 

Citation :

il y a juste de petit étincellement au nivaux de l'affichage


C'est à dire? Qu'entends tu par étincellement?

 
Citation :

petit remarque quand j'utilise le " unsigned int nombre; " il me fait une erreur donc je l'ai mis au début et sa marche.


Oui c'est possible, faut déclarer au début de la fonction.

 

edit: "au début"... mais dans la fonction main()? Ou t'as toujours tes variables globales? Poste donc une version actuelle du code après avoir pris en compte tout mes messages (au cas où tu en aurait raté un avec nos messages qui se sont recoupés).


Message édité par rat de combat le 01-06-2015 à 22:12:21
n°2259334
nebukadnez​are
Posté le 01-06-2015 à 22:19:24  profilanswer
 

étincellement, c'est que les chiffres ne défile pas normalement, il sont saccadé, je pence que c'est le simulateur.  
Es que ta essayé  la simulation?

n°2259336
rat de com​bat
attention rongeur méchant!
Posté le 01-06-2015 à 22:20:50  profilanswer
 

J'ai rien simulé du tout faute d'avoir le bon logiciel. Fais donc un test sur le hardware réel...

n°2259339
nebukadnez​are
Posté le 01-06-2015 à 22:24:40  profilanswer
 

Ok ;il me faut juste la fameuse ligne de mémorisation

n°2259341
rat de com​bat
attention rongeur méchant!
Posté le 01-06-2015 à 22:28:27  profilanswer
 

A désolé, je ne vais pas faire le travail à ta place. Je t'ai donné une indication comment faire, à toi de voir...

n°2259346
nebukadnez​are
Posté le 02-06-2015 à 00:01:33  profilanswer
 

ok je vais essaye de moi même on verras ce que sa va donner et je te dit quoi.

n°2259349
nebukadnez​are
Posté le 02-06-2015 à 02:51:54  profilanswer
 

voila je crois que c'est bon ,et vraiment vraiment merci "rat de combat" du soutient; voici le code finale, s'il y a des choses en trop n’hésite pas.
 

Code :
  1. void displayDigit(int y)
  2. {
  3. switch(y)
  4. {
  5. case 0:PORTB        = 0x3F;break;
  6. case 1:PORTB        = 0x06;break;
  7. case 2:PORTB        = 0x5B;break;
  8. case 3:PORTB        = 0x4F;break;
  9. case 4:PORTB        = 0x66;break;
  10. case 5:PORTB        = 0x6D;break;
  11. case 6:PORTB        = 0x7D;break;
  12. case 7:PORTB        = 0x07;break;
  13. case 8:PORTB        = 0x7F;break;
  14. case 9:PORTB        = 0x67;break;
  15. }
  16. }
  17. #define bouton_plus PORTD.RD0
  18. #define bouton_moins PORTD.RD1
  19. #define bouton_start PORTD.RD2
  20. #define bouton_select PORTD.RD3
  21. #define appui_bouton(b) (!(b))
  22. #define TEMPS_MAX 9999
  23. #define TEMPS_MIN 0
  24. #define TICK_DELAY_MS 10
  25. unsigned int count = 0;
  26. unsigned int count1 = 0;
  27. unsigned int count2 = 0;
  28. unsigned int count3 = 0;
  29. unsigned int count4 = 0;
  30. unsigned int x = 0;
  31. unsigned int nombre;
  32. unsigned short mem;
  33. void main(void)
  34. {
  35. count=EEPROM_Read(0x32);
  36. TRISA = 0x00;
  37. TRISB = 0x00;
  38. PORTA = 0x00;        // RA3 RA2 RA1 RA0 (Common Cathode)
  39. PORTB = 0x00;        // dpgfedcba (Common Cathode)
  40. TRISD = 0xff;        // input button
  41. PORTD = 0x00;
  42. TRISC = 0x00;        // OUTPUT LED
  43. PORTC = 0x00;
  44.            while(1)
  45.     {
  46.                 count4= (count/1000)%10;             // AFFICHAGE 0000
  47.                 count3= (count/100)%10;
  48.                 count2 = (count/10)%10;
  49.                 count1 = count%10;
  50.                 PORTA = 0x17; displayDigit(count1); Delay_ms(TICK_DELAY_MS);
  51.                 PORTA = 0x1B; displayDigit(count2); Delay_ms(TICK_DELAY_MS);
  52.                 PORTA = 0x1D; displayDigit(count3); Delay_ms(TICK_DELAY_MS);
  53.                 PORTA = 0x16; displayDigit(count4); Delay_ms(TICK_DELAY_MS);
  54.         if(appui_bouton(bouton_plus))    // BP PLUS TEMPS
  55.         {
  56.             if(count<TEMPS_MAX)
  57.                 count++;
  58.         }
  59.          if(appui_bouton(bouton_moins))    //BP MOINS TEMPS
  60.         {
  61.             if(count>TEMPS_MIN)
  62.                 count--;
  63.         }
  64.           if(appui_bouton(bouton_start))     // BP DEBUT DECOMPTAGE
  65.           {
  66.           EEPROM_Write(0x32, count);         // Mémorisation de la valeur
  67.              
  68.               do
  69.                {
  70.                    if (count > TEMPS_MIN)               // AFFICHAGE DECOMPTE
  71.                    {
  72.                      count4= (count/1000)%10;
  73.                      count3= (count/100)%10;
  74.                      count2 = (count/10)%10;
  75.                      count1 = count%10;
  76.                    
  77.                      //unsigned int nombre;
  78.                       for(nombre=0; nombre <150; nombre++)
  79.                       {
  80.                       PORTA = 0x17; displayDigit(count1); delay_ms(1);
  81.                       PORTA = 0x1B; displayDigit(count2); delay_ms(1);
  82.                       PORTA = 0x1D; displayDigit(count3); delay_ms(1);
  83.                       PORTA = 0x16; displayDigit(count4); delay_ms(1);
  84.                       }
  85.                 }
  86.                }
  87.              
  88.                while(count--);                // CONDITION
  89.                 PORTC=0xff;                   // ACTIVATION PORTC...
  90.                 delay_ms(1000);               // ...1S
  91.                 //count=TEMPS_MIN;
  92.                 PORTC=0;
  93.                 count = EEPROM_Read(0x32);
  94.          
  95.            }
  96.    }
  97. }

n°2259401
rat de com​bat
attention rongeur méchant!
Posté le 02-06-2015 à 13:56:23  profilanswer
 

Il y a toujours les variables globales, si ce terme ne te dit rien faut regarder dans ton cours, un livre ou sur le net! Il y a aussi deux variables inutilisées. Quand tu en auras fait des variables locales ton compilateur devrait d'avertir, sinon il est mal configuré (faut toujours demander le maximum de warnings!).
 
Pour la mémorisation on peut faire comme ça.
 
Ton chrono n'est pas calibré, voir mon message 01-06-2015 à 21:19:54.
 
Des problèmes de mise en page qui sont peut-être réels ou proviennent d'un problème au niveau du forum.
 
Il y a deux version du code d'affichage, une avec Delay_ms(TICK_DELAY_MS); et l'autre. 4x10ms=25Hz=peu, ça risque de se voir. (C'est peut-être ça cet "étincellement" dont tu parlais?)
 
De manière générale: Attention de ne pas mettre des commentaires "bidons" genre

Code :
  1. int i=4; //on stocke la valeur 4 dans i


D'accord, c'est vrai, mais le code le dit clairement, inutile de répéter... Exemple concret:

Code :
  1. if(appui_bouton(bouton_plus))    // BP PLUS TEMPS

Le code est (à mon avis) suffisamment clair (mais je connais les profs qui veulent qu'on commente chaque ligne...).

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  mikroc

 

Sujets relatifs
programmation avec compilateur mikroCBesoin d'aide: Programme sous MikroC
Acuqisition de données PAr RS232(MIKROC)mikroc,mplab..?
Forum MikroC[MiKroC] Appeller plusieurs procédures\sous programmes
Plus de sujets relatifs à : mikroc


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR