mikroc - C - Programmation
Marsh Posté le 25-05-2015 à 21:06:49
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é...)
Marsh Posté le 25-05-2015 à 21:20:08
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 :
|
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...
Marsh Posté le 25-05-2015 à 21:48:36
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.
Marsh Posté le 25-05-2015 à 22:02:40
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?
Marsh Posté le 30-05-2015 à 13:11:16
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.
Marsh Posté le 01-06-2015 à 02:19:12
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 :
|
Marsh Posté le 01-06-2015 à 20:51:07
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 :
|
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)
Marsh Posté le 01-06-2015 à 21:11:39
Touts est dans la code, en attente de vos lire merci
Code :
|
Marsh Posté le 01-06-2015 à 21:19:07
voici les fichiers source+isis
https://drive.google.com/open?id=0B [...] authuser=0
Marsh Posté le 01-06-2015 à 21:19:54
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 :
|
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 :
|
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 :
|
À 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!
Marsh Posté le 01-06-2015 à 21:50:09
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 |
Et heu pardon mais un minimum d'application svp...
Citation : |
Marsh Posté le 01-06-2015 à 22:06:08
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.
Marsh Posté le 01-06-2015 à 22:09:33
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).
Marsh Posté le 01-06-2015 à 22:19:24
é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?
Marsh Posté le 01-06-2015 à 22:20:50
J'ai rien simulé du tout faute d'avoir le bon logiciel. Fais donc un test sur le hardware réel...
Marsh Posté le 01-06-2015 à 22:28:27
A désolé, je ne vais pas faire le travail à ta place. Je t'ai donné une indication comment faire, à toi de voir...
Marsh Posté le 02-06-2015 à 00:01:33
ok je vais essaye de moi même on verras ce que sa va donner et je te dit quoi.
Marsh Posté le 02-06-2015 à 02:51:54
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 :
|
Marsh Posté le 02-06-2015 à 13:56:23
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 :
|
D'accord, c'est vrai, mais le code le dit clairement, inutile de répéter... Exemple concret:
Code :
|
Le code est (à mon avis) suffisamment clair (mais je connais les profs qui veulent qu'on commente chaque ligne...).
Marsh Posté le 25-05-2015 à 20:42:39
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);
}
}
}